diff --git a/app/.config b/app/.config new file mode 100644 index 0000000..258f421 --- /dev/null +++ b/app/.config @@ -0,0 +1,3 @@ +mysql login is: coresevaangels +mysql password is: OI0nffBu +mysql dbname is: coresevaangels diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..be93a80 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,4 @@ +/public_html/assets/.sass-cache/249aff91a402ca71c71b9b435f36ede940d9c347/*.scssc +/public_html/assets/.sass-cache/ad15a9450a1a9db0dfc2799403cf03067aa8ee32/*.scssc +/public_html/assets/.sass-cache/eec1b91ea5f292b0302cc627790fb17a12e40180/*.scssc +/public_html/assets/.sass-cache/faf9fdf4101f3cba59e35eca2e76f7c3fe669eb0/*.scssc diff --git a/app/composer.json b/app/composer.json new file mode 100644 index 0000000..2861fac --- /dev/null +++ b/app/composer.json @@ -0,0 +1,6 @@ +{ + "require": { + "friendsofphp/php-cs-fixer": "^3.39", + "filp/whoops": "^2.16" + } +} diff --git a/app/composer.lock b/app/composer.lock new file mode 100644 index 0000000..5772076 --- /dev/null +++ b/app/composer.lock @@ -0,0 +1,1934 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "15b2c3a11b2276bf717fae0baf949d99", + "packages": [ + { + "name": "composer/pcre", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.1.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-10-11T07:11:09+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-08-31T09:50:34+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-02-25T21:32:43+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.39.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "04bf7b28fc847185b247d112cab617da941e3cca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/04bf7b28fc847185b247d112cab617da941e3cca", + "reference": "04bf7b28fc847185b247d112cab617da941e3cca", + "shasum": "" + }, + "require": { + "composer/semver": "^3.3", + "composer/xdebug-handler": "^3.0.3", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0", + "sebastian/diff": "^4.0 || ^5.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-mbstring": "^1.27", + "symfony/polyfill-php80": "^1.27", + "symfony/polyfill-php81": "^1.27", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3 || ^2.0", + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^2.0", + "mikey179/vfsstream": "^1.6.11", + "php-coveralls/php-coveralls": "^2.5.3", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", + "phpspec/prophecy": "^1.16", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "symfony/phpunit-bridge": "^6.2.3 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.39.0" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2023-11-22T11:20:09+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-05-07T05:35:17+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.31", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "11ac5f154e0e5c4c77af83ad11ead9165280b92a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/11ac5f154e0e5c4c77af83ad11ead9165280b92a", + "reference": "11ac5f154e0e5c4c77af83ad11ead9165280b92a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.31" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-10-31T07:58:33+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5dcc00e03413f05c1e7900090927bb7247cb0aac", + "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-06T06:34:20+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.4.25", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", + "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.4.25" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-31T13:04:02+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.27", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.27" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-31T08:02:31+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v5.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9", + "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.4.21" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:03:56+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "875e90aeea2777b6f135677f618529449334a612" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "42292d99c55abe617799667f454222c54c60e229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-28T09:04:16+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/process", + "version": "v5.4.28", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", + "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.4.28" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-08-07T10:36:04+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-30T19:17:29+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "f83692cd869a6f2391691d40a01e8acb89e76fee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f83692cd869a6f2391691d40a01e8acb89e76fee", + "reference": "f83692cd869a6f2391691d40a01e8acb89e76fee", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.4.21" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-02-14T08:03:56+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.31", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "2765096c03f39ddf54f6af532166e42aaa05b24b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/2765096c03f39ddf54f6af532166e42aaa05b24b", + "reference": "2765096c03f39ddf54f6af532166e42aaa05b24b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.31" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-11-09T08:19:44+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.0.0" +} diff --git a/app/config/accounts.dev.php b/app/config/accounts.dev.php new file mode 100644 index 0000000..53f122c --- /dev/null +++ b/app/config/accounts.dev.php @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/app/config/accounts.php b/app/config/accounts.php new file mode 100644 index 0000000..b6230a8 --- /dev/null +++ b/app/config/accounts.php @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/app/config/db.cfg.dev.php b/app/config/db.cfg.dev.php new file mode 100644 index 0000000..cfc0aa0 --- /dev/null +++ b/app/config/db.cfg.dev.php @@ -0,0 +1,21 @@ +connect('mariadb', 'app_user', 'app_pass', 'app_db'); +$core_db->q('SET NAMES utf8'); + +$server_name = 'localhost'; // Основной домен сайта + +if ($_SERVER['HTTPS'] == 'on' ) { + define('_SITE_SCHEMA_', 'https'); +} else { + define('_SITE_SCHEMA_', 'http'); +} + +define('_SITE_ROOT_', _SITE_SCHEMA_.'://'.$server_name . '/' . _SITE_PATH ); +define('_STATIC_ROOT_', _SITE_SCHEMA_.'://'.$server_name . '/' ); +define('_SHOP_ROOT_', _SITE_SCHEMA_.'://'.$server_name .'/'); +define ('_COOKIE_DOMAIN_', $server_name ); + + +?> \ No newline at end of file diff --git a/app/config/db.cfg.php b/app/config/db.cfg.php new file mode 100644 index 0000000..5c639c0 --- /dev/null +++ b/app/config/db.cfg.php @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/app/engine/admin/bladetpl/admin_polygon/main.blade.php b/app/engine/admin/bladetpl/admin_polygon/main.blade.php new file mode 100644 index 0000000..96d32f4 --- /dev/null +++ b/app/engine/admin/bladetpl/admin_polygon/main.blade.php @@ -0,0 +1,350 @@ +
+
+
+
+
+
+
Редактирование участков
+ @if(!empty($cat->cat_name)) + Раздел: {{ $cat->cat_name }} + @endif +
+ +
+ +
+
+
+
+
+
+
+ + + + + + + diff --git a/app/engine/admin/bladetpl/cache/80046d07cdc61f1ed8e5a65a5b1cefaeeb3d0c3b.bladec b/app/engine/admin/bladetpl/cache/80046d07cdc61f1ed8e5a65a5b1cefaeeb3d0c3b.bladec new file mode 100644 index 0000000..c43fe63 --- /dev/null +++ b/app/engine/admin/bladetpl/cache/80046d07cdc61f1ed8e5a65a5b1cefaeeb3d0c3b.bladec @@ -0,0 +1,352 @@ +
+
+
+
+
+
+
Редактирование участков
+ cat_name)): ?> + Раздел: cat_name, ENT_QUOTES, 'UTF-8', false); ?> + +
+ +
+ +
+
+
+
+
+
+
+ + + + + + + diff --git a/app/engine/admin/modules/admin_cats.php b/app/engine/admin/modules/admin_cats.php new file mode 100644 index 0000000..a0a0d24 --- /dev/null +++ b/app/engine/admin/modules/admin_cats.php @@ -0,0 +1,111 @@ +getTpl( $this->templ, 'body' ); + + $tmp = $this->r_subtree( '' ); + $tpl = $R->parse( 'rows', $tmp, $tpl ); + $tpl = $R->set( 'form', '', $tpl ); + + return $R->clear( $tpl ); + } + + function _on_edit() { + global $R; + $tpl = $R->getTpl( $this->templ, 'body' ); + + $obj = new cobject ('_sys_cat'); + if (!$this->id && $this->parentCat ) { + $obj->set('parent_cat', $this->parentCat ); + } else { + $obj->byId( $this->id ); + } + $form = new form( $obj ); + $tpl = $R->set( 'form', $form->render(), $tpl ); + $tmp = $this->r_subtree( '' ); + $tpl = $R->parse( 'rows', $tmp, $tpl ); + + return $R->clear( $tpl ); + } + + function _on_save_edit() { + global $cat; + $obj = new cobject ('_sys_cat'); + $obj->lPost(); + $obj->save(); + + $savedSql = $obj->save_sql; + $this->saveMigration($savedSql); + + _redirect("?cat=" . $cat->cat . '&act=edit&id='.$obj->id); + } + + function r_subtree( $cat, $level = 1 ) { + global $R, $core_db; + $tpl = $R->getTpl( $this->templ, 'row' ); + $tplu = $R->getTpl( $this->templ, 'row_unvisible' ); + $tpls = $R->getTpl( $this->templ, 'sep' ); + $obj = new cobject( '_sys_cat' ); + $db2 = $core_db->q( $obj->getSelect( ' AND `parent_cat` = "'.$cat.'" ORDER BY `_sys_order` ') ); + while ( $db2->r() ) { + $obj->lRow( $db2 ); + if ($obj->get('_sys_unvisible')) { + $tt = $obj->assign( $tplu ); + } else { + $tt = $obj->assign( $tpl ); + } + for( $i=0; $i<$level; $i++ ) { + $tt = $R->parse( 'seps', $tpls, $tt ); + } + $tmp = $this->r_subtree($db2->f('cat_id'), ($level+1)); + $out .= $R->parse( 'subrows', $tmp, $tt ); + } + + return $out; + } + + function _on_getVars() { + $module = substr($this->mname,0,-4); + + if(!$module) die(''); + + $obj = new cobject ('_sys_cat'); + $data = explode(';', $obj->attrs['module']['templ']); + $path = $data[0]; + + + require_once( _ENGINE_DIR . $path .'/' . $module.'.php' ); + $tobj = new $module(); + $html = ''; + foreach($tobj->_loc_vars as $v) { + $html .= "$"."$v=".$tobj->$v.";
"; + } + + die($html); + } + + + function saveMigration($query) { + global $core_db; + + $filename = date('Ymd-Hi') . "-user-cats.sql"; + + $f = fopen( _ENGINE_DIR . 'migrations/' . $filename, "a" ); + fputs($f, $query . ";\n" ); + fclose($f); + + $core_db->q('SELECT apply_datetime FROM _sys_db_migrations WHERE `filename` = "'.db_escape_string($filename).'" '); + if (!$core_db->nr()) { + $core_db->q('INSERT INTO _sys_db_migrations (`filename`,`apply_datetime`) values ("'.db_escape_string($filename).'", "'.date('Y-m-d H:i:s').'" ) '); + } + } +} + +?> \ No newline at end of file diff --git a/app/engine/admin/modules/admin_core_cats.php b/app/engine/admin/modules/admin_core_cats.php new file mode 100644 index 0000000..d332ce2 --- /dev/null +++ b/app/engine/admin/modules/admin_core_cats.php @@ -0,0 +1,109 @@ +getTpl( $this->templ, 'body' ); + + $tmp = $this->r_subtree( '' ); + $tpl = $R->parse( 'rows', $tmp, $tpl ); + $tpl = $R->set( 'form', '', $tpl ); + + return $R->clear( $tpl ); + } + + function _on_edit() { + global $R, $cat; + $tpl = $R->getTpl( $this->templ, 'body' ); + + $obj = new cobject ('_sys_cat_admin'); + if (!$this->id && $this->parentCat ) { + $obj->set('parent_cat', $this->parentCat ); + } else { + $obj->byId( $this->id ); + } + $form = new form( $obj ); + $tpl = $R->set( 'form', $form->render(), $tpl ); + $tmp = $this->r_subtree( '' ); + $tpl = $R->parse( 'rows', $tmp, $tpl ); + + return $R->clear( $tpl ); + } + + function _on_save_edit() { + global $cat; + $obj = new cobject ('_sys_cat_admin'); + $obj->lPost(); + $obj->save(); + $savedSql = $obj->save_sql; + $this->saveMigration($savedSql); + + _redirect("?cat=" . $cat->cat . '&act=edit&id='.$obj->id); + } + + function r_subtree( $cat, $level = 1 ) { + global $R, $core_db; + $tpl = $R->getTpl( $this->templ, 'row' ); + $tplu = $R->getTpl( $this->templ, 'row_unvisible' ); + $tpls = $R->getTpl( $this->templ, 'sep' ); + $obj = new cobject( '_sys_cat_admin' ); + $db2 = $core_db->q( $obj->getSelect( ' AND `parent_cat` = "'.$cat.'" ORDER BY `_sys_order` ') ); + while ( $db2->r() ) { + $obj->lRow( $db2 ); + if ($obj->get('_sys_unvisible')) { + $tt = $obj->assign( $tplu ); + } else { + $tt = $obj->assign( $tpl ); + } + for( $i=0; $i<$level; $i++ ) { + $tt = $R->parse( 'seps', $tpls, $tt ); + } + $tmp = $this->r_subtree($db2->f('cat_id'), ($level+1)); + $out .= $R->parse( 'subrows', $tmp, $tt ); + } + + return $out; + } + + function _on_getVars() { + $module = substr($this->mname,0,-4); + + if(!$module) die(''); + + $obj = new cobject ('_sys_cat_admin'); + $data = explode(';', $obj->attrs['module']['templ']); + $path = $data[0]; + + + require_once( _ENGINE_DIR . $path .'/' . $module.'.php' ); + $tobj = new $module(); + $html = ''; + foreach($tobj->_loc_vars as $v) { + $html .= "$"."$v=".$tobj->$v.";
"; + } + + die($html); + } + + function saveMigration($query) { + global $core_db; + + $filename = date('Ymd-Hi') . "-admin-cats.sql"; + + $f = fopen( _ENGINE_DIR . 'migrations/' . $filename, "a" ); + fputs($f, $query . ";\n" ); + fclose($f); + + $core_db->q('SELECT apply_datetime FROM _sys_db_migrations WHERE `filename` = "'.db_escape_string($filename).'" '); + if (!$core_db->nr()) { + $core_db->q('INSERT INTO _sys_db_migrations (`filename`,`apply_datetime`) values ("'.db_escape_string($filename).'", "'.date('Y-m-d H:i:s').'" ) '); + } + } +} + +?> \ No newline at end of file diff --git a/app/engine/admin/modules/admin_objects_all.php b/app/engine/admin/modules/admin_objects_all.php new file mode 100644 index 0000000..d6cb736 --- /dev/null +++ b/app/engine/admin/modules/admin_objects_all.php @@ -0,0 +1,141 @@ +obj = new cobject( $this->obj_name ); + return parent::_init(); + } + + function _on_() { + global $R; + + $db = $this->obj->getDB(); + + $tpl = $R->getTpl( $this->templ, 'body' ); + $tplr = $R->getTpl( $this->templ, 'row' ); + $tpltd = $R->getTpl( $this->templ, 'td' ); + $tplth = $R->getTpl( $this->templ, 'th' ); + + $tpl_del_td = $R->getTpl( $this->templ, 'del_td' ); + $tpl_del_th = $R->getTpl( $this->templ, 'del_th' ); + + foreach( $this->obj->attrs as $attr_name => $attrs ) { + if ( $attrs['hide'] ) continue; + $tt = $R->set('attr_name', $attrs['desc'], $tplth ); + $tpl = $R->parse( 'head_cols', $tt, $tpl ); + + $tt = $R->set('attr_name', $attr_name, $tpltd ); + $tplr = $R->parse( 'row_cols', $tt, $tplr); + } + + if ( $this->del ) { + $tpl = $R->parse( 'head_cols', $tpl_del_th, $tpl ); + $tplr = $R->parse( 'row_cols', $tpl_del_td, $tplr); + } + + $db2 = $db->q( $this->obj->getSelectEx( 'COUNT(*) as `cnt`') ); + $db2->r(); + $size = $db2->f('cnt'); + + $pw = new Walker( $size ); + $filter = new filter( $this->obj_name ); + $filter->parse(); + $tpl = $R->set( 'filter', $filter->getHTML() , $tpl); + $db2 = $db->q( $this->obj->getSelect( $filter->getSQL() . ' ORDER BY `ID` DESC ' . $pw->getSQL() ) ); + while( $db2->r() ) { + $this->obj->lRow($db2); + $tt = $this->obj->assign( $tplr, true ); + $tpl = $R->parse( 'rows', $tt, $tpl ); + } + + $this->obj->byId($this->id); + if ( !$this->id && !$this->add ) { + $tpl = $R->set( 'form', '' , $tpl); + } else { + $tpl = $R->set( 'form', $this->r_form() , $tpl); + $tpl = $R->set( 'id', intval($this->id), $tpl ); + + } + $tpl = $R->set( 'walker', $pw->getHTML() , $tpl); + $tpl = $R->set( 'cur_page', $pw->page , $tpl); + $tpl = $R->set( 'obj_name', $this->obj_name, $tpl ); + + + $sql = "SELECT TABLE_COMMENT FROM `information_schema`.`TABLES` where TABLE_SCHEMA = '".$db->dbname."' and TABLE_NAME = '".$this->obj_name."' "; + $db2 = $db->q($sql); + $db2->nr(); + $tpl = $R->set('obj_title', htmlspecialchars($db2->f('TABLE_COMMENT')), $tpl); + + $tpl = $R->set( 'filter_url', $this->_get_filter_url(), $tpl ); + return $R->clear( $tpl ); + } + + function _on_edit() { + global $R; + $this->obj->byId($this->id); + if ( $this->id || $this->add ) { + return $this->r_form(); + } + return ''; + } + + function _on_copy() { + global $cat; + $this->obj->byId($this->id); + $this->obj->saveAsCopy(); + _redirect('?cat=' . $cat->cat . '&obj_name='.$this->obj_name . '&id='. $this->obj->id.'&' . $this->_get_filter_url() .'&curpage='.$_GET['curpage'] ); + } + + function r_form() { + + $form = new form( $this->obj ); + $form->_parse(); + $form->form['obj_name']['hidden'] = 0; + $form->form['obj_name']['html'] = ''; + return $form->_html(); + } + + function _on_save_edit() { + global $cat; + if ( !$this->id && !$this->add ) _redirect('?cat=' . $cat->cat . '&obj_name='.$this->obj_name ); + + $this->obj->lPost(); + if ( $this->obj->validate() ) { + $this->obj->save(); + } else { + return $this->r_form(); + } + _redirect('?cat=' . $cat->cat . '&obj_name='.$this->obj_name . '&' . $this->_get_filter_url() .'&curpage='.$_GET['curpage'] ); + + } + + function _on_del() { + global $cat; + if ( $this->del ) { + $this->obj->byId( $this->id ); + $this->obj->del(); + } + _redirect('?cat=' . $cat->cat . '&obj_name='.$this->obj_name . '&' . $this->_get_filter_url() .'&curpage='.$_GET['curpage'] ); + } + + function _get_filter_url() { + foreach( $_GET as $k => $v ) { + if ( strpos($k, $this->obj_name.'_') === 0 ) { + $ret = '&'.$k.'='.$v; + } + } + return $ret; + } + +} + +?> \ No newline at end of file diff --git a/app/engine/admin/modules/admin_polygon.php b/app/engine/admin/modules/admin_polygon.php new file mode 100644 index 0000000..7a07340 --- /dev/null +++ b/app/engine/admin/modules/admin_polygon.php @@ -0,0 +1,119 @@ +obj = new cobject($this->obj_name); + return parent::_init(); + } + + public function _on_() { + global $blade; + + + $data = []; + $db2 = $this->obj->getDB()->q($this->obj->getSelectEx('id, title, ASTEXT(`geom`) as `geom` ')); + while($db2->nr()) { + + $coords = $this->mysql2json($db2->f('geom')); + $row = []; + $row['coords'] = $coords; + $row['id'] = $db2->f('id'); + $row['title'] = $db2->f('title'); + + $data['rows'][] = $row; + } + + return $blade->run($this->getBladeTempl('main'), $data); + } + + public function _on_save_edit() { + + $this->obj->set_hidden('geom'); + $this->obj->lPost(); + $this->obj->save(); + $this->id = $this->obj->id; + return $this->_ajax_getForm(); + + } + + + public function _ajax_getForm() { + $this->obj->byId($this->id); + $this->obj->set_hidden('geom'); + $form = new form($this->obj); + $form->setTempl('attrs/poly_form.htm'); + + $formdata = $form->render(); + $polycolor = $this->obj->get('color') ? $this->obj->get('color') : '#00FF00'; + + $returndata = ['html' => $formdata, 'color' => $polycolor, 'title' => $this->obj->get('title') ]; + echo json_encode($returndata); + + // echo $form->render(); + die(); + } + + public function _ajax_editgeom() { + $id = $this->id; + + $this->obj->byId($id); + + if ($this->geom) { + + if (!$this->obj->id) { + $this->obj->set('title', 'Новая зона'); + $this->obj->save(); + $id = $this->obj->id; + } + + $data = []; + foreach ($this->geom[0] as $p) { + $data[] = $p[0] . ' '. $p[1]; + } + $str = "POLYGON((".implode(",", $data)."))"; + $sql = "UPDATE `".$this->obj_name."` SET `geom` = GeomFromText('".$str."') WHERE `id` = '".$id."' "; + $db2 = $this->obj->getDB()->q($sql); + + $ret = []; + $ret['id'] = $id; + $ret['title'] = htmlspecialchars_decode($this->obj->get('title')); + + echo json_encode($ret); + die(); + } + + $ret = []; + $ret['id'] = 0; + echo json_encode($ret); + die(); + } + + public function mysql2json($str) { + // POLYGON((59.94778267548529 30.047386140625,60.12503918773836 30.468986482421876,59.92986664045532 30.963371248046883,59.84083181279909 30.456626863281247,59.960180395813275 30.38933560351563,59.94778267548529 30.047386140625)) + preg_match_all('/POLYGON\(\((.*?)\)\)/', $str, $arr); + $points = explode(',', $arr[1][0]); + + foreach($points as $point) { + $ret[0][] = explode(' ', $point); + } + + return json_encode($ret); + } + + public function _ajax_remove() { + $this->obj->byId($this->id); + $this->obj->del(); + echo '1'; + die(); + } + +} + +?> \ No newline at end of file diff --git a/app/engine/admin/modules/admin_schema.php b/app/engine/admin/modules/admin_schema.php new file mode 100644 index 0000000..c582e96 --- /dev/null +++ b/app/engine/admin/modules/admin_schema.php @@ -0,0 +1,382 @@ +migrationPrefix = date('Ymd-Hi'); + return parent::_init(); + } + + function _on_() { + global $R, $core_db; + $tpl = $R->getTpl( $this->templ, 'body' ); + $tplr = $R->getTpl( $this->templ, 'row' ); + + $db2 = $core_db->q( "SELECT DISTINCT `obj_name` FROM `_sys_datatypes` ORDER BY `obj_name`" ); + while( $db2->r() ) { + $tt = $R->set('obj_name', $db2->f('obj_name'), $tplr ); + $tpl = $R->parse( 'rows', $tt, $tpl ); + $this->obj_cache[] = $db2->f('obj_name'); + } + $tpl = $R->set( 'form', $this->r_table(), $tpl ); + + return $R->clear( $tpl ); + } + + + function r_table() { + global $R, $core_db; + + if (!$this->obj_name) return; + + $tpl = $R->getTpl( $this->templ, 'edit_table' ); + $tplr = $R->getTpl( $this->templ, 'edit_table_row' ); + + $db2 = $core_db->q( 'SELECT * FROM `_sys_datatypes` WHERE `obj_name` = "' . $this->obj_name . '" ORDER BY `attr_order`' ); + while( $db2->r() ) { + $tt = $R->set('name', $db2->f('attr_name'), $tplr ); + $tt = $R->set('attr_desc', $db2->f('attr_desc'), $tt ); + $tt = $R->set('attr_templ', $db2->f('attr_templ'), $tt ); + $tt = $R->set('attr_order', $db2->f('attr_order'), $tt ); + $tt = $R->set('attr_hide', $db2->f('attr_hide')?'checked':'', $tt ); + $tt = $R->set('attr_mand', $db2->f('attr_mand')?'checked':'', $tt ); + $tt = $R->set('attr_view', $this->r_types( $db2->f('attr_type') ), $tt ); + $tpl = $R->parse( 'rows', $tt, $tpl ); + } + $tpl = $R->set('obj_name', $this->obj_name, $tpl ); + $tpl = $R->set('attr_view', $this->r_types(), $tpl ); + + $sql = "SELECT TABLE_COMMENT FROM `information_schema`.`TABLES` where TABLE_SCHEMA = '".$core_db->dbname."' and TABLE_NAME = '".$this->obj_name."' "; + $db2 = $core_db->q($sql); + $db2->nr(); + $tpl = $R->set('obj_title', htmlspecialchars($db2->f('TABLE_COMMENT')), $tpl); + + + return $R->clear( $tpl ); + } + + function r_types( $val = '' ) { + global $loaded_attrs; + sort($loaded_attrs); + sort($this->obj_cache); + $html = ''; + foreach ($loaded_attrs as $v ) { + $classname = 'attr_' . $v; + $size = $classname::getDBType(); + + //eval('$'."size = attr_$v::getDBType();"); + + switch( $v ) { + case 'LINK': + $html .= ''; + foreach( $this->obj_cache as $obj_name ) { + $vv = $v . '|' . $obj_name; + $title = "LINK " . $obj_name; + if ( $vv == $val ) + $html .= ''; + else + $html .= ''; + } + $html .= ''; + break; + case 'MLINK': + $html .= ''; + foreach( $this->obj_cache as $obj_name ) { + $vv = $v . '|' . $obj_name; + $title = "MLINK " . $obj_name; + if ( $vv == $val ) + $html .= ''; + else + $html .= ''; + } + $html .= ''; + break; + default: + if ( $v == $val ) + $html .= ''; + else + $html .= ''; + break; + } + } + return $html; + } + + function _on_add_attr() { + global $cat, $core_db, $auth; + if (!$this->attr_name ) cdie('no attr name'); + if (!$this->attr_type ) cdie('no attr type'); + + $this->sLog( "-- [" . date('Y-m-d H:i:s') . "] Создание атрибута" ); + $this->do_add($this->obj_name, $this->attr_name, $this->attr_type); + + _redirect('?cat=' .$cat->cat .'&obj_name='.$this->obj_name); + } + + function do_add( $obj_name, $attr_name, $attr_type, $attr_title = '', $attr_templ = '', $attr_order = 100 ) { + global $cat, $core_db, $auth; + $sys_obj = false; + if ( ( strpos( $obj_name, '_sys_') !== false ) ) { + $sys_obj = true; + } + + + /* CREATE TABLE */ + $sql = "CREATE TABLE IF NOT EXISTS `" . $obj_name . "` ("; + $sql .= " `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY "; + $sql .= ") ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"; + $core_db->q( $sql ); + $this->sLog( $sql ); + /* ADD Attribute */ + + $v = explode('|',$attr_type); + $v = $v[0]; + eval('$'."size = attr_$v::getDBType();"); + + $sql = "ALTER TABLE `" . $obj_name . "` ADD `" . $attr_name . "` " . $size . " NOT NULL"; + $core_db->q( $sql ); + $this->sLog( $sql ); + + if (substr($attr_type,0,4) == 'LINK') { + /* ADD index */ + $sql = "ALTER TABLE `" . $obj_name . "` ADD INDEX ( `" . $attr_name . "` )"; + $core_db->q( $sql ); + $this->sLog( $sql ); + } + + + if ($attr_type == 'tree_object') { + /* ADD index */ + $sql = "ALTER TABLE `" . $obj_name . "` ADD INDEX ( `" . $attr_name . "` )"; + $core_db->q( $sql ); + $this->sLog( $sql ); + } + + /* ADD to Datatype table */ + $sql = 'REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("'.$obj_name.'","'.$attr_name.'","'.$attr_type.'","'.$attr_title.'","'.$attr_templ.'","'.$attr_order.'")'; + + $core_db->q( $sql ); + $this->sLog( $sql ); + } + + function _on_do_urled() { + global $cat; + + $this->sLog( "-- [" . date('Y-m-d H:i:s') . "] Создание атрибутов" ); + $this->do_add($this->obj_name, 'title', 'input', 'Название','', 50); + $this->do_add($this->obj_name, 'url', 'full_url', 'Полный URL','prefix|cat_id',60 ); + $this->do_add($this->obj_name, 'description', 'redactor_html', 'Текстовый блок'); + $this->do_add($this->obj_name, 'page_description', 'input', 'seo description','',504); + $this->do_add($this->obj_name, 'page_h1', 'input', 'seo H1','',502); + $this->do_add($this->obj_name, 'page_keywords', 'input', 'seo keywords','',503); + $this->do_add($this->obj_name, 'page_title', 'input', 'seo title','',501); + $this->do_add($this->obj_name, '_sys_deleted', 'checkbox', 'Удалённый','', 1000); + $this->do_add($this->obj_name, '_sys_order', 'int12', 'Порядок сортировки','', 800); + $this->do_add($this->obj_name, '_sys_unvisible', 'checkbox', 'Невидимый','', 999); + $this->do_add($this->obj_name, '_sys_lastchange', 'datetime_modify', 'Последнее изменение','', 999); + + _redirect('?cat=' .$cat->cat .'&obj_name='.$this->obj_name); + } + + + function _on_do_treeobj() { + + global $cat; + + $this->sLog( "-- [" . date('Y-m-d H:i:s') . "] Создание атрибутов" ); + $this->do_add($this->obj_name, 'title', 'input', 'Название','', 50); + $this->do_add($this->obj_name, 'parent_id', 'tree_object', 'Родитель','',60 ); + $this->do_add($this->obj_name, 'path_ids', 'input', 'Путь по ID'); + $this->do_add($this->obj_name, 'path_titles', 'input', 'Путь по названию','',504); + $this->do_add($this->obj_name, 'level', 'int12', 'Уровень','',502); + $this->do_add($this->obj_name, '_sys_unvisible', 'checkbox', 'Невидимый','', 999); + + _redirect('?cat=' .$cat->cat .'&obj_name='.$this->obj_name); + } + + + function _on_save_object() { + global $core_db, $cat, $auth; + $attrs = array( 'attr_type', 'attr_templ', 'attr_desc', 'attr_hide', 'attr_mand', 'attr_order', '_sys_deleted' ); + $obj = $this->_obj[$this->obj_name]; + + $sys_obj = false; + if ( ( strpos( $this->obj_name, '_sys_') !== false ) ) { + $sys_obj = true; + } + + + // Вычисляем текущие хеши, чтобы понять, есть ли изменения в данных + $oldObjHash = []; + $db2 = $core_db->q( 'SELECT * FROM `_sys_datatypes` WHERE `obj_name` = "' . $this->obj_name . '" ORDER BY `attr_order`' ); + while( $db2->r() ) { + $attr_hash_array = []; + foreach ($attrs as $k ) { + $attr_hash_array[$k] = $db2->f($k); + } + $oldObjHash[$db2->f('attr_name')] = md5(json_encode($attr_hash_array)); + } + + $sql = "SELECT TABLE_COMMENT FROM `information_schema`.`TABLES` where TABLE_SCHEMA = '".$core_db->dbname."' and TABLE_NAME = '".$this->obj_name."' "; + $db2 = $core_db->q($sql); + $db2->nr(); + $oldObjTitle = $db2->f('TABLE_COMMENT'); + + + foreach ( $obj as $attr_name => $attr_vals ) { + $presave = []; + foreach ($attrs as $k ) { + if (isset( $attr_vals[$k])) { + $presave[$k] = $attr_vals[$k]; + } else { + $presave[$k] = "0"; + } + } + $attr_hash = md5(json_encode($presave)); + + $presave['obj_name'] = $this->obj_name; + $presave['attr_name'] = $attr_name; + if ($attr_hash != $oldObjHash[$attr_name]) { + $this->sLog( "-- [" . date('Y-m-d H:i:s') . "] Изменение атрибута " . $attr_name ); + $sql = 'REPLACE INTO `_sys_datatypes` (`' . implode('`, `',array_keys($presave)) . '`) VALUES ("'.implode('" , "',array_values($presave)) . '")'; + $core_db->q( $sql ); + $this->sLog( $sql ); + } + } + + if ($oldObjTitle != $this->obj_title) { + $sql = "ALTER TABLE `".$this->obj_name."` COMMENT = '".db_escape_string($this->obj_title)."';"; + $core_db->q( $sql ); + $this->sLog( "-- [" . date('Y-m-d H:i:s') . "] Изменение комментария " . $this->obj_name ); + $this->sLog( $sql ); + } + + + _redirect('?cat=' .$cat->cat .'&obj_name='.$this->obj_name); + } + + function sLog( $txt = '' ) { + $f = fopen( _ENGINE_DIR . 'migrations/' . $this->migrationPrefix . '-' . $this->obj_name . ".sql", "a" ); + fputs($f, $txt . ";\n" ); + fclose($f); + + $this->saveMigration($this->migrationPrefix . '-' . $this->obj_name . ".sql"); + + } + + + function _on_del_attr() { + global $core_db, $cat; + $obj_name = $this->obj_name; + $attr_name = $this->attr_name; + if ( $obj_name && $attr_name ) { + + $this->sLog( "-- [" . date('Y-m-d H:i:s') . "] Удаление атрибута " . $attr_name ); + + $core_db->q("DELETE FROM `_sys_datatypes` WHERE `obj_name` = '".$obj_name."' AND `attr_name` = '".$attr_name."'"); + $this->sLog("DELETE FROM `_sys_datatypes` WHERE `obj_name` = '".$obj_name."' AND `attr_name` = '".$attr_name."'"); + + $core_db->q("ALTER TABLE `".$obj_name."` DROP `".$attr_name."`"); + $this->sLog("ALTER TABLE `".$obj_name."` DROP `".$attr_name."`"); + } + + _redirect('?cat=' . $cat->cat . '&obj_name='. $obj_name); + } + + function _on_export() { + global $cat, $core_db; + + $objname = $this->obj_name; + + $sql = "SHOW CREATE TABLE `".$objname."`"; + $db2 = $core_db->q($sql); + $db2->nr(); + $sql_arr[] = $db2->f('Create Table'); + + + $sql = "SELECT * FROM `_sys_datatypes` WHERE `obj_name` = '".$objname."'"; + $db2 = $core_db->q($sql); + while( $db2->nr() ) { + + $sql_arr[] = "REPLACE INTO `_sys_datatypes` + (`obj_name`,`attr_name`,`attr_type`,`attr_templ`,`attr_desc`,`attr_hide`,`attr_mand`,`attr_order`) + VALUES + ( + '".db_escape_string($db2->f('obj_name'))."', + '".db_escape_string($db2->f('attr_name'))."', + '".db_escape_string($db2->f('attr_type'))."', + '".db_escape_string($db2->f('attr_templ'))."', + '".db_escape_string($db2->f('attr_desc'))."', + '".db_escape_string($db2->f('attr_hide'))."', + '".db_escape_string($db2->f('attr_mand'))."', + '".db_escape_string($db2->f('attr_order'))."' + ) + "; + } + + + $html .= implode($sql_arr, ';
'); + + echo $html; + die(); + } + + function _on_export_grp() { + global $core_db; + + foreach( $this->obj_names as $objname ) { + $sql = "SHOW CREATE TABLE `".$objname."`"; + $db2 = $core_db->q($sql); + $db2->nr(); + $sql_arr[] = $db2->f('Create Table'); + + + $sql = "SELECT * FROM `_sys_datatypes` WHERE `obj_name` = '".$objname."'"; + $db2 = $core_db->q($sql); + while( $db2->nr() ) { + + $sql_arr[] = "REPLACE INTO `_sys_datatypes` + (`obj_name`,`attr_name`,`attr_type`,`attr_templ`,`attr_desc`,`attr_hide`,`attr_mand`,`attr_order`) + VALUES + ( + '".db_escape_string($db2->f('obj_name'))."', + '".db_escape_string($db2->f('attr_name'))."', + '".db_escape_string($db2->f('attr_type'))."', + '".db_escape_string($db2->f('attr_templ'))."', + '".db_escape_string($db2->f('attr_desc'))."', + '".db_escape_string($db2->f('attr_hide'))."', + '".db_escape_string($db2->f('attr_mand'))."', + '".db_escape_string($db2->f('attr_order'))."') + "; + } + + + + } + + header('Content-Disposition: attachment; filename=dump.sql'); + + $html .= implode($sql_arr, ';' . PHP_EOL); + echo $html; + + die(); + } + + + function saveMigration($filename) { + global $core_db; + $core_db->q('SELECT apply_datetime FROM _sys_db_migrations WHERE `filename` = "'.db_escape_string($filename).'" '); + if (!$core_db->nr()) { + $core_db->q('INSERT INTO _sys_db_migrations (`filename`,`apply_datetime`) values ("'.db_escape_string($filename).'", "'.date('Y-m-d H:i:s').'" ) '); + } + } + +} + +?> \ No newline at end of file diff --git a/app/engine/admin/modules/admin_tree.php b/app/engine/admin/modules/admin_tree.php new file mode 100644 index 0000000..d540a9b --- /dev/null +++ b/app/engine/admin/modules/admin_tree.php @@ -0,0 +1,102 @@ +getTpl( $this->templ, 'body' ); + $tmp = $this->r_subtree( 0 ); + $tpl = $R->parse( 'rows', $tmp, $tpl ); + $tpl = $R->set( 'form', '', $tpl ); + return $R->clear( $tpl ); + } + + function _on_edit() { + global $R, $cat; + $tpl = $R->getTpl( $this->templ, 'body' ); + + $obj = new cobject ($this->obj_name); + if (!$this->id && $this->parentId ) { + $obj->set('parent_id', $this->parentId ); + } else { + $obj->byId( $this->id ); + } + $form = new form( $obj ); + $tpl = $R->set( 'form', $form->render(), $tpl ); + $tmp = $this->r_subtree( '' ); + $tpl = $R->parse( 'rows', $tmp, $tpl ); + + return $R->clear( $tpl ); + } + + function _on_save_edit() { + global $cat; + $obj = new cobject($this->obj_name); + $obj->lPost(); + $obj->save(); + $this->reindex(0); + _redirect("?cat=" . $cat->cat . '&act=edit&id='.$obj->id); + } + + function r_subtree( $id, $level = 1 ) { + global $R, $core_db; + $tpl = $R->getTpl( $this->templ, 'row' ); + $tplu = $R->getTpl( $this->templ, 'row_unvisible' ); + $tpls = $R->getTpl( $this->templ, 'sep' ); + $obj = new cobject( $this->obj_name ); + $db2 = $core_db->q( $obj->getSelect( ' AND `parent_id` = "'.$id.'" ORDER BY `title` ') ); + while ( $db2->r() ) { + $obj->lRow( $db2 ); + if ($obj->get('_sys_unvisible')) { + $tt = $obj->assign( $tplu ); + } else { + $tt = $obj->assign( $tpl ); + } + for( $i=0; $i<$level; $i++ ) { + $tt = $R->parse( 'seps', $tpls, $tt ); + } + $tmp = $this->r_subtree($db2->f('id'), ($level+1)); + $out .= $R->parse( 'subrows', $tmp, $tt ); + } + + return $out; + } + + function reindex($id, $level = 1) { + global $core_db; + $obj = new cobject( $this->obj_name ); + $pobj = new cobject( $this->obj_name ); + + + $parr_ids = array(); + if ( $id ) { + $pobj->byId($id); + $parr_ids = explode(',', $pobj->get('path_ids')); + $parr_titles = explode('>', $pobj->get('path_titles')); + } + + $db2 = $core_db->q( $obj->getSelect( ' AND `parent_id` = "'.$id.'" ') ); + while ( $db2->r() ) { + $obj->lRow( $db2 ); + $parr_ids_tmp = $parr_ids; + $parr_ids_tmp[] = $db2->f('id'); + + $parr_titles_tmp = $parr_titles; + $parr_titles_tmp[] = $db2->f('title'); + + $obj->set('path_ids', implode(',', $parr_ids_tmp)); + $obj->set('path_titles', implode(' > ', $parr_titles_tmp)); + $obj->set('level', $level); + $obj->save(); + $this->reindex($db2->f('id'), ($level+1)); + } + } + +} + +?> \ No newline at end of file diff --git a/app/engine/admin/modules/auto_title.php b/app/engine/admin/modules/auto_title.php new file mode 100644 index 0000000..c3e9bd8 --- /dev/null +++ b/app/engine/admin/modules/auto_title.php @@ -0,0 +1,15 @@ +path_name); + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/admin/modules/line_menu.php b/app/engine/admin/modules/line_menu.php new file mode 100644 index 0000000..12e42e0 --- /dev/null +++ b/app/engine/admin/modules/line_menu.php @@ -0,0 +1,57 @@ +getTpl( $this->templ, 'body' ); + $tpli = $R->getTpl( $this->templ, 'item' ); + $tplis = $R->getTpl( $this->templ, 'item_sel' ); + $tplsep = $R->getTpl( $this->templ, 'sep' ); + if (!$this->root ) $this->root = $cat->cat; + $this->obj = new cobject(__REAL_CAT_OBJ_); + + $sql_where = ''; + if ($this->noexit) { + $sql_where = ' AND id not in (18) '; + global $auth; + if ($auth->is_login) { + $tpl = $R->set('current_user_name', $auth->user_obj->assign('{name}'), $tpl); + } + } + + $tpl = $R->set('root', 'root'.crc32($this->root), $tpl); + + $db2 = $core_db->q( $this->obj->getSelect(' AND `cat_id` = "'.db_escape_string($this->root).'"') ); + if ($db2->nr() ) { + $this->obj->lRow($db2); + $tpl = $this->obj->assign($tpl); + } + + $db2 = $core_db->q( $this->obj->getSelect( ' AND `parent_cat` = "' . $this->root . '" AND `_sys_unvisible` = "0" '.$sql_where.' ORDER BY `_sys_order`') ); + $first = true; + while ( $db2->r() ) { + $this->obj->lRow( $db2 ); + if ( !in_array($db2->f('cat_id'), $cat->path) ) { + $tt = $this->obj->assign( $tpli ); + } else { + $tt = $this->obj->assign( $tplis ); + } + if ( $first ) $first = false; + else + $tpl = $R->parse( 'menu_item', $tplsep, $tpl ); + + $tpl = $R->parse( 'menu_item', $tt, $tpl ); + } + + return $R->clear( $tpl ); + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/admin/modules/loginbox.php b/app/engine/admin/modules/loginbox.php new file mode 100644 index 0000000..a204006 --- /dev/null +++ b/app/engine/admin/modules/loginbox.php @@ -0,0 +1,65 @@ +is_login() ) { + if ( $this->logout ) { + $auth->do_logout(); + _redirect(''); + } else { + return $this->is_login(); + } + } + else { + if ( $this->login ) { + $this->checkAuth(); + } + return $this->r_form(); + } + } + + function r_form() { + global $R; + $tpl = $R->getTpl( $this->templ, 'form' ); + if ( $this->error ){ + $tpl = $R->set( 'err_msg', $this->error.'
', $tpl ); + } + return $R->clear( $tpl ); + + } + + function is_login() { + global $auth, $R; + $tpl = $R->getTpl( $this->templ, 'islogin' ); + $tpl = $auth->user_obj->assign( $tpl ); + return $R->clear( $tpl ); + } + + function checkAuth() { + global $core_db, $auth; + if (!$this->passwd ) { + $this->error = 'Не указан пароль!'; + return; + } else { + $db2 = $core_db->q( 'SELECT `id` FROM `_sys_users` WHERE LOWER(`login`) = "'.strtolower($this->login).'" AND `passwd` = MD5("'.$this->passwd.'") AND !`_sys_deleted`' ); + if ( $db2->r() ) { + $auth->do_login( $db2->f('id') ); + _redirect(''); + } else { + $this->error = 'Авторизация неверна'; + return; + } + } + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/admin/modules/object_admin.php b/app/engine/admin/modules/object_admin.php new file mode 100644 index 0000000..e693926 --- /dev/null +++ b/app/engine/admin/modules/object_admin.php @@ -0,0 +1,113 @@ +obj = new cobject( $this->obj_name ); + return parent::_init(); + } + + function _on_() { + global $R; + $db = $this->obj->getDB(); + + $tpl = $R->getTpl( $this->templ, 'body' ); + $tplr = $R->getTpl( $this->templ, 'row' ); + $tpltd = $R->getTpl( $this->templ, 'td' ); + $tplth = $R->getTpl( $this->templ, 'th' ); + + $tpl_del_td = $R->getTpl( $this->templ, 'del_td' ); + $tpl_del_th = $R->getTpl( $this->templ, 'del_th' ); + + foreach( $this->obj->attrs as $attr_name => $attrs ) { + if ( $attrs['hide'] ) continue; + $tt = $R->set('attr_name', $attrs['desc'], $tplth ); + $tpl = $R->parse( 'head_cols', $tt, $tpl ); + + $tt = $R->set('attr_name', $attr_name, $tpltd ); + $tplr = $R->parse( 'row_cols', $tt, $tplr); + } + + if ( $this->del ) { + $tpl = $R->parse( 'head_cols', $tpl_del_th, $tpl ); + $tplr = $R->parse( 'row_cols', $tpl_del_td, $tplr); + } + + $filter = new filter( $this->obj_name ); + $filter->parse(); + + $db2 = $db->q( $this->obj->getSelectEx( 'COUNT(*) as `cnt`', $filter->getSQL() ) ); + $db2->r(); + $size = $db2->f('cnt'); + + $pw = new Walker( $size, $this->onPage ); + + $tpl = $R->set( 'filter', $filter->getHTML() , $tpl); + $db2 = $db->q( $this->obj->getSelect( $filter->getSQL() . ' ORDER BY `ID` DESC ' . $pw->getSQL() ) ); + while( $db2->r() ) { + $this->obj->lRow($db2); + $tt = $this->obj->assign( $tplr, true ); + $tpl = $R->parse( 'rows', $tt, $tpl ); + } + + $this->obj->byId($this->id); + if ( !$this->id && !$this->add ) { + $tpl = $R->set( 'form', '' , $tpl); + } else { + $tpl = $R->set( 'form', $this->r_form() , $tpl); + } + $tpl = $R->set( 'walker', $pw->getHTML() , $tpl); + $tpl = $R->set( 'cur_page', $pw->page, $tpl ); + $tpl = $R->set( 'filter_url', $this->_get_filter_url(), $tpl ); + return $R->clear( $tpl ); + } + + + function r_form() { + $form = new form( $this->obj ); + return $form->render(); + } + + function _on_save_edit() { + global $cat; + if ( !$this->id && !$this->add ) _redirect('?cat=' . $cat->cat ); + + $this->obj->lPost(); + if ( $this->obj->validate() ) { + $this->obj->save(); + } else { + return $this->r_form(); + } + _redirect('?cat=' . $cat->cat . '&' . $this->_get_filter_url() .'&curpage='.$_GET['curpage'] ); + } + + function _on_del() { + global $cat; + if ( $this->del ) { + $this->obj->byId( $this->id ); + $this->obj->del(); + } + _redirect('?cat=' . $cat->cat . '&' . $this->_get_filter_url() .'&curpage='.$_GET['curpage']); + } + + function _get_filter_url() { + foreach( $_GET as $k => $v ) { + if ( strpos($k, $this->obj_name.'_') === 0 ) { + $ret = '&'.$k.'='.$v; + } + } + return $ret; + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/admin/modules/object_polygon_view.php b/app/engine/admin/modules/object_polygon_view.php new file mode 100644 index 0000000..ece29f2 --- /dev/null +++ b/app/engine/admin/modules/object_polygon_view.php @@ -0,0 +1,58 @@ +obj = new cobject($this->obj_name); + return parent::_init(); + } + + public function _on_() { + global $R, $db, $core_db; + $tpl = $R->getTpl($this->templ, 'body'); + $tplr = $R->getTpl($this->templ, 'row'); + + $db2 = $this->obj->getDB()->q($this->obj->getSelectEx('id, title, color, ASTEXT(`geom`) as `geom` ')); + while($db2->nr()) { + $tt = $tplr; + + $coords = $this->mysql2json($db2->f('geom')); + $tt = $R->set('coords', $coords, $tt); + $tt = $R->set('id', $db2->f('id'), $tt); + $tt = $R->set('title', htmlspecialchars_decode($db2->f('title')), $tt); + $tt = $R->set('color', $db2->f('color') ? $db2->f('color') : '#00FF00', $tt); + + $tpl = $R->parse('rows', $tt, $tpl); + + } + + + + + return $R->clear($tpl); + } + + + + public function mysql2json($str) { + // POLYGON((59.94778267548529 30.047386140625,60.12503918773836 30.468986482421876,59.92986664045532 30.963371248046883,59.84083181279909 30.456626863281247,59.960180395813275 30.38933560351563,59.94778267548529 30.047386140625)) + preg_match_all('/POLYGON\(\((.*?)\)\)/', $str, $arr); + $points = explode(',', $arr[1][0]); + + foreach($points as $point) { + $ret[0][] = explode(' ', $point); + } + + return json_encode($ret); + } + +} + +?> \ No newline at end of file diff --git a/app/engine/admin/tpls/admin.htm b/app/engine/admin/tpls/admin.htm new file mode 100644 index 0000000..4ba87a0 --- /dev/null +++ b/app/engine/admin/tpls/admin.htm @@ -0,0 +1,28 @@ + + + + {autotitle} + + + + + {include:include/_static_css_headers.htm} + {include:include/_static_js_headers.htm} + {add_headers} + + + + +
+ {body} +
+ + + + \ No newline at end of file diff --git a/app/engine/admin/tpls/admin_cats.htm b/app/engine/admin/tpls/admin_cats.htm new file mode 100644 index 0000000..de0a8f2 --- /dev/null +++ b/app/engine/admin/tpls/admin_cats.htm @@ -0,0 +1,46 @@ +#[body]# +
+

{cur_cat_name}

+ +
+
+
+

Дерево

+
+
+ Корень
+ {rows} +
+
+
+
+
+

Параметры категории

+
+
+ {form} +
+
+
+
+
+ +#[!body]# +#[row]# +{seps}|-- {cat_name} [+]
+{subrows} +#[!row]# +#[sep]# +   +#[!sep]# +#[row_unvisible]# +{seps}|--{cat_name} [+]
+{subrows} +#[!row_unvisible]# \ No newline at end of file diff --git a/app/engine/admin/tpls/admin_content_menu.htm b/app/engine/admin/tpls/admin_content_menu.htm new file mode 100644 index 0000000..d6be9c9 --- /dev/null +++ b/app/engine/admin/tpls/admin_content_menu.htm @@ -0,0 +1,26 @@ +#[body]# +
+

{cur_cat_name}

+
+ {menu_item} +
+
+#[!body]# +#[item]# +
+ +
+{cat_name} +

+
+#[!item]# +#[item_sel]# +
+ +
+{cat_name} +

+
+#[!item_sel]# +#[sep]# +#[!sep]# diff --git a/app/engine/admin/tpls/admin_core_cats.htm b/app/engine/admin/tpls/admin_core_cats.htm new file mode 100644 index 0000000..97f5a77 --- /dev/null +++ b/app/engine/admin/tpls/admin_core_cats.htm @@ -0,0 +1,46 @@ +#[body]# +
+

{cur_cat_name}

+ +
+
+
+

Дерево

+
+
+ Корень
+ {rows} +
+
+
+
+
+

Параметры категории

+
+
+ {form} +
+
+
+
+
+ +#[!body]# +#[row]# +{seps}|-- {cat_name} [+]
+{subrows} +#[!row]# +#[sep]# +   +#[!sep]# +#[row_unvisible]# +{seps}|-- {cat_name} [+]
+{subrows} +#[!row_unvisible]# \ No newline at end of file diff --git a/app/engine/admin/tpls/admin_objects_all.htm b/app/engine/admin/tpls/admin_objects_all.htm new file mode 100644 index 0000000..63c3d86 --- /dev/null +++ b/app/engine/admin/tpls/admin_objects_all.htm @@ -0,0 +1,100 @@ +#[body]# + +
+
+
+
+

{obj_name} {obj_title}

+ + +
+ {filter} +
+
+ + {head_cols}{del_h} + {rows} +
ID
+
+ {walker} +
+
+
+ +
+
+
+

Редактирование объекта [id: {id}]

+
+
+ +
+
+
+ {form} +
+
+
+
+
+ + +#[!body]# +#[del_th]# +Уд. +#[!del_th]# +#[del_td]# + +#[!del_td]# +#[th]# +{attr_name} +#[!th]# +#[td]# +{{attr_name}} +#[!td]# +#[row]# + + + + + + {id}{row_cols} +#[!row]# diff --git a/app/engine/admin/tpls/admin_schema.htm b/app/engine/admin/tpls/admin_schema.htm new file mode 100644 index 0000000..04db751 --- /dev/null +++ b/app/engine/admin/tpls/admin_schema.htm @@ -0,0 +1,131 @@ +#[body]# +
+
+
+
+ +
+ + +
+
+ +
+ + +
+ {rows} +
+ +
+
+
+
+
+

Атрибуты

+
+
+ {form} +
+
+
+
+
+#[!body]# +#[row]# +
+
+ +
+ + {obj_name} +
+#[!row]# +#[edit_table]# +
+

{obj_name}

+ +
+
+ + + + + + + + + + + + + + {rows} +
ИмяНазваниеТипШаблонСкрытьОбязатПорядок
+
+ + + +
+
+
+
+
+
Новый атрибут
+
+ + +
+
+ + +
+
+ + + + +
+
+
+
+
+ +
+
+ + +#[!edit_table]# +#[edit_table_row]# + + {name} + + + + +
+ + +
+ + +
+ + +
+ + + + +#[!edit_table_row]# diff --git a/app/engine/admin/tpls/admin_top_menu.htm b/app/engine/admin/tpls/admin_top_menu.htm new file mode 100644 index 0000000..f0f845e --- /dev/null +++ b/app/engine/admin/tpls/admin_top_menu.htm @@ -0,0 +1,18 @@ +#[body]# +{cat_name} + + +#[!body]# +#[item]# + +#[!item]# +#[item_sel]# + +#[!item_sel]# +#[sep]##[!sep]# diff --git a/app/engine/admin/tpls/admin_top_menu_root.htm b/app/engine/admin/tpls/admin_top_menu_root.htm new file mode 100644 index 0000000..19973b4 --- /dev/null +++ b/app/engine/admin/tpls/admin_top_menu_root.htm @@ -0,0 +1,25 @@ +#[body]# +{_SITE_TITLE_} + + +#[!body]# +#[item]# + +#[!item]# +#[item_sel]# + +#[!item_sel]# +#[sep]##[!sep]# diff --git a/app/engine/admin/tpls/admin_tree.htm b/app/engine/admin/tpls/admin_tree.htm new file mode 100644 index 0000000..41ea939 --- /dev/null +++ b/app/engine/admin/tpls/admin_tree.htm @@ -0,0 +1,43 @@ +#[body]# +
+

{cur_cat_name}

+ +
+
+
+

Дерево

+
+
+ Корень [+]
+ {rows} +
+
+
+
+
+

Параметры объекта

+
+
+ {form} +
+
+
+
+
+ +#[!body]# +#[row]# +{seps}|-- {title} [+]
+{subrows} +#[!row]# +#[sep]# +   +#[!sep]# +#[row_unvisible]# +{seps}|-- {title} [+]
+{subrows} +#[!row_unvisible]# \ No newline at end of file diff --git a/app/engine/admin/tpls/attrs/form.htm b/app/engine/admin/tpls/attrs/form.htm new file mode 100644 index 0000000..d874fc3 --- /dev/null +++ b/app/engine/admin/tpls/attrs/form.htm @@ -0,0 +1,48 @@ +#[body]# +
+
+ {form_rows} + +
+ +
+ +
+
+ {hidden_attrs} + + + + +
+
+#[!body]# +#[row]# +
+ +
+ {attr_html} + {attr_error} +
+
+#[!row]# +#[mand]# +* +#[!mand]# + + +#[row_checkbox]# +
+ +
+
+
+ {attr_html} + +
+ {attr_error} +
+
+
+ +#[!row_checkbox]# \ No newline at end of file diff --git a/app/engine/admin/tpls/attrs/poly_form.htm b/app/engine/admin/tpls/attrs/poly_form.htm new file mode 100644 index 0000000..6b5688d --- /dev/null +++ b/app/engine/admin/tpls/attrs/poly_form.htm @@ -0,0 +1,24 @@ +#[body]# + +
+ + {form_rows} + + + +
+ {hidden_attrs} + + + + +
+
+
+#[!body]# +#[row]# + {attr_title}{attr_mand}:{attr_html}{attr_error} +#[!row]# +#[mand]# +* +#[!mand]# diff --git a/app/engine/admin/tpls/breadcrumbs.htm b/app/engine/admin/tpls/breadcrumbs.htm new file mode 100644 index 0000000..4a932a3 --- /dev/null +++ b/app/engine/admin/tpls/breadcrumbs.htm @@ -0,0 +1,10 @@ +#[body]# + +#[!body]# +#[row]# + +#[!row]# +#[sep]##[!sep]# +#[last_row]# + +#[!last_row]# diff --git a/app/engine/admin/tpls/filters/arts.htm b/app/engine/admin/tpls/filters/arts.htm new file mode 100644 index 0000000..b40b166 --- /dev/null +++ b/app/engine/admin/tpls/filters/arts.htm @@ -0,0 +1,6 @@ +
+{attr_title}:
+ +
diff --git a/app/engine/admin/tpls/filters/date_range.htm b/app/engine/admin/tpls/filters/date_range.htm new file mode 100644 index 0000000..658eca2 --- /dev/null +++ b/app/engine/admin/tpls/filters/date_range.htm @@ -0,0 +1,33 @@ +
+{attr_title}: с по +
+ diff --git a/app/engine/admin/tpls/filters/number.htm b/app/engine/admin/tpls/filters/number.htm new file mode 100644 index 0000000..e881617 --- /dev/null +++ b/app/engine/admin/tpls/filters/number.htm @@ -0,0 +1,3 @@ +
+{attr_title}: +
diff --git a/app/engine/admin/tpls/filters/number_less.htm b/app/engine/admin/tpls/filters/number_less.htm new file mode 100644 index 0000000..0a32ba2 --- /dev/null +++ b/app/engine/admin/tpls/filters/number_less.htm @@ -0,0 +1,5 @@ +
+{attr_title}: + + +
diff --git a/app/engine/admin/tpls/filters/number_more.htm b/app/engine/admin/tpls/filters/number_more.htm new file mode 100644 index 0000000..0a32ba2 --- /dev/null +++ b/app/engine/admin/tpls/filters/number_more.htm @@ -0,0 +1,5 @@ +
+{attr_title}: + + +
diff --git a/app/engine/admin/tpls/include/_static_css_headers.htm b/app/engine/admin/tpls/include/_static_css_headers.htm new file mode 100644 index 0000000..50876cc --- /dev/null +++ b/app/engine/admin/tpls/include/_static_css_headers.htm @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/app/engine/admin/tpls/include/_static_js_headers.htm b/app/engine/admin/tpls/include/_static_js_headers.htm new file mode 100644 index 0000000..21ed651 --- /dev/null +++ b/app/engine/admin/tpls/include/_static_js_headers.htm @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/app/engine/admin/tpls/loginbox.htm b/app/engine/admin/tpls/loginbox.htm new file mode 100644 index 0000000..e90d445 --- /dev/null +++ b/app/engine/admin/tpls/loginbox.htm @@ -0,0 +1,46 @@ +#[form]# +
+
+

Авторизация

+
+
+ + +
+
+ + +
+
{err_msg}
+ +
+
+
+ +#[!form]# + +#[islogin]# +
+
+

Админка Бамболо

+
+
+ +
+
+
+
Имя
+
{name}
+
Привелегии: {group}
+
+
+
+
+ +
+
+
+
+
+ +#[!islogin]# \ No newline at end of file diff --git a/app/engine/admin/tpls/object_admin.htm b/app/engine/admin/tpls/object_admin.htm new file mode 100644 index 0000000..40241dc --- /dev/null +++ b/app/engine/admin/tpls/object_admin.htm @@ -0,0 +1,93 @@ +#[body]# + +
+
+
+
+

{cur_cat_name}

+ +
+ {filter} +
+
+ + {head_cols}{del_h} + {rows} +
ID
+
+ {walker} +
+
+
+ +
+
+
+

Редактирование

+
+
+ +
+
+
+ {form} +
+
+
+
+
+ +#[!body]# +#[del_th]# +Уд. +#[!del_th]# +#[del_td]# + +#[!del_td]# +#[th]# +{attr_name} +#[!th]# +#[td]# +{{attr_name}} +#[!td]# +#[row]# + {id}{row_cols} +#[!row]# \ No newline at end of file diff --git a/app/engine/admin/tpls/object_polygon_view.htm b/app/engine/admin/tpls/object_polygon_view.htm new file mode 100644 index 0000000..87b734d --- /dev/null +++ b/app/engine/admin/tpls/object_polygon_view.htm @@ -0,0 +1,86 @@ +#[body]# + + + + + + + +
+ + + + +#[!body]# + + +#[row]# + myMap.geoObjects.add( + new ymaps.GeoObject({ + geometry: { + type: "Polygon", + coordinates: {coords}, + fillRule: "nonZero" + }, + properties:{ + hintContent: "{title}", + balloonContentHeader: '{title}', + balloonContentFooter: '' + } + }, { + fillColor: '{color}', + strokeColor: '#222', + opacity: 0.6, + strokeWidth: 1, + strokeStyle: 'solid' + }) + ); +#[!row]# \ No newline at end of file diff --git a/app/engine/admin/tpls/pagewalker.htm b/app/engine/admin/tpls/pagewalker.htm new file mode 100644 index 0000000..ed531c1 --- /dev/null +++ b/app/engine/admin/tpls/pagewalker.htm @@ -0,0 +1,5 @@ +#[body]##[!body]# +#[num]#
  • {page_num}
  • #[!num]# +#[num_c]#
  • {page_num}
  • #[!num_c]# +#[page_prev]##[!page_prev]# +#[page_next]#
  • #[!page_next]# diff --git a/app/engine/admin/tpls/shop_admin_polygon.htm b/app/engine/admin/tpls/shop_admin_polygon.htm new file mode 100644 index 0000000..c205952 --- /dev/null +++ b/app/engine/admin/tpls/shop_admin_polygon.htm @@ -0,0 +1,216 @@ +#[body]# + + + + +

    {cur_cat_name}

    +
    +
    +
    + +#[!body]# + + +#[row]# +addPolygon({coords}, {id}, "{title}"); +#[!row]# \ No newline at end of file diff --git a/app/engine/admin/xml/admin.xml b/app/engine/admin/xml/admin.xml new file mode 100644 index 0000000..a587ce2 --- /dev/null +++ b/app/engine/admin/xml/admin.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/engine/bootstrap.php b/app/engine/bootstrap.php new file mode 100644 index 0000000..57be511 --- /dev/null +++ b/app/engine/bootstrap.php @@ -0,0 +1,84 @@ +read() ) { + if (substr( $file, -4 ) == '.php' ) { + require_once( _CORE_DIR . 'attrs/' .$file ); + $classname = 'attr_' . substr( $file,0,-4 ); + if ( class_exists( $classname ) ) { + $loaded_attrs[] = substr( $file,0,-4 ); + } + } + } + } + + // WEB + if ( $is_cli == false ) { + require_once( _ENGINE_DIR . 'rewrite.php'); + + /* */ + require_once( _CORE_DIR . 'auth.core.php'); + $auth = new auth(); + + /* */ + require_once( _CORE_DIR . 'walker.core.php'); + require_once( _CORE_DIR . 'form.core.php'); + require_once( _CORE_DIR . 'filter.core.php'); + + /* render */ + require_once( _CORE_DIR . 'render.core.php'); + $R = new render(); + + require_once( _CORE_DIR . 'blade/BladeOne.php'); + + $blade = new BladeOne( + _BASE_DIR . '/bladetpl', + _BASE_DIR . '/bladetpl/cache', + BladeOne::MODE_AUTO + ); + $blade->share('auth', $auth); + + + /* cat */ + require_once( _CORE_DIR . 'cat.core.php'); + $cat = new cat(); + $blade->share('cat', $cat); + } + +?> \ No newline at end of file diff --git a/app/engine/core/abstract/attr.php b/app/engine/core/abstract/attr.php new file mode 100644 index 0000000..ddb6d7b --- /dev/null +++ b/app/engine/core/abstract/attr.php @@ -0,0 +1,140 @@ +attr_name = $attr_name; + $this->obj = $obj; + } + + /** + * Вызывается при получении POST запроса с данным формы. Сохраняет данные в объект + * @return none + */ + function lPost() { + if ( ini_get('magic_quotes_gpc') ) { + $this->obj->set($this->attr_name,stripslashes($_POST[$this->attr_name])); + } else { + $this->obj->set($this->attr_name,$_POST[$this->attr_name]); + } + } + + + /** + * Получение текущего значения атрибута + * @return mixed текущие значение атрибута + */ + function getCurVal() { + return $this->obj->get( $this->attr_name ); + } + + + /** + * Получение основногом параметров атрибута (обычно шаблон) + * @return mixed + */ + function getAttrTempl() { + return str_replace("]","}",str_replace("[","{",$this->obj->attrs[$this->attr_name]['templ'])); + } + + /** + * Получение конкретного параметра атрибута (тип, обязательность, шаблон итд) + * @param string $setting какой параметр нужно получить + * @return mixed + */ + function getAttrSetting($setting='') { + return $this->obj->attrs[$this->attr_name][$setting]; + } + + + /** + * Метод вызывается всегда при сохранении объекта. + * Последние манипуляции с данными до сохранения в БД + * @return none + */ + function presave() { + if (!is_array($this->getCurVal())) + $this->obj->set($this->attr_name, htmlspecialchars( html_entity_decode( $this->getCurVal() ) ) ); + } + + + /** + * Метод вызывается при валидации объекта. + * Проверяется корретность заполнения. + * Соответвуют ли данные в атрибуте ожидаемым + * @return bool прошел элемент валидацию или нет + */ + function validate() { + return true; + } + + /** + * Метод для отрисовки HTML элемента управления + * @return html код элемента для страницы + */ + function render_input() { + if ($this->obj->attrs[$this->attr_name]['mand']) { + $required = ' required = "required" '; + } else { + $required = ''; + } + return ''; + } + + /** + * Метод для отрисовки HTML вывода в браузере + * @param boolean $crop использовать сокращённый вывод (для таблиц админки) + * @return html преобразованное значение атрибута для вывода на экран + */ + function render_text( $crop = false) { + return $this->getCurVal(); + } + + /** + * Сохранение SQL ограничение при фильтрации объектов. Используется далее фильтрами + * @param string $sql_where Хвост SQL запроса + */ + function setSqlWhere( $sql_where ) { + $this->sql_where = $sql_where; + } + + /** + * Получаем HTML и SQL хвост для фильтрации объектов + * @param string $sql_where Хвост SQL запроса + * @return array ['html' => 'html код элемента с фильтром', 'sql'=>'SQL хвост запроса'] + */ + function getFilter( $sql_where = '' ) { + return ['html'=> '', 'sql'=>'']; + } + + + /** + * После сохранения объекта, когда уже точно есть ID + * @return none + */ + function postsave() { + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/abstract/filter.php b/app/engine/core/abstract/filter.php new file mode 100644 index 0000000..cb6690f --- /dev/null +++ b/app/engine/core/abstract/filter.php @@ -0,0 +1,75 @@ +attr_name = $attr_name; + $this->obj = $obj; + } + + + function lPost() { + if ( ini_get('magic_quotes_gpc') ) { + $this->obj->set($this->attr_name,stripslashes($_POST[$this->attr_name])); + } else { + $this->obj->set($this->attr_name,$_POST[$this->attr_name]); + } + } + + function getCurVal() { + return $this->obj->get( $this->attr_name ); + } + + function getAttrTempl() { + return str_replace("]","}",str_replace("[","{",$this->obj->attrs[$this->attr_name]['templ'])); + } + + function getAttrSetting($setting='') { + return $this->obj->attrs[$this->attr_name][$setting]; + } + + function presave() { + if (!is_array($this->getCurVal())) + $this->obj->set($this->attr_name, htmlspecialchars( html_entity_decode( $this->getCurVal() ) ) ); + } + + function validate() { + + } + + function render_input() { + return ''; + } + + function render_text( $crop ) { + return $this->getCurVal(); + } + + function setSqlWhere( $sql_where ) { + $this->sql_where = $sql_where; + } + + function getFilter( $sql_where = '' ) { + + $html = "attr_name."'>"; + + + return array('html'=> '', 'sql'=>''); + } + + + + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/abstract/module.php b/app/engine/core/abstract/module.php new file mode 100644 index 0000000..6796126 --- /dev/null +++ b/app/engine/core/abstract/module.php @@ -0,0 +1,158 @@ +cat, $in_cats)) { + $this->_sys_no_load = true; + } + } + + if (isset($loc_data['in_path'])) { + $in_path = explode(',', $loc_data['in_path']); + if (!array_intersect($in_path, $cat->path)) { + $this->_sys_no_load = true; + } + } + + + if (isset($loc_data['not_in_cat'])) { + $in_cats = explode(',', $loc_data['not_in_cat']); + if (in_array($cat->cat, $in_cats)) { + $this->_sys_no_load = true; + } + } + //pr($cat->path); + if (isset($loc_data['not_in_path'])) { + $in_path = explode(',', $loc_data['not_in_path']); + if (array_intersect($in_path, $cat->path)) { + $this->_sys_no_load = true; + } + } + + /* init vars */ + foreach ($this->_get_vars as $k) { + if (isset($_GET[$k])) { + if (is_array($_GET[$k])) { + $this->$k = $_GET[$k]; + } else { + $this->$k = addslashes($_GET[$k]); + } + } + } + foreach ($this->_post_vars as $k) { + if (isset($_POST[$k])) { + if (is_array($_POST[$k])) { + $this->$k = $_POST[$k]; + } else { + $this->$k = addslashes($_POST[$k]); + } + } + } + + foreach ($this->_loc_vars as $k) { + if (isset($loc_data[$k])) { + if (is_array($loc_data[$k])) { + $this->$k = $loc_data[$k]; + } else { + $this->$k = $loc_data[$k]; + } + } + } + + + if (!$this->_init()) { + cdie(); + } + + } + + public function _init() { + return true; + } + + public function render($templ = '', $ajax = false) { + $this->is_ajax = $ajax; + + if ($templ == 'body') { + if ($ajax) { + if (method_exists($this, '_ajax_' . $this->act)) { + $render = '_ajax_' . $this->act; + } else { + $render = '_on_' . $this->act; + } + } else { + $render = '_on_' . $this->act; + } + } else { + if (method_exists($this, '_'.$templ.'_')) { + $render = '_'.$templ.'_'; + } else { + $render = '_on_'; + } + } + + if (method_exists($this, $render)) { + return $this->$render(); + } else { + if (!$this->url_parse()) { + return $this->die404(); + } else { + return $this->url_parse(); + } + } + } + + public function url_parse() { + return false; + } + + public function die404() { + global $cat; + $cat->addTitle('Страница не найдена'); + Header("HTTP/1.0 404 Not Found", true, 404); + $html = ' +
    +

    Ошибка 404

    +
    Страница не найдена
    или у Вас нет доступа к ней
    + +
    + '; + + return $html; + } + + /** + * Получаем шаблон для Блейда + * @param string $templName имя шаблона + * @return false|string + */ + public function getBladeTempl($templName = "") { + $baseTempl = $this->templBlade; + if (substr($baseTempl, -1) == '.') { + $baseTempl = substr($baseTempl, 0, -1); + } + if ($templName == "") { + return $baseTempl; + } + return $baseTempl . '.' . $templName; + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/LINK.php b/app/engine/core/attrs/LINK.php new file mode 100644 index 0000000..8264d22 --- /dev/null +++ b/app/engine/core/attrs/LINK.php @@ -0,0 +1,119 @@ +attr_name = $attr_name; + $this->obj = $obj; + $full_type = $obj->attrs[$attr_name]['type']; + $arr = explode("|", $full_type); + $lobj_name = $arr[1]; + if ($lobj_name == $obj->obj_name ) cdie('recursion'); + $this->lobj_name = $lobj_name; + //$this->linked_obj = new cobject( $lobj_name, $this->obj->recursion_depth ); + } + function getDBType() { + return "int(12)"; + } + + function getLinkedObj() { + if ( !$this->linked_obj ) { + $this->linked_obj = new cobject( $this->lobj_name, $this->obj->recursion_depth ); + } + return $this->linked_obj; + } + + function render_text( $crop = false ) { + $id = $this->getCurVal(); + $out = ''; + $tpl = $this->obj->attrs[$this->attr_name]['templ']; + if ( $id && $tpl) { + $this->getLinkedObj()->byId( $id ); + $out = $this->getLinkedObj()->assign( $tpl ); + } elseif ( $id ) { + return $id; + } + + return $out; + } + + function render_input() { + $db = $this->getLinkedObj()->getDB(); + $db2 = $db->q( $this->getLinkedObj()->getSelect( $this->sql_where ) ); + $id = $this->getCurVal(); + $tpl = $this->obj->attrs[$this->attr_name]['templ']; + $out = ''; + return $out; + } + + function getFilter( $sql_where = '' ) { + $db = $this->getLinkedObj()->getDB(); + $fname = $this->obj->obj_name . '_' . $this->attr_name; + $uniq_ids = array(); + if ( $this->obj->obj_name ) { + $db3 = $this->obj->getDB()->q( $this->obj->getSelectEx( ' DISTINCT(`'.$this->attr_name.'`) as `'.$this->attr_name.'` ', '' ) ); + while ( $db3->nr() ) { + $uniq_ids[] = $db3->f($this->attr_name); + } + } else { + $uniq_ids = array(); + } + + if (!$_GET[$fname]) { + $tmp = array(''); + $tmp_s = array('Все'); + } else { + $tmp = array(''); + $tmp_s = array('Все'); + } + + $db2 = $db->q( $this->getLinkedObj()->getSelect( $sql_where) ); + $c = 0; + while ( $db2->r() ) { + + if ( $this->obj->obj_name && !in_array( $db2->f('id'), $uniq_ids ) ) continue; + $tpl = strip_tags( $this->getAttrTempl() ); + $this->getLinkedObj()->lRow($db2); + $tpl = $this->getLinkedObj()->assign($tpl, true); + if ( strlen($tpl) > 100 ) $tpl = substr($tpl,0,100) . '...'; + + if ($_GET[$fname] != $db2->f('id')) { + $tplh = ''; + $tplh_s = '' .$tpl . ''; + } else { + $tplh = ''; + $tplh_s = '' .$tpl . ''; + $ret['sql'] = " AND " . ($this->obj->obj_name?('`'.$this->obj->obj_name."`.`".$this->attr_name.'`'):($this->attr_name)) . " = '" . $db2->f('id') . "' " ; + } + $tmp[] = $tplh; + $tmp_s[] = $tplh_s; + $c++; + } + + if ($c > 10 ) { + $ret['html'] = '"; + } else { + $ret['html'] .= implode(' | ', $tmp_s); + } + return $ret; + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/MLINK.php b/app/engine/core/attrs/MLINK.php new file mode 100644 index 0000000..8b92907 --- /dev/null +++ b/app/engine/core/attrs/MLINK.php @@ -0,0 +1,139 @@ +attr_name = $attr_name; + $this->obj = $obj; + $full_type = $obj->attrs[$attr_name]['type']; + $arr = explode("|", $full_type); + $lobj_name = $arr[1]; + //if ($lobj_name == $obj->obj_name ) cdie('recursion'); + $this->lobj_name = $lobj_name; + //$this->linked_obj = new cobject( $lobj_name, $this->obj->recursion_depth ); + } + + function getDBType() { + return "varchar(255)"; + } + + function getLinkedObj() { + if ( !$this->linked_obj ) { + $this->linked_obj = new cobject( $this->lobj_name, $this->obj->recursion_depth ); + } + return $this->linked_obj; + } + + function lPost() { + if (is_array($_POST[$this->attr_name])) { + $this->obj->set($this->attr_name,implode(",",$_POST[$this->attr_name])); + } else { + $this->obj->set($this->attr_name,$_POST[$this->attr_name]); + } + } + + + function render_text( $crop = false ) { + $id = $this->getCurVal(); + if ( $id ) $ids = explode( ",", $id ); + $tpl = $this->obj->attrs[$this->attr_name]['templ']; + $outa = array(); + if ( $ids ) { + foreach( $ids as $id ) { + $this->getLinkedObj()->byId( $id ); // Показывать удаленные + $outa[] = $this->getLinkedObj()->assign( $tpl ); + } + if ($outa ) { + sort($outa); + } + } + return implode("; ", $outa); + } + + + function render_input() { + global $core; + + $db = $this->getLinkedObj()->getDB(); + $db2 = $db->q( $this->getLinkedObj()->getSelect( $this->sql_where ) ); + $out = ''; + $id = $this->getCurVal(); + if ( $id ) $ids = explode( ",", $id ); + $tpl = $this->obj->attrs[$this->attr_name]['templ']; + while ( $db2->r() ) { + $this->getLinkedObj()->lRow( $db2 ); + $tt = $this->getLinkedObj()->assign( $tpl ); + if ( $ids && in_array( $db2->f( 'id' ), $ids ) ) $checked = 'checked'; + else $checked = ''; + $out .= ' +
    +
    + + +
    +
    + '; + } + return $out; + } + function getFilter( $sql_where = '' ) { + $db = $this->getLinkedObj()->getDB(); + $fname = $this->obj->obj_name . '_' . $this->attr_name; + $uniq_ids = array(); + if ( $this->obj->obj_name ) { + $db3 = $this->obj->getDB()->q( $this->obj->getSelectEx( ' DISTINCT(`'.$this->attr_name.'`) as `'.$this->attr_name.'` ', '' ) ); + while ( $db3->nr() ) { + $uniq_ids[] = $db3->f($this->attr_name); + } + } else { + $uniq_ids = array(); + } + + if (!$_GET[$fname]) { + $tmp = array(''); + $tmp_s = array('Все'); + } else { + $tmp = array(''); + $tmp_s = array('Все'); + } + + $db2 = $db->q( $this->getLinkedObj()->getSelect( $sql_where) ); + $c = 0; + while ( $db2->r() ) { + + if ( $this->obj->obj_name && !in_array( $db2->f('id'), $uniq_ids ) ) continue; + $tpl = strip_tags( $this->getAttrTempl() ); + $this->getLinkedObj()->lRow($db2); + $tpl = $this->getLinkedObj()->assign($tpl, true); + if ( strlen($tpl) > 100 ) $tpl = substr($tpl,0,100) . '...'; + + if ($_GET[$fname] != $db2->f('id')) { + $tplh = ''; + $tplh_s = '' .$tpl . ''; + } else { + $tplh = ''; + $tplh_s = '' .$tpl . ''; + $ret['sql'] = " AND FIND_IN_SET( ".$db2->f('id').",`" . $this->obj->obj_name . "`.`" . $this->attr_name . "`)" ; + } + $tmp[] = $tplh; + $tmp_s[] = $tplh_s; + $c++; + } + + if ($c > 10 ) { + $ret['html'] = '"; + } else { + $ret['html'] .= implode(' | ', $tmp_s); + } + return $ret; + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/checkbox.php b/app/engine/core/attrs/checkbox.php new file mode 100644 index 0000000..0ecdd5a --- /dev/null +++ b/app/engine/core/attrs/checkbox.php @@ -0,0 +1,23 @@ +attr_name . '" type="checkbox" name="' . $this->attr_name . '" '.($this->getCurVal()?'checked':'').' value="1">'; + return $html; + } + + function render_text( $crop = false ) { + if ($this->getCurVal() ) $val = 'Да'; + else $val = 'Нет'; + return $val; + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/color.php b/app/engine/core/attrs/color.php new file mode 100644 index 0000000..8f19a0f --- /dev/null +++ b/app/engine/core/attrs/color.php @@ -0,0 +1,28 @@ +getCurVal(); + $tpl = ''; + return $tpl; + } + + function render_text( $crop = false ) { + if ($crop) { + $color = $this->getCurVal(); + if ($color) { + return ''.$color.''; + } else { + return ''; + } + } + return $this->getCurVal(); + } +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/color_picker.php b/app/engine/core/attrs/color_picker.php new file mode 100644 index 0000000..54e2391 --- /dev/null +++ b/app/engine/core/attrs/color_picker.php @@ -0,0 +1,21 @@ +obj->attrs[$this->attr_name]['mand']) { + $required = ' required = "required" '; + } else { + $required = ''; + } + return ''; + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/date.php b/app/engine/core/attrs/date.php new file mode 100644 index 0000000..fc1354f --- /dev/null +++ b/app/engine/core/attrs/date.php @@ -0,0 +1,213 @@ +getAttrSetting('mand')) + $defval = date('Y-m-d'); + else + $defval = ''; + + $cv = $this->getCurVal(); + + $tpl = ''; + return $tpl; + + } + + function lPost() { + $time = strtotime($_POST[$this->attr_name] . ' 00:00:00'); + if ( $time == false ) { + $time = $_POST[$this->attr_name]; + } + + if (empty($_POST[$this->attr_name]) && !$this->getAttrSetting('mand') ) { + $time = 0; + } + + $this->obj->set($this->attr_name, $time); + } + + function render_text( $crop = false ) { + if ( $this->getCurVal() ) { + return date('d.m.Y',$this->getCurVal()); + } else { + return ''; + } + } + + function getFilter( $sql_where = '' ) { + + $fname = $this->obj->obj_name . '_' . $this->attr_name; + + if (!isset($_GET[$fname.'_year'])) $_GET[$fname.'_year'] = 0; + if (!isset($_GET[$fname.'_month'])) $_GET[$fname.'_month'] = 0; + if (!isset($_GET[$fname.'_week'])) $_GET[$fname.'_week'] = 0; + if (!isset($_GET[$fname.'_sday'])) $_GET[$fname.'_sday'] = 0; + + $y = intval( $_GET[$fname.'_year'] ); + $m = intval( $_GET[$fname.'_month'] ); + $w = intval( $_GET[$fname.'_week'] ); + $d = intval( $_GET[$fname.'_sday'] ); + + $ret = ''; + // Display + // By date + // year + $nofirst = true ; + + if ($y=='0') + $html.="Все"; + else + $html.="Все"; + + for ($year=2010;$year<=date('Y')+2;$year++) { + if ( $nofirst ) { + $html .= ' | '; + } + $nofirst = true; + $html.=""; + if ($y==$year) + $html.= "$year"; + else + $html.= "$year"; + $html.=""; + } + $html.= "
    "; + // month + if ($m=='0') + $html.="Все"; + else + $html.="Все"; + for ($month=1;$month<=12;$month++) { + $html .= ' | '; + $html.=""; + if ($m==$month) + $html.= ""._getMonthName($month).""; + else + $html.= _getMonthName($month); + $html.=""; + } + $html.= "
    "; + // week + if ( $sql_where != 'noweek' ) { + if ($w=='0') + $html.="Все"; + else + $html.="Все"; + + $weeks = $this->getSeven(mktime(0,0,0, $m, 1, $y)); + + foreach ($weeks as $k=>$week) { + if ($k == 0) continue; + $html .= ' | '; + $html .=""; + if ($w==$k) + $html .= "".date('d', $weeks[($k-1)]).'-'.date('d', $week).""; + else + $html .= date('d', $weeks[($k-1)]).'-'.date('d', $week); + $html.=""; + } + + $html .= "
    "; + // day + if ( $sql_where != 'nodays' ) { + + if ($d=='0') + $html.= "Все"; + else + $html.= "Все"; + + for ($i=1; $i<=date("t", mktime(0,0,0,$m,1,$y)); $i++) { + if ($i == 0) continue; + $html .= ' | '; + $html .= ""; + if ($d==$i) + $html.= "".$i.""; + else + $html.= $i; + $html.=""; + } + $html .= "
    "; + $html.= ""; + if ( ( $d == date('d') ) && ($y == date('Y') ) && ($m == date('m') ) ) { + $html .="Сегодня"; + } else { + $html .="Сегодня"; + } + $html .=""; + } + } + // SQL + $range = $this->getTimeRangeMonth($y, $m); + + if ( $w ) { + $ret .= ' AND + ( '. ($this->obj->obj_name?($this->obj->obj_name. '.'):'') . $this->attr_name .' >= ' . $weeks[($w-1)] . ' + AND + '. ($this->obj->obj_name?($this->obj->obj_name. '.'):'') . $this->attr_name .' <= ' . $weeks[$w] . ' )'; + }elseif ( $d ) { + $ret .= ' AND + ( '. ($this->obj->obj_name?($this->obj->obj_name. '.'):'') . $this->attr_name .' >= ' . mktime(0,0,0,$m, $d, $y) . ' + AND + '. ($this->obj->obj_name?($this->obj->obj_name. '.'):'') . $this->attr_name .' <= ' . mktime(23,59,59,$m, $d, $y) . ' )'; + + } else { + $ret .= ' AND + ( '. ($this->obj->obj_name?($this->obj->obj_name. '.'):'') . $this->attr_name .' >= ' . $range['first'] . ' + AND + '. ($this->obj->obj_name?($this->obj->obj_name. '.'):'') . $this->attr_name .' <= ' . $range['last'] . ' )'; + } + $r['sql'] = $ret; + $r['html'] = $html; + + return $r; } + + + function getTimeRangeMonth($year, $month) { + if ($year && $month) { + $ret['first'] = mktime(0,0,0,$month,1,$year); + $ret['last'] = mktime(23,59,59,$month,date("t", $ret['first']),$year); + } + else { + if ($year) { + $ret['first'] = mktime(0,0,0,1,1,$year); + $ret['last'] = mktime(23,59,59,12,31,$year); + } + else { + $ret['first'] = 0; + $ret['last'] = 999999999999; + } + } + + return $ret; + } + + function getSeven ($date) { // С шагом в 7 дней + $day = date('d', $date); + $first_day = mktime(0,0,0,date('m', $date),1,date('Y', $date)); + $last_day = mktime(23,59,59,date('m', $date),date('t', $date),date('Y', $date)); + $ret[] = $first_day; + $tmp = $first_day; + while ( $tmp < $last_day ) { + $tmp = mktime(0,0,0,date('m', $tmp),date('d', $tmp)+7,date('Y', $tmp)); + if ($tmp > $last_day) + $ret[] = $last_day; + else + $ret[] = $tmp; + } + return $ret; + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/datereal.php b/app/engine/core/attrs/datereal.php new file mode 100644 index 0000000..11613c7 --- /dev/null +++ b/app/engine/core/attrs/datereal.php @@ -0,0 +1,44 @@ +getAttrSetting('mand')) + $defval = date('Y-m-d'); + else + $defval = ''; + + $cv = $this->getCurVal(); + + $tpl = ''; + return $tpl; + + } + + function lPost() { + $time = strtotime($_POST[$this->attr_name] . ' 00:00:00'); + if ( $time == false ) { + $time = $_POST[$this->attr_name]; + } + + if (empty($_POST[$this->attr_name]) && !$this->getAttrSetting('mand') ) { + $time = 0; + } + + $this->obj->set($this->attr_name, date('Y-m-d', $time)); + } + + function render_text( $crop = false ) { + if ( $this->getCurVal() ) { + return $this->getCurVal(); + } else { + return ''; + } + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/datetime.php b/app/engine/core/attrs/datetime.php new file mode 100644 index 0000000..664f6e9 --- /dev/null +++ b/app/engine/core/attrs/datetime.php @@ -0,0 +1,205 @@ +getAttrSetting('mand')) + $defval = date('Y-m-d\TH:i:00'); + else + $defval = ''; + + $cv = $this->getCurVal(); + + $tpl = ''; + return $tpl; + } + + function lPost() { + $time = strtotime($_POST[$this->attr_name]); + if ( $time == false ) { + $time = $_POST[$this->attr_name]; + } + $this->obj->set($this->attr_name, $time); + } + + function render_text( $crop = false ) { + return date('d.m.Y H:i:s',$this->getCurVal()); + } + + + function getFilter( $sql_where = '' ) { + + $fname = $this->obj->obj_name . '_' . $this->attr_name; + + if (!isset($_GET[$fname.'_year'])) $_GET[$fname.'_year'] = 0; + if (!isset($_GET[$fname.'_month'])) $_GET[$fname.'_month'] = 0; + if (!isset($_GET[$fname.'_week'])) $_GET[$fname.'_week'] = 0; + if (!isset($_GET[$fname.'_sday'])) $_GET[$fname.'_sday'] = 0; + + $y = intval( $_GET[$fname.'_year'] ); + $m = intval( $_GET[$fname.'_month'] ); + $w = intval( $_GET[$fname.'_week'] ); + $d = intval( $_GET[$fname.'_sday'] ); + + $ret = ''; + // Display + // By date + // year + $nofirst = true ; + + if ($y=='0') + $html.="Все"; + else + $html.="Все"; + + for ($year=2010;$year<=date('Y')+2;$year++) { + if ( $nofirst ) { + $html .= ' | '; + } + $nofirst = true; + $html.=""; + if ($y==$year) + $html.= "$year"; + else + $html.= "$year"; + $html.=""; + } + $html.= "
    "; + // month + if ($m=='0') + $html.="Все"; + else + $html.="Все"; + for ($month=1;$month<=12;$month++) { + $html .= ' | '; + $html.=""; + if ($m==$month) + $html.= ""._getMonthName($month).""; + else + $html.= _getMonthName($month); + $html.=""; + } + $html.= "
    "; + // week + if ( $sql_where != 'noweek' ) { + if ($w=='0') + $html.="Все"; + else + $html.="Все"; + + $weeks = $this->getSeven(mktime(0,0,0, $m, 1, $y)); + + foreach ($weeks as $k=>$week) { + if ($k == 0) continue; + $html .= ' | '; + $html .=""; + if ($w==$k) + $html .= "".date('d', $weeks[($k-1)]).'-'.date('d', $week).""; + else + $html .= date('d', $weeks[($k-1)]).'-'.date('d', $week); + $html.=""; + } + + $html .= "
    "; + // day + if ( $sql_where != 'nodays' ) { + + if ($d=='0') + $html.= "Все"; + else + $html.= "Все"; + + for ($i=1; $i<=date("t", mktime(0,0,0,$m,1,$y)); $i++) { + if ($i == 0) continue; + $html .= ' | '; + $html .= ""; + if ($d==$i) + $html.= "".$i.""; + else + $html.= $i; + $html.=""; + } + $html .= "
    "; + $html.= ""; + if ( ( $d == date('d') ) && ($y == date('Y') ) && ($m == date('m') ) ) { + $html .="Сегодня"; + } else { + $html .="Сегодня"; + } + $html .=""; + } + } + // SQL + $range = $this->getTimeRangeMonth($y, $m); + + if ( $w ) { + $ret .= ' AND + ( '. ($this->obj->obj_name?($this->obj->obj_name. '.'):'') . $this->attr_name .' >= ' . $weeks[($w-1)] . ' + AND + '. ($this->obj->obj_name?($this->obj->obj_name. '.'):'') . $this->attr_name .' <= ' . $weeks[$w] . ' )'; + }elseif ( $d ) { + $ret .= ' AND + ( '. ($this->obj->obj_name?($this->obj->obj_name. '.'):'') . $this->attr_name .' >= ' . mktime(0,0,0,$m, $d, $y) . ' + AND + '. ($this->obj->obj_name?($this->obj->obj_name. '.'):'') . $this->attr_name .' <= ' . mktime(23,59,59,$m, $d, $y) . ' )'; + + } else { + $ret .= ' AND + ( '. ($this->obj->obj_name?($this->obj->obj_name. '.'):'') . $this->attr_name .' >= ' . $range['first'] . ' + AND + '. ($this->obj->obj_name?($this->obj->obj_name. '.'):'') . $this->attr_name .' <= ' . $range['last'] . ' )'; + } + $r['sql'] = $ret; + $r['html'] = $html; + + return $r; + } + + + function getTimeRangeMonth($year, $month) { + if ($year && $month) { + $ret['first'] = mktime(0,0,0,$month,1,$year); + $ret['last'] = mktime(23,59,59,$month,date("t", $ret['first']),$year); + } + else { + if ($year) { + $ret['first'] = mktime(0,0,0,1,1,$year); + $ret['last'] = mktime(23,59,59,12,31,$year); + } + else { + $ret['first'] = 0; + $ret['last'] = 999999999999; + } + } + + return $ret; + } + + function getSeven ($date) { // С шагом в 7 дней + $day = date('d', $date); + $first_day = mktime(0,0,0,date('m', $date),1,date('Y', $date)); + $last_day = mktime(23,59,59,date('m', $date),date('t', $date),date('Y', $date)); + $ret[] = $first_day; + $tmp = $first_day; + while ( $tmp < $last_day ) { + $tmp = mktime(0,0,0,date('m', $tmp),date('d', $tmp)+7,date('Y', $tmp)); + if ($tmp > $last_day) + $ret[] = $last_day; + else + $ret[] = $tmp; + } + return $ret; + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/datetime_modify.php b/app/engine/core/attrs/datetime_modify.php new file mode 100644 index 0000000..129a114 --- /dev/null +++ b/app/engine/core/attrs/datetime_modify.php @@ -0,0 +1,25 @@ +obj->set($this->attr_name, time()); + } + + function presave() { + // $this->obj->set($this->attr_name, time()); + } + + function render_text( $crop = false ) { + return date('d.m.Y H:i:s',$this->getCurVal()); + } +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/datetimereal.php b/app/engine/core/attrs/datetimereal.php new file mode 100644 index 0000000..54831ed --- /dev/null +++ b/app/engine/core/attrs/datetimereal.php @@ -0,0 +1,44 @@ +getAttrSetting('mand')) + $defval = date('Y-m-d\TH:i:00'); + else + $defval = ''; + + $cv = $this->getCurVal(); + + $tpl = ''; + return $tpl; + } + + + function lPost() { + $time = strtotime($_POST[$this->attr_name]); + if ( $time == false ) { + $time = $_POST[$this->attr_name]; + } + + if (empty($_POST[$this->attr_name]) && !$this->getAttrSetting('mand') ) { + $time = 0; + } + + $this->obj->set($this->attr_name, date('Y-m-d H:i:s', $time)); + } + + function render_text( $crop = false ) { + if ( $this->getCurVal() ) { + return $this->getCurVal(); + } else { + return ''; + } + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/email.php b/app/engine/core/attrs/email.php new file mode 100644 index 0000000..ee58076 --- /dev/null +++ b/app/engine/core/attrs/email.php @@ -0,0 +1,51 @@ +attr_name])); + $this->obj->set($this->attr_name, $val); + } + + + + function render_text( $crop = false ) { + return $this->getCurVal(); + } + + function validate() { + if ( !preg_match("/^([a-z0-9_\.-]+)@([a-z0-9_\.-]+)\.([a-z\.]{2,6})$/i",strtolower($this->getCurVal()) ) ) { + return 'Неверный формат ввода'; + } + } + + function render_input() { + return ''; + } + + function getFilter( $sql_where = '' ) { + + $fname = $this->obj->obj_name . '_' . $this->attr_name; + $html = ' + '; + + $sql = ''; + if ( $_GET[$fname] ) { + $sql = ' AND `' . $this->attr_name . '` LIKE "%' . db_escape_string($_GET[$fname]) . '%" '; + } + + return array('html'=> $html, 'sql'=> $sql); + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/file.php b/app/engine/core/attrs/file.php new file mode 100644 index 0000000..42796f2 --- /dev/null +++ b/app/engine/core/attrs/file.php @@ -0,0 +1,61 @@ +attr_name . '">'; + $html .= ''; + if ( $this->getCurVal() ) { + $html .= '
    '; + } + return $html; + } + + function lPost() { + $tmpObj = new cobject( '_sys_files' ); + $file = $_FILES[$this->attr_name]; + + $fileContent = file_get_contents($file['tmp_name']); + $fname = md5($fileContent); + + $fpath = substr($fname,0,2); + $fpath2 = substr($fname,2,2); + @mkdir( _FILES_DIR_ . $fpath . '/' . $fpath2, 0777, true ); + $fname = $fpath .'/' . $fpath2 . '/' . $fname; + + + + if ($_POST[$this->attr_name . '_del']) { + $this->obj->set( $this->attr_name, 0 ); + } + + if (!$file['error']) { + if ( move_uploaded_file( $file['tmp_name'], _FILES_DIR_.$fname ) ) { + $tmpObj->set('filename', $fname ); + $tmpObj->set('realname', $file['name'] ); + $tmpObj->set('ext', $file['type'] ); + $tmpObj->save(); + $this->obj->set( $this->attr_name, $tmpObj->id ); + } else { + die('Error: проверьте права на сохранение в ' . _FILES_DIR_ . $fpath . '/' . $fpath2); + } + } + } + + function render_text( $crop = false ) { + if ($crop) { + $val = 'Скачать'; + } else { + $val = $this->getCurVal(); + } + return $val; + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/file_direct.php b/app/engine/core/attrs/file_direct.php new file mode 100644 index 0000000..2f0fe82 --- /dev/null +++ b/app/engine/core/attrs/file_direct.php @@ -0,0 +1,56 @@ +attr_name . '">'; + $html .= ''; + if ( $this->getCurVal() ) { + $html .= '
    '; + } + return $html; + } + + function lPost() { + $file = $_FILES[$this->attr_name]; + $fname = md5(microtime(true)); + + if ($_POST[$this->attr_name . '_del']) { + $this->obj->set( $this->attr_name, '' ); + } + + if (!$file['error']) { + + $ext = pathinfo($file['name'], PATHINFO_EXTENSION); + + $fpath = substr($fname,0,2); + @mkdir( _FILES_DIR_ . $fpath ); + + $fpath2 = substr($fname,2,2); + @mkdir( _FILES_DIR_ . $fpath . '/' . $fpath2); + + $fname = $fpath .'/' . $fpath2 . '/'. $file['name']; + + if ( move_uploaded_file( $file['tmp_name'], _FILES_DIR_.$fname ) ) { + $this->obj->set( $this->attr_name, $fname ); + } + } + } + + function render_text( $crop = false ) { + if ($crop) { + $val = 'Скачать'; + } else { + $val = $this->getCurVal(); + } + return $val; + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/file_private.php b/app/engine/core/attrs/file_private.php new file mode 100644 index 0000000..900d0a2 --- /dev/null +++ b/app/engine/core/attrs/file_private.php @@ -0,0 +1,62 @@ +attr_name . '">'; + $html .= ''; + if ( $this->getCurVal() ) { + $html .= '
    '; + } + return $html; + } + + function lPost() { + $tmpObj = new cobject( '_sys_files' ); + $file = $_FILES[$this->attr_name]; + + $fileContent = file_get_contents($file['tmp_name']); + $fname = md5($fileContent); + + $fpath = substr($fname,0,2); + $fpath2 = substr($fname,2,2); + @mkdir( _FILES_DIR_ . $fpath . '/' . $fpath2, 0777, true ); + $fname = $fpath .'/' . $fpath2 . '/' . $fname; + + + + if ($_POST[$this->attr_name . '_del']) { + $this->obj->set( $this->attr_name, 0 ); + } + + if (!$file['error']) { + if ( move_uploaded_file( $file['tmp_name'], _FILES_DIR_.$fname ) ) { + $tmpObj->set('filename', $fname ); + $tmpObj->set('realname', $file['name'] ); + $tmpObj->set('ext', $file['type'] ); + $tmpObj->set('private', 1 ); + $tmpObj->save(); + $this->obj->set( $this->attr_name, $tmpObj->id ); + } else { + die('Error: проверьте права на сохранение в ' . _FILES_DIR_ . $fpath . '/' . $fpath2); + } + } + } + + function render_text( $crop = false ) { + if ($crop) { + $val = 'Скачать'; + } else { + $val = $this->getCurVal(); + } + return $val; + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/float.php b/app/engine/core/attrs/float.php new file mode 100644 index 0000000..4ebff56 --- /dev/null +++ b/app/engine/core/attrs/float.php @@ -0,0 +1,35 @@ +getCurVal() + 0; // auto format trick + $val = number_format ($val, 3, '.',''); + if ( $this->getAttrSetting('mand')) { + return ''; + } else { + return ''; + } + } + + function render_text( $crop = false ) { + if ( !$this->getCurVal() ) return '0'; + + $dec = 2; + $val = $this->getCurVal() + 0; // auto format trick + if ( $this->obj->attrs[$this->attr_name]['templ'] ) { + $val = $this->getCurVal() + 0; // auto format trick + return floatval($val); + } + + + return number_format ($val, $dec, '.',''); + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/full_url.php b/app/engine/core/attrs/full_url.php new file mode 100644 index 0000000..5e255d6 --- /dev/null +++ b/app/engine/core/attrs/full_url.php @@ -0,0 +1,54 @@ +getCurVal(); + } + + function lPost() { + $url = preg_replace('/[^A-Za-z0-9_\-\/\.]/','', $_POST[$this->attr_name]); + + if (!$this->getCurVal()) { + $url = strtolower($url); + } + + $this->obj->set($this->attr_name,$url); + } + + + + function render_input() { + $templ = $this->getAttrTempl(); + list($prefix, $cat_id ) = explode('|', $templ); + if ( $this->getCurVal() && $this->obj->id ) { + return '
    + + '.$this->getCurVal().'
    + '; + } else { + $str = ''." + +"; + return $str; + } + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/geometry.php b/app/engine/core/attrs/geometry.php new file mode 100644 index 0000000..0d963e5 --- /dev/null +++ b/app/engine/core/attrs/geometry.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/app/engine/core/attrs/icon.php b/app/engine/core/attrs/icon.php new file mode 100644 index 0000000..da28d4d --- /dev/null +++ b/app/engine/core/attrs/icon.php @@ -0,0 +1,63 @@ +getCurVal() ) { + $html .= ''; + } + $html .= ''; + $html .= ''; + if ( $this->getCurVal() ) { + $html .= ' +
    + + +
    '; + } + return $html; + } + + function lPost() { + + if ( substr( $this->attr_name, -8 ) == '_preview' ) { + return; + } + + $tmpObj = new cobject( '_sys_files' ); + $file = $_FILES[$this->attr_name]; + $nn = md5(microtime(true)); + + if ($_POST[$this->attr_name . '_del']) { + $this->obj->set( $this->attr_name, '' ); + }elseif ($_POST[$this->attr_name]) { + $this->obj->set( $this->attr_name, $_POST[$this->attr_name] ); + } + + if (!$file['error']) { + $this->obj->set($this->attr_name, 'data:'.$file['type'].';base64,' . base64_encode(file_get_contents($file['tmp_name'])) ); + } + } + + + function render_text( $crop = false ) { + if ($crop) { + if ( $this->getCurVal() ) { + $val = $this->getCurVal(); + } else { + $val = ''; + } + } else { + $val = $this->getCurVal(); + } + return $val; + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/image.php b/app/engine/core/attrs/image.php new file mode 100644 index 0000000..a133453 --- /dev/null +++ b/app/engine/core/attrs/image.php @@ -0,0 +1,125 @@ +getCurVal() ) { + $html .= ''; + } + $html .= ''; + $html .= ''; + if ( $this->getCurVal() ) { + $html .= ' +
    + + +
    '; + } + return $html; + } + + function lPost() { + + if ( substr( $this->attr_name, -8 ) == '_preview' ) { + return; + } + + if ($_POST[$this->attr_name . '_del']) { + $this->obj->set( $this->attr_name, 0 ); + } + if ($_POST[$this->attr_name]) { + $this->obj->set( $this->attr_name, $_POST[$this->attr_name] ); + } + + $file = $_FILES[$this->attr_name]; + if (isset($file['error']) && !$file['error']) { + + require_once (_CORE_DIR . 'image.transform.core.php'); + $tmpObj = new cobject( '_sys_files' ); + $file = $_FILES[$this->attr_name]; + $fileContent = file_get_contents($file['tmp_name']); + + // Имя файла основано на содержимом + + $fname = md5($fileContent); + + $fpath = substr($fname,0,2); + $fpath2 = substr($fname,2,2); + @mkdir( _FILES_DIR_ . $fpath . '/' . $fpath2, 0777, true ); + $fname = $fpath .'/' . $fpath2 . '/' . $fname; + + $toSize = $this->obj->attrs[$this->attr_name]['templ']; + + if (!file_exists(_FILES_DIR_ . $fname .'_'. $toSize) ) { + + $im = imagecreatefromstring($fileContent); + // Сохраняем картинку + $res = imagejpeg($im, _FILES_DIR_ . $fname.'_' , 95 ); + + //Ресайзим если нужно + if ($toSize != "") { + $p = explode('x', $toSize); + if (count($p) == 2) { + $tr = new imageTransform(_FILES_DIR_ . $fname .'_', 'image/jpeg'); + $tr->resize($p[0], $p[1], true); + $tr->save(_FILES_DIR_ .$fname .'_'. $toSize); + } + } + } + + // Сохраняем в базу + $fobj = new cobject('_sys_files'); + $fobj->set('filename', $fname . '_'. $toSize); + $fobj->set('ext','image/jpeg'); + $fobj->set('realname', $file['name']); + $fobj->save(); + + // Сохраняем в объект + $this->obj->set( $this->attr_name, $fobj->id ); + + // Автопревью + if ( isset($this->obj->attrs[$this->attr_name.'_preview']) && $this->obj->attrs[$this->attr_name.'_preview']['templ'] ) { + + $pre_size = $this->obj->attrs[$this->attr_name.'_preview']['templ']; + if ($pre_size != "" ) { + + // Сохраняем в базу + $fobj = new cobject('_sys_files'); + $fobj->set('filename', $fname . '_' . $pre_size ); + $fobj->set('ext','image/jpeg'); + $fobj->set('realname', 'preview_'.$file['name']); + $fobj->save(); + + $this->obj->set( $this->attr_name.'_preview', $fobj->id ); + + copy(_FILES_DIR_.$fname . '_'. $toSize, _FILES_DIR_.$fname.'_' . $pre_size ); + $p = explode('x',$pre_size); + + $tr = new imageTransform(_FILES_DIR_ . $fname.'_' . $pre_size, 'image/jpeg'); + $tr->resize($p[0], $p[1], true); + $tr->save(_FILES_DIR_ .$fname.'_' . $pre_size ); + } + } + } + + } + + + function render_text( $crop = false ) { + if ($crop) { + $val = ''; + } else { + $val = $this->getCurVal(); + $val = getImagePath($val); + } + return $val; + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/input.php b/app/engine/core/attrs/input.php new file mode 100644 index 0000000..1609e3b --- /dev/null +++ b/app/engine/core/attrs/input.php @@ -0,0 +1,31 @@ +getCurVal(); + } + + function getFilter( $sql_where = '' ) { + + $fname = $this->obj->obj_name . '_' . $this->attr_name; + $html = ' + '; + + $sql = ''; + if ( $_GET[$fname] ) { + $sql = ' AND `' . $this->attr_name . '` LIKE "%' . db_escape_string($_GET[$fname]) . '%" '; + } + + return array('html'=> $html, 'sql'=> $sql); + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/int12.php b/app/engine/core/attrs/int12.php new file mode 100644 index 0000000..afd787e --- /dev/null +++ b/app/engine/core/attrs/int12.php @@ -0,0 +1,16 @@ +attr_name . '" type="number" class="form-control" name="' . $this->attr_name . '" value="' .$this->getCurVal() . '">'; + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/json.php b/app/engine/core/attrs/json.php new file mode 100644 index 0000000..1add293 --- /dev/null +++ b/app/engine/core/attrs/json.php @@ -0,0 +1,27 @@ +attr_name.'" name="' . $this->attr_name.'" value=\'' .$this->getCurVal() . '\'/>'; + } + + function render_text( $crop = false ) { + $val = 'JSON DATA'; + return $val; + } + + function lPost() { + + } + + function presave() { + + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/mobile_phone.php b/app/engine/core/attrs/mobile_phone.php new file mode 100644 index 0000000..be770e7 --- /dev/null +++ b/app/engine/core/attrs/mobile_phone.php @@ -0,0 +1,95 @@ +attr_name]); + $this->obj->set($this->attr_name, $val); + } else { + $val = preg_replace('/[^0-9]/','', $_POST[$this->attr_name]); + if ($val) { + $this->obj->set($this->attr_name, _PHONE_PREFIX . substr($val,-_PHONE_LEN)); + } else { + $this->obj->set($this->attr_name, ''); + } + } + } + + function render_text( $crop = false ) { + $p = $this->getCurVal(); + // Форматиирование телефонов + switch( strlen($p) ) { + case 11: // RU + KZ + return '+' . substr($p,0,1) . '('.substr($p,1,3).')'.substr($p,-(strlen($p) - 4 )); + break; + case 12: // BY + return '+' . substr($p,0,3) . '('.substr($p,3,2).')'.substr($p,-(strlen($p) - 5 )); + break; + case 3: + return $p; + break; + case 1: + if (!$p) { + return ''; + } else { + return $p; + } + default: + return '('.substr($p,0,3).')'.substr($p,-(strlen($p) - 3 )); + break; + } + + } + + function validate() { + if ( defined('_ADMINKA_') ) { + if ( !preg_match('/\d{10,}/', $this->getCurVal() ) ) { + return 'Введите телефон в формате
    +[код страны][код города][телефон]'; + } + return; + } else { + $fulllen = _PHONE_LEN + strlen(_PHONE_PREFIX); + if ( !preg_match('/\d{'.$fulllen.'}/', $this->getCurVal() ) ) { + return 'Введите телефон в формате
    +' . _PHONE_PREFIX . str_repeat('X', _PHONE_LEN); + } + } + } + + function render_input() { + if (defined('_PHONE_PLACEHOLDER')) { + $placeholder = _PHONE_PLACEHOLDER; + } else { + $placeholder = '+[код страны][код города][телефон]'; + } + + return 'obj->attrs[$this->attr_name]['mand']?'required':'').'>'; + } + + function getFilter( $sql_where = '' ) { + + $fname = $this->obj->obj_name . '_' . $this->attr_name; + $html = ' + '; + + $sql = ''; + if ( $_GET[$fname] ) { + $sql = ' AND `' . $this->attr_name . '` LIKE "%' . db_escape_string($_GET[$fname]) . '%" '; + } + + return array('html'=> $html, 'sql'=> $sql); + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/modulelist.php b/app/engine/core/attrs/modulelist.php new file mode 100644 index 0000000..c9fa99b --- /dev/null +++ b/app/engine/core/attrs/modulelist.php @@ -0,0 +1,47 @@ +getAttrTempl(); + $val = $this->getCurVal(); + list($dir, $exts) = explode(";", $templ ); + $ext = explode(',', $exts ); + + $file_list = scandir( _ENGINE_DIR . $dir ); + + $html = ''; + return $html; + } + + function render_text( $crop = false ) { + $val = $this->getCurVal(); + if ( $crop ) { + $val = substr(strip_tags($val),0, 100); + } + return $val; + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/money.php b/app/engine/core/attrs/money.php new file mode 100644 index 0000000..de15c28 --- /dev/null +++ b/app/engine/core/attrs/money.php @@ -0,0 +1,28 @@ +getAttrSetting('mand')) { + return ''; + } else { + return ''; + } + } + + + function render_text( $crop = false ) { + if ( !$this->getCurVal() ) return '0'; + if ( $this->obj->attrs[$this->attr_name]['templ'] ) $c = true; else $c= false; + + return nf($this->getCurVal(), $c); + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/passwd.php b/app/engine/core/attrs/passwd.php new file mode 100644 index 0000000..57f9c0f --- /dev/null +++ b/app/engine/core/attrs/passwd.php @@ -0,0 +1,22 @@ +attr_name] != "***" ) { + $this->obj->set($this->attr_name,md5($_POST[$this->attr_name])); + } + } + + function render_input() { + return ''; + } + + function render_text( $crop = false ) { + return '***'; + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/redactor_html.php b/app/engine/core/attrs/redactor_html.php new file mode 100644 index 0000000..3b0f587 --- /dev/null +++ b/app/engine/core/attrs/redactor_html.php @@ -0,0 +1,38 @@ +attr_name.'" name="' . $this->attr_name.'">' .html_entity_decode($this->getCurVal()) . ' + + '; + } + + function render_text( $crop = false ) { + $val = $this->getCurVal(); + if ( $crop ) { + $val = mb_substr(strip_tags(html_entity_decode($val)),0, 100,'UTF-8'); + } + return html_entity_decode($val); + } + + + function lPost() { + if ( ini_get('magic_quotes_gpc') ) { + $this->obj->set($this->attr_name,stripslashes($_POST[$this->attr_name])); + } else { + $this->obj->set($this->attr_name,$_POST[$this->attr_name]); + } + } + + function presave() { + $data = htmlspecialchars( html_entity_decode( $this->getCurVal(), NULL, 'UTF-8' ), NULL, 'UTF-8' ); + $this->obj->set($this->attr_name, $data ); + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/redactor_html_private.php b/app/engine/core/attrs/redactor_html_private.php new file mode 100644 index 0000000..3d4f6ca --- /dev/null +++ b/app/engine/core/attrs/redactor_html_private.php @@ -0,0 +1,38 @@ +attr_name.'" name="' . $this->attr_name.'">' .html_entity_decode($this->getCurVal()) . ' + + '; + } + + function render_text( $crop = false ) { + $val = $this->getCurVal(); + if ( $crop ) { + $val = mb_substr(strip_tags(html_entity_decode($val)),0, 100,'UTF-8'); + } + return html_entity_decode($val); + } + + + function lPost() { + if ( ini_get('magic_quotes_gpc') ) { + $this->obj->set($this->attr_name,stripslashes($_POST[$this->attr_name])); + } else { + $this->obj->set($this->attr_name,$_POST[$this->attr_name]); + } + } + + function presave() { + $data = htmlspecialchars( html_entity_decode( $this->getCurVal(), NULL, 'UTF-8' ), NULL, 'UTF-8' ); + $this->obj->set($this->attr_name, $data ); + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/tags.php b/app/engine/core/attrs/tags.php new file mode 100644 index 0000000..e962bad --- /dev/null +++ b/app/engine/core/attrs/tags.php @@ -0,0 +1,204 @@ +attr_name = $attr_name; + $this->obj = $obj; + $full_type = $obj->attrs[$attr_name]['type']; + $this->lobj_name = 'global_tags'; + $this->lattr_name = 'entity_id'; + $this->linked_obj = new cobject($this->lobj_name); + $this->hashCode = md5($this->lobj_name . $this->attr_name . $this->obj->id); + } + + function getDBType() { + return "int(1)"; + } + + function lPost() { + $this->beenLPost = true; + $data = $_POST[$this->hashCode]; + $curattrs = []; + // Заполняем данные из POST + if (is_array($data) && !empty($data) ) { + $sql = "SELECT id, title, tag_group_id FROM `global_tags_titles` + WHERE id in (".implode(",", $data).") + "; + $db2 = $this->linked_obj->getDB()->q($sql); + + while( $db2->nr() ) { + $curattrs[$db2->f('tag_group_id')][] = array('id' => $db2->f('id'), 'title' => $db2->f('title')); + } + } + $this->presaveData = $curattrs; + $this->obj->diffed[] = $this->attr_name; + } + + + function render_text( $crop = false ) { + + $data = $this->getCurVal(); + $html = ''; + foreach($data as $group_id => $vals) { + foreach( $vals as $val ) { + $html .=''.$val['title'].''; + } + } + return $html; + } + + function getCurVal() { + + // Если была подгрузка из POST, то берём оттуда + if ($this->beenLPost) { + return $this->presaveData; + } + + + // Иначе из базы + $curattrs = []; + $sql = "SELECT global_tags_titles.id, global_tags_titles.title, `".$this->lobj_name."`.tag_group_id FROM `".$this->lobj_name."` + LEFT JOIN `global_tags_titles` ON (`global_tags_titles`.`id` = `".$this->lobj_name."`.`tag_id`) + WHERE `".$this->lattr_name."` = '".$this->obj->id."' "; + $db2 = $this->linked_obj->getDB()->q( $sql ); + + while( $db2->nr() ) { + $curattrs[$db2->f('tag_group_id')][] = array('id' => $db2->f('id'), 'title' => $db2->f('title')); + } + + + return $curattrs; + } + + function render_input() { + $obj_id = $this->linked_obj->id; + + $groupObj = new cobject('global_tags_groups'); + $titleObj = new cobject('global_tags_titles'); + $out = ' + + + + + '; + + $groupList = $groupObj->getList(' ORDER BY `title` '); + + // Получаем текущие значения из базы или POST + $curattrs = $this->getCurVal(); + + $addList = []; + foreach ($groupList as $group_id => $group_title) { + if (isset($curattrs[$group_id])) { + $out .= ' + "; + + } else { + $addList[] = ''; + } + } + + $out .= ' + + + +
    ХарактеристикаЗначение
    ' . $group_title . " +
    + + + Добавить +
    + + '; + + + + + $out .= " "; + + return $out; + } + + // Сохраняем после сохранения основного объекта + function postsave() { + + if (!$this->obj->id ) return false; + + // Очищаем старые значения + $this->linked_obj->getDB()->q('DELETE FROM `'.$this->lobj_name.'` WHERE `'.$this->lattr_name.'` = "'.$this->obj->id.'"'); + foreach($this->presaveData as $group_id => $vals) { + foreach( $vals as $val ) { + $this->linked_obj->byId(0); + $this->linked_obj->set($this->lattr_name, $this->obj->id); + $this->linked_obj->set('tag_id', $val['id']); + $this->linked_obj->set('tag_group_id', $group_id); + $this->linked_obj->save(); + } + } + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/textarea.php b/app/engine/core/attrs/textarea.php new file mode 100644 index 0000000..8a28fde --- /dev/null +++ b/app/engine/core/attrs/textarea.php @@ -0,0 +1,23 @@ +attr_name.'" name="' . $this->attr_name.'">' .$this->getCurVal() . ''; + } + + function render_text( $crop = false ) { + $val = $this->getCurVal(); + if ( $crop ) { + $val = substr(strip_tags($val),0, 100); + } + return $val; + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/textarea_html.php b/app/engine/core/attrs/textarea_html.php new file mode 100644 index 0000000..98bec70 --- /dev/null +++ b/app/engine/core/attrs/textarea_html.php @@ -0,0 +1,23 @@ +attr_name.'" name="' . $this->attr_name.'">' .$this->getCurVal() . ''; + } + + function render_text( $crop = false ) { + $val = $this->getCurVal(); + if ( $crop ) { + $val = substr(strip_tags($val),0, 100); + } + return html_entity_decode($val); + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/tree.php b/app/engine/core/attrs/tree.php new file mode 100644 index 0000000..25ef2af --- /dev/null +++ b/app/engine/core/attrs/tree.php @@ -0,0 +1,120 @@ +attr_name = $attr_name; + $this->obj = $obj; + $full_type = $obj->attrs[$attr_name]['type']; + $lobj_name = $obj->obj_name; + $this->linked_obj = new cobject( $lobj_name, $this->obj->recursion_depth ); + } + function getDBType() { + return "int(12)"; + } + + function render_text( $crop = false ) { + $id = $this->getCurVal(); + $out = ''; + $tpl = $this->obj->attrs[$this->attr_name]['templ']; + if ( $id ) { + $this->linked_obj->byId( $id ); + $out = $this->linked_obj->assign( $tpl ); + } + return $out; + } + + function render_input() { + $db = $this->linked_obj->getDB(); + $db2 = $db->q( $this->linked_obj->getSelect( $this->sql_where ) ); + $id = $this->getCurVal(); + $tpl = $this->obj->attrs[$this->attr_name]['templ']; + $out = ''; + return $out; + } + + function r_subtree( $cat, $level = 0 ) { + global $R, $core_db; + + $db2 = $this->obj->getDB()->q( $this->obj->getSelect( ' AND `'.$this->attr_name.'` = "'.$cat.'" ORDER BY `title` ') ); + while ( $db2->r() ) { + + if ( $db2->f('id') == $this->getCurVal() ) { + $check = 'selected'; + } else { + $check = ''; + } + + $out.= ''; + $out .= $this->r_subtree($db2->f('id'), ($level+1)); + } + + return $out; + } + + + function getFilter( $sql_where = '' ) { + $db = $this->linked_obj->getDB(); + $fname = $this->obj->obj_name . '_' . $this->attr_name; + if ( $this->obj->obj_name ) { + $db3 = $this->obj->getDB()->q( $this->obj->getSelectEx( ' DISTINCT(`'.$this->attr_name.'`) as `'.$this->attr_name.'` ', '' ) ); + while ( $db3->nr() ) { + $uniq_ids[] = $db3->f($this->attr_name); + } + } else { + $uniq_ids = array(); + } + + if (!$_GET[$fname]) { + $tmp = array(''); + $tmp_s = array('Все'); + } else { + $tmp = array(''); + $tmp_s = array('Все'); + } + + $db2 = $db->q( $this->linked_obj->getSelect( $sql_where) ); + $c = 0; + while ( $db2->r() ) { + if ( $this->obj->obj_name && !in_array( $db2->f('id'), $uniq_ids ) ) continue; + $tpl = strip_tags( $this->getAttrTempl() ); + $this->linked_obj->lRow($db2); + $tpl = $this->linked_obj->assign($tpl, true); + if ( strlen($tpl) > 100 ) $tpl = substr($tpl,0,100) . '...'; + + if ($_GET[$fname] != $db2->f('id')) { + $tplh = ''; + $tplh_s = '' .$tpl . ''; + } else { + $tplh = ''; + $tplh_s = '' .$tpl . ''; + $ret['sql'] = " AND " . ($this->obj->obj_name?('`'.$this->obj->obj_name."`.`".$this->attr_name.'`'):($this->attr_name)) . " = '" . $db2->f('id') . "' " ; + } + $tmp[] = $tplh; + $tmp_s[] = $tplh_s; + $c++; + } + + if ($c > 10 ) { + $ret['html'] = ""; + } else { + $ret['html'] .= implode(' | ', $tmp_s); + } + return $ret; + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/tree_object.php b/app/engine/core/attrs/tree_object.php new file mode 100644 index 0000000..5b36a5d --- /dev/null +++ b/app/engine/core/attrs/tree_object.php @@ -0,0 +1,119 @@ +attr_name = $attr_name; + $this->obj = $obj; + $full_type = $obj->attrs[$attr_name]['type']; + $lobj_name = $obj->attrs[$attr_name]['templ']; + if ($lobj_name == "") { + $lobj_name = $obj->obj_name; + } + + $this->lobj_name = $lobj_name; + } + + function getDBType() { + return "varchar(255)"; + } + + function lPost() { + if (is_array($_POST[$this->attr_name])) { + $this->obj->set($this->attr_name,implode(",",$_POST[$this->attr_name])); + } else { + $this->obj->set($this->attr_name,$_POST[$this->attr_name]); + } + } + + function getLinkedObj() { + if ( !$this->linked_obj ) { + $this->linked_obj = new cobject( $this->lobj_name, $this->obj->recursion_depth ); + } + return $this->linked_obj; + } + + function render_text( $crop = false ) { + $id = $this->getCurVal(); + if (!$id) return ''; + + if ( $id ) $ids = explode( ",", $id ); + + $this->getLinkedObj()->byId( $id ); + + if ($this->getLinkedObj()->get('path_titles')) { + return $this->getLinkedObj()->assign('{path_titles}'); + } elseif ($this->getLinkedObj()->get('path_ids')) { + $template_path = explode(',', $this->getLinkedObj()->get('path_ids')); + $path_data = array(); + foreach( $template_path as $id ) { + $this->getLinkedObj()->byId( $id ); + $path_data[] = $this->getLinkedObj()->assign('{title}'); + } + + return implode(' > ', $path_data); + } else { + return $this->getLinkedObj()->assign('{title}'); + } + + } + + + function render_input() { + $db = $this->getLinkedObj()->getDB(); + $id = $this->getCurVal(); + $tpl = $this->obj->attrs[$this->attr_name]['templ']; + + $out = '"; + return $out; + } + + function r_subtree( $cat, $level = 0 ) { + global $R, $core_db; + + $cid = $this->getCurVal(); + if ($cid) { + $cids = explode(",", $cid ); + } else { + $cids = array(); + } + + $db2 = $this->getLinkedObj()->getDB()->q( $this->getLinkedObj()->getSelect( ' AND `parent_id` = "'.$cat.'" AND !`_sys_unvisible` ORDER BY `title` ') ); + while ( $db2->r() ) { + + if ( in_array( $db2->f('id'), $cids ) ) { + $check = 'selected'; + } else { + $check = ''; + } + $out.= ''; + $out .= $this->r_subtree($db2->f('id'), ($level+1)); + } + + return $out; + } + + + function getFilter( $sql_where = '' ) { + return ''; + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/url.php b/app/engine/core/attrs/url.php new file mode 100644 index 0000000..0729604 --- /dev/null +++ b/app/engine/core/attrs/url.php @@ -0,0 +1,33 @@ +getCurVal(); + } + + function render_input() { + + if ( $this->getCurVal() && $this->obj->id ) { + return ''.$this->getCurVal(); +// return ''; + } else { + return ''." +"; + } + } + + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/userlist.php b/app/engine/core/attrs/userlist.php new file mode 100644 index 0000000..d1ef421 --- /dev/null +++ b/app/engine/core/attrs/userlist.php @@ -0,0 +1,84 @@ +attr_name = $attr_name; + $this->obj = $obj; + $full_type = $obj->attrs[$attr_name]['type']; + $this->lobj_name = '_sys_users'; + } + + public function getDBType() { + return "varchar(255)"; + } + + public function getLinkedObj() { + if (!$this->linked_obj) { + $this->linked_obj = new cobject($this->lobj_name, $this->obj->recursion_depth); + } + return $this->linked_obj; + } + + public function lPost() { + if (is_array($_POST[$this->attr_name])) { + $this->obj->set($this->attr_name, implode(",", $_POST[$this->attr_name])); + } else { + $this->obj->set($this->attr_name, $_POST[$this->attr_name]); + } + } + + + public function render_text($crop) { + $id = $this->getCurVal(); + if ($id) { + $ids = explode(",", $id); + } + $outa = []; + if ($ids) { + foreach($ids as $id) { + $this->getLinkedObj()->byId($id); // Показывать удаленные + $outa[] = $this->getLinkedObj()->assign('{name}'); + } + if ($outa) { + sort($outa); + } + } + return implode("; ", $outa); + } + + + public function render_input() { + global $core; + + $db = $this->getLinkedObj()->getDB(); + + $addsql = $this->obj->attrs[$this->attr_name]['templ']; + + $db2 = $db->q($this->getLinkedObj()->getSelect($this->sql_where . $addsql . ' ORDER BY `name`')); + $out = ''; + $id = $this->getCurVal(); + if ($id) { + $ids = explode(",", $id); + } + while ($db2->r()) { + $this->getLinkedObj()->lRow($db2); + $tt = $this->getLinkedObj()->assign(' {name}'); + if ($ids && in_array($db2->f('id'), $ids)) { + $checked = 'checked'; + } else { + $checked = ''; + } + $out .= '
    '; + } + return $out; + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/attrs/video.php b/app/engine/core/attrs/video.php new file mode 100644 index 0000000..1b59ac0 --- /dev/null +++ b/app/engine/core/attrs/video.php @@ -0,0 +1,79 @@ +attr_name . '">
    (макс.: '.ini_get('upload_max_filesize').')'; + $html .= ''; + if ( $this->getCurVal() ) { + $html .= '
    '; + } + return $html; + } + + function lPost() { + $tmpObj = new cobject( '_sys_files' ); + $file = $_FILES[$this->attr_name]; + $nn = md5(microtime(true)); + + if ($_POST[$this->attr_name . '_del']) { + $this->obj->set( $this->attr_name, 0 ); + } + + if (!$file['error']) { + $arr = explode('/', $file['type'] ); + if ($arr[0] == 'video' || $arr[0] == 'application') { + if ( move_uploaded_file( $file['tmp_name'], _FILES_DIR_.$nn ) ) { + $tmpObj->set('filename', $nn ); + $tmpObj->set('realname', $file['name'] ); + $tmpObj->set('ext', $file['type'] ); + $tmpObj->save(); + $this->obj->set( $this->attr_name, $tmpObj->id ); + symlink( _FILES_DIR_.$nn , _VIDEO_DIR_ . $tmpObj->id . '.flv'); + if ( isset($this->obj->attrs[$this->attr_name.'_preview']) ) { + $str = "ffmpeg -i "._FILES_DIR_.$nn. " -an -ss 00:00:05 -an -r 1 -vframes 1 -y -f image2 -s ".$this->obj->attrs[$this->attr_name.'_preview']['templ']." " ._FILES_DIR_.$nn . "_pre.jpg"; + system($str); + copy( _FILES_DIR_.$nn.'_pre.jpg' , _FILES_DIR_.$nn.'_pre' ); + unlink( _FILES_DIR_.$nn.'_pre.jpg' ); + $tmpObj->byId(0); + $tmpObj->set('filename', $nn.'_pre' ); + $tmpObj->set('realname', $file['name'].'.jpg' ); + $tmpObj->set('ext', 'image/jpeg' ); + $tmpObj->save(); + $this->obj->set($this->attr_name.'_preview', $tmpObj->id ); + } + if ( isset($this->obj->attrs[$this->attr_name.'_full_preview']) ) { + $str = "ffmpeg -i "._FILES_DIR_.$nn. " -an -ss 00:00:05 -an -r 1 -vframes 1 -y -f image2 -s ".$this->obj->attrs[$this->attr_name.'_full_preview']['templ']." " ._FILES_DIR_.$nn . "_pre.jpg"; + system($str); + copy( _FILES_DIR_.$nn.'_pre.jpg' , _FILES_DIR_.$nn.'_full_preview' ); + unlink( _FILES_DIR_.$nn.'_pre.jpg' ); + $tmpObj->byId(0); + $tmpObj->set('filename', $nn.'_full_preview' ); + $tmpObj->set('realname', $file['name'].'.jpg' ); + $tmpObj->set('ext', 'image/jpeg' ); + $tmpObj->save(); + $this->obj->set($this->attr_name.'_full_preview', $tmpObj->id ); + } + } + } + } + } + + function render_text( $crop = false ) { + if ($crop) { + $val = 'Скачать'; + } else { + if (!$this->getCurVal()) return ''; + return $this->getCurVal(); + } + return $val; + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/auth.core.php b/app/engine/core/auth.core.php new file mode 100644 index 0000000..a08a355 --- /dev/null +++ b/app/engine/core/auth.core.php @@ -0,0 +1,88 @@ +sess_obj = new cobject( '_sys_user_sessions' ); + $this->user_obj = new cobject( '_sys_users' ); + + + $db2 = $this->sess_obj->getDB()->q( $this->sess_obj->getSelect(' AND `session_id` = "'. db_escape_string($sess_id) . '" ' ) ); + if ( $db2->nr() ) { + $this->_intAuth( $db2->f('user_id') ); + } else { + $this->is_login = false; + } + } + + function _intAuth( $user_id ) { + global $core_db; + $this->user_obj->byId($user_id); + if ($this->user_obj->id && !$this->user_obj->get('_sys_disabled') ) { + $this->is_login = true; + $this->user_id = $user_id; + if ( $this->user_obj->get('group') ) { + $this->groups = explode( ',', $this->user_obj->get('group') ); + } + } else { + $this->do_logout(); + } + } + + + function do_login( $user_id ) { + $this->do_logout(); + $this->sess_obj->set('session_id', session_id() ); + $this->sess_obj->set('user_id', $user_id ); + $this->sess_obj->save(); + $this->_intAuth($user_id); + } + + + function do_logout() { + $this->sess_obj->getDB()->q( 'DELETE FROM `_sys_user_sessions` WHERE `session_id` = "' . db_escape_string(session_id()) . '" ' ); + $this->is_login = false; + $this->user_obj->byId( 0 ); + $this->user_id = 0; + } + + + function is_login() { + return $this->is_login; + } + + function get( $attr ) { + return $this->user_obj->get( $attr ); + } + + function sessGet($key) { + return $this->sessionData[$key]; + } + + function sessSet($key, $val) { + $this->sessionData[$key] = $val; + } + + function saveSession() { + if ( $this->is_login ) { + $data = serialize($this->sessionData); + $this->user_obj->byId( $this->user_id ); + if ( $data != $this->user_obj->get('session_data') ) { + $this->user_obj->set('session_data',$data); + $this->user_obj->save(false); + } + } + } +} +?> \ No newline at end of file diff --git a/app/engine/core/blade/BladeOne.php b/app/engine/core/blade/BladeOne.php new file mode 100644 index 0000000..dff7aab --- /dev/null +++ b/app/engine/core/blade/BladeOne.php @@ -0,0 +1,4187 @@ + + * @copyright Copyright (c) 2016-2021 Jorge Patricio Castro Castillo MIT License. + * Don't delete this comment, its part of the license. + * Part of this code is based in the work of Laravel PHP Components. + * @version 4.2 + * @link https://github.com/EFTEC/BladeOne + */ +class BladeOne +{ + // + public const VERSION='4.2'; + /** @var int BladeOne reads if the compiled file has changed. If it has changed,then the file is replaced. */ + public const MODE_AUTO = 0; + /** @var int Then compiled file is always replaced. It's slow and it's useful for development. */ + public const MODE_SLOW = 1; + /** @var int The compiled file is never replaced. It's fast and it's useful for production. */ + public const MODE_FAST = 2; + /** @var int DEBUG MODE, the file is always compiled and the filename is identifiable. */ + public const MODE_DEBUG = 5; + /** @var array Hold dictionary of translations */ + public static $dictionary = []; + /** @var string PHP tag. You could use < ?php or < ? (if shorttag is active in php.ini) */ + public $phpTag = ' + * If false (default value), then the variables defined in the include as arguments are defined globally.
    + * Example: (includeScope=false)
    + *
    +     * @include("template",['a1'=>'abc']) // a1 is equals to abc
    +     * @include("template",[]) // a1 is equals to abc
    +     * 
    + * Example: (includeScope=true)
    + *
    +     * @include("template",['a1'=>'abc']) // a1 is equals to abc
    +     * @include("template",[]) // a1 is not defined
    +     * 
    + */ + public $includeScope = false; + /** + * @var callable[] It allows to parse the compiled output using a function. + * This function doesn't require to return a value
    + * Example: this converts all compiled result in uppercase (note, content is a ref) + *
    +     * $this->compileCallbacks[]= static function (&$content, $templatename=null) {
    +     *      $content=strtoupper($content);
    +     * };
    +     * 
    + */ + public $compileCallbacks = []; + /** @var array All the registered extensions. */ + protected $extensions = []; + /** @var array All the finished, captured sections. */ + protected $sections = []; + /** @var string The template currently being compiled. For example "folder.template" */ + protected $fileName; + protected $currentView; + protected $notFoundPath; + /** @var string File extension for the template files. */ + protected $fileExtension = '.blade.php'; + /** @var array The stack of in-progress sections. */ + protected $sectionStack = []; + /** @var array The stack of in-progress loops. */ + protected $loopsStack = []; + /** @var array Dictionary of variables */ + protected $variables = []; + /** @var null Dictionary of global variables */ + protected $variablesGlobal = []; + /** @var array All the available compiler functions. */ + protected $compilers = [ + 'Extensions', + 'Statements', + 'Comments', + 'Echos', + ]; + /** @var string|null it allows to set the stack */ + protected $viewStack; + /** @var array used by $this->composer() */ + protected $composerStack = []; + /** @var array The stack of in-progress push sections. */ + protected $pushStack = []; + /** @var array All the finished, captured push sections. */ + protected $pushes = []; + /** @var int The number of active rendering operations. */ + protected $renderCount = 0; + /** @var string[] Get the template path for the compiled views. */ + protected $templatePath; + /** @var string Get the compiled path for the compiled views. If null then it uses the default path */ + protected $compiledPath; + /** @var string the extension of the compiled file. */ + protected $compileExtension = '.bladec'; + /** @var array Custom "directive" dictionary. Those directives run at compile time. */ + protected $customDirectives = []; + /** @var bool[] Custom directive dictionary. Those directives run at runtime. */ + protected $customDirectivesRT = []; + /** @var callable Function used for resolving injected classes. */ + protected $injectResolver; + /** @var array Used for conditional if. */ + protected $conditions = []; + /** @var int Unique counter. It's used for extends */ + protected $uidCounter = 0; + /** @var string The main url of the system. Don't use raw $_SERVER values unless the value is sanitized */ + protected $baseUrl = '.'; + /** @var string|null The base domain of the system */ + protected $baseDomain; + /** @var string|null It stores the current canonical url. */ + protected $canonicalUrl; + /** @var string|null It stores the current url including arguments */ + protected $currentUrl; + /** @var string it is a relative path calculated between baseUrl and the current url. Example ../../ */ + protected $relativePath = ''; + /** @var string[] Dictionary of assets */ + protected $assetDict; + /** @var bool if true then it removes tabs and unneeded spaces */ + protected $optimize = true; + /** @var bool if false, then the template is not compiled (but executed on memory). */ + protected $isCompiled = true; + /** @var bool */ + protected $isRunFast = false; // stored for historical purpose. + /** @var array Array of opening and closing tags for raw echos. */ + protected $rawTags = ['{!!', '!!}']; + /** @var array Array of opening and closing tags for regular echos. */ + protected $contentTags = ['{{', '}}']; + /** @var array Array of opening and closing tags for escaped echos. */ + protected $escapedTags = ['{{{', '}}}']; + /** @var string The "regular" / legacy echo string format. */ + protected $echoFormat = '\htmlentities(%s, ENT_QUOTES, \'UTF-8\', false)'; + protected $echoFormatOld = 'static::e(%s)'; + /** @var array Lines that will be added at the footer of the template */ + protected $footer = []; + /** @var string Placeholder to temporary mark the position of verbatim blocks. */ + protected $verbatimPlaceholder = '$__verbatim__$'; + /** @var array Array to temporary store the verbatim blocks found in the template. */ + protected $verbatimBlocks = []; + /** @var int Counter to keep track of nested forelse statements. */ + protected $forelseCounter = 0; + /** @var array The components being rendered. */ + protected $componentStack = []; + /** @var array The original data passed to the component. */ + protected $componentData = []; + /** @var array The slot contents for the component. */ + protected $slots = []; + /** @var array The names of the slots being rendered. */ + protected $slotStack = []; + /** @var string tag unique */ + protected $PARENTKEY = '@parentXYZABC'; + /** + * Indicates the compile mode. + * if the constant BLADEONE_MODE is defined, then it is used instead of this field. + * + * @var int=[BladeOne::MODE_AUTO,BladeOne::MODE_DEBUG,BladeOne::MODE_SLOW,BladeOne::MODE_FAST][$i] + */ + protected $mode; + /** @var int Indicates the number of open switches */ + private $switchCount = 0; + /** @var bool Indicates if the switch is recently open */ + private $firstCaseInSwitch = true; + + //
    + + // + + /** + * Bob the constructor. + * The folder at $compiledPath is created in case it doesn't exist. + * + * @param string|array $templatePath If null then it uses (caller_folder)/views + * @param string $compiledPath If null then it uses (caller_folder)/compiles + * @param int $mode =[BladeOne::MODE_AUTO,BladeOne::MODE_DEBUG,BladeOne::MODE_FAST,BladeOne::MODE_SLOW][$i] + */ + public function __construct($templatePath = null, $compiledPath = null, $mode = 0) + { + if ($templatePath === null) { + $templatePath = \getcwd() . '/views'; + } + if ($compiledPath === null) { + $compiledPath = \getcwd() . '/compiles'; + } + $this->templatePath = (is_array($templatePath)) ? $templatePath : [$templatePath]; + $this->compiledPath = $compiledPath; + $this->setMode($mode); + $this->authCallBack = function ($action = null, /** @noinspection PhpUnusedParameterInspection */ $subject = null) { + return \in_array($action, $this->currentPermission, true); + }; + + $this->authAnyCallBack = function ($array = []) { + foreach ($array as $permission) { + if (\in_array($permission, $this->currentPermission, true)) { + return true; + } + } + return false; + }; + + $this->errorCallBack = static function (/** @noinspection PhpUnusedParameterInspection */ $key = null) { + return false; + }; + + if (!\is_dir($this->compiledPath)) { + $ok = @\mkdir($this->compiledPath, 0777, true); + if ($ok === false) { + $this->showError( + 'Constructing', + "Unable to create the compile folder [$this->compiledPath]. Check the permissions of it's parent folder.", + true + ); + } + } + // If the traits has "Constructors", then we call them. + // Requisites. + // 1- the method must be public or protected + // 2- it must don't have arguments + // 3- It must have the name of the trait. i.e. trait=MyTrait, method=MyTrait() + $traits = get_declared_traits(); + foreach ($traits as $trait) { + $r = explode('\\', $trait); + $name = end($r); + if (is_callable([$this, $name]) && method_exists($this, $name)) { + $this->{$name}(); + } + } + } + // + // + + /** + * Show an error in the web. + * + * @param string $id Title of the error + * @param string $text Message of the error + * @param bool $critic if true then the compilation is ended, otherwise it continues + * @param bool $alwaysThrow if true then it always throws a runtime exception. + * @return string + * @throws \RuntimeException + */ + public function showError($id, $text, $critic = false, $alwaysThrow = false) + { + \ob_get_clean(); + if ($this->throwOnError || $alwaysThrow || $critic === true) { + throw new \RuntimeException("BladeOne Error [$id] $text"); + } + + $msg= "
    "; + $msg.= "BladeOne Error [$id]:
    "; + $msg.= "$text
    \n"; + echo $msg; + if ($critic) { + die(1); + } + return $msg; + } + + /** + * Escape HTML entities in a string. + * + * @param string $value + * @return string + */ + public static function e($value) + { + return (\is_array($value) || \is_object($value)) + ? \htmlentities(\print_r($value, true), ENT_QUOTES, 'UTF-8', false) + : \htmlentities($value, ENT_QUOTES, 'UTF-8', false); + } + + protected static function convertArgCallBack($k, $v) + { + return $k . "='$v' "; + } + + /** + * @param mixed|\DateTime $variable + * @param string|null $format + * @return string + */ + public function format($variable, $format = null) + { + if ($variable instanceof \DateTime) { + $format = $format ?? 'Y/m/d'; + return $variable->format($format); + } + $format = $format ?? '%s'; + return sprintf($format, $variable); + } + + /** + * It converts a text into a php code with echo
    + * Example:
    + *
    +     * $this->wrapPHP('$hello'); // "< ?php echo $this->e($hello); ? >"
    +     * $this->wrapPHP('$hello',''); // < ?php echo $this->e($hello); ? >
    +     * $this->wrapPHP('$hello','',false); // < ?php echo $hello; ? >
    +     * $this->wrapPHP('"hello"'); // "< ?php echo $this->e("hello"); ? >"
    +     * $this->wrapPHP('hello()'); // "< ?php echo $this->e(hello()); ? >"
    +     * 
    + * + * @param string $input The input value + * @param string $quote The quote used (to quote the result) + * @param bool $parse If the result will be parsed or not. If false then it's returned without $this->e + * @return string + */ + public function wrapPHP($input, $quote = '"', $parse = true) + { + if (strpos($input, '(') !== false && !$this->isQuoted($input)) { + if ($parse) { + return $quote . $this->phpTagEcho . '$this->e(' . $input . ');?>' . $quote; + } + + return $quote . $this->phpTagEcho . $input . ';?>' . $quote; + } + if (strpos($input, '$') === false) { + if ($parse) { + return self::enq($input); + } + + return $input; + } + if ($parse) { + return $quote . $this->phpTagEcho . '$this->e(' . $input . ');?>' . $quote; + } + return $quote . $this->phpTagEcho . $input . ';?>' . $quote; + } + + /** + * Returns true if the text is surrounded by quotes (double or single quote) + * + * @param string|null $text + * @return bool + */ + public function isQuoted($text) + { + if (!$text || strlen($text) < 2) { + return false; + } + if ($text[0] === '"' && substr($text, -1) === '"') { + return true; + } + return ($text[0] === "'" && substr($text, -1) === "'"); + } + + /** + * Escape HTML entities in a string. + * + * @param string $value + * @return string + */ + public static function enq($value) + { + if (\is_array($value) || \is_object($value)) { + return \htmlentities(\print_r($value, true), ENT_NOQUOTES, 'UTF-8', false); + } + return \htmlentities($value, ENT_NOQUOTES, 'UTF-8', false); + } + + /** + * @param string $view example "folder.template" + * @param string|null $alias example "mynewop". If null then it uses the name of the template. + */ + public function addInclude($view, $alias = null) + { + if (!isset($alias)) { + $alias = \explode('.', $view); + $alias = \end($alias); + } + $this->directive($alias, function ($expression) use ($view) { + $expression = $this->stripParentheses($expression) ?: '[]'; + return "$this->phpTag echo \$this->runChild('$view', $expression); ?>"; + }); + } + + /** + * Register a handler for custom directives. + * + * @param string $name + * @param callable $handler + * @return void + */ + public function directive($name, callable $handler) + { + $this->customDirectives[$name] = $handler; + $this->customDirectivesRT[$name] = false; + } + + /** + * Strip the parentheses from the given expression. + * + * @param string $expression + * @return string + */ + public function stripParentheses($expression) + { + if (static::startsWith($expression, '(')) { + $expression = \substr($expression, 1, -1); + } + return $expression; + } + + /** + * Determine if a given string starts with a given substring. + * + * @param string $haystack + * @param string|array $needles + * @return bool + */ + public static function startsWith($haystack, $needles) + { + foreach ((array)$needles as $needle) { + if ($needle != '') { + if (\function_exists('mb_strpos')) { + if (\mb_strpos($haystack, $needle) === 0) { + return true; + } + } elseif (\strpos($haystack, $needle) === 0) { + return true; + } + } + } + + return false; + } + + /** + * If false then the file is not compiled, and it is executed directly from the memory.
    + * By default the value is true
    + * It also sets the mode to MODE_SLOW + * + * @param bool $bool + * @return BladeOne + * @see \eftec\bladeone\BladeOne::setMode + */ + public function setIsCompiled($bool = false) + { + $this->isCompiled = $bool; + if (!$bool) { + $this->setMode(self::MODE_SLOW); + } + return $this; + } + + /** + * It sets the template and compile path (without trailing slash). + *

    Example:setPath("somefolder","otherfolder"); + * + * @param null|string|string[] $templatePath If null then it uses the current path /views folder + * @param null|string $compiledPath If null then it uses the current path /views folder + */ + public function setPath($templatePath, $compiledPath) + { + if ($templatePath === null) { + $templatePath = \getcwd() . '/views'; + } + if ($compiledPath === null) { + $compiledPath = \getcwd() . '/compiles'; + } + $this->templatePath = (is_array($templatePath)) ? $templatePath : [$templatePath]; + $this->compiledPath = $compiledPath; + } + + /** + * @return array + */ + public function getAliasClasses() + { + return $this->aliasClasses; + } + + /** + * @param array $aliasClasses + */ + public function setAliasClasses($aliasClasses) + { + $this->aliasClasses = $aliasClasses; + } + + /** + * @param string $aliasName + * @param string $classWithNS + */ + public function addAliasClasses($aliasName, $classWithNS) + { + $this->aliasClasses[$aliasName] = $classWithNS; + } + // + // + + /** + * Authentication. Sets with a user,role and permission + * + * @param string $user + * @param null $role + * @param array $permission + */ + public function setAuth($user = '', $role = null, $permission = []) + { + $this->currentUser = $user; + $this->currentRole = $role; + $this->currentPermission = $permission; + } + + /** + * run the blade engine. It returns the result of the code. + * + * @param string HTML to parse + * @param array $data + * @return string + * @throws Exception + */ + public function runString($string, $data = []) + { + $php = $this->compileString($string); + + $obLevel = \ob_get_level(); + \ob_start(); + \extract($data, EXTR_SKIP); + + $previousError = \error_get_last(); + + try { + @eval('?' . '>' . $php); + } catch (Exception $e) { + while (\ob_get_level() > $obLevel) { + \ob_end_clean(); + } + throw $e; + } catch (ParseError $e) { // PHP 7 + while (\ob_get_level() > $obLevel) { + \ob_end_clean(); + } + $this->showError('runString', $e->getMessage(). ' '.$e->getCode(), true); + return ''; + } + + $lastError = \error_get_last(); // PHP 5.6 + if ($previousError != $lastError && $lastError['type'] == E_PARSE) { + while (\ob_get_level() > $obLevel) { + \ob_end_clean(); + } + $this->showError('runString', $lastError['message']. ' '.$lastError['type'], true); + return ''; + } + + return \ob_get_clean(); + } + + /** + * Compile the given Blade template contents. + * + * @param string $value + * @return string + */ + public function compileString($value) + { + $result = ''; + if (\strpos($value, '@verbatim') !== false) { + $value = $this->storeVerbatimBlocks($value); + } + $this->footer = []; + // Here we will loop through all the tokens returned by the Zend lexer and + // parse each one into the corresponding valid PHP. We will then have this + // template as the correctly rendered PHP that can be rendered natively. + foreach (\token_get_all($value) as $token) { + $result .= \is_array($token) ? $this->parseToken($token) : $token; + } + if (!empty($this->verbatimBlocks)) { + $result = $this->restoreVerbatimBlocks($result); + } + // If there are any footer lines that need to get added to a template we will + // add them here at the end of the template. This gets used mainly for the + // template inheritance via the extends keyword that should be appended. + if (\count($this->footer) > 0) { + $result = \ltrim($result, PHP_EOL) + . PHP_EOL . \implode(PHP_EOL, \array_reverse($this->footer)); + } + return $result; + } + + /** + * Store the verbatim blocks and replace them with a temporary placeholder. + * + * @param string $value + * @return string + */ + protected function storeVerbatimBlocks($value) + { + return \preg_replace_callback('/(?verbatimBlocks[] = $matches[1]; + return $this->verbatimPlaceholder; + }, $value); + } + + /** + * Parse the tokens from the template. + * + * @param array $token + * + * @return string + * + * @see \eftec\bladeone\BladeOne::compileStatements + * @see \eftec\bladeone\BladeOne::compileExtends + * @see \eftec\bladeone\BladeOne::compileComments + * @see \eftec\bladeone\BladeOne::compileEchos + */ + protected function parseToken($token) + { + [$id, $content] = $token; + if ($id == T_INLINE_HTML) { + foreach ($this->compilers as $type) { + $content = $this->{"compile$type"}($content); + } + } + return $content; + } + + /** + * Replace the raw placeholders with the original code stored in the raw blocks. + * + * @param string $result + * @return string + */ + protected function restoreVerbatimBlocks($result) + { + $result = \preg_replace_callback('/' . \preg_quote($this->verbatimPlaceholder) . '/', function () { + return \array_shift($this->verbatimBlocks); + }, $result); + $this->verbatimBlocks = []; + return $result; + } + + /** + * it calculates the relative path of a web.
    + * This function uses the current url and the baseurl + * + * @param string $relativeWeb . Example img/images.jpg + * @return string Example ../../img/images.jpg + */ + public function relative($relativeWeb) + { + return $this->assetDict[$relativeWeb] ?? ($this->relativePath . $relativeWeb); + } + + /** + * It adds an alias to the link of the resources.
    + * addAssetDict('name','url/res.jpg')
    + * addAssetDict(['name'=>'url/res.jpg','name2'=>'url/res2.jpg']); + * + * @param string|array $name example 'css/style.css', you could also add an array + * @param string $url example https://www.web.com/style.css' + */ + public function addAssetDict($name, $url = '') + { + if (\is_array($name)) { + if ($this->assetDict === null) { + $this->assetDict = $name; + } else { + $this->assetDict = \array_merge($this->assetDict, $name); + } + } else { + $this->assetDict[$name] = $url; + } + } + + /** + * Compile the push statements into valid PHP. + * + * @param string $expression + * @return string + */ + public function compilePush($expression) + { + return $this->phpTag . "\$this->startPush$expression; ?>"; + } + + /** + * Compile the push statements into valid PHP. + * + * @param string $expression + * @return string + */ + public function compilePushOnce($expression) + { + $key = '$__pushonce__' . \trim(\substr($expression, 2, -2)); + return $this->phpTag . "if(!isset($key)): $key=1; \$this->startPush$expression; ?>"; + } + + /** + * Compile the push statements into valid PHP. + * + * @param string $expression + * @return string + */ + public function compilePrepend($expression) + { + return $this->phpTag . "\$this->startPush$expression; ?>"; + } + + /** + * Start injecting content into a push section. + * + * @param string $section + * @param string $content + * @return void + */ + public function startPush($section, $content = '') + { + if ($content === '') { + if (\ob_start()) { + $this->pushStack[] = $section; + } + } else { + $this->extendPush($section, $content); + } + } + + /* + * endswitch tag + */ + + /** + * Append content to a given push section. + * + * @param string $section + * @param string $content + * @return void + */ + protected function extendPush($section, $content) + { + if (!isset($this->pushes[$section])) { + $this->pushes[$section] = []; // start an empty section + } + if (!isset($this->pushes[$section][$this->renderCount])) { + $this->pushes[$section][$this->renderCount] = $content; + } else { + $this->pushes[$section][$this->renderCount] .= $content; + } + } + + /** + * Start injecting content into a push section. + * + * @param string $section + * @param string $content + * @return void + */ + public function startPrepend($section, $content = '') + { + if ($content === '') { + if (\ob_start()) { + \array_unshift($this->pushStack[], $section); + } + } else { + $this->extendPush($section, $content); + } + } + + /** + * Stop injecting content into a push section. + * + * @return string + */ + public function stopPush() + { + if (empty($this->pushStack)) { + $this->showError('stopPush', 'Cannot end a section without first starting one', true); + } + $last = \array_pop($this->pushStack); + $this->extendPush($last, \ob_get_clean()); + return $last; + } + + /** + * Stop injecting content into a push section. + * + * @return string + */ + public function stopPrepend() + { + if (empty($this->pushStack)) { + $this->showError('stopPrepend', 'Cannot end a section without first starting one', true); + } + $last = \array_shift($this->pushStack); + $this->extendStartPush($last, \ob_get_clean()); + return $last; + } + + /** + * Append content to a given push section. + * + * @param string $section + * @param string $content + * @return void + */ + protected function extendStartPush($section, $content) + { + if (!isset($this->pushes[$section])) { + $this->pushes[$section] = []; // start an empty section + } + if (!isset($this->pushes[$section][$this->renderCount])) { + $this->pushes[$section][$this->renderCount] = $content; + } else { + $this->pushes[$section][$this->renderCount] = $content . $this->pushes[$section][$this->renderCount]; + } + } + + /** + * Get the string contents of a push section. + * + * @param string $section + * @param string $default + * @return string + */ + public function yieldPushContent($section, $default = '') + { + if (!isset($this->pushes[$section])) { + return $default; + } + return \implode(\array_reverse($this->pushes[$section])); + } + + /** + * Get the string contents of a push section. + * + * @param int|string $each if "int", then it split the foreach every $each numbers.
    + * if "string" or "c3", then it means that it will split in 3 columns
    + * @param string $splitText + * @param string $splitEnd + * @return string + */ + public function splitForeach($each = 1, $splitText = ',', $splitEnd = '') + { + $loopStack = static::last($this->loopsStack); // array(7) { ["index"]=> int(0) ["remaining"]=> int(6) ["count"]=> int(5) ["first"]=> bool(true) ["last"]=> bool(false) ["depth"]=> int(1) ["parent"]=> NULL } + if (($loopStack['index']) == $loopStack['count'] - 1) { + return $splitEnd; + } + $eachN = 0; + if (is_numeric($each)) { + $eachN = $each; + } elseif (strlen($each) > 1) { + if ($each[0] === 'c') { + $eachN = $loopStack['count'] / substr($each, 1); + } + } else { + $eachN = PHP_INT_MAX; + } + + if (($loopStack['index'] + 1) % $eachN === 0) { + return $splitText; + } + return ''; + } + + /** + * Return the last element in an array passing a given truth test. + * + * @param array $array + * @param callable|null $callback + * @param mixed $default + * @return mixed + */ + public static function last($array, callable $callback = null, $default = null) + { + if (\is_null($callback)) { + return empty($array) ? static::value($default) : \end($array); + } + return static::first(\array_reverse($array), $callback, $default); + } + + /** + * Return the default value of the given value. + * + * @param mixed $value + * @return mixed + */ + public static function value($value) + { + return $value instanceof Closure ? $value() : $value; + } + + /** + * Return the first element in an array passing a given truth test. + * + * @param array $array + * @param callable|null $callback + * @param mixed $default + * @return mixed + */ + public static function first($array, callable $callback = null, $default = null) + { + if (\is_null($callback)) { + return empty($array) ? static::value($default) : \reset($array); + } + foreach ($array as $key => $value) { + if ($callback($key, $value)) { + return $value; + } + } + return static::value($default); + } + + /** + * @param string $name + * @param $args [] + * @return string + * @throws BadMethodCallException + */ + public function __call($name, $args) + { + if ($name === 'if') { + return $this->registerIfStatement($args[0] ?? null, $args[1] ?? null); + } + $this->showError('call', "function $name is not defined
    ", true, true); + return ''; + } + + /** + * Register an "if" statement directive. + * + * @param string $name + * @param callable $callback + * @return string + */ + public function registerIfStatement($name, callable $callback) + { + $this->conditions[$name] = $callback; + + $this->directive($name, function ($expression) use ($name) { + $tmp = $this->stripParentheses($expression); + return $expression !== '' + ? $this->phpTag . " if (\$this->check('$name', $tmp)): ?>" + : $this->phpTag . " if (\$this->check('$name')): ?>"; + }); + + $this->directive('else' . $name, function ($expression) use ($name) { + $tmp = $this->stripParentheses($expression); + return $expression !== '' + ? $this->phpTag . " elseif (\$this->check('$name', $tmp)): ?>" + : $this->phpTag . " elseif (\$this->check('$name')): ?>"; + }); + + $this->directive('end' . $name, function () { + return $this->phpTag . ' endif; ?>'; + }); + return ''; + } + + /** + * Check the result of a condition. + * + * @param string $name + * @param array $parameters + * @return bool + */ + public function check($name, ...$parameters) + { + return \call_user_func($this->conditions[$name], ...$parameters); + } + + /** + * @param bool $bool + * @param string $view name of the view + * @param array $value arrays of values + * @return string + * @throws Exception + */ + public function includeWhen($bool = false, $view = '', $value = []) + { + if ($bool) { + return $this->runChild($view, $value); + } + return ''; + } + + /** + * Macro of function run + * + * @param $view + * @param array $variables + * @return string + * @throws Exception + */ + public function runChild($view, $variables = []) + { + if (\is_array($variables)) { + if ($this->includeScope) { + $backup = $this->variables; + } else { + $backup = null; + } + $newVariables = \array_merge($this->variables, $variables); + } else { + if ($variables === null) { + $newVariables = $this->variables; + var_dump($newVariables); + die(1); + } + + $this->showError('run/include', "RunChild: Include/run variables should be defined as array ['idx'=>'value']", true); + return ''; + } + $r = $this->runInternal($view, $newVariables, false, false, $this->isRunFast); + if ($backup !== null) { + $this->variables = $backup; + } + return $r; + } + + /** + * run the blade engine. It returns the result of the code. + * + * @param string $view + * @param array $variables + * @param bool $forced if true then it recompiles no matter if the compiled file exists or not. + * @param bool $isParent + * @param bool $runFast if true then the code is not compiled neither checked, and it runs directly the compiled + * version. + * @return string + * @throws Exception + * @noinspection PhpUnusedParameterInspection + */ + private function runInternal($view, $variables = [], $forced = false, $isParent = true, $runFast = false) + { + $this->currentView = $view; + if (@\count($this->composerStack)) { + $this->evalComposer($view); + } + if (@\count($this->variablesGlobal) > 0) { + $this->variables = \array_merge($variables, $this->variablesGlobal); + $this->variablesGlobal = []; // used so we delete it. + } else { + $this->variables = $variables; + } + if (!$runFast) { + // a) if the "compile" is forced then we compile the original file, then save the file. + // b) if the "compile" is not forced then we read the datetime of both file, and we compared. + // c) in both cases, if the compiled doesn't exist then we compile. + if ($view) { + $this->fileName = $view; + } + $result = $this->compile($view, $forced); + if (!$this->isCompiled) { + return $this->evaluateText($result, $this->variables); + } + } elseif ($view) { + $this->fileName = $view; + } + $this->isRunFast = $runFast; + return $this->evaluatePath($this->getCompiledFile(), $this->variables); + } + + protected function evalComposer($view) + { + foreach ($this->composerStack as $viewKey => $fn) { + if ($this->wildCardComparison($view, $viewKey)) { + if (is_callable($fn)) { + $fn($this); + } elseif ($this->methodExistsStatic($fn, 'composer')) { + // if the method exists statically then $fn is the class and 'composer' is the name of the method + $fn::composer($this); + } elseif (is_object($fn) || class_exists($fn)) { + // if $fn is an object, or it is a class and the class exists. + $instance = (is_object($fn)) ? $fn : new $fn(); + if (method_exists($instance, 'composer')) { + // and the method exists inside the instance. + $instance->composer($this); + } else { + if ($this->mode === self::MODE_DEBUG) { + $this->showError('evalComposer', "BladeOne: composer() added an incorrect method [$fn]", true, true); + return; + } + $this->showError('evalComposer', 'BladeOne: composer() added an incorrect method', true, true); + return; + } + } else { + $this->showError('evalComposer', 'BladeOne: composer() added an incorrect method', true, true); + } + } + } + } + + /** + * It compares with wildcards (*) and returns true if both strings are equals
    + * The wildcards only works at the beginning and/or at the end of the string.
    + * Example:
    + *

    +     * Text::wildCardComparison('abcdef','abc*'); // true
    +     * Text::wildCardComparison('abcdef','*def'); // true
    +     * Text::wildCardComparison('abcdef','*abc*'); // true
    +     * Text::wildCardComparison('abcdef','*cde*'); // true
    +     * Text::wildCardComparison('abcdef','*cde'); // false
    +     *
    +     * 
    + * + * @param string $text + * @param string|null $textWithWildcard + * + * @return bool + */ + protected function wildCardComparison($text, $textWithWildcard) + { + if (($textWithWildcard === null || $textWithWildcard === '') + || strpos($textWithWildcard, '*') === false) { + // if the text with wildcard is null or empty, or it contains two ** or it contains no * then.. + return $text == $textWithWildcard; + } + if ($textWithWildcard === '*' || $textWithWildcard === '**') { + return true; + } + $c0 = $textWithWildcard[0]; + $c1 = substr($textWithWildcard, -1); + $textWithWildcardClean = str_replace('*', '', $textWithWildcard); + $p0 = strpos($text, $textWithWildcardClean); + if ($p0 === false) { + // no matches. + return false; + } + if ($c0 === '*' && $c1 === '*') { + // $textWithWildcard='*asasasas*' + return true; + } + if ($c1 === '*') { + // $textWithWildcard='asasasas*' + return $p0 === 0; + } + // $textWithWildcard='*asasasas' + $len = strlen($textWithWildcardClean); + return (substr($text, -$len) === $textWithWildcardClean); + } + + protected function methodExistsStatic($class, $method) + { + try { + return (new \ReflectionMethod($class, $method))->isStatic(); + } catch (\ReflectionException $e) { + return false; + } + } + + /** + * Compile the view at the given path. + * + * @param string $templateName The name of the template. Example folder.template + * @param bool $forced If the compilation will be forced (always compile) or not. + * @return boolean|string True if the operation was correct, or false (if not exception) + * if it fails. It returns a string (the content compiled) if isCompiled=false + * @throws Exception + */ + public function compile($templateName = null, $forced = false) + { + $compiled = $this->getCompiledFile($templateName); + $template = $this->getTemplateFile($templateName); + if (!$this->isCompiled) { + $contents = $this->compileString($this->getFile($template)); + $this->compileCallBacks($contents, $templateName); + return $contents; + } + if ($forced || $this->isExpired($templateName)) { + // compile the original file + $contents = $this->compileString($this->getFile($template)); + $this->compileCallBacks($contents, $templateName); + $dir = \dirname($compiled); + if (!\is_dir($dir)) { + $ok = @\mkdir($dir, 0777, true); + if ($ok === false) { + $this->showError( + 'Compiling', + "Unable to create the compile folder [$dir]. Check the permissions of it's parent folder.", + true + ); + return false; + } + } + if ($this->optimize) { + // removes space and tabs and replaces by a single space + $contents = \preg_replace('/^ {2,}/m', ' ', $contents); + $contents = \preg_replace('/^\t{2,}/m', ' ', $contents); + } + $ok = @\file_put_contents($compiled, $contents); + if ($ok === false) { + $this->showError( + 'Compiling', + "Unable to save the file [$compiled]. Check the compile folder is defined and has the right permission" + ); + return false; + } + } + return true; + } + + /** + * Get the full path of the compiled file. + * + * @param string $templateName + * @return string + */ + public function getCompiledFile($templateName = '') + { + $templateName = (empty($templateName)) ? $this->fileName : $templateName; + if ($this->getMode() == self::MODE_DEBUG) { + return $this->compiledPath . '/' . $templateName . $this->compileExtension; + } + + return $this->compiledPath . '/' . \sha1($templateName) . $this->compileExtension; + } + + /** + * Get the mode of the engine.See BladeOne::MODE_* constants + * + * @return int=[self::MODE_AUTO,self::MODE_DEBUG,self::MODE_FAST,self::MODE_SLOW][$i] + */ + public function getMode() + { + if (\defined('BLADEONE_MODE')) { + $this->mode = BLADEONE_MODE; + } + return $this->mode; + } + + /** + * Set the compile mode + * + * @param $mode int=[self::MODE_AUTO,self::MODE_DEBUG,self::MODE_FAST,self::MODE_SLOW][$i] + * @return void + */ + public function setMode($mode) + { + $this->mode = $mode; + } + + /** + * Get the full path of the template file. + *

    Example: getTemplateFile('.abc.def')

    + * + * @param string $templateName template name. If not template is set then it uses the base template. + * @return string + */ + public function getTemplateFile($templateName = '') + { + $templateName = (empty($templateName)) ? $this->fileName : $templateName; + if (\strpos($templateName, '/') !== false) { + return $this->locateTemplate($templateName); // it's a literal + } + $arr = \explode('.', $templateName); + $c = \count($arr); + if ($c == 1) { + // it's in the root of the template folder. + return $this->locateTemplate($templateName . $this->fileExtension); + } + + $file = $arr[$c - 1]; + \array_splice($arr, $c - 1, $c - 1); // delete the last element + $path = \implode('/', $arr); + return $this->locateTemplate($path . '/' . $file . $this->fileExtension); + } + + /** + * Find template file with the given name in all template paths in the order the paths were written + * + * @param string $name Filename of the template (without path) + * @return string template file + */ + private function locateTemplate($name) + { + $this->notFoundPath = ''; + foreach ($this->templatePath as $dir) { + $path = $dir . '/' . $name; + if (\is_file($path)) { + return $path; + } + + $this->notFoundPath .= $path . ","; + } + return ''; + } + + /** + * Get the contents of a file. + * + * @param string $fullFileName It gets the content of a filename or returns ''. + * + * @return string + */ + public function getFile($fullFileName) + { + if (\is_file($fullFileName)) { + return \file_get_contents($fullFileName); + } + $this->showError('getFile', "File does not exist at paths (separated by comma) [$this->notFoundPath] or permission denied"); + return ''; + } + + protected function compileCallBacks(&$contents, $templateName) + { + if (!empty($this->compileCallbacks)) { + foreach ($this->compileCallbacks as $callback) { + if (is_callable($callback)) { + $callback($contents, $templateName); + } + } + } + } + + /** + * Determine if the view has expired. + * + * @param string|null $fileName + * @return bool + */ + public function isExpired($fileName) + { + $compiled = $this->getCompiledFile($fileName); + $template = $this->getTemplateFile($fileName); + if (!\is_file($template)) { + if ($this->mode == self::MODE_DEBUG) { + $this->showError('Read file', 'Template not found :' . $this->fileName . " on file: $template", true); + } else { + $this->showError('Read file', 'Template not found :' . $this->fileName, true); + } + } + // If the compiled file doesn't exist we will indicate that the view is expired + // so that it can be re-compiled. Else, we will verify the last modification + // of the views is less than the modification times of the compiled views. + if (!$this->compiledPath || !\is_file($compiled)) { + return true; + } + return \filemtime($compiled) < \filemtime($template); + } + + /** + * Evaluates a text (string) using the current variables + * + * @param string $content + * @param array $variables + * @return string + * @throws Exception + */ + protected function evaluateText($content, $variables) + { + \ob_start(); + \extract($variables); + // We'll evaluate the contents of the view inside a try/catch block, so we can + // flush out any stray output that might get out before an error occurs or + // an exception is thrown. This prevents any partial views from leaking. + try { + eval(' ?>' . $content . $this->phpTag); + } catch (Exception $e) { + $this->handleViewException($e); + } + return \ltrim(\ob_get_clean()); + } + + /** + * Handle a view exception. + * + * @param Exception $e + * @return void + * @throws $e + */ + protected function handleViewException($e) + { + \ob_get_clean(); + throw $e; + } + + /** + * Evaluates a compiled file using the current variables + * + * @param string $compiledFile full path of the compile file. + * @param array $variables + * @return string + * @throws Exception + */ + protected function evaluatePath($compiledFile, $variables) + { + \ob_start(); + // note, the variables are extracted locally inside this method, + // they are not global variables :-3 + \extract($variables); + // We'll evaluate the contents of the view inside a try/catch block so we can + // flush out any stray output that might get out before an error occurs or + // an exception is thrown. This prevents any partial views from leaking. + try { + include $compiledFile; + } catch (Exception $e) { + $this->handleViewException($e); + } + return \ltrim(\ob_get_clean()); + } + + /** + * @param array $views array of views + * @param array $value + * @return string + * @throws Exception + */ + public function includeFirst($views = [], $value = []) + { + foreach ($views as $view) { + if ($this->templateExist($view)) { + return $this->runChild($view, $value); + } + } + return ''; + } + + /** + * Returns true if the template exists. Otherwise, it returns false + * + * @param $templateName + * @return bool + */ + private function templateExist($templateName) + { + $file = $this->getTemplateFile($templateName); + return \is_file($file); + } + + /** + * Convert an array such as ["class1"=>"myclass","style="mystyle"] to class1='myclass' style='mystyle' string + * + * @param array|string $array array to convert + * @return string + */ + public function convertArg($array) + { + if (!\is_array($array)) { + return $array; // nothing to convert. + } + return \implode(' ', \array_map('static::convertArgCallBack', \array_keys($array), $array)); + } + + /** + * Returns the current token. if there is not a token then it generates a new one. + * It could require an open session. + * + * @param bool $fullToken It returns a token with the current ip. + * @param string $tokenId [optional] Name of the token. + * + * @return string + */ + public function getCsrfToken($fullToken = false, $tokenId = '_token') + { + if ($this->csrf_token == '') { + $this->regenerateToken($tokenId); + } + if ($fullToken) { + return $this->csrf_token . '|' . $this->ipClient(); + } + return $this->csrf_token; + } + + /** + * Regenerates the csrf token and stores in the session. + * It requires an open session. + * + * @param string $tokenId [optional] Name of the token. + */ + public function regenerateToken($tokenId = '_token') + { + try { + $this->csrf_token = \bin2hex(\random_bytes(10)); + } catch (Exception $e) { + $this->csrf_token = '123456789012345678901234567890'; // unable to generates a random token. + } + @$_SESSION[$tokenId] = $this->csrf_token . '|' . $this->ipClient(); + } + + public function ipClient() + { + if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) + && \preg_match('/^([d]{1,3}).([d]{1,3}).([d]{1,3}).([d]{1,3})$/', $_SERVER['HTTP_X_FORWARDED_FOR'])) { + return $_SERVER['HTTP_X_FORWARDED_FOR']; + } + return $_SERVER['REMOTE_ADDR'] ?? ''; + } + + /** + * Validates if the csrf token is valid or not.
    + * It requires an open session. + * + * @param bool $alwaysRegenerate [optional] Default is false.
    + * If true then it will generate a new token regardless + * of the method.
    + * If false, then it will generate only if the method is POST.
    + * Note: You must not use true if you want to use csrf with AJAX. + * + * @param string $tokenId [optional] Name of the token. + * + * @return bool It returns true if the token is valid or it is generated. Otherwise, false. + */ + public function csrfIsValid($alwaysRegenerate = false, $tokenId = '_token') + { + if (@$_SERVER['REQUEST_METHOD'] === 'POST' && $alwaysRegenerate === false) { + $this->csrf_token = $_POST[$tokenId] ?? null; // ping pong the token. + return $this->csrf_token . '|' . $this->ipClient() === ($_SESSION[$tokenId] ?? null); + } + + if ($this->csrf_token == '' || $alwaysRegenerate) { + // if not token then we generate a new one + $this->regenerateToken($tokenId); + } + return true; + } + + /** + * Stop injecting content into a section and return its contents. + * + * @return string + */ + public function yieldSection() + { + $sc = $this->stopSection(); + return $this->sections[$sc] ?? null; + } + + /** + * Stop injecting content into a section. + * + * @param bool $overwrite + * @return string + */ + public function stopSection($overwrite = false) + { + if (empty($this->sectionStack)) { + $this->showError('stopSection', 'Cannot end a section without first starting one.', true, true); + } + $last = \array_pop($this->sectionStack); + if ($overwrite) { + $this->sections[$last] = \ob_get_clean(); + } else { + $this->extendSection($last, \ob_get_clean()); + } + return $last; + } + + /** + * Append content to a given section. + * + * @param string $section + * @param string $content + * @return void + */ + protected function extendSection($section, $content) + { + if (isset($this->sections[$section])) { + $content = \str_replace($this->PARENTKEY, $content, $this->sections[$section]); + } + $this->sections[$section] = $content; + } + + public function dump($object, $jsconsole = false) + { + if (!$jsconsole) { + echo '
    ';
    +            \var_dump($object);
    +            echo '
    '; + } else { + /** @noinspection BadExpressionStatementJS */ + /** @noinspection JSVoidFunctionReturnValueUsed */ + echo ''; + } + } + + /** + * Start injecting content into a section. + * + * @param string $section + * @param string $content + * @return void + */ + public function startSection($section, $content = '') + { + if ($content === '') { + \ob_start() && $this->sectionStack[] = $section; + } else { + $this->extendSection($section, $content); + } + } + + /** + * Stop injecting content into a section and append it. + * + * @return string + * @throws InvalidArgumentException + */ + public function appendSection() + { + if (empty($this->sectionStack)) { + $this->showError('appendSection', 'Cannot end a section without first starting one.', true, true); + } + $last = \array_pop($this->sectionStack); + if (isset($this->sections[$last])) { + $this->sections[$last] .= \ob_get_clean(); + } else { + $this->sections[$last] = \ob_get_clean(); + } + return $last; + } + + /** + * Adds a global variable. If $varname is an array then it merges all the values. + * Example: + *
    +     * $this->share('variable',10.5);
    +     * $this->share('variable2','hello');
    +     * // or we could add the two variables as:
    +     * $this->share(['variable'=>10.5,'variable2'=>'hello']);
    +     * 
    + * + * @param string|array $varname It is the name of the variable or, it is an associative array + * @param mixed $value + * @return $this + * @see \eftec\bladeone\BladeOne::share + */ + public function with($varname, $value = null) + { + return $this->share($varname, $value); + } + + /** + * Adds a global variable. If $varname is an array then it merges all the values. + * Example: + *
    +     * $this->share('variable',10.5);
    +     * $this->share('variable2','hello');
    +     * // or we could add the two variables as:
    +     * $this->share(['variable'=>10.5,'variable2'=>'hello']);
    +     * 
    + * + * @param string|array $varname It is the name of the variable or it is an associative array + * @param mixed $value + * @return $this + */ + public function share($varname, $value = null) + { + if (is_array($varname)) { + $this->variablesGlobal = \array_merge($this->variablesGlobal, $varname); + } else { + $this->variablesGlobal[$varname] = $value; + } + return $this; + } + + /** + * Get the string contents of a section. + * + * @param string $section + * @param string $default + * @return string + */ + public function yieldContent($section, $default = '') + { + if (isset($this->sections[$section])) { + return \str_replace($this->PARENTKEY, $default, $this->sections[$section]); + } + + return $default; + } + + /** + * Register a custom Blade compiler. + * + * @param callable $compiler + * @return void + */ + public function extend(callable $compiler) + { + $this->extensions[] = $compiler; + } + + /** + * Register a handler for custom directives for run at runtime + * + * @param string $name + * @param callable $handler + * @return void + */ + public function directiveRT($name, callable $handler) + { + $this->customDirectives[$name] = $handler; + $this->customDirectivesRT[$name] = true; + } + + /** + * Sets the escaped content tags used for the compiler. + * + * @param string $openTag + * @param string $closeTag + * @return void + */ + public function setEscapedContentTags($openTag, $closeTag) + { + $this->setContentTags($openTag, $closeTag, true); + } + + /** + * Gets the content tags used for the compiler. + * + * @return array + */ + public function getContentTags() + { + return $this->getTags(); + } + + /** + * Sets the content tags used for the compiler. + * + * @param string $openTag + * @param string $closeTag + * @param bool $escaped + * @return void + */ + public function setContentTags($openTag, $closeTag, $escaped = false) + { + $property = ($escaped === true) ? 'escapedTags' : 'contentTags'; + $this->{$property} = [\preg_quote($openTag), \preg_quote($closeTag)]; + } + + /** + * Gets the tags used for the compiler. + * + * @param bool $escaped + * @return array + */ + protected function getTags($escaped = false) + { + $tags = $escaped ? $this->escapedTags : $this->contentTags; + return \array_map('stripcslashes', $tags); + } + + /** + * Gets the escaped content tags used for the compiler. + * + * @return array + */ + public function getEscapedContentTags() + { + return $this->getTags(true); + } + + /** + * Sets the function used for resolving classes with inject. + * + * @param callable $function + */ + public function setInjectResolver(callable $function) + { + $this->injectResolver = $function; + } + + /** + * Get the file extension for template files. + * + * @return string + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension for the template files. + * It must includes the leading dot e.g. .blade.php + * + * @param string $fileExtension Example: .prefix.ext + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Get the file extension for template files. + * + * @return string + */ + public function getCompiledExtension() + { + return $this->compileExtension; + } + + /** + * Set the file extension for the compiled files. + * Including the leading dot for the extension is required, e.g. .bladec + * + * @param $fileExtension + */ + public function setCompiledExtension($fileExtension) + { + $this->compileExtension = $fileExtension; + } + + /** + * Add new loop to the stack. + * + * @param array|Countable $data + * @return void + */ + public function addLoop($data) + { + $length = \is_array($data) || $data instanceof Countable ? \count($data) : null; + $parent = static::last($this->loopsStack); + $this->loopsStack[] = [ + 'index' => -1, + 'iteration' => 0, + 'remaining' => isset($length) ? $length + 1 : null, + 'count' => $length, + 'first' => true, + 'even' => true, + 'odd' => false, + 'last' => isset($length) ? $length == 1 : null, + 'depth' => \count($this->loopsStack) + 1, + 'parent' => $parent ? (object)$parent : null, + ]; + } + + /** + * Increment the top loop's indices. + * + * @return object + */ + public function incrementLoopIndices() + { + $c = \count($this->loopsStack) - 1; + $loop = &$this->loopsStack[$c]; + + $loop['index']++; + $loop['iteration']++; + $loop['first'] = $loop['index'] == 0; + $loop['even'] = $loop['index'] % 2 == 0; + $loop['odd'] = !$loop['even']; + if (isset($loop['count'])) { + $loop['remaining']--; + $loop['last'] = $loop['index'] == $loop['count'] - 1; + } + return (object)$loop; + } + + /** + * Pop a loop from the top of the loop stack. + * + * @return void + */ + public function popLoop() + { + \array_pop($this->loopsStack); + } + + /** + * Get an instance of the first loop in the stack. + * + * @return object + */ + public function getFirstLoop() + { + return ($last = static::last($this->loopsStack)) ? (object)$last : null; + } + + /** + * Get the rendered contents of a partial from a loop. + * + * @param string $view + * @param array $data + * @param string $iterator + * @param string $empty + * @return string + * @throws Exception + */ + public function renderEach($view, $data, $iterator, $empty = 'raw|') + { + $result = ''; + + if (\count($data) > 0) { + // If is actually data in the array, we will loop through the data and append + // an instance of the partial view to the final result HTML passing in the + // iterated value of this data array, allowing the views to access them. + foreach ($data as $key => $value) { + $data = ['key' => $key, $iterator => $value]; + $result .= $this->runChild($view, $data); + } + } elseif (static::startsWith($empty, 'raw|')) { + $result = \substr($empty, 4); + } else { + $result = $this->run($empty, []); + } + return $result; + } + + /** + * Run the blade engine. It returns the result of the code. + * + * @param string|null $view The name of the cache. Ex: "folder.folder.view" ("/folder/folder/view.blade") + * @param array $variables An associative arrays with the values to display. + * @return string + * @throws Exception + */ + public function run($view = null, $variables = []) + { + $mode = $this->getMode(); + + if ($view === null) { + $view = $this->viewStack; + } + $this->viewStack = null; + if ($view === null) { + $this->showError('run', 'BladeOne: view not set', true); + return ''; + } + + $forced = $mode & 1; // mode=1 forced:it recompiles no matter if the compiled file exists or not. + $runFast = $mode & 2; // mode=2 runfast: the code is not compiled neither checked and it runs directly the compiled + $this->sections = []; + if ($mode == 3) { + $this->showError('run', "we can't force and run fast at the same time", true); + } + return $this->runInternal($view, $variables, $forced, true, $runFast); + } + + /** + * It sets the current view
    + * This value is cleared when it is used (method run).
    + * Example:
    + *
    +     * $this->setView('folder.view')->share(['var1'=>20])->run(); // or $this->run('folder.view',['var1'=>20]);
    +     * 
    + * + * @param string $view + * @return BladeOne + */ + public function setView($view) + { + $this->viewStack = $view; + return $this; + } + + /** + * It injects a function, an instance, or a method class when a view is called.
    + * It could be stacked. If it sets null then it clears all definitions. + * Example:
    + *
    +     * $this->composer('folder.view',function($bladeOne) { $bladeOne->share('newvalue','hi there'); });
    +     * $this->composer('folder.view','namespace1\namespace2\SomeClass'); // SomeClass must exist, and it must have the
    +     *                                                                   // method 'composer'
    +     * $this->composer('folder.*',$instance); // $instance must have the method called 'composer'
    +     * $this->composer(); // clear all composer.
    +     * 
    + * + * @param string|array|null $view It could contains wildcards (*). Example: 'aa.bb.cc','*.bb.cc','aa.bb.*','*.bb.*' + * + * @param callable|string|null $functionOrClass + * @return BladeOne + */ + public function composer($view = null, $functionOrClass = null) + { + if ($view === null && $functionOrClass === null) { + $this->composerStack = []; + return $this; + } + if (is_array($view)) { + foreach ($view as $v) { + $this->composerStack[$v] = $functionOrClass; + } + } else { + $this->composerStack[$view] = $functionOrClass; + } + + return $this; + } + + /** + * Start a component rendering process. + * + * @param string $name + * @param array $data + * @return void + */ + public function startComponent($name, array $data = []) + { + if (\ob_start()) { + $this->componentStack[] = $name; + + $this->componentData[$this->currentComponent()] = $data; + + $this->slots[$this->currentComponent()] = []; + } + } + + /** + * Get the index for the current component. + * + * @return int + */ + protected function currentComponent() + { + return \count($this->componentStack) - 1; + } + + /** + * Render the current component. + * + * @return string + * @throws Exception + */ + public function renderComponent() + { + //echo "
    render
    "; + $name = \array_pop($this->componentStack); + //return $this->runChild($name, $this->componentData()); + $cd = $this->componentData(); + $clean = array_keys($cd); + $r = $this->runChild($name, $cd); + // we clean variables defined inside the component (so they are garbaged when the component is used) + foreach ($clean as $key) { + unset($this->variables[$key]); + } + return $r; + } + + /** + * Get the data for the given component. + * + * @return array + */ + protected function componentData() + { + $cs = count($this->componentStack); + //echo "
    "; + //echo "
    data:
    "; + //var_dump($this->componentData); + //echo "
    datac:
    "; + //var_dump(count($this->componentStack)); + return array_merge( + $this->componentData[$cs], + ['slot' => trim(ob_get_clean())], + $this->slots[$cs] + ); + } + + /** + * Start the slot rendering process. + * + * @param string $name + * @param string|null $content + * @return void + */ + public function slot($name, $content = null) + { + if (\count(\func_get_args()) === 2) { + $this->slots[$this->currentComponent()][$name] = $content; + } elseif (\ob_start()) { + $this->slots[$this->currentComponent()][$name] = ''; + + $this->slotStack[$this->currentComponent()][] = $name; + } + } + + /** + * Save the slot content for rendering. + * + * @return void + */ + public function endSlot() + { + static::last($this->componentStack); + + $currentSlot = \array_pop( + $this->slotStack[$this->currentComponent()] + ); + + $this->slots[$this->currentComponent()] + [$currentSlot] = \trim(\ob_get_clean()); + } + + /** + * @return string + */ + public function getPhpTag() + { + return $this->phpTag; + } + + /** + * @param string $phpTag + */ + public function setPhpTag($phpTag) + { + $this->phpTag = $phpTag; + } + + /** + * @return string + */ + public function getCurrentUser() + { + return $this->currentUser; + } + + /** + * @param string $currentUser + */ + public function setCurrentUser($currentUser) + { + $this->currentUser = $currentUser; + } + + /** + * @return string + */ + public function getCurrentRole() + { + return $this->currentRole; + } + + /** + * @param string $currentRole + */ + public function setCurrentRole($currentRole) + { + $this->currentRole = $currentRole; + } + + /** + * @return string[] + */ + public function getCurrentPermission() + { + return $this->currentPermission; + } + + /** + * @param string[] $currentPermission + */ + public function setCurrentPermission($currentPermission) + { + $this->currentPermission = $currentPermission; + } + + /** + * Returns the current base url without trailing slash. + * + * @return string + */ + public function getBaseUrl() + { + return $this->baseUrl; + } + + /** + * It sets the base url and, it also calculates the relative path.
    + * The base url defines the "root" of the project, not always the level of the domain, but it could be + * any folder.
    + * This value is used to calculate the relativity of the resources but it is also used to set the domain.
    + * Note: The trailing slash is removed automatically if it's present.
    + * Note: We should not use arguments or name of the script.
    + * Examples:
    + *
    +     * $this->setBaseUrl('http://domain.dom/myblog');
    +     * $this->setBaseUrl('http://domain.dom/corporate/erp');
    +     * $this->setBaseUrl('http://domain.dom/blog.php?args=20'); // avoid this one.
    +     * $this->setBaseUrl('http://another.dom');
    +     * 
    + * + * @param string $baseUrl Example http://www.web.com/folder https://www.web.com/folder/anotherfolder + * @return BladeOne + */ + public function setBaseUrl($baseUrl) + { + $this->baseUrl = \rtrim($baseUrl, '/'); // base with the url trimmed + $this->baseDomain = @parse_url($this->baseUrl)['host']; + $currentUrl = $this->getCurrentUrlCalculated(); + if ($currentUrl === '') { + $this->relativePath = ''; + return $this; + } + if (\strpos($currentUrl, $this->baseUrl) === 0) { + $part = \str_replace($this->baseUrl, '', $currentUrl); + $numf = \substr_count($part, '/') - 1; + $numf = ($numf > 10) ? 10 : $numf; // avoid overflow + $this->relativePath = ($numf < 0) ? '' : \str_repeat('../', $numf); + } else { + $this->relativePath = ''; + } + return $this; + } + + /** + * It gets the full current url calculated with the information sends by the user.
    + * Note: If we set baseurl, then it always uses the baseurl as domain (it's safe).
    + * Note: This information could be forged/faked by the end-user.
    + * Note: It returns empty '' if it is called in a command line interface / non-web.
    + * Note: It doesn't return the user and password.
    + * @param bool $noArgs if true then it excludes the arguments. + * @return string + */ + public function getCurrentUrlCalculated($noArgs = false) + { + if (!isset($_SERVER['HTTP_HOST'], $_SERVER['REQUEST_URI'])) { + return ''; + } + $host = $this->baseDomain ?? $_SERVER['HTTP_HOST']; // <-- it could be forged! + $link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http'); + $port = $_SERVER['SERVER_PORT']; + $port2 = (($link === 'http' && $port === '80') || ($link === 'https' && $port === '443')) ? '' : ':' . $port; + $link .= "://$host$port2$_SERVER[REQUEST_URI]"; + if ($noArgs) { + $link = @explode('?', $link)[0]; + } + return $link; + } + + /** + * It returns the relative path to the base url or empty if not set
    + * Example:
    + *
    +     * // current url='http://domain.dom/page/subpage/web.php?aaa=2
    +     * $this->setBaseUrl('http://domain.dom/');
    +     * $this->getRelativePath(); // '../../'
    +     * $this->setBaseUrl('http://domain.dom/');
    +     * $this->getRelativePath(); // '../../'
    +     * 
    + * Note:The relative path is calculated when we set the base url. + * + * @return string + * @see \eftec\bladeone\BladeOne::setBaseUrl + */ + public function getRelativePath() + { + return $this->relativePath; + } + + /** + * It gets the full current canonical url.
    + * Example: https://www.mysite.com/aaa/bb/php.php?aa=bb + *
      + *
    • It returns the $this->canonicalUrl value if is not null
    • + *
    • Otherwise, it returns the $this->currentUrl if not null
    • + *
    • Otherwise, the url is calculated with the information sends by the user
    • + *
    + * + * @return string|null + */ + public function getCanonicalUrl() + { + return $this->canonicalUrl ?? $this->getCurrentUrl(); + } + + /** + * It sets the full canonical url.
    + * Example: https://www.mysite.com/aaa/bb/php.php?aa=bb + * + * @param string|null $canonUrl + * @return BladeOne + */ + public function setCanonicalUrl($canonUrl = null) + { + $this->canonicalUrl = $canonUrl; + return $this; + } + + /** + * It gets the full current url
    + * Example: https://www.mysite.com/aaa/bb/php.php?aa=bb + *
      + *
    • It returns the $this->currentUrl if not null
    • + *
    • Otherwise, the url is calculated with the information sends by the user
    • + *
    + * + * @param bool $noArgs if true then it ignores the arguments. + * @return string|null + */ + public function getCurrentUrl($noArgs = false) + { + $link = $this->currentUrl ?? $this->getCurrentUrlCalculated(); + if ($noArgs) { + $link = @explode('?', $link)[0]; + } + return $link; + } + + /** + * It sets the full current url.
    + * Example: https://www.mysite.com/aaa/bb/php.php?aa=bb + * Note: If the current url is not set, then the system could calculate the current url. + * + * @param string|null $currentUrl + * @return BladeOne + */ + public function setCurrentUrl($currentUrl = null) + { + $this->currentUrl = $currentUrl; + return $this; + } + + /** + * If true then it optimizes the result (it removes tab and extra spaces). + * + * @param bool $bool + * @return BladeOne + */ + public function setOptimize($bool = false) + { + $this->optimize = $bool; + return $this; + } + + /** + * It sets the callback function for authentication. It is used by @can and @cannot + * + * @param callable $fn + */ + public function setCanFunction(callable $fn) + { + $this->authCallBack = $fn; + } + + /** + * It sets the callback function for authentication. It is used by @canany + * + * @param callable $fn + */ + public function setAnyFunction(callable $fn) + { + $this->authAnyCallBack = $fn; + } + + /** + * It sets the callback function for errors. It is used by @error + * + * @param callable $fn + */ + public function setErrorFunction(callable $fn) + { + $this->errorCallBack = $fn; + } + + //
    + // + + /** + * Get the entire loop stack. + * + * @return array + */ + public function getLoopStack() + { + return $this->loopsStack; + } + + /** + * It adds a string inside a quoted string
    + * example:
    + *
    +     * $this->addInsideQuote("'hello'"," world"); // 'hello world'
    +     * $this->addInsideQuote("hello"," world"); // hello world
    +     * 
    + * + * @param $quoted + * @param $newFragment + * @return string + */ + public function addInsideQuote($quoted, $newFragment) + { + if ($this->isQuoted($quoted)) { + return substr($quoted, 0, -1) . $newFragment . substr($quoted, -1); + } + return $quoted . $newFragment; + } + + /** + * Return true if the string is a php variable (it starts with $) + * + * @param string|null $text + * @return bool + */ + public function isVariablePHP($text) + { + if (!$text || strlen($text) < 2) { + return false; + } + return $text[0] === '$'; + } + + /** + * It's the same as "@_e", however it parses the text (using sprintf). + * If the operation fails then, it returns the original expression without translation. + * + * @param $phrase + * + * @return string + */ + public function _ef($phrase) + { + $argv = \func_get_args(); + $r = $this->_e($phrase); + $argv[0] = $r; // replace the first argument with the translation. + $result = @sprintf(...$argv); + return ($result == false) ? $r : $result; + } + + /** + * Tries to translate the word if it's in the array defined by BladeOneLang::$dictionary + * If the operation fails then, it returns the original expression without translation. + * + * @param $phrase + * + * @return string + */ + public function _e($phrase) + { + if ((!\array_key_exists($phrase, static::$dictionary))) { + $this->missingTranslation($phrase); + return $phrase; + } + + return static::$dictionary[$phrase]; + } + + /** + * Log a missing translation into the file $this->missingLog.
    + * If the file is not defined, then it doesn't write the log. + * + * @param string $txt Message to write on. + */ + private function missingTranslation($txt) + { + if (!$this->missingLog) { + return; // if there is not a file assigned then it skips saving. + } + $fz = @\filesize($this->missingLog); + if (\is_object($txt) || \is_array($txt)) { + $txt = \print_r($txt, true); + } + // Rewrite file if more than 100000 bytes + $mode = ($fz > 100000) ? 'w' : 'a'; + $fp = \fopen($this->missingLog, $mode); + \fwrite($fp, $txt . "\n"); + \fclose($fp); + } + + /** + * if num is more than one then it returns the phrase in plural, otherwise the phrase in singular. + * Note: the translation should be as follows: $msg['Person']='Person' $msg=['Person']['p']='People' + * + * @param string $phrase + * @param string $phrases + * @param int $num + * + * @return string + */ + public function _n($phrase, $phrases, $num = 0) + { + if ((!\array_key_exists($phrase, static::$dictionary))) { + $this->missingTranslation($phrase); + return ($num <= 1) ? $phrase : $phrases; + } + + return ($num <= 1) ? $this->_e($phrase) : $this->_e($phrases); + } + + /** + * @param $expression + * @return string + * @see \eftec\bladeone\BladeOne::getCanonicalUrl + */ + public function compileCanonical($expression = null) + { + return ''; + } + + /** + * @param $expression + * @return string + * @see \eftec\bladeone\BladeOne::getBaseUrl() + */ + public function compileBase($expression = null) + { + return ''; + } + + protected function compileUse($expression) + { + return $this->phpTag . 'use ' . $this->stripParentheses($expression) . '; ?>'; + } + + protected function compileSwitch($expression) + { + $this->switchCount++; + $this->firstCaseInSwitch = true; + return $this->phpTag . "switch $expression {"; + } + //
    + // + + protected function compileDump($expression) + { + return $this->phpTagEcho . "\$this->dump$expression;?>"; + } + + protected function compileRelative($expression) + { + return $this->phpTagEcho . "\$this->relative$expression;?>"; + } + + protected function compileMethod($expression) + { + $v = $this->stripParentheses($expression); + + return ""; + } + + protected function compilecsrf($expression = null) + { + $expression = $expression ?? "'_token'"; + return ""; + } + + protected function compileDd($expression) + { + return $this->phpTagEcho . "'
    '; var_dump$expression; echo '
    ';?>"; + } + + /** + * Execute the case tag. + * + * @param $expression + * @return string + */ + protected function compileCase($expression) + { + if ($this->firstCaseInSwitch) { + $this->firstCaseInSwitch = false; + return 'case ' . $expression . ': ?>'; + } + return $this->phpTag . "case $expression: ?>"; + } + + /** + * Compile the while statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileWhile($expression) + { + return $this->phpTag . "while$expression: ?>"; + } + + /** + * default tag used for switch/case + * + * @return string + */ + protected function compileDefault() + { + if ($this->firstCaseInSwitch) { + return $this->showError('@default', '@switch without any @case', true); + } + return $this->phpTag . 'default: ?>'; + } + + protected function compileEndSwitch() + { + --$this->switchCount; + if ($this->switchCount < 0) { + return $this->showError('@endswitch', 'Missing @switch', true); + } + return $this->phpTag . '} // end switch ?>'; + } + + /** + * Compile while statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileInject($expression) + { + $ex = $this->stripParentheses($expression); + $p0 = \strpos($ex, ','); + if ($p0 == false) { + $var = $this->stripQuotes($ex); + $namespace = ''; + } else { + $var = $this->stripQuotes(\substr($ex, 0, $p0)); + $namespace = $this->stripQuotes(\substr($ex, $p0 + 1)); + } + return $this->phpTag . "\$$var = \$this->injectClass('$namespace', '$var'); ?>"; + } + + /** + * Remove first and end quote from a quoted string of text + * + * @param mixed $text + * @return null|string|string[] + */ + public function stripQuotes($text) + { + if (!$text || strlen($text) < 2) { + return $text; + } + $text = trim($text); + $p0 = $text[0]; + $p1 = \substr($text, -1); + if ($p0 === $p1 && ($p0 === '"' || $p0 === "'")) { + return \substr($text, 1, -1); + } + return $text; + } + + /** + * Execute the user defined extensions. + * + * @param string $value + * @return string + */ + protected function compileExtensions($value) + { + foreach ($this->extensions as $compiler) { + $value = $compiler($value, $this); + } + return $value; + } + + /** + * Compile Blade comments into valid PHP. + * + * @param string $value + * @return string + */ + protected function compileComments($value) + { + $pattern = \sprintf('/%s--(.*?)--%s/s', $this->contentTags[0], $this->contentTags[1]); + return \preg_replace($pattern, $this->phpTag . '/*$1*/ ?>', $value); + } + + /** + * Compile Blade echos into valid PHP. + * + * @param string $value + * @return string + */ + protected function compileEchos($value) + { + foreach ($this->getEchoMethods() as $method => $length) { + $value = $this->$method($value); + } + return $value; + } + + /** + * Get the echo methods in the proper order for compilation. + * + * @return array + */ + protected function getEchoMethods() + { + $methods = [ + 'compileRawEchos' => \strlen(\stripcslashes($this->rawTags[0])), + 'compileEscapedEchos' => \strlen(\stripcslashes($this->escapedTags[0])), + 'compileRegularEchos' => \strlen(\stripcslashes($this->contentTags[0])), + ]; + \uksort($methods, static function ($method1, $method2) use ($methods) { + // Ensure the longest tags are processed first + if ($methods[$method1] > $methods[$method2]) { + return -1; + } + if ($methods[$method1] < $methods[$method2]) { + return 1; + } + // Otherwise, give preference to raw tags (assuming they've overridden) + if ($method1 === 'compileRawEchos') { + return -1; + } + if ($method2 === 'compileRawEchos') { + return 1; + } + if ($method1 === 'compileEscapedEchos') { + return -1; + } + if ($method2 === 'compileEscapedEchos') { + return 1; + } + throw new BadMethodCallException("Method [$method1] not defined"); + }); + return $methods; + } + + /** + * Compile Blade statements that start with "@". + * + * @param string $value + * + * @return array|string|string[]|null + */ + protected function compileStatements($value) + { + /** + * @param array $match + * [0]=full expression with @ and parenthesis + * [1]=expression without @ and argument + * [2]=???? + * [3]=argument with parenthesis and without the first @ + * [4]=argument without parenthesis. + * + * @return mixed|string + */ + $callback = function ($match) { + if (static::contains($match[1], '@')) { + // @@escaped tag + $match[0] = isset($match[3]) ? $match[1] . $match[3] : $match[1]; + } else { + if (strpos($match[1], '::') !== false) { + // Someclass::method + return $this->compileStatementClass($match); + } + if (isset($this->customDirectivesRT[$match[1]])) { + if ($this->customDirectivesRT[$match[1]] == true) { + $match[0] = $this->compileStatementCustom($match); + } else { + $match[0] = \call_user_func( + $this->customDirectives[$match[1]], + $this->stripParentheses(static::get($match, 3)) + ); + } + } elseif (\method_exists($this, $method = 'compile' . \ucfirst($match[1]))) { + // it calls the function compile + $match[0] = $this->$method(static::get($match, 3)); + } else { + return $match[0]; + } + } + return isset($match[3]) ? $match[0] : $match[0] . $match[2]; + }; + /* return \preg_replace_callback('/\B@(@?\w+)([ \t]*)(\( ( (?>[^()]+) | (?3) )* \))?/x', $callback, $value); */ + return preg_replace_callback('/\B@(@?\w+(?:::\w+)?)([ \t]*)(\( ( (?>[^()]+) | (?3) )* \))?/x', $callback, $value); + } + + /** + * Determine if a given string contains a given substring. + * + * @param string $haystack + * @param string|array $needles + * @return bool + */ + public static function contains($haystack, $needles) + { + foreach ((array)$needles as $needle) { + if ($needle != '') { + if (\function_exists('mb_strpos')) { + if (\mb_strpos($haystack, $needle) !== false) { + return true; + } + } elseif (\strpos($haystack, $needle) !== false) { + return true; + } + } + } + + return false; + } + + private function compileStatementClass($match) + { + if (isset($match[3])) { + return $this->phpTagEcho . $this->fixNamespaceClass($match[1]) . $match[3] . '; ?>'; + } + + return $this->phpTagEcho . $this->fixNamespaceClass($match[1]) . '(); ?>'; + } + + /** + * Util method to fix namespace of a class
    + * Example: "SomeClass::method()" -> "\namespace\SomeClass::method()"
    + * + * @param string $text + * + * @return string + * @see \eftec\bladeone\BladeOne::$aliasClasses + */ + private function fixNamespaceClass($text) + { + if (strpos($text, '::') === false) { + return $text; + } + $classPart = explode('::', $text, 2); + if (isset($this->aliasClasses[$classPart[0]])) { + $classPart[0] = $this->aliasClasses[$classPart[0]]; + } + return $classPart[0] . '::' . $classPart[1]; + } + + /** + * For compile custom directive at runtime. + * + * @param $match + * @return string + */ + protected function compileStatementCustom($match) + { + $v = $this->stripParentheses(static::get($match, 3)); + $v = ($v == '') ? '' : ',' . $v; + return $this->phpTag . 'call_user_func($this->customDirectives[\'' . $match[1] . '\']' . $v . '); ?>'; + } + + /** + * Get an item from an array using "dot" notation. + * + * @param ArrayAccess|array $array + * @param string $key + * @param mixed $default + * @return mixed + */ + public static function get($array, $key, $default = null) + { + $accesible = \is_array($array) || $array instanceof ArrayAccess; + if (!$accesible) { + return static::value($default); + } + if (\is_null($key)) { + return $array; + } + if (static::exists($array, $key)) { + return $array[$key]; + } + foreach (\explode('.', $key) as $segment) { + if (static::exists($array, $segment)) { + $array = $array[$segment]; + } else { + return static::value($default); + } + } + return $array; + } + + /** + * Determine if the given key exists in the provided array. + * + * @param ArrayAccess|array $array + * @param string|int $key + * @return bool + */ + public static function exists($array, $key) + { + if ($array instanceof ArrayAccess) { + return $array->offsetExists($key); + } + return \array_key_exists($key, $array); + } + + /** + * This method removes the parenthesis of the expression and parse the arguments. + * @param string $expression + * @return array + */ + protected function getArgs($expression) + { + return $this->parseArgs($this->stripParentheses($expression), ' '); + } + + /** + * It separates a string using a separator and a identifier
    + * It excludes quotes,double quotes and the "¬" symbol.
    + * Example
    + *
    +     * $this->parseArgs('a=2,b='a,b,c',d'); // ['a'=>'2','b'=>'a,b,c','d'=>null]
    +     * $this->parseArgs('a=2,b=c,d'); // ['a'=>'2','b'=>'c','d'=>null]
    +     * $this->parseArgs('a=2 b=c',' '); // ['a'=>'2','b'=>'c']
    +     * $this->parseArgs('a:2 b:c',' ',':'); // ['a'=>'2','b'=>'c']
    +     * 
    + * Note: parseArgs('a = 2 b = c',' '); with return 4 values instead of 2. + * + * @param string $text the text to separate + * @param string $separator the separator of arguments + * @param string $assigment the character used to assign a new value + * @param bool $emptyKey if the argument is without value, we return it as key (true) or value (false) ? + * @return array + */ + public function parseArgs($text, $separator = ',', $assigment = '=', $emptyKey = true) + { + if ($text === null || $text === '') { + return []; //nothing to convert. + } + $chars = $text; // str_split($text); + $parts = []; + $nextpart = ''; + $strL = strlen($chars); + $stringArr='"\'¬'; + $parenthesis='([{'; + $parenthesisClose=')]}'; + $insidePar=false; + for ($i = 0; $i < $strL; $i++) { + $char = $chars[$i]; + // we check if the character is a parenthesis. + $pp=strpos($parenthesis, $char); + if ($pp!==false) { + // is a parenthesis, so we mark as inside a parenthesis. + $insidePar=$parenthesisClose[$pp]; + } + if ($char===$insidePar) { + // we close the parenthesis. + $insidePar=false; + } + if (strpos($stringArr, $char)!==false) { // if ($char === '"' || $char === "'" || $char === "¬") { + // we found a string initializer + $inext = strpos($text, $char, $i + 1); + $inext = $inext === false ? $strL : $inext; + $nextpart .= substr($text, $i, $inext - $i + 1); + $i = $inext; + } else { + $nextpart .= $char; + } + if ($char === $separator && $insidePar==false) { + $parts[] = substr($nextpart, 0, -1); + $nextpart = ''; + } + } + if ($nextpart !== '') { + $parts[] = $nextpart; + } + $result = []; + // duct taping for key= argument (it has a space). however, it doesn't work with key =argument + /* + foreach ($parts as $k=>$part) { + if(substr($part,-1)===$assigment && isset($parts[$k+1])) { + var_dump('ok'); + $parts[$k].=$parts[$k+1]; + unset($parts[$k+1]); + } + } + */ + foreach ($parts as $part) { + if ($part) { + $part=trim($part); + $char = $part[0]; + if (strpos($stringArr, $char)!==false) { // if ($char === '"' || $char === "'" || $char === "¬") { + if ($emptyKey) { + $result[$part] = null; + } else { + $result[] = $part; + } + } else { + $r = explode($assigment, $part, 2); + if (count($r) === 2) { + // key=value. + $result[trim($r[0])] = trim($r[1]); + } elseif ($emptyKey) { + $result[trim($r[0])] = null; + } else { + $result[] = trim($r[0]); + } + } + } + } + return $result; + } + public function parseArgsOld($text, $separator = ',') + { + if ($text === null || $text === '') { + return []; //nothing to convert. + } + $chars = str_split($text); + $parts = []; + $nextpart = ''; + $strL = count($chars); + /** @noinspection ForeachInvariantsInspection */ + for ($i = 0; $i < $strL; $i++) { + $char = $chars[$i]; + if ($char === '"' || $char === "'") { + $inext = strpos($text, $char, $i + 1); + $inext = $inext === false ? $strL : $inext; + $nextpart .= substr($text, $i, $inext - $i + 1); + $i = $inext; + } else { + $nextpart .= $char; + } + if ($char === $separator) { + $parts[] = substr($nextpart, 0, -1); + $nextpart = ''; + } + } + if ($nextpart !== '') { + $parts[] = $nextpart; + } + $result = []; + foreach ($parts as $part) { + $r = explode('=', $part, 2); + $result[trim($r[0])] = count($r) === 2 ? trim($r[1]) : null; + } + return $result; + } + /** + * Compile the "raw" echo statements. + * + * @param string $value + * @return string + */ + protected function compileRawEchos($value) + { + $pattern = \sprintf('/(@)?%s\s*(.+?)\s*%s(\r?\n)?/s', $this->rawTags[0], $this->rawTags[1]); + $callback = function ($matches) { + $whitespace = empty($matches[3]) ? '' : $matches[3] . $matches[3]; + return $matches[1] ? \substr( + $matches[0], + 1 + ) : $this->phpTagEcho . $this->compileEchoDefaults($matches[2]) . '; ?>' . $whitespace; + }; + return \preg_replace_callback($pattern, $callback, $value); + } + + /** + * Compile the default values for the echo statement. + * + * @param string $value + * @return string + */ + protected function compileEchoDefaults($value) + { + $result = \preg_replace('/^(?=\$)(.+?)\s+or\s+(.+?)$/s', 'isset($1) ? $1 : $2', $value); + if (!$this->pipeEnable) { + return $this->fixNamespaceClass($result); + } + return $this->pipeDream($this->fixNamespaceClass($result)); + } + + /** + * It converts a string separated by pipes | into an filtered expression.
    + * If the method exists (as directive), then it is used
    + * If the method exists (in this class) then it is used
    + * Otherwise, it uses a global function.
    + * If you want to escape the "|", then you could use "/|"
    + * Note: It only works if $this->pipeEnable=true and by default it is false
    + * Example:
    + *
    +     * $this->pipeDream('$name | strtolower | substr:0,4'); // strtolower(substr($name ,0,4)
    +     * $this->pipeDream('$name| getMode') // $this->getMode($name)
    +     * 
    + * + * @param string $result + * @return string + * @\eftec\bladeone\BladeOne::$pipeEnable + */ + protected function pipeDream($result) + { + $array = preg_split('~\\\\.(*SKIP)(*FAIL)|\|~s', $result); + $c = count($array) - 1; // base zero. + if ($c === 0) { + return $result; + } + + $prev = ''; + for ($i = $c; $i >= 1; $i--) { + $r = @explode(':', $array[$i], 2); + $fnName = trim($r[0]); + $fnNameF = $fnName[0]; // first character + if ($fnNameF === '"' || $fnNameF === '\'' || $fnNameF === '$' || is_numeric($fnNameF)) { + $fnName = '!isset(' . $array[0] . ') ? ' . $fnName . ' : '; + } elseif (isset($this->customDirectives[$fnName])) { + $fnName = '$this->customDirectives[\'' . $fnName . '\']'; + } elseif (method_exists($this, $fnName)) { + $fnName = '$this->' . $fnName; + } + if ($i === 1) { + $prev = $fnName . '(' . $array[0]; + if (count($r) === 2) { + $prev .= ',' . $r[1]; + } + $prev .= ')'; + } else { + $prev = $fnName . '(' . $prev; + if (count($r) === 2) { + if ($i === 2) { + $prev .= ','; + } + $prev .= $r[1] . ')'; + } + } + } + return $prev; + } + + /** + * Compile the "regular" echo statements. {{ }} + * + * @param string $value + * @return string + */ + protected function compileRegularEchos($value) + { + $pattern = \sprintf('/(@)?%s\s*(.+?)\s*%s(\r?\n)?/s', $this->contentTags[0], $this->contentTags[1]); + $callback = function ($matches) { + $whitespace = empty($matches[3]) ? '' : $matches[3] . $matches[3]; + $wrapped = \sprintf($this->echoFormat, $this->compileEchoDefaults($matches[2])); + return $matches[1] ? \substr($matches[0], 1) : $this->phpTagEcho . $wrapped . '; ?>' . $whitespace; + }; + return \preg_replace_callback($pattern, $callback, $value); + } + + /** + * Compile the escaped echo statements. {!! !!} + * + * @param string $value + * @return string + */ + protected function compileEscapedEchos($value) + { + $pattern = \sprintf('/(@)?%s\s*(.+?)\s*%s(\r?\n)?/s', $this->escapedTags[0], $this->escapedTags[1]); + $callback = function ($matches) { + $whitespace = empty($matches[3]) ? '' : $matches[3] . $matches[3]; + + return $matches[1] ? $matches[0] : $this->phpTag + . \sprintf($this->echoFormat, $this->compileEchoDefaults($matches[2])) . '; ?>' + . $whitespace; + //return $matches[1] ? $matches[0] : $this->phpTag + // . 'echo static::e(' . $this->compileEchoDefaults($matches[2]) . '); ? >' . $whitespace; + }; + return \preg_replace_callback($pattern, $callback, $value); + } + + /** + * Compile the "@each" tag into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileEach($expression) + { + return $this->phpTagEcho . "\$this->renderEach$expression; ?>"; + } + + protected function compileSet($expression) + { + //$segments = \explode('=', \preg_replace("/[()\\\']/", '', $expression)); + $segments = \explode('=', $this->stripParentheses($expression)); + $value = (\count($segments) >= 2) ? '=@' . $segments[1] : '++'; + return $this->phpTag . \trim($segments[0]) . $value . ';?>'; + } + + /** + * Compile the yield statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileYield($expression) + { + return $this->phpTagEcho . "\$this->yieldContent$expression; ?>"; + } + + /** + * Compile the show statements into valid PHP. + * + * @return string + */ + protected function compileShow() + { + return $this->phpTagEcho . '$this->yieldSection(); ?>'; + } + + /** + * Compile the section statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileSection($expression) + { + return $this->phpTag . "\$this->startSection$expression; ?>"; + } + + /** + * Compile the append statements into valid PHP. + * + * @return string + */ + protected function compileAppend() + { + return $this->phpTag . '$this->appendSection(); ?>'; + } + + /** + * Compile the auth statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileAuth($expression = '') + { + $role = $this->stripParentheses($expression); + if ($role == '') { + return $this->phpTag . 'if(isset($this->currentUser)): ?>'; + } + + return $this->phpTag . "if(isset(\$this->currentUser) && \$this->currentRole==$role): ?>"; + } + + /** + * Compile the elseauth statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileElseAuth($expression = '') + { + $role = $this->stripParentheses($expression); + if ($role == '') { + return $this->phpTag . 'else: ?>'; + } + + return $this->phpTag . "elseif(isset(\$this->currentUser) && \$this->currentRole==$role): ?>"; + } + + /** + * Compile the end-auth statements into valid PHP. + * + * @return string + */ + protected function compileEndAuth() + { + return $this->phpTag . 'endif; ?>'; + } + + protected function compileCan($expression) + { + $v = $this->stripParentheses($expression); + return $this->phpTag . 'if (call_user_func($this->authCallBack,' . $v . ')): ?>'; + } + + /** + * Compile the else statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileElseCan($expression = '') + { + $v = $this->stripParentheses($expression); + if ($v) { + return $this->phpTag . 'elseif (call_user_func($this->authCallBack,' . $v . ')): ?>'; + } + + return $this->phpTag . 'else: ?>'; + } + //
    + // + + protected function compileCannot($expression) + { + $v = $this->stripParentheses($expression); + return $this->phpTag . 'if (!call_user_func($this->authCallBack,' . $v . ')): ?>'; + } + + /** + * Compile the elsecannot statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileElseCannot($expression = '') + { + $v = $this->stripParentheses($expression); + if ($v) { + return $this->phpTag . 'elseif (!call_user_func($this->authCallBack,' . $v . ')): ?>'; + } + + return $this->phpTag . 'else: ?>'; + } + + /** + * Compile the canany statements into valid PHP. + * canany(['edit','write']) + * + * @param $expression + * @return string + */ + protected function compileCanAny($expression) + { + $role = $this->stripParentheses($expression); + return $this->phpTag . 'if (call_user_func($this->authAnyCallBack,' . $role . ')): ?>'; + } + + /** + * Compile the else statements into valid PHP. + * + * @param $expression + * @return string + */ + protected function compileElseCanAny($expression) + { + $role = $this->stripParentheses($expression); + if ($role == '') { + return $this->phpTag . 'else: ?>'; + } + return $this->phpTag . 'elseif (call_user_func($this->authAnyCallBack,' . $role . ')): ?>'; + } + + /** + * Compile the guest statements into valid PHP. + * + * @param null $expression + * @return string + */ + protected function compileGuest($expression = null) + { + if ($expression === null) { + return $this->phpTag . 'if(!isset($this->currentUser)): ?>'; + } + + $role = $this->stripParentheses($expression); + if ($role == '') { + return $this->phpTag . 'if(!isset($this->currentUser)): ?>'; + } + + return $this->phpTag . "if(!isset(\$this->currentUser) || \$this->currentRole!=$role): ?>"; + } + + /** + * Compile the else statements into valid PHP. + * + * @param $expression + * @return string + */ + protected function compileElseGuest($expression) + { + $role = $this->stripParentheses($expression); + if ($role == '') { + return $this->phpTag . 'else: ?>'; + } + + return $this->phpTag . "elseif(!isset(\$this->currentUser) || \$this->currentRole!=$role): ?>"; + } + + /** + * /** + * Compile the end-auth statements into valid PHP. + * + * @return string + */ + protected function compileEndGuest() + { + return $this->phpTag . 'endif; ?>'; + } + + /** + * Compile the end-section statements into valid PHP. + * + * @return string + */ + protected function compileEndsection() + { + return $this->phpTag . '$this->stopSection(); ?>'; + } + + /** + * Compile the stop statements into valid PHP. + * + * @return string + */ + protected function compileStop() + { + return $this->phpTag . '$this->stopSection(); ?>'; + } + + /** + * Compile the overwrite statements into valid PHP. + * + * @return string + */ + protected function compileOverwrite() + { + return $this->phpTag . '$this->stopSection(true); ?>'; + } + + /** + * Compile the unless statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileUnless($expression) + { + return $this->phpTag . "if ( ! $expression): ?>"; + } + + /** + * Compile the User statements into valid PHP. + * + * @return string + */ + protected function compileUser() + { + return $this->phpTagEcho . "'" . $this->currentUser . "'; ?>"; + } + + /** + * Compile the endunless statements into valid PHP. + * + * @return string + */ + protected function compileEndunless() + { + return $this->phpTag . 'endif; ?>'; + } + // + // + + /** + * @error('key') + * + * @param $expression + * @return string + */ + protected function compileError($expression) + { + $key = $this->stripParentheses($expression); + return $this->phpTag . '$message = call_user_func($this->errorCallBack,' . $key . '); if ($message): ?>'; + } + + /** + * Compile the end-error statements into valid PHP. + * + * @return string + */ + protected function compileEndError() + { + return $this->phpTag . 'endif; ?>'; + } + + /** + * Compile the else statements into valid PHP. + * + * @return string + */ + protected function compileElse() + { + return $this->phpTag . 'else: ?>'; + } + + /** + * Compile the for statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileFor($expression) + { + return $this->phpTag . "for$expression: ?>"; + } + // + // + + /** + * Compile the foreach statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileForeach($expression) + { + //\preg_match('/\( *(.*) * as *([^\)]*)/', $expression, $matches); + \preg_match('/\( *(.*) * as *([^)]*)/', $expression, $matches); + $iteratee = \trim($matches[1]); + $iteration = \trim($matches[2]); + $initLoop = "\$__currentLoopData = $iteratee; \$this->addLoop(\$__currentLoopData);\$this->getFirstLoop();\n"; + $iterateLoop = '$loop = $this->incrementLoopIndices(); '; + return $this->phpTag . "$initLoop foreach(\$__currentLoopData as $iteration): $iterateLoop ?>"; + } + + /** + * Compile a split of a foreach cycle. Used for example when we want to separate limites each "n" elements. + * + * @param string $expression + * @return string + */ + protected function compileSplitForeach($expression) + { + return $this->phpTagEcho . '$this::splitForeach' . $expression . '; ?>'; + } + + /** + * Compile the break statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileBreak($expression) + { + return $expression ? $this->phpTag . "if$expression break; ?>" : $this->phpTag . 'break; ?>'; + } + + /** + * Compile the continue statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileContinue($expression) + { + return $expression ? $this->phpTag . "if$expression continue; ?>" : $this->phpTag . 'continue; ?>'; + } + + /** + * Compile the forelse statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileForelse($expression) + { + $empty = '$__empty_' . ++$this->forelseCounter; + return $this->phpTag . "$empty = true; foreach$expression: $empty = false; ?>"; + } + + /** + * Compile the if statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileIf($expression) + { + return $this->phpTag . "if$expression: ?>"; + } + // + // + + /** + * Compile the else-if statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileElseif($expression) + { + return $this->phpTag . "elseif$expression: ?>"; + } + + /** + * Compile the forelse statements into valid PHP. + * + * @param string $expression empty if it's inside a for loop. + * @return string + */ + protected function compileEmpty($expression = '') + { + if ($expression == '') { + $empty = '$__empty_' . $this->forelseCounter--; + return $this->phpTag . "endforeach; if ($empty): ?>"; + } + return $this->phpTag . "if (empty$expression): ?>"; + } + + /** + * Compile the has section statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileHasSection($expression) + { + return $this->phpTag . "if (! empty(trim(\$this->yieldContent$expression))): ?>"; + } + + /** + * Compile the end-while statements into valid PHP. + * + * @return string + */ + protected function compileEndwhile() + { + return $this->phpTag . 'endwhile; ?>'; + } + + /** + * Compile the end-for statements into valid PHP. + * + * @return string + */ + protected function compileEndfor() + { + return $this->phpTag . 'endfor; ?>'; + } + + /** + * Compile the end-for-each statements into valid PHP. + * + * @return string + */ + protected function compileEndforeach() + { + return $this->phpTag . 'endforeach; $this->popLoop(); $loop = $this->getFirstLoop(); ?>'; + } + + /** + * Compile the end-can statements into valid PHP. + * + * @return string + */ + protected function compileEndcan() + { + return $this->phpTag . 'endif; ?>'; + } + + /** + * Compile the end-can statements into valid PHP. + * + * @return string + */ + protected function compileEndcanany() + { + return $this->phpTag . 'endif; ?>'; + } + + /** + * Compile the end-cannot statements into valid PHP. + * + * @return string + */ + protected function compileEndcannot() + { + return $this->phpTag . 'endif; ?>'; + } + + /** + * Compile the end-if statements into valid PHP. + * + * @return string + */ + protected function compileEndif() + { + return $this->phpTag . 'endif; ?>'; + } + + /** + * Compile the end-for-else statements into valid PHP. + * + * @return string + */ + protected function compileEndforelse() + { + return $this->phpTag . 'endif; ?>'; + } + + /** + * Compile the raw PHP statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compilePhp($expression) + { + return $expression ? $this->phpTag . "$expression; ?>" : $this->phpTag; + } + + // + + /** + * Compile end-php statement into valid PHP. + * + * @return string + */ + protected function compileEndphp() + { + return ' ?>'; + } + + /** + * Compile the unset statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileUnset($expression) + { + return $this->phpTag . "unset$expression; ?>"; + } + + /** + * Compile the extends statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileExtends($expression) + { + $expression = $this->stripParentheses($expression); + // $_shouldextend avoids to runchild if it's not evaluated. + // For example @if(something) @extends('aaa.bb') @endif() + // If something is false then it's not rendered at the end (footer) of the script. + $this->uidCounter++; + $data = $this->phpTag . 'if (isset($_shouldextend[' . $this->uidCounter . '])) { echo $this->runChild(' . $expression . '); } ?>'; + $this->footer[] = $data; + return $this->phpTag . '$_shouldextend[' . $this->uidCounter . ']=1; ?>'; + } + + + /** + * Execute the @parent command. This operation works in tandem with extendSection + * + * @return string + * @see extendSection + */ + protected function compileParent() + { + return $this->PARENTKEY; + } + + /** + * Compile the include statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileInclude($expression) + { + $expression = $this->stripParentheses($expression); + return $this->phpTagEcho . '$this->runChild(' . $expression . '); ?>'; + } + + /** + * It loads a compiled template and paste inside the code.
    + * It uses more disk space, but it decreases the number of includes
    + * + * @param $expression + * @return string + * @throws Exception + */ + protected function compileIncludeFast($expression) + { + $expression = $this->stripParentheses($expression); + $ex = $this->stripParentheses($expression); + $exp = \explode(',', $ex); + $file = $this->stripQuotes($exp[0] ?? null); + $fileC = $this->getCompiledFile($file); + if (!@\is_file($fileC)) { + // if the file doesn't exist then it's created + $this->compile($file, true); + } + return $this->getFile($fileC); + } + + /** + * Compile the include statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileIncludeIf($expression) + { + return $this->phpTag . 'if ($this->templateExist' . $expression . ') echo $this->runChild' . $expression . '; ?>'; + } + + /** + * Compile the include statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileIncludeWhen($expression) + { + $expression = $this->stripParentheses($expression); + return $this->phpTagEcho . '$this->includeWhen(' . $expression . '); ?>'; + } + + /** + * Compile the includefirst statement + * + * @param string $expression + * @return string + */ + protected function compileIncludeFirst($expression) + { + $expression = $this->stripParentheses($expression); + return $this->phpTagEcho . '$this->includeFirst(' . $expression . '); ?>'; + } + + /** + * Compile the {@}compilestamp statement. + * + * @param string $expression + * + * @return false|string + */ + protected function compileCompileStamp($expression) + { + $expression = $this->stripQuotes($this->stripParentheses($expression)); + $expression = ($expression === '') ? 'Y-m-d H:i:s' : $expression; + return date($expression); + } + + /** + * compile the {@}viewname statement
    + * {@}viewname('compiled') returns the full compiled path + * {@}viewname('template') returns the full template path + * {@}viewname('') returns the view name. + * + * @param mixed $expression + * + * @return string + */ + protected function compileViewName($expression) + { + $expression = $this->stripQuotes($this->stripParentheses($expression)); + switch ($expression) { + case 'compiled': + return $this->getCompiledFile($this->fileName); + case 'template': + return $this->getTemplateFile($this->fileName); + default: + return $this->fileName; + } + } + + /** + * Compile the stack statements into the content. + * + * @param string $expression + * @return string + */ + protected function compileStack($expression) + { + return $this->phpTagEcho . "\$this->yieldPushContent$expression; ?>"; + } + + /** + * Compile the endpush statements into valid PHP. + * + * @return string + */ + protected function compileEndpush() + { + return $this->phpTag . '$this->stopPush(); ?>'; + } + + /** + * Compile the endpushonce statements into valid PHP. + * + * @return string + */ + protected function compileEndpushOnce() + { + return $this->phpTag . '$this->stopPush(); endif; ?>'; + } + + /** + * Compile the endpush statements into valid PHP. + * + * @return string + */ + protected function compileEndPrepend() + { + return $this->phpTag . '$this->stopPrepend(); ?>'; + } + + /** + * Compile the component statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileComponent($expression) + { + return $this->phpTag . " \$this->startComponent$expression; ?>"; + } + + /** + * Compile the end-component statements into valid PHP. + * + * @return string + */ + protected function compileEndComponent() + { + return $this->phpTagEcho . '$this->renderComponent(); ?>'; + } + + /** + * Compile the slot statements into valid PHP. + * + * @param string $expression + * @return string + */ + protected function compileSlot($expression) + { + return $this->phpTag . " \$this->slot$expression; ?>"; + } + + /** + * Compile the end-slot statements into valid PHP. + * + * @return string + */ + protected function compileEndSlot() + { + return $this->phpTag . ' $this->endSlot(); ?>'; + } + + protected function compileAsset($expression) + { + return $this->phpTagEcho . "(isset(\$this->assetDict[$expression]))?\$this->assetDict[$expression]:\$this->baseUrl.'/'.$expression; ?>"; + } + + protected function compileJSon($expression) + { + $parts = \explode(',', $this->stripParentheses($expression)); + $options = isset($parts[1]) ? \trim($parts[1]) : JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT; + $depth = isset($parts[2]) ? \trim($parts[2]) : 512; + return $this->phpTagEcho . "json_encode($parts[0], $options, $depth); ?>"; + } + //
    + + // + + protected function compileIsset($expression) + { + return $this->phpTag . "if(isset$expression): ?>"; + } + + protected function compileEndIsset() + { + return $this->phpTag . 'endif; ?>'; + } + + protected function compileEndEmpty() + { + return $this->phpTag . 'endif; ?>'; + } + + // + + /** + * Resolve a given class using the injectResolver callable. + * + * @param string $className + * @param string|null $variableName + * @return mixed + */ + protected function injectClass($className, $variableName = null) + { + if (isset($this->injectResolver)) { + return call_user_func($this->injectResolver, $className, $variableName); + } + + $fullClassName = $className . "\\" . $variableName; + return new $fullClassName(); + } + + /** + * Used for @_e directive. + * + * @param $expression + * + * @return string + */ + protected function compile_e($expression) + { + return $this->phpTagEcho . "\$this->_e$expression; ?>"; + } + + /** + * Used for @_ef directive. + * + * @param $expression + * + * @return string + */ + protected function compile_ef($expression) + { + return $this->phpTagEcho . "\$this->_ef$expression; ?>"; + } + + // + + /** + * Used for @_n directive. + * + * @param $expression + * + * @return string + */ + protected function compile_n($expression) + { + return $this->phpTagEcho . "\$this->_n$expression; ?>"; + } + + // + + + // + public static function isCli() + { + return !http_response_code(); + } + + /** + * @param $key + * @param string $default is the defalut value is the parameter is set + * without value. + * @param bool $set it is the value returned when the argument is set but there is not value assigned + * @return string + */ + public static function getParameterCli($key, $default = '', $set = true) + { + global $argv; + $p = array_search('-' . $key, $argv, true); + if ($p === false) { + return $default; + } + if (isset($argv[$p + 1])) { + return self::removeTrailSlash($argv[$p + 1]); + } + return $set; + } + + protected static function removeTrailSlash($txt) + { + return rtrim($txt, '/\\'); + } + + /** + * @param string $str + * @param string $type=['i','e','s','w'][$i] + * @return string + */ + public static function colorLog($str, $type = 'i') + { + switch ($type) { + case 'e': //error + return "\033[31m$str\033[0m"; + case 's': //success + return "\033[32m$str\033[0m"; + case 'w': //warning + return "\033[33m$str\033[0m"; + case 'i': //info + return "\033[36m$str\033[0m"; + default: + return $str; + } + } + public function checkHealthPath() + { + echo self::colorLog("Checking Health\n"); + if (is_dir($this->compiledPath)) { + echo "Compile-path [$this->compiledPath] is a folder ".self::colorLog("OK")."\n"; + } else { + echo "Compile-path [$this->compiledPath] is not a folder ".self::colorLog("ERROR", 'e')."\n"; + } + $error=self::colorLog('OK'); + try { + /** @noinspection RandomApiMigrationInspection */ + $rnd=$this->compiledPath . '/dummy'.rand(10000, 900009); + $f = @file_put_contents($rnd, 'dummy'); + if ($f===false) { + $error=self::colorLog("Unable to create file [".$this->compiledPath . '/dummy]', 'e'); + } + @unlink($rnd); + } catch (Exception $ex) { + $error=self::colorLog($ex->getMessage(), 'e'); + } + echo "Testing write in the compile folder [$rnd] $error\n"; + $files = @glob($this->templatePath[0].'/*'); + echo "Testing reading in the view folder [".$this->templatePath[0]."].\n"; + echo "View(s) found :".count($files)."\n"; + } + public function clearcompile() + { + echo self::colorLog("Clearing Compile Folder\n"); + $files = glob($this->compiledPath.'/*'); // get all file names + $count=0; + foreach ($files as $file) { // iterate files + if (is_file($file)) { + $count++; + echo "deleting [$file] "; + $r=@unlink($file); // delete file + if ($r) { + echo self::colorLog("OK\n"); + } else { + echo self::colorLog("ERROR\n", 'e'); + } + } + } + echo "Files deleted $count\n"; + } + public function cliEngine() + { + $clearcompile = self::getParameterCli('clearcompile'); + $check = self::getParameterCli('check'); + echo' ____ _ _ ____ '."\n"; + echo' | _ \| | | | / __ \ '."\n"; + echo' | |_) | | __ _ __| | ___| | | |_ __ ___ '."\n"; + echo' | _ <| |/ _` |/ _` |/ _ \ | | | \'_ \ / _ \\'."\n"; + echo' | |_) | | (_| | (_| | __/ |__| | | | | __/'."\n"; + echo' |____/|_|\__,_|\__,_|\___|\____/|_| |_|\___|'." V.". self::VERSION."\n\n"; + echo"\n"; + $done=false; + if ($check) { + $done=true; + $this->checkHealthPath(); + } + if ($clearcompile) { + $done=true; + $this->clearcompile(); + } + if (!$done) { + echo" Syntax:\n"; + echo" -templatepath (optional) the template-path.\n Example: '/folder/views' or 'views' (relative)\n"; + echo" -compilepath (optional) the compile-path.\n Example: '/folder/compiles or 'compiles' (relative)\n"; + echo" -clearcompile It deletes the content of the compile path\n"; + echo" -check It checks the library\n"; + } + } + public static function isAbsolutePath($path) + { + if (!$path) { + return true; + } + if (DIRECTORY_SEPARATOR === '/') { + // linux and macos + return $path[0]==='/'; + } + return $path[1]===':'; + } + + // +} +if (!defined('PHPUNIT_COMPOSER_INSTALL') && !defined('__PHPUNIT_PHAR__') + && isset($_SERVER['PHP_SELF']) && basename($_SERVER['PHP_SELF']) === 'BladeOne.php' + && BladeOne::isCli()) { + $compilepath = BladeOne::getParameterCli('compilepath', null); + $templatepath = BladeOne::getParameterCli('templatepath', null); + if (!BladeOne::isAbsolutePath($compilepath)) { + $compilepath=getcwd().'/'.$compilepath; + } + if (!BladeOne::isAbsolutePath($templatepath)) { + $templatepath=getcwd().'/'.$templatepath; + } + $inst=new BladeOne($templatepath, $compilepath); + $inst->cliEngine(); +} diff --git a/app/engine/core/blade/BladeOneCache.php b/app/engine/core/blade/BladeOneCache.php new file mode 100644 index 0000000..81eafea --- /dev/null +++ b/app/engine/core/blade/BladeOneCache.php @@ -0,0 +1,328 @@ + + * @ cache([cacheid],[duration=86400]). The id is optional. The duration of the cache is in seconds + * // content here + * @ endcache() + * + * It also adds a new function (optional) to the business or logic layer + * + * if ($blade->cacheExpired('hellocache',1,5)) { //'helloonecache' =template, =1 id cache, 5=duration (seconds) + * // cache expired, so we should do some stuff (such as read from the database) + * } + * + * + * @package BladeOneCache + * @version 3.42 2020-04-25 + * @link https://github.com/EFTEC/BladeOne + * @author Jorge Patricio Castro Castillo + */ +trait BladeOneCache +{ + protected $curCacheId = 0; + protected $curCacheDuration = 0; + protected $curCachePosition = 0; + protected $cacheRunning = false; + protected $cachePageRunning = false; + protected $cacheLog; + /** + * @var array avoids to compare the file different times. It also avoids race conditions. + */ + private $cacheExpired = []; + /** + * @var string=['get','post','getpost','request',null][$i] + */ + private $cacheStrategy; + /** @var array|null */ + private $cacheStrategyIndex; + + /** + * @return null|string $cacheStrategy=['get','post','getpost','request',null][$i] + */ + public function getCacheStrategy() + { + return $this->cacheStrategy; + } + + /** + * It sets the cache log. If not cache log then it does not generates a log file
    + * The cache log stores each time a template is creates or expired.
    + * + * @param string $file + */ + public function setCacheLog($file) + { + $this->cacheLog=$file; + } + + public function writeCacheLog($txt, $nivel) + { + if (!$this->cacheLog) { + return; // if there is not a file assigned then it skips saving. + } + $fz = @filesize($this->cacheLog); + if (is_object($txt) || is_array($txt)) { + $txt = print_r($txt, true); + } + // Rewrite file if more than 100000 bytes + $mode=($fz > 100000) ? 'w':'a'; + $fp = fopen($this->cacheLog, $mode); + if ($fp === false) { + return; + } + switch ($nivel) { + case 1: + $txtNivel='expired'; + break; + case 2: + $txtNivel='new'; + break; + default: + $txtNivel='other'; + } + $txtarg=json_encode($this->cacheUniqueGUID(false)); + fwrite($fp, date('c') . "\t$txt\t$txtNivel\t$txtarg\n"); + fclose($fp); + } + + /** + * It sets the strategy of the cache page. + * + * @param null|string $cacheStrategy =['get','post','getpost','request',null][$i] + * @param array|null $index if null then it reads all indexes. If not, it reads a indexes. + */ + public function setCacheStrategy($cacheStrategy, $index = null) + { + $this->cacheStrategy = $cacheStrategy; + $this->cacheStrategyIndex = $index; + } + + /** + * It obtains an unique GUID based in:
    + * get= parameters from the url
    + * post= parameters sends via post
    + * getpost = a mix between get and post
    + * request = get, post and cookies (including sessions)
    + * MD5 could generate colisions (2^64 = 18,446,744,073,709,551,616) but the end hash is the sum of the hash of + * the page + this GUID. + * + * @param bool $serialize if true then it serializes using md5 + * @return string + */ + private function cacheUniqueGUID($serialize = true) + { + switch ($this->cacheStrategy) { + case 'get': + $r = $_GET; + break; + case 'post': + $r = $_POST; + break; + case 'getpost': + $arr = array_merge($_GET, $_POST); + $r = $arr; + break; + case 'request': + $r = $_REQUEST; + break; + default: + $r = null; + } + if ($this->cacheStrategyIndex === null || !is_array($r)) { + $r= serialize($r); + } else { + $copy=[]; + foreach ($r as $key => $item) { + if (in_array($key, $this->cacheStrategyIndex, true)) { + $copy[$key]=$item; + } + } + $r=serialize($copy); + } + return $serialize===true ? md5($r): $r; + } + + public function compileCache($expression) + { + // get id of template + // if the file exists then + // compare date. + // if the date is too old then re-save. + // else + // save for the first time. + + return $this->phpTag . "echo \$this->cacheStart$expression; if(!\$this->cacheRunning) { ?>"; + } + + public function compileEndCache($expression) + { + return $this->phpTag . "} // if cacheRunning\necho \$this->cacheEnd$expression; ?>"; + } + + /** + * It get the filename of the compiled file (cached). If cache is not enabled, then it + * returns the regular file. + * + * @param string $view + * @return string The full filename + */ + private function getCompiledFileCache($view) + { + $id = $this->cacheUniqueGUID(); + if ($id !== null) { + return str_replace($this->compileExtension, '_cache' . $id + . $this->compileExtension, $this->getCompiledFile($view)); + } + return $this->getCompiledFile($view); + } + + /** + * run the blade engine. It returns the result of the code. + * + * @param string $view The name of the cache. Ex: "folder.folder.view" ("/folder/folder/view.blade") + * @param array $variables An associative arrays with the values to display. + * @param int $ttl time to live (in second). + * @return string + * @throws Exception + */ + public function runCache($view, $variables = [], $ttl = 86400) + { + $this->cachePageRunning = true; + $cacheStatus=$this->cachePageExpired($view, $ttl); + if ($cacheStatus!==0) { + $this->writeCacheLog($view, $cacheStatus); + $this->cacheStart('_page_', $ttl); + $content = $this->run($view, $variables); // if no cache, then it runs normally. + $this->fileName = $view; // sometimes the filename is replaced (@include), so we restore it + $this->cacheEnd($content); // and it stores as a cache paged. + } else { + $content = $this->getFile($this->getCompiledFileCache($view)); + } + $this->cachePageRunning = false; + return $content; + } + + /** + * Returns true if the block cache expired (or doesn't exist), otherwise false. + * + * @param string $templateName name of the template to use (such hello for template hello.blade.php) + * @param string $id (id of cache, optional, if not id then it adds automatically a number) + * @param int $cacheDuration (duration of the cache in seconds) + * @return int 0=cache exists, 1= cache expired, 2=not exists, string= the cache file (if any) + */ + public function cacheExpired($templateName, $id, $cacheDuration) + { + if ($this->getMode() & 1) { + return 2; // forced mode, hence it always expires. (fast mode is ignored). + } + $compiledFile = $this->getCompiledFile($templateName) . '_cache' . $id; + return $this->cacheExpiredInt($compiledFile, $cacheDuration); + } + + /** + * It returns true if the whole page expired. + * + * @param string $templateName + * @param int $cacheDuration is seconds. + * @return int 0=cache exists, 1= cache expired, 2=not exists, string= the cache content (if any) + */ + public function cachePageExpired($templateName, $cacheDuration) + { + if ($this->getMode() & 1) { + return 2; // forced mode, hence it always expires. (fast mode is ignored). + } + $compiledFile = $this->getCompiledFileCache($templateName); + return $this->CacheExpiredInt($compiledFile, $cacheDuration); + } + + /** + * This method is used by cacheExpired() and cachePageExpired() + * + * @param string $compiledFile + * @param int $cacheDuration is seconds. + * @return int|mixed 0=cache exists, 1= cache expired, 2=not exists, string= the cache content (if any) + */ + private function cacheExpiredInt($compiledFile, $cacheDuration) + { + if (isset($this->cacheExpired[$compiledFile])) { + // if the information is already in the array then returns it. + return $this->cacheExpired[$compiledFile]; + } + $date = @filemtime($compiledFile); + if ($date) { + if ($date + $cacheDuration < time()) { + $this->cacheExpired[$compiledFile] = 1; + return 2; // time-out. + } + } else { + $this->cacheExpired[$compiledFile] = 2; + return 1; // no file + } + $this->cacheExpired[$compiledFile] = 0; + return 0; // cache active. + } + + public function cacheStart($id = '', $cacheDuration = 86400) + { + $this->curCacheId = ($id == '') ? ($this->curCacheId + 1) : $id; + $this->curCacheDuration = $cacheDuration; + $this->curCachePosition = strlen(ob_get_contents()); + if ($this->cachePageRunning) { + $compiledFile = $this->getCompiledFileCache($this->fileName); + } else { + $compiledFile = $this->getCompiledFile() . '_cache' . $this->curCacheId; + } + + if ($this->cacheExpired('', $id, $cacheDuration) !==0) { + $this->cacheRunning = false; + } else { + $this->cacheRunning = true; + $content = $this->getFile($compiledFile); + echo $content; + } + } + + public function cacheEnd($txt = null) + { + if (!$this->cacheRunning) { + $txt = $txt ?? substr(ob_get_contents(), $this->curCachePosition); + if ($this->cachePageRunning) { + $compiledFile = $this->getCompiledFileCache($this->fileName); + } else { + $compiledFile = $this->getCompiledFile() . '_cache' . $this->curCacheId; + } + file_put_contents($compiledFile, $txt); + } + $this->cacheRunning = false; + } +} diff --git a/app/engine/core/blade/BladeOneCacheRedis.php b/app/engine/core/blade/BladeOneCacheRedis.php new file mode 100644 index 0000000..42fe6db --- /dev/null +++ b/app/engine/core/blade/BladeOneCacheRedis.php @@ -0,0 +1,160 @@ + + * @ cache([cacheid],[duration=86400]). The id is optional. The duration of the cache is in seconds + * // content here + * @ endcache() + * + * It also adds a new function (optional) to the business or logic layer + * + * if ($blade->cacheExpired('hellocache',1,5)) { //'helloonecache' =template, =1 id cache, 5=duration (seconds) + * // cache expired, so we should do some stuff (such as read from the database) + * } + * + * + * @package BladeOneCacheRedis + * @version 0.1 2017-12-15 NOT YET IMPLEMENTED, ITS A WIP!!!!!!!! + * @link https://github.com/EFTEC/BladeOne + * @author Jorge Patricio Castro Castillo + */ +const CACHEREDIS_SCOPEURL = 1; + +trait BladeOneCacheRedis +{ + protected $curCacheId = 0; + protected $curCacheDuration = ""; + protected $curCachePosition = 0; + protected $cacheRunning = false; + /** @var \Redis $redis */ + protected $redis; + protected $redisIP = '127.0.0.1'; + protected $redisPort = 6379; + protected $redisTimeOut = 2.5; + protected $redisConnected = false; + protected $redisNamespace = 'bladeonecache:'; + protected $redisBase = 0; + private $cacheExpired = []; // avoids to compare the file different times. + + // + public function compileCache($expression) + { + // get id of template + // if the file exists then + // compare date. + // if the date is too old then re-save. + // else + // save for the first time. + + return $this->phpTag . "echo \$this->cacheStart{$expression}; if(!\$this->cacheRunning) { ?>"; + } + + public function compileEndCache($expression) + { + return $this->phpTag . "} // if cacheRunning\necho \$this->cacheEnd{$expression}; ?>"; + } + // + + public function connect($redisIP = null, $redisPort = null, $redisTimeOut = null) + { + if ($this->redisConnected) { + return true; + } + if (!class_exists('Redis')) { + return false; // it requires redis. + } + if ($redisIP !== null) { + $this->redisIP = $redisIP; + $this->redisPort = $redisPort; + $this->redisTimeOut = $redisTimeOut; + } + $this->redis = new Redis(); + // 2.5 sec timeout. + $this->redisConnected = $this->redis->connect($this->redisIP, $this->redisPort, $this->redisTimeOut); + + return $this->redisConnected; + } + + /** + * Returns true if the cache expired (or doesn't exist), otherwise false. + * + * @param string $templateName name of the template to use (such hello for template hello.blade.php) + * @param string $id (id of cache, optional, if not id then it adds automatically a number) + * @param int $scope scope of the cache. + * @param int $cacheDuration (duration of the cache in seconds) + * @return bool (return if the cache expired) + */ + public function cacheExpired($templateName, $id, $scope, $cacheDuration) + { + if ($this->getMode() & 1) { + return true; // forced mode, hence it always expires. (fast mode is ignored). + } + $compiledFile = $this->getCompiledFile($templateName) . '_cache' . $id; + if (isset($this->cacheExpired[$compiledFile])) { + // if the information is already in the array then returns it. + return $this->cacheExpired[$compiledFile]; + } + $date = @filemtime($compiledFile); + if ($date) { + if ($date + $cacheDuration < time()) { + $this->cacheExpired[$compiledFile] = true; + return true; // time-out. + } + } else { + $this->cacheExpired[$compiledFile] = true; + return true; // no file + } + $this->cacheExpired[$compiledFile] = false; + return false; // cache active. + } + + public function cacheStart($id = "", $cacheDuration = 86400) + { + $this->curCacheId = ($id == "") ? ($this->curCacheId + 1) : $id; + $this->curCacheDuration = $cacheDuration; + $this->curCachePosition = strlen(ob_get_contents()); + $compiledFile = $this->getCompiledFile() . '_cache' . $this->curCacheId; + if ($this->cacheExpired('', $id, $cacheDuration)) { + $this->cacheRunning = false; + } else { + $this->cacheRunning = true; + $content = $this->getFile($compiledFile); + echo $content; + } + // getFile($fileName) + } + + public function cacheEnd() + { + if (!$this->cacheRunning) { + $txt = substr(ob_get_contents(), $this->curCachePosition); + $compiledFile = $this->getCompiledFile() . '_cache' . $this->curCacheId; + file_put_contents($compiledFile, $txt); + } + $this->cacheRunning = false; + } + + private function keyByScope($scope) + { + $key = ''; + if ($scope && CACHEREDIS_SCOPEURL) { + $key .= $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; + } + } +} diff --git a/app/engine/core/blade/BladeOneCustom.php b/app/engine/core/blade/BladeOneCustom.php new file mode 100644 index 0000000..72dae2a --- /dev/null +++ b/app/engine/core/blade/BladeOneCustom.php @@ -0,0 +1,59 @@ + + /** + * Usage @panel('title',true,true).....@endpanel() + * + * @param $expression + * @return string + */ + protected function compilePanel($expression) + { + $this->customItem[] = 'Panel'; + return $this->phpTag . "echo \$this->panel$expression; ?>"; + } + + protected function compileEndPanel() + { + $r = @array_pop($this->customItem); + if ($r === null) { + $this->showError('@endpanel', 'Missing @compilepanel or so many @compilepanel', true); + } + return ' '; // we don't need to create a function for this. + } + + //
    + + // + protected function panel($title = '', $toggle = true, $dismiss = true) + { + return "
    +
    +
    + " . (($toggle) ? "" : '') . ' + ' . (($dismiss) ? "" : '') . " +
    + +

    $title

    +
    +
    "; + } + // +} diff --git a/app/engine/core/cat.core.php b/app/engine/core/cat.core.php new file mode 100644 index 0000000..6f72732 --- /dev/null +++ b/app/engine/core/cat.core.php @@ -0,0 +1,388 @@ +cat = addslashes($_POST['cat']); + + if ( !$this->cat ) + $this->cat = addslashes($_GET['cat']); + if ( !$this->cat ) $this->cat = 'index'; + $cat_obj = new cobject( __REAL_CAT_OBJ_ ); + $db2 = $core_db->q( $cat_obj->getSelect( ' AND `cat_id` = "' . $this->cat . '"' ) ); + if ( $db2->r() ) { + $cat_obj->lRow( $db2 ); + $this->module = $cat_obj->get('module'); + $this->cat_name = $cat_obj->get('cat_name'); + $this->data = $this->dataParse(htmlspecialchars_decode($cat_obj->get('data'))); + if (!$cat_obj->get('xml') ) { + $this->xml = $this->searchXml( $cat_obj->get('parent_cat') ); + } else { + $this->xml = $cat_obj->get('xml'); + } + + $this->path = $this->getPath(); + if ( $cat_obj->get('meta_keywords') ) { + $this->addKeywords( $cat_obj->get('meta_keywords') ); + } + + if ( $cat_obj->get('meta_description') ) { + $this->setDescription( $cat_obj->get('meta_description') ); + } + + if ( $cat_obj->get('access_group') ) { + $this->access = explode( ",", $cat_obj->get('access_group') ); + } + if (!$this->module) { + $this->module = 'line_menu.php'; + $this->data = array('root' => $this->cat ); + } + + } else { + header("HTTP/1.1 404 Not Found"); + + if (defined('_ADMINKA_')) { + header("Location: "._SITE_ROOT_); + } else { + header("Location: "._SITE_ROOT_."404"); + } + die(); + /* + $this->module = 'loginbox.php'; + $this->cat_name = 'Авторизация'; + $this->path = $this->getPath(); + $this->xml = 'login.xml'; + */ + + } + if (!$this->xml) { + cdie('XML не определена'); + } + } + + function checkAccess() { + global $auth; + if ( !$this->access ) return true; + if ( $auth->user_id == _ROOT_USER_ID ) return true; + $acc = false; + foreach( $auth->groups as $v ) { + if (in_array( $v, $this->access ) ) { + $acc = true; + } + } + + return $acc; + + } + + function dataParse( $data = "" ) { + + preg_match_all( '/\$(.*?)=(.*?);/', $data, $r ); + foreach( $r[1] as $k => $var ) { + $var = trim($var); + $ret[$var] = trim($r[2][$k]); + } + return $ret; + } + + function searchXml( $cat ) { + global $core_db; + $cat_obj = new cobject( __REAL_CAT_OBJ_ ); + $db2 = $core_db->q( $cat_obj->getSelect( ' AND `cat_id` = "' . $cat . '" ' ) ); + $db2->r(); + + if (!$db2->f('xml') ) { + return $this->searchXml( $db2->f('parent_cat') ); + } else { + return $db2->f('xml'); + } + + } + + function render() { + /* load module */ + global $R; + if ( !$this->checkAccess() ) { + $this->module = 'loginbox.php'; + $this->cat_name = 'Авторизация'; + $this->path = $this->getPath(); + $this->xml = 'login.xml'; + } + + if ( $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ) { + // Не выполняем всю движку, только модуль и сразу возвращаемся + if (substr($this->module,-4) == '.php' ) { + $module = substr($this->module,0,-4); + } + require_once( _BASE_DIR . 'modules/' . $module .'.php' ); + $body_module = new $module( $this->data ); + if ( $body_module->_sys_no_load ) return; + return $R->clear($body_module->render( 'body', true)); + } + + $this->parseXml(); + + $this->setModule( 'body', $this->module, $this->data ); + + + if ( $this->delayed_modules ) { + foreach( $this->delayed_modules as $arr ) { + $this->setModule( $arr['tpl'], $arr['module'], $arr['data'] ); + } + } + $this->out = $R->set('meta_keywords', implode(', ', $this->meta_keywords), $this->out ); + $this->out = $R->set('meta_description', $this->meta_description, $this->out ); + + if ($this->cat != 'index' ) { + $this->out = $R->set('breadcrumbs', $this->r_breadcrumbs(), $this->out ); + } + /* + $this->out = $R->set('auto_title', implode(" / ", $this->path_name), $this->out ); + */ + + $this->out = $R->set('auto_title', $this->path_name[0], $this->out ); + if ( defined('NOINDEX') ) { + $this->addHeaders(''); + } + + $this->out = $R->set('add_headers', implode("\n", $this->add_headers), $this->out ); + + return $R->clear( $this->out ); + } + + function r_breadcrumbs() { + global $R; + + $tpl = $R->getTpl( 'breadcrumbs.htm', 'body' ); + $tplr = $R->getTpl( 'breadcrumbs.htm', 'row' ); + $tpls = $R->getTpl( 'breadcrumbs.htm', 'sep' ); + $tpll = $R->getTpl( 'breadcrumbs.htm', 'last_row' ); + $first_yes = false; + if (!$this->breadcrumbs ) { + foreach( $this->path as $k => $v ) { + if ($v != 'index') { + $tit = $this->path_name[$k]; + $this->breadcrumbs[$v] = $tit; + } else { + $tit = $this->path_name[$k]; + $this->breadcrumbs[''] = $tit; + $first_yes = true; + } + } + $this->breadcrumbs = array_reverse( $this->breadcrumbs, true ); + } + + $cnt = @count( $this->breadcrumbs ); + + if (!$first_yes ) { + $tta[] = $R->set('url', '', $R->set('title', end($this->path_name), $tplr) ); + } + + + + foreach( $this->breadcrumbs as $k => $v ) { + $i++; + if ( $i == $cnt ) { + $tplr = $tpll; + } + + if ($i == ($cnt-1) ) { + $tpl = $R->set('parent_url', $k, $tpl ); + $tpl = $R->set('parent_title', $v, $tpl); + } + + $tt = $R->set('url', $k, $tplr ); + $tt = $R->set('title', $v, $tt); + + $tta[] = $tt; + } + + if ($cnt == 1 ) { + $tpl = $R->set('parent_url', '/', $tpl ); + $tpl = $R->set('parent_title', 'Главная', $tpl); + } + + + $tpl = $R->set('rows', implode( $tpls, $tta ), $tpl ); + + return $R->clear( $tpl ); + } + + + function setModule( $templ, $module, $data = array() ) { + global $R, $statistica; + + if ( !$module ) return; + + if (substr($module,-4) == '.php' ) { + $module = substr($module,0,-4); + } + + require_once( _BASE_DIR . 'modules/' . $module .'.php' ); + + $tmptime = microtime( true ); + $body_module = new $module( $data ); + + if ( $body_module->_sys_no_load ) return; + + if ($templ == 'body') { + global $blade; + $blade->share('module', $body_module); + } + + $this->out = $R->set( $templ, $body_module->render( $templ ), $this->out ); + $statistica['modules'][$module] = microtime( true ) - $tmptime; + } + + function parseXml($exec_modules = true) { + global $R; + $xml = simplexml_load_file( _BASE_DIR . 'xml/'.$this->xml ); + + $xml = (Array)$xml; + $this->templ = $xml['@attributes']['filename']; + if ($_GET['frame_mode'] && $xml['@attributes']['frame_filename']) { + $this->templ = $xml['@attributes']['frame_filename']; + } + + + if ( !$this->templ ) cdie( 'Не указан файл шаблона в xml' ); + unset($xml['@attributes']); + + $this->out = $R->getTpl( $this->templ ); + + foreach( $xml as $templ_set => $module_data ) { + if ( is_object( $module_data )) { + + foreach( $module_data as $module => $attrs ) { + $delay = false; + $attrs = (Array)$attrs; + $data = Array(); + if (isset( $attrs['@attributes'] ) ) { + foreach( $attrs['@attributes'] as $k => $v ) { + $data[$k] = $v; + if ($k == 'delay' && $v == 'true' ) { + $delay = true; + } + } + } + if ($delay ) { + $this->delayed_modules[] = array('tpl' => $templ_set, 'module' => $module, 'data' => $data ); + } else { + $this->setModule( $templ_set, $module, $data ); + } + } + } + } + + } + + function getPath() { + global $core_db; + $cat_obj = new cobject( __REAL_CAT_OBJ_ ); + $db2 = $core_db->q( $cat_obj->getSelect( ' AND `cat_id` = "' . $this->cat . '"' ) ); + $db2->r(); + $parent_cat = $db2->f('parent_cat'); + if ( !$db2->f('_sys_unvisible') ) { + $path[] = $this->cat; + $this->path_name[] = $db2->f('cat_name'); + } + + + while( $parent_cat ) { + $i++; + $db2 = $core_db->q( $cat_obj->getSelect( ' AND `cat_id` = "' . $parent_cat . '"' ) ); + $db2->r(); + + if ( !$db2->f('_sys_unvisible') ) { + $path[] = $parent_cat; + $this->path_name[] = $db2->f('cat_name'); + } + + $parent_cat = $db2->f('parent_cat'); + if ($i > 10 ) cdie('Больше 10 вложений в пути.'); + } + + return $path; + } + + function addKeywords($words) { + if ($words) { + $this->meta_keywords[] = $words; + } + } + + function addTitle($words) { + global $url_arr; + if ($words) { + array_unshift( $this->path_name, $words ); + array_unshift( $this->path, implode('/', $url_arr ) ); + return true; + } + return false; + } + function addCurTitle($words) { + if ($words) { + $this->path_name[0] .= ' ' .trim( $words ) ; + return true; + } + return false; + } + + function setKeywords($words) { + if ($words) { + $this->meta_keywords = explode(',', $words ); + return true; + } + return false; + } + + function setDescription($words) { + if ($words) { + $this->meta_description = $words; + return true; + } + return false; + } + + function setPath($path) { + if ($path) { + $this->breadcrumbs = $path; + return true; + } + return false; + } + + + function addPath($url, $title) { + if ( $url || $title ) { + $this->breadcrumbs[$url] = $title; + return true; + } + return false; + } + + + function addHeaders( $title ) { + if (!in_array($title, $this->add_headers ) ) { + $this->add_headers[] = $title; + } + } +} + +?> \ No newline at end of file diff --git a/app/engine/core/db.class.php b/app/engine/core/db.class.php new file mode 100644 index 0000000..9245030 --- /dev/null +++ b/app/engine/core/db.class.php @@ -0,0 +1,124 @@ +host = $host; + $this->user = $user; + $this->pass = $pass; + $this->dbname = $dbname; + $this->database = mysqli_connect($host,$user,$pass,$dbname); + if ( !$this->database ) { + die('Mysql server fail'); + } + + } + + function new_db() { + $db = clone $this; + $db->connect($this->host, $this->user, $this->pass, $this->dbname); + return $db; + } + + + function q( $sql ) { + global $statistica; + $statistica['q_count']++; + $statistica['sqls'][] = $sql; + $starttime = microtime( true ); + + if (!($result = mysqli_query($this->database, $sql) ) ) { + + + if (php_sapi_name()==='cli') { + echo '/* MYSQL_ERROR */ ' . PHP_EOL; + echo mysqli_error($this->database); + echo PHP_EOL; + die(); + } + + if ( _DEBUG != true ) { + header("HTTP/1.1 503 Service Unavailable", true, 503); + header("Retry-After: 3600"); + $data = file_get_contents(_SHOP_DIR . 'blocker/index.html'); + echo $data; + die(); + } + + + //die('error'); + echo ""; + debug_print_backtrace(); + echo ""; + + die(mysqli_error($this->database) . "
    " . $sql ); + + } else { + $endtime = microtime( true ); + $statistica['query_time'] += ($endtime - $starttime); + $statistica['sql_time'][] = ($endtime - $starttime); + $this->r = $result; + return clone $this; + + } + } + + function r() { + $row = mysqli_fetch_assoc($this->r); + if ( $row ) { + $this->lastRow = $row; + return true; + } else { + return false; + } + } + + function nr() { + return $this->r(); + } + + function f( $key ) { + return $this->lastRow[$key]; + } + + function insert_id() { + return mysqli_insert_id($this->database); + } + + function affected_rows() { + return mysqli_affected_rows($this->database); + } + + function close() { + mysqli_close( $this->database ); + } + + public function fetchAll() { + return mysqli_fetch_all($this->r, MYSQLI_ASSOC); + } + +} + +$core_db = new db(); + +function db_escape_string($str = "") { + global $core_db; + return mysqli_real_escape_string($core_db->database, $str); +} + +function db_real_escape_string($str = "") { + return db_escape_string($str); +} + +function mysql_real_escape_string($str = "") { + return db_escape_string($str); +} + +?> diff --git a/app/engine/core/filesystem.core.php b/app/engine/core/filesystem.core.php new file mode 100644 index 0000000..9644420 --- /dev/null +++ b/app/engine/core/filesystem.core.php @@ -0,0 +1,45 @@ +set('filename', $fname ); + $fobj->set('ext', $mimeType); + $fobj->set('realname', $realFileName); + $fobj->set('private', $is_private); + $fobj->set('hash', $hashfile); + $fobj->save(); + + if (!file_exists(_FILES_DIR_ . $fname) ) { + rename($filename, _FILES_DIR_ . $fname); + } else { + unlink($filename); + } + + return $fobj->id; + } + +} +?> \ No newline at end of file diff --git a/app/engine/core/filter.core.php b/app/engine/core/filter.core.php new file mode 100644 index 0000000..07d1866 --- /dev/null +++ b/app/engine/core/filter.core.php @@ -0,0 +1,56 @@ +obj = new cobject ( $obj_name ); + } + + function add_filter( $attr_name ) { + $this->filter_columns[] = $attr_name; + } + + function parse() { + foreach( $this->obj->attrs as $name => $attr ) { + if (!empty( $this->filter_columns ) && !in_array($name, $this->filter_columns ) ) continue; + $arr = $attr['attr_obj']->getFilter($this->add_sql[$name]); + if ($arr['html']) { + $this->sql .= $arr['sql']; + $this->html[$name] = '
    ' . $arr['html'] .'
    '; + } + } + } + + function add_sql( $attr_name, $sql_where ) { + $this->add_sql[$attr_name] = $sql_where; + } + + function set_desc( $attr_name, $sql_where ) { + $this->descs[$attr_name] = $sql_where; + } + + + function getHTML($attrs = array()) { + if (empty($attrs) ) return implode("",$this->html); + + $ret = array(); + foreach( $attrs as $k ) { + if ( $this->html[$k] ) + $ret[] = $this->html[$k]; + } + + return implode("
    ",$ret); + } + + function getSQL() { + return $this->sql; + } + +} + +?> diff --git a/app/engine/core/form.core.php b/app/engine/core/form.core.php new file mode 100644 index 0000000..05d2be6 --- /dev/null +++ b/app/engine/core/form.core.php @@ -0,0 +1,236 @@ +obj = $obj; + } + + function setTempl( $filename ) { + $this->templ = $filename; + } + + function setTitle( $title ) { + $this->title = $title; + } + + function set_sql_where( $attr_name, $sql_where ) { + $this->obj->attrs[$attr_name]['attr_obj']->sql_where = $sql_where; + } + + function _parse() { + if ($this->parsed) return; + foreach ( $this->obj->attrs as $k => $attr ) { + $this->form[$k]['title'] = $attr['desc']; + if ( $attr['hide'] || in_array( $k, $this->obj->force_hidden ) ) { + $this->form[$k]['html'] = ''; + } else { + $this->form[$k]['html'] = $attr['attr_obj']->render_input(); + } + $this->form[$k]['mand'] = $attr['mand']; + $this->form[$k]['hidden'] = $attr['hide']; + $this->form[$k]['error'] = $this->obj->errors[$k]; + } + $this->parsed = true; + } + + function _html( $act = "save_edit" ) { + global $R; + $tpl = $R->getTpl( $this->templ, 'body' ); + $tplr = $R->getTpl( $this->templ, 'row' ); + $tplr_chbox = $R->getTpl( $this->templ, 'row_checkbox' ); + + $tplm = $R->getTpl( $this->templ, 'mand' ); + foreach( $this->form as $k => $v ) { + if ( in_array( $k, $this->obj->force_hidden ) ) continue; + if ( $v['hidden'] || ( in_array($k, $this->hidden_vars)) ) { + $tt = ''; + $tpl = $R->parse( 'hidden_attrs', $tt, $tpl ); + } else { + + $tt = $tplr; + if ($this->obj->attrs[$k]['type'] == 'checkbox' ) { + $tt = $tplr_chbox; + } + + $tt = $R->set( 'attr_title', $v['title'], $tt ); + $tt = $R->set( 'attr_html', $v['html'], $tt ); + $tt = $R->set( 'attr_name', $k, $tt ); + + if ( $v['mand'] ) { + $tt = $R->set( 'attr_mand', $tplm, $tt ); + } else { + $tt = $R->set( 'attr_mand', '' ,$tt ); + } + if ( $v['error'] ) { + $tt = $R->set( 'attr_error', '
    '.$v['error'].'
    ', $tt ); + } else { + $tt = $R->set( 'attr_error', '', $tt ); + } + $tpl = $R->parse( 'form_rows', $tt, $tpl ); + } + } + if ( $this->title ) { + $tplt = $R->getTpl( $this->templ, 'th' ); + $tplt = $R->set('title', $this->title, $tplt ); + $tpl = $R->set('title_row', $tplt, $tpl ); + } + + $tpl = $R->set( 'id', $this->obj->id, $tpl ); + $tpl = $R->set( 'send_act', $act, $tpl ); + return $R->clear( $tpl ); + } + + function render( $act = "save_edit" ) { + $this->_parse(); + return $this->_html( $act ); + } + + function set_hidden( $attr_name ) { + $this->hidden_vars[] = $attr_name; + } + + /** + * Получаем HTML код артибута + * @param string $fieldName имя атрибута + * @return html + */ + function fieldHTML($fieldName) { + $this->_parse(); + $arr = $this->form[$fieldName]; + if ( $arr['hidden'] ) { + return ''; + } else { + return $arr['html']; + $tpl = $R->set( $attr_name .'_title', $arr['title'].($arr['mand']?'*':''), $tpl ); + $tpl = $R->set( $attr_name .'_html', $arr['html'], $tpl ); + $tpl = $R->set( $attr_name .'_error', '
    '.$this->obj->errors[$attr_name].'
    ', $tpl ); + } + } + + /** + * Имя атрибута для формы + * @param string $fieldName имя атрибута + * @return html + */ + function fieldTitle($fieldName) { + $this->_parse(); + return $arr['title'].($arr['mand']?'*':''); + } + + /** + * Ошибка атрибута для формы + * @param string $fieldName имя атрибута + * @return html + */ + function fieldError($fieldName) { + $this->_parse(); + if ( isset($this->obj->errors[$attr_name]) && $this->obj->errors[$attr_name] != "") { + return '
    '.$this->obj->errors[$attr_name].'
    '; + } + return ''; + } + + + function manual($tpl) { + global $R; + $this->_parse(); + foreach( $this->form as $attr_name => $arr ) { + if ( $arr['hidden'] ) { + $t = ''; + $tpl = $R->parse('hidden_items', $t, $tpl ); + } else { + $tpl = $R->set( $attr_name .'_title', $arr['title'].($arr['mand']?'*':''), $tpl ); + $tpl = $R->set( $attr_name .'_html', $arr['html'], $tpl ); + $tpl = $R->set( $attr_name .'_error', '
    '.$this->obj->errors[$attr_name].'
    ', $tpl ); + } + } + return $tpl; + } + + /** + * Автоматический блок формы + * @param string $tpl строка старого шаблонизатора + * @return html|object возвращает или строку старого шаблонизатора или объект для blade + */ + function autotpl($tpl = "") { + global $R; + + + $this->_parse(); + + $tplr = $R->getTpl( $this->templ, 'row' ); + $tplr_chbox = $R->getTpl( $this->templ, 'row_checkbox' ); + $tplm = $R->getTpl( $this->templ, 'mand' ); + + $tpls = []; + + foreach( $this->form as $k => $v ) { + if ( in_array( $k, $this->obj->force_hidden ) ) continue; + if ( $v['hidden'] || ( in_array($k, $this->hidden_vars)) ) { + $tt = ''; + $tpls[$k] = $tt; + } else { + + $tt = $tplr; + if ($this->obj->attrs[$k]['type'] == 'checkbox' ) { + $tt = $tplr_chbox; + } + + $tt = $R->set( 'attr_title', $v['title'], $tt ); + $tt = $R->set( 'attr_html', $v['html'], $tt ); + $tt = $R->set( 'attr_name', $k, $tt ); + + if ( $v['mand'] ) { + $tt = $R->set( 'attr_mand', $tplm, $tt ); + } else { + $tt = $R->set( 'attr_mand', '' ,$tt ); + } + if ( $v['error'] ) { + $tt = $R->set( 'attr_error', '
    '.$v['error'].'
    ', $tt ); + } else { + $tt = $R->set( 'attr_error', '', $tt ); + } + $tpls[$k] = $tt; + } + } + + // Старый шаблонизатор + if ($tpl != "") { + foreach( $tpls as $k => $v ) { + $tpl = $R->set($k . '_block', $v, $tpl); + } + $tpl = $this->manual($tpl); + return $tpl; + } else { + // Возвращаем в виде объекта + $retObj = new stdClass(); + $tpls['id'] = ''; + foreach( $tpls as $k => $v ) { + $retObj->$k = $v; + $htmlKey = $k . '_html'; + if ( in_array( $k, $this->obj->force_hidden ) ) { + $retObj->$htmlKey = ''; + } else { + if ($this->form[$k]['hidden'] || ( in_array($k, $this->hidden_vars)) ) { + $retObj->$htmlKey = ''; + } else { + $retObj->$htmlKey = $this->form[$k]['html']; + } + } + } + return $retObj; + } + + } +} + +?> \ No newline at end of file diff --git a/app/engine/core/image.transform.core.php b/app/engine/core/image.transform.core.php new file mode 100644 index 0000000..af4f514 --- /dev/null +++ b/app/engine/core/image.transform.core.php @@ -0,0 +1,179 @@ + 'jpeg', + 'image/gif' => 'gif', + 'image/png' => 'png' + ); + + var $output_format = 'jpeg'; + + + function __construct($filename, $ct = "" ) { + $this->filename = $filename; + if (!$ct) $ct = mime_content_type($this->filename); + if (!$ct ) $ct = 'image/jpeg'; + $this->ct = $ct; + $this->type = $this->ct_to_type[$ct]; + + $this->loadImage(); + } + + function loadImage() { + $this->src = $this->imagecreatefrom($this->filename); + $this->w = imageSX($this->src); + $this->h = imageSY($this->src); + } + + function imagecreatefrom($filename) { + $fname = 'imagecreatefrom'.$this->type; + return $fname($filename); + } + + function resize($w = 0, $h = 0, $zoomout = true) { + + if (!$w ) { + $k = $this->h/$h; + $w = $this->w/$k; + } + + if (!$h ) { + $k = $this->w/$w; + $h = $this->h/$k; + } + + + if (!$this->dst ) { + $this->create($w, $h); + } + + $src_k = $this->w/$this->h; + $dst_k = $w/$h; + if ($src_k == $dst_k ) { + // , + $this->zoom($w, $h); + } + // , src dst + + if ( $src_k < 1 ) { // source + if ( $dst_k > 1 ) { + if ($zoomout) { // | _ + $this->resize_w2h($w,$h); + } else { + $this->resize_w2w($w,$h); + } + } else { + if ($zoomout ) { + $this->resize_w2w($w,$h); // _ | + } else { + $this->resize_w2h($w,$h); + } + } + } else { + if ( $dst_k > 1 ) { + if ($zoomout ) { + $this->resize_w2w($w,$h); // _ | + } else { + $this->resize_w2h($w,$h); + } + } else { + if ($zoomout) { // | _ + $this->resize_w2h($w,$h); + } else { + $this->resize_w2w($w,$h); + } } + } + } + + function resize_w2h($w, $h) { + $k = $this->w / $w; + $new_h = $this->h/$k; + $margin_top = ($h-$new_h)/2; + imagecopyresampled($this->dst,$this->src,0,$margin_top,0,0,$w,$new_h,$this->w,$this->h); + } + + function resize_w2w($w, $h) { + $k = $this->h / $h; + $new_w = ($this->w/$k); + $margin_left = ($w - $new_w)/2; + imagecopyresampled($this->dst, $this->src, $margin_left, 0, 0, 0, $new_w, $h, $this->w, $this->h); + } + + function zoom($w, $h) { + imagecopyresampled($this->dst,$this->src,0,0,0,0,$w,$h,$this->w,$this->h); + } + + function custom($x, $y, $w, $h ) { + + } + + function create($w = 0, $h = 0) { + if (!$w) $w = $this->w; + if (!$h) $h = $this->h; + $this->dst = ImageCreateTrueColor($w, $h); + if (in_array($this->type, array('png','gif') ) ) { + imagesavealpha($this->dst, true); + $transparent = imagecolorallocatealpha($this->dst, 255, 255, 255, 127); + } else { + $transparent = imagecolorallocate($this->dst, 255, 255, 255); + } + imagefill($this->dst, 0, 0, $transparent); + } + + function save($filename) { + $this->image($this->dst, $filename); + ImageDestroy($this->dst); + ImageDestroy($this->src); + } + + function image($link, $filename = '') { + $fname = 'image'.$this->output_format; + if ($this->output_format == 'jpeg' ) { + $fname($link, $filename, 90); + } else { + $fname($link, $filename); + } + } + + + function addWM($logo, $center = false) { + if (!$this->dst) { + $this->create(); + imagecopy($this->dst, $this->src, 0,0,0,0,$this->w,$this->h ); + } + + $logoImage = ImageCreateFromPNG($logo); + imageAlphaBlending($logoImage, false); + imageSaveAlpha($logoImage, true); + $trcolor = ImageColorAllocate($logoImage, 255, 255, 255); + ImageColorTransparent($logoImage , $trcolor); + + if ($center ) { + $x = imageSX($this->dst)/2- imageSX($logoImage)/2; + $y = imageSY($this->dst)/2 - imageSY($logoImage)/2; + } else { + $x = rand(0, imageSX($this->dst)- imageSX($logoImage) ); + $y = imageSY($this->dst) - ( imageSY($logoImage) * 1.2 ); + } + imagecopy($this->dst, $logoImage, $x, $y, 0, 0, imageSX($logoImage), imageSY($logoImage)); + ImageDestroy($logoImage); + } + + function flush() { + Header('Content-Type: ' . array_search($this->output_format, $this->ct_to_type) ); + + $this->image($this->dst); + die(); + } + +} + +?> \ No newline at end of file diff --git a/app/engine/core/mail.core.php b/app/engine/core/mail.core.php new file mode 100644 index 0000000..2f7ca17 --- /dev/null +++ b/app/engine/core/mail.core.php @@ -0,0 +1,138 @@ +sendSMTP($email, $title, $body); + + $title = '=?utf-8?B?'.base64_encode($title).'?='; + + + + if ( $attaches ) { + $boundary = md5(uniqid(time())); + + $headers = + "MIME-Version: 1.0;\r\n" . + "Reply-to: ".htmlspecialchars_decode($mailfrom)."\r\n". + "From: ".htmlspecialchars_decode($mailfrom)."\r\n". + "Content-type: multipart/related; type=\"text/html\"; charset=utf-8; boundary=\"".$boundary."\""; + + $parts = "--$boundary\r\n"; + $parts .= "Content-Type: text/html; charset=utf-8\r\n"; + $parts .= "Content-Transfer-Encoding: base64\r\n"; + $parts .= "\r\n"; // раздел между заголовками и телом html-части + $parts .= chunk_split(base64_encode($body)); + + foreach( $attaches as $arr ) { + $data = $arr['data']; + $name = $arr['name']; + $ct = $arr['ct']; + $disp = $arr['attach']?'attachment':'inline'; + + $parts .= "\r\n--$boundary\r\n"; + $parts .= "Content-Type: ".$ct."; name=\"$name\"\r\n"; + $parts .= "Content-Transfer-Encoding: base64\r\n"; + $parts .= "Content-ID: <$name>\r\n"; + $parts .= "Content-Disposition: inline; filename=\"$name\"\r\n"; + $parts .= "\r\n"; // раздел между заголовками и телом прикрепленного файла + $parts .= chunk_split(base64_encode($data)); + } + + //$parts .= "\r\n--$boundary\r\n"; + + } else { + $headers = + "Reply-to: ".htmlspecialchars_decode($mailfrom)."\n". + "From: ".htmlspecialchars_decode($mailfrom)."\n". + "Content-Transfer-Encoding: base64\r\n". + "Content-type: text/html; charset=utf-8"; + $parts = chunk_split(base64_encode($body)); + } + + + return mail($email, $title, $parts, $headers); + } + + function sendSMTP($email, $title, $body) { + require_once('smtp.class.php'); + $mail = new KM_Mailer("smtp.yandex.ru", "587", "zakaz@zootovar-spb.ru", "xcHkoYJx", "tls"); + if($mail->isLogin) { + if( $mail->send("zakaz@zootovar-spb.ru", $email, $title, $body) ) { + return true; + } + return false; + } + return false; + } + + + + function to_pool($email, $title, $msg, $api_id = 1, $attach_ids = '', $from = '') { + if (!$email) return; + + $email = trim($email); + /* + if ( !preg_match("/^([a-z0-9_\.-]+)@([a-z0-9_\.-]+)\.([a-z\.]{2,6})$/i",$email ) ) { + return; + } + */ + + // Не отправляем на локальные адреса + if ( preg_match("/client\d{1,}@zootovar-spb.ru/", $email) ) { + return false; + } + + // проверяем тип оповещения в стоп-листе клиента + if($this->notify_type){ + $types_obj = new cobject('shop_notify_types'); + $types_obj->byAttr('notify_type', $this->notify_type); + + $user_obj = new cobject('shop_users'); + $user_obj->byAttr('email', $email); + + $stop_obj = new cobject('shop_notify_stoplist'); + $db = $stop_obj->getDB()->q($stop_obj->getSelect(' AND `client_id`="'.$user_obj->id.'" AND `type_id`="'.$types_obj->id.'" AND `channel`="'.$this->channel.'"')); + if($db->nr()){ + return false; + } + } + + + $obj = new cobject('_sys_mail_pool'); + $obj->getDB()->q('INSERT INTO `_sys_mail_pool` (`id`,`email`,`title`,`msg`,`create_time`,`send_time`,`from`,`attach_ids`) VALUES (NULL,"'.db_escape_string($email).'","'.mysql_real_escape_string($title).'","'.mysql_real_escape_string($msg).'",'.time().', 0, "'.mysql_real_escape_string($from).'", "'.$attach_ids.'" )'); + + // Вместо пула - сразу шлём письмо + /* + $from = _MAIL_FROM_; + $this->send($email, $title, $msg, $from); + */ + } + +function chunk_split_unicode($str, $l = 76, $e = "\r\n") { + $tmp = array_chunk( + preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $l); + $str = ""; + foreach ($tmp as $t) { + $str .= join("", $t) . $e; + } + return $str; +} + + +} + +?> diff --git a/app/engine/core/object.class.php b/app/engine/core/object.class.php new file mode 100644 index 0000000..f36d086 --- /dev/null +++ b/app/engine/core/object.class.php @@ -0,0 +1,664 @@ + 'cat_id', // объекты где основной ключ не ID при сохранении + '_sys_cat_admin' => 'cat_id']; + + + /** + * Конструктор + * @param string $obj_name имя таблицы в DB + * @param integer $depth текущия глубина рекурсии (для предотвращения бесконечной рекурсии) + */ + function __construct( $obj_name, $depth = 0 ) { + global $statistica; + + $statistica['objects_add']++; + $this->recursion_depth = ($depth+1); + $this->obj_name = $obj_name; + // Определяем тип объекта по имени + //if ( strpos($obj_name, '_sys_') !== false ) { + // All objects is local in basic mode + $this->global_type = 1; + //} + + if ($depth <= 2 ) { // Не более 3х вложений!! + $this->getAttrs(); + } + + $this->attrs_vals = array(); + } + + /** + * Получить экземпляр базы данных, связанный с объектом + * @return [type] [description] + */ + function getDB() { + global $db, $core_db; + + if ( $this->global_type == 1 ) { + return $core_db; + } else { + return $db; + } + } + + /** + * Pагружаем атрибуты в объект + * @return [type] [description] + */ + private function getAttrs() { + global $objects_cache; + $curdb = $this->getDB(); + if ( $objects_cache[$this->obj_name] ) { + foreach( $objects_cache[$this->obj_name] as $name => $arr ) { + $this->attrs[$name]['name'] = $name; + $this->attrs[$name]['type'] = $arr['attr_type']; + $this->attrs[$name]['templ'] = str_replace('[', '{', str_replace(']', '}', $arr['attr_templ'])); + $this->attrs[$name]['desc'] = $arr['attr_desc']; + $this->attrs[$name]['hide'] = $arr['attr_hide']; + $this->attrs[$name]['mand'] = $arr['attr_mand']; + $this->attrs[$name]['attr_obj'] = $this->getAttrObj( $name, $arr['attr_type'] ); + } + + } else { + $db2 = $curdb->q("SELECT * FROM `_sys_datatypes` WHERE `obj_name` = '".$this->obj_name."' AND !`_sys_deleted` ORDER BY `attr_order` ASC"); + while( $db2->r() ) { + $name=$db2->f('attr_name'); + $objects_cache[$this->obj_name][$name] = $db2->lastRow; + $this->attrs[$name]['name'] = $name; + $this->attrs[$name]['type'] = $db2->f('attr_type'); + $this->attrs[$name]['templ'] = str_replace('[', '{', str_replace(']', '}', $db2->f('attr_templ'))); + $this->attrs[$name]['desc'] = $db2->f('attr_desc'); + $this->attrs[$name]['hide'] = $db2->f('attr_hide'); + $this->attrs[$name]['mand'] = $db2->f('attr_mand'); + $this->attrs[$name]['attr_obj'] = $this->getAttrObj( $name, $db2->f('attr_type') ); + } + } + } + + /** + * Получить объект атрибута + * @param string $attr_name имя атрибута + * @param string $attr_type тип атрибута + * @return object + */ + function getAttrObj( $attr_name, $attr_type ) { + @list($type, $obj_link) = explode( '|', $attr_type ); + $classname = 'attr_' . $type; + if ( class_exists( $classname ) ) { + $attr_obj = new $classname( $attr_name, $this); + return $attr_obj; + } else { + die( 'Заявленный класс "' . $classname . '" - не определен' ); + } + } + + + /** + * Расширенный конструктор SQL запросов + * @param string $sql_from что берём + * @param string $sql_where с каким where ограничением + * @param integer $show_deleted забираем ли удалённые объекты (по умолчанию нет) + * @return string SQL запрос + */ + function getSelectEx( $sql_from ="*", $sql_where = "", $show_deleted = 0) { + $sql = "SELECT " . $sql_from; + $sql .= " FROM `" . $this->obj_name . "` WHERE 1 "; + if (!$show_deleted && isset($this->attrs['_sys_deleted']) ) { + $sql .= " AND !`".$this->obj_name."`.`_sys_deleted` "; + } + $sql .= $sql_where; + return $sql; + } + + /** + * Конструктор SQL запросов + * @param string $sql_where_in where ограничение + * @param integer $show_deleted забираем ли удалённые объекты (по умолчанию нет) + * @return string SQL запрос + */ + function getSelect($sql_where_in = "", $show_deleted = 0) { + global $auth, $cat; + $sql_joins = ''; + + /* Access deleted */ + $sql_where = ''; + if (!$show_deleted && isset($this->attrs['_sys_deleted']) ) { + $sql_where .= " AND !`".$this->obj_name."`.`_sys_deleted` "; + } + + /* Access Group */ + if ( isset($this->attrs['access_group']) && ( $auth->user_id != _ROOT_USER_ID ) ) { + if ( !$auth->is_login() ) { + $sql_where .= " AND !`".$this->obj_name."`.`access_group` "; + } else { + $tmp_sql[] = ' !`'.$this->obj_name.'`.`access_group` '; + foreach( $auth->groups as $v ) { + $tmp_sql[] = ' FIND_IN_SET('.$v.',`'.$this->obj_name.'`.`access_group`) '; + } + if ($tmp_sql ) { + $sql_where .= " AND (" . implode(" OR ", $tmp_sql ) . " ) "; + } else { + $sql_where .= " AND !`".$this->obj_name."`.`access_group` "; + } + } + + } + + /* access geo */ + if ( isset($this->attrs['access_city']) && !defined('_ADMINKA_') ) { + global $geoip; + $sql_where .= " AND ( FIND_IN_SET(".$geoip->city_id.", `".$this->obj_name."`.`access_city` ) OR `".$this->obj_name."`.`access_city` = '' ) "; + } + /* Global where */ + if ( $this->sql_where ) { + $sql_where = $this->sql_where .' '. $sql_where; + } + + + /* incoming arg */ + $sql_where .= $sql_where_in; + + /* SELECT */ + $sql = "SELECT "; + $sqls[] = " `".$this->obj_name."`.`id` "; + foreach( $this->attrs as $k => $arr ) { + $sqls[] = " `".$this->obj_name."`.`".$k."` "; + } + $sql .= implode(",", $sqls); + $sql .= " FROM `" . $this->obj_name . "` " . $sql_joins . " WHERE 1 "; + + + $sql .= $sql_where; + return $sql; + } + + + /** + * Загружаем данные в объект по ID + * @param integer $id ID из таблицы + * @param boolean $usecache Использовать ли кэш + */ + function byId( $id, $usecache = true ) { + global $cached_objects; + + $this->diffed = array(); + $this->save_sql = ''; + + + if ($cached_objects[$this->obj_name][$id] && $usecache) { + $this->attrs_vals = $cached_objects[$this->obj_name][$id]; + $this->id = $id; + } else { + $curdb = $this->getDB(); + $db2 = $curdb->q( $this->getSelect( ' AND `'. $this->obj_name.'`.`id` = "'.$id.'" ', 1 ) ); + $this->attrs_vals = array(); + $this->id = 0; + if ( $db2->r() ) { + foreach( $this->attrs as $k => $arr ) { + $this->attrs_vals[$k] = $db2->f( $k ); + + } + $this->id = $id; + $cached_objects[$this->obj_name][$id] = $this->attrs_vals; + } else { + return false; + } + } + } + + + /** + * Сохраняет объект + * @param boolean $do_log логировать ли сохранение + * @param boolean $delayed отложенный UPDATE/INSERT + */ + function save($do_log = true, $delayed = false ) { + + $curdb = $this->getDB(); + + + /* только измененные атрибуты */ + if ( empty( $this->diffed ) ) return false; + $this->diffed = array_unique($this->diffed); + + foreach( $this->diffed as $key ) { + if ( $this->attrs[$key] ) { + $this->attrs[$key]['attr_obj']->presave(); + } + } + + foreach( $this->diffed as $key ) { + $val = $this->attrs_vals[$key]; + if (is_array($val)) { + $val = trim_array($val); + $val = implode(',', $val); + } + $val = db_escape_string( $val ); + $update[] = ' `'.$this->obj_name.'`.`'.$key.'` = "' . $val . '" ' ; + $insert[$key] = $val; + } + + + // Расширенный лог для товаров + $this->itemObjLog(); + + if ( $this->id ) { + + if ($do_log) { + if ($this->global_type == 1 ) { + $db2 = $curdb->q('SELECT * FROM `'.$this->obj_name.'` WHERE `id` = ' . intval( $this->id ) ); + if ( $db2->nr() ) { + $old_d = $db2->lastRow; + $new_d = $this->attrs_vals; + foreach( $old_d as $k=>$v ) { + if ( $k == 'id' ) continue; + if ( $k == 'full' ) continue; + if ( $new_d[$k] != $v ) { + $s_old[$k] = $v; + $s_new[$k] = $new_d[$k]; + } + } + if ( $s_old || $s_new ) { + global $auth; + $db2->q("INSERT INTO `_sys_obj_log` (`datetime`,`user_id`,`obj_name`,`obj_id`,`old_data`,`user_ip`,`new_data`) + VALUES ('".time()."','".$auth->user_id."','".$this->obj_name."','".$this->id."','".db_escape_string(serialize($s_old))."','".$_SERVER['REMOTE_ADDR']."','".mysql_real_escape_string(serialize($s_new))."') "); + } + } + } + } + + if ( $delayed ) { + $sql = 'UPDATE LOW_PRIORITY `'.$this->obj_name.'` SET '; + } else { + $sql = 'UPDATE `'.$this->obj_name.'` SET '; + } + + $sql .= implode( ',', $update ); + + if (isset($this->exceptPrimaryKeys[$this->obj_name]) ) { + $saveKey = $this->exceptPrimaryKeys[$this->obj_name]; + $sql .= ' WHERE `'.$this->obj_name.'`.`'.$saveKey.'` = "' . $this->get($saveKey) . '"'; + } else { + $sql .= ' WHERE `'.$this->obj_name.'`.`id` = "' . $this->id . '"'; + } + + $curdb->q( $sql ); + $this->save_sql = $sql; + global $cached_objects; + unset($cached_objects[$this->obj_name][$this->id]); + + } else { + $sql = 'INSERT INTO `' . $this->obj_name . '` (`' . implode( '`, `', array_keys( $insert ) ) . '`) VALUES ( "' . implode( '", "', array_values( $insert ) ) . '")' ; + $db2 = $curdb->q( $sql ); + $this->id = $db2->insert_id(); + $this->save_sql = $sql; + if ($do_log) { + if ($this->global_type == 1 ) { + global $auth; + $db2->q("INSERT INTO `_sys_obj_log` (`datetime`,`user_id`,`obj_name`,`obj_id`,`old_data`,`user_ip`,`new_data`) + VALUES ('".time()."','".$auth->user_id."','".$this->obj_name."','".$this->id."','','".$_SERVER['REMOTE_ADDR']."','') "); + } + } + + } + + foreach( $this->diffed as $key ) { + if ( $this->attrs[$key] ) { + $this->attrs[$key]['attr_obj']->postsave(); + } + } + + } + + /** + * Сбрасывает (обнуляет) объект + */ + public function reset() { + $this->byId(0); + $this->save_sql = ''; + $this->diffed = []; + } + + /** + * Создает новые объект с данными текущего, но без ID + */ + function copy() { + $this->id = 0; + $this->save_sql = ''; + foreach($this->attrs_vals as $k => $v) { + $this->diffed[] = $k; + } + } + + /** + * Сохраняет объект как копию + * @param boolean $do_log логировать ли запрос + */ + function saveAsCopy($do_log = true) { + $this->id = 0; + $this->save_sql = ''; + foreach( $this->attrs as $key => $val ) { + $this->diffed[] = $key; + } + return $this->save($do_log); + } + + /** + * Удаляет объект + */ + function del() { + + $curdb = $this->getDB(); + + if ( $this->id ) { + if ( isset($this->attrs['_sys_deleted']) ) { + $curdb->q('UPDATE `'.$this->obj_name.'` SET `'.$this->obj_name.'`.`_sys_deleted` = "1" WHERE `'.$this->obj_name.'`.`id` = "'.$this->id.'"'); + } else { + $curdb->q('DELETE FROM `'.$this->obj_name.'` WHERE `'.$this->obj_name.'`.`id` = "'.$this->id.'"'); + } + } + global $cached_objects; + unset($cached_objects[$this->obj_name][$this->id]); + } + + /** + * Заплоняет объект строчкой из базы данных + * @param db $db ссылка на подключение к базе данных + */ + function lRow( $db ) { + $this->diffed = array(); + + foreach( $this->attrs as $key => $val ) { + $this->attrs_vals[$key] = $db->f( $key ); + } + $this->id = $db->f('id'); + global $cached_objects; + $cached_objects[$this->obj_name][$db->f('id')] = $this->attrs_vals; + return $this; + } + + /** + * Заполняет объект из POST данных формы + */ + function lPost() { + if ( intval( $_POST['id']) ) { + $this->byId( intval( $_POST['id']) ); + } + foreach( $this->attrs as $k => $val ) { + if (in_array($k, $this->force_hidden ) ) continue; + if ( !isset($_FILES[$k]) && !isset($_POST[$k]) && (!$this->attrs[$k]['mand']) ) { + if ( substr( $val['name'], -8 ) != '_preview' ) { + $this->set($k,''); + } + } else { + $val['attr_obj']->lPost(); + } +// $this->diffed[] = $k; + } + $this->id = intval($_POST['id']); + } + + + /** + * Меняет данных атрибута (сеттер) + * @param string $attr_name имя атрибута + * @param string $value данные + */ + function set( $attr_name, $value ) { + + + // Проверка на совпадение, с учётом приведения типов + // в this->attrs_vals всегда лежат string + + if ( (string)$this->attrs_vals[$attr_name] === (string)$value ) return false; + if ( $this->attrs_vals[$attr_name] === '0' && $value === "") return false; + if ( $this->attrs_vals[$attr_name] === '0' && $value === false ) return false; + if ( $this->attrs_vals[$attr_name] === '1' && $value === true ) return false; + if ( is_numeric($this->attrs_vals[$attr_name]) && is_numeric($value) && $this->attrs_vals[$attr_name] == $value ) return false; + + $this->attrs_vals[$attr_name] = $value; + if (!in_array($attr_name, $this->diffed)) { + $this->diffed[] = $attr_name; + } + + + return true; + + } + + /** + * Получает данные атрибута из объекта + * @param string $attr_name имя атрибута + * @return string + */ + function get( $attr_name ) { + return $this->attrs_vals[$attr_name]; + } + + + /** + * Отрисовка атрибутов через шаблонизатор Render + * @param string $tpl переменная-шаблон + * @param boolean $crop укороченный вывод + * @param array $params устарело - не используется + * @return [type] [description] + */ + function assign( $tpl, $crop = false, $params = array() ) { + global $R; + $vars = $R->getVars($tpl); + foreach( $this->attrs as $key => $val ) { + if ( in_array( $key, $vars ) ) { + if ($this->recursion_depth < 3 ) { + $tpl = $R->set( $key, $this->attrs[$key]['attr_obj']->render_text($crop), $tpl ); + } else { + $tpl = $R->set( $key, $this->get($key), $tpl ); + } + } + $tpl = $R->set( $key.'_real', $this->get($key), $tpl ); + $tpl = $R->set( $key.'_money', number_format((float)$this->get($key), 2), $tpl ); + } + + $tpl = $R->set( "id", $this->id, $tpl ); + $tpl = $R->set( $this->obj_name."_id", $this->id, $tpl ); + return $tpl; + } + + + function validate() { + + $valid = true; + + foreach( $this->attrs as $attr_name=>$attr ) { + if (in_array($attr_name, $this->force_hidden ) ) continue; + if ($attr['mand'] && !$this->attrs_vals[$attr_name]) { + $this->errors[$attr_name] = 'Поле не заполнено'; + $valid = false; + } elseif ( $this->attrs_vals[$attr_name] ) { + $err = $attr['attr_obj']->validate(); + if ( $err && $err !== true ) { + $this->errors[$attr_name] = $err; + $valid = false; + } + } + + } + return $valid; + } + + function set_hidden( $attr_name ) { + $this->force_hidden[] = $attr_name; + } + + function set_no_hidden( $attr_arr = array() ) { + foreach( $this->attrs as $k => $v ) { + if (!in_array($k, $attr_arr ) ) { + $this->force_hidden[] = $k; + } + } + } + + + function setSqlWhere( $attr_name, $sql_where ) { + if ( $this->attrs[$attr_name] ) { + $this->attrs[$attr_name]['attr_obj']->setSqlWhere($sql_where); + } + } + + function addSqlWhere( $attr_name, $sql_where ) { + if ( $this->attrs[$attr_name] ) { + $this->attrs[$attr_name]['attr_obj']->setSqlWhere( $this->attrs[$attr_name]['attr_obj']->sql_where . $sql_where); + } + } + + function setError($attr_name, $error) { + $this->errors[$attr_name] = $error; + } + + function getSize( $sql_where = '' ) { + $db2 = $this->getDB()->q( $this->getSelectEx(' count(*) as `c` ', $sql_where ) ); + $db2->nr(); + return intval( $db2->f('c') ); + } + + function getList( $sql_where = '', $value = 'title' ) { + $db2 = $this->getDB()->q( $this->getSelect( $sql_where ) ); + $lst = array(); + while($db2->nr()) { + $lst[$db2->f('id')] = $db2->f($value); + } + return $lst; + } + + function itemObjLog() { + global $auth; + // array('shop_item', 'shop_item_variants','shop_item_chars','shop_item_images') + if (!in_array($this->obj_name, array('shop_item', 'shop_item_variants',/*'shop_item_chars',*/'shop_item_images') ) ) return; + $skipFields = array('nostock_tmp', 'stock_data', 'stock_roz', 'in_stock', 'stock_im', 'in_stock_im'); + + $data = array(); + $data['datetime'] = time(); + $data['ip'] = $_SERVER['REMOTE_ADDR']; + $data['user_id'] = $auth->user_id; + $data['obj_name'] = $this->obj_name; + $data['script_name'] = $_SERVER['PWD'].'/'.$_SERVER['PHP_SELF']; + switch( $this->obj_name ) { + case 'shop_item': + $data['item_id'] = $this->id; + $data['variant_id'] = 0; + break; + case 'shop_item_variants': + $data['item_id'] = $this->get('item_id'); + $data['variant_id'] = $this->id; + break; + default: + $data['item_id'] = $this->get('item_id'); + $data['variant_id'] = $this->id; + break; + } + + $old = array(); + if ($this->id ) { + /* OldVals */ + $curdb = $this->getDB(); + $db2 = $curdb->q('SELECT * FROM `'.$this->obj_name.'` WHERE `id` = ' . intval( $this->id ) ); + if ( $db2->nr() ) { + $old = $db2->lastRow; + } + } + + foreach( $this->diffed as $field ) { + + if (in_array( $field, $skipFields ) ) continue; + + + $newval = $this->attrs_vals[$field]; + $oldval = $old[$field]; + + if ($newval == $oldval ) continue; + + $data['field_name'] = $this->attrs[$field]['name']; + + if (!$newval) { + $data['change_type'] = 3; + } elseif( !$oldval ) { + $data['change_type'] = 1; + } else { + $data['change_type'] = 2; + } + $data['old_value'] = db_escape_string($oldval); + $data['new_value'] = db_escape_string($newval); + $sql = 'INSERT DELAYED INTO `shop_item_change_log` (`'.implode("`, `",array_keys($data)).'`) VALUES ("'.implode('", "', $data).'") '; + $curdb = $this->getDB(); + $db2 = $curdb->q( $sql ); + } + } + + + function getCollection($sql_where = "", $show_deleted = 0) { + return new cobject_collection($this, $sql_where, $show_deleted); + } + +} + +/** + * Класс для коллекции объектов. + * Так удобнее работать с blade шаблонами + */ +class cobject_collection { + var $obj; + var $db; + + // Готовим запрос в базу + function __construct($obj, $sql_where, $show_deleted = 0) { + $this->obj = $obj; + $this->db = $this->obj->getDB()->q($this->obj->getSelect($sql_where)); + } + + // Следующий экземпляр коллекции + public function next() { + if ($this->db->nr()) { + $this->obj->lRow($this->db); + return true; + } else { + return false; + } + } + // Получение свойства + public function __get($key) { + return $this->render($key); + } + + // Получение реального значения свойства + public function get($key) { + return $this->obj->get($key); + } + + // Отрисовка + public function render($key, $crop = false) { + if (isset($this->obj->attrs[$key])) { + if ($this->obj->recursion_depth < 3 ) { + return $this->obj->attrs[$key]['attr_obj']->render_text($crop); + } else { + return $this->obj->get($key); + } + } else { + if ($key == 'id') return $this->obj->id; + return ''; + } + } +} + +?> \ No newline at end of file diff --git a/app/engine/core/render.core.php b/app/engine/core/render.core.php new file mode 100644 index 0000000..54b9af9 --- /dev/null +++ b/app/engine/core/render.core.php @@ -0,0 +1,98 @@ +tpl_cache[$path . $filename][''] ) { + $subtpl = @file_get_contents($path . $filename); + $this->tpl_cache[$path . $filename][''] = $subtpl; + } else { + $subtpl = $this->tpl_cache[$path . $filename]['']; + } + $subtpl = @file_get_contents($path . $filename); + $tpl = $this->set('include:'.$filename, $subtpl, $tpl ); + } + } + + /* global sets */ + $tpl = $this->set('cur_cat', $cat->cat, $tpl); + $tpl = $this->set('cur_year', date('Y'), $tpl); + $tpl = $this->set('cur_date', date('d.m.Y'), $tpl); + $tpl = $this->set('cur_cat_name', $cat->cat_name, $tpl); + $tpl = $this->set('getRand', rand(), $tpl); + $tpl = $this->set('_SITE_TITLE_', _SITE_TITLE_, $tpl); + $tpl = $this->set('_SITE_ROOT_', _SITE_ROOT_, $tpl); + $tpl = $this->set('_STATIC_ROOT_', _STATIC_ROOT_, $tpl); + + if ($url_arr) { + $tpl = $this->set('cur_url', implode('/', $url_arr), $tpl); + } + /* */ + return $tpl; + } + + function getTpl($filename, $section ='', $path = '') { + if (!$path ) $path = _BASE_DIR . '/tpls/'; + if ( !$tpl_cache[$path . $filename][$section] ) { + $tpl = file_get_contents($path . $filename); + if ( $section ) { + preg_match ("/\#\[".$section."\]\#(.*?)\#\[!".$section."\]\#/s", $tpl, $r); + $tpl = $r[1]; + } + $tpl_cache[$path . $filename][$section] = $tpl; + } else { + $tpl = $tpl_cache[$path . $filename][$section]; + } + $tpl = $this->globalsets($tpl); + return $tpl; + } + + function set($x, $y, $tpl) { + global $statistica; + $starttime = microtime(true); + $tpl = str_replace('{' . $x . '}', $y, $tpl); + + $statistica['render_time'] += microtime(true) - $starttime; + + + return $tpl; + } + + function parse($x, $y, $tpl) { + global $statistica; + $starttime = microtime(true); + $tpl = str_replace('{' . $x . '}', $y . '{' . $x . '}', $tpl); + $statistica['render_time'] += microtime(true) - $starttime; + + return $tpl; + } + + + function clear($tpl) { + global $statistica; + $starttime = microtime(true); + $tpl = preg_replace ("/\{[^\s]{1,}?\}/", '', $tpl); + $statistica['render_time'] += microtime(true) - $starttime; + return $tpl; + } + + function getVars($tpl) { + preg_match_all ("/{(.*?)}/", $tpl, $r); + return $r[1]; + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/core/router.core.php b/app/engine/core/router.core.php new file mode 100644 index 0000000..89e63ee --- /dev/null +++ b/app/engine/core/router.core.php @@ -0,0 +1,65 @@ +requestURI = $requestURI; + $this->requestMethod = strtolower($_SERVER['REQUEST_METHOD']); + } + + /** + * @throws Exception ошибки при вызове роутера + */ + public function __call($method, $arguments) { + $method = strtolower($method); + if (!in_array($method, $this->availableMethods)) { + throw new Exception("Router error: method not found", 1); + } + + if ($method != $this->requestMethod) { + return false; + } + + if (count($arguments) > 2 ) { + throw new Exception("Router error: arguments too long", 1); + } + + if (count($arguments) < 1 ) { + throw new Exception("Router error: no arguments", 1); + } + + $url = $arguments[0]; + $callback = $arguments[1]; + + if (!is_callable($callback)) { + throw new Exception("Router error: function not callable", 1); + } + + // Тестируем URL на соответствие строки + $url_mask = preg_quote($url, '/'); + $url_mask = preg_replace('/\\\{.*?\\\}/', '(.*?)', $url_mask); + + if (preg_match('/^'.$url_mask.'$/', $this->requestURI, $matches)) { + unset($matches[0]); + echo call_user_func_array($callback, $matches); + die(); + } + return true; + } + + } + +?> \ No newline at end of file diff --git a/app/engine/core/sms.core.php b/app/engine/core/sms.core.php new file mode 100644 index 0000000..d3dfac5 --- /dev/null +++ b/app/engine/core/sms.core.php @@ -0,0 +1,84 @@ +phone_format( $phone ); + $url = $this->url . '?Http_username='.urlencode($this->login).'&Http_password='.urlencode($this->passwd).'&Phone_list='.$phone.'&Message='.urlencode($text). '&fromPhone=' . $this->sms_from; + + $context = stream_context_create(array( + 'http' => array( + 'method' => 'GET', + 'header' => 'Content-type: application/x-www-form-urlencoded; charset=UTF-8' + ) + )); + + $resp = file_get_contents( $url, false, $context); + + if ( strpos($resp, 'Result=ok') || strpos($resp, 'error_num=OK')) { + return true; + } else { + return false; + } + + } + + function phone_format( $phone ) { + $phone = '+7' . substr( preg_replace( '/[^0-9]/', '', $phone ), -10 ); + return $phone; + } + + + function to_pool($phone, $text, $sendtime = 0, $order_id = 0) { + + $phone = substr(preg_replace( '/[^0-9]/', '', $phone ), -10); + if ($phone=='' || $text=='' ) return false; + + + // проверяем тип оповещения в стоп-листе клиента + if($this->notify_type){ + $types_obj = new cobject('shop_notify_types'); + $types_obj->byAttr('notify_type', $this->notify_type); + + $user_obj = new cobject('shop_users'); + $user_obj->byAttr('phone', $phone); + + $stop_obj = new cobject('shop_notify_stoplist'); + $db = $stop_obj->getDB()->q($stop_obj->getSelect(' AND `client_id`="'.$user_obj->id.'" AND `type_id`="'.$types_obj->id.'" AND `channel`="'.$this->channel.'"')); + if($db->nr()){ + return false; + } + } + + + $create_time = time(); + if (!$sendtime) $sendtime = $create_time; + + $obj = new cobject('_sys_sms_pool'); + + $obj->set('number', $phone); + $obj->set('text', $text); + $obj->set('create_time', $create_time ); + $obj->set('send_time', 0); + $obj->set('send_after', $sendtime ); + $obj->set('order_id', $order_id ); + $obj->set('retry_count', 0); + $obj->save(false, true); // Без логов, отложенное добавление + + return $obj->id; + } + + + +} + +?> diff --git a/app/engine/core/smtp.class.php b/app/engine/core/smtp.class.php new file mode 100644 index 0000000..204fc03 --- /dev/null +++ b/app/engine/core/smtp.class.php @@ -0,0 +1,367 @@ +isLogin + * + * Once the instance is created, you can send mail by calling : + * $mail->send(from, to, subject, body, headers = optional); + * + * from : sender's email address (myname@mydomain.com OR MyName ) + * to : recipient's email address (ie: yourname@yourdomain.com OR YourName ) + * subject : email subject + * body : email message body, usually in HTML format + * headers : any special headers required + * + * See example.php for more tips + * + * In this version you can also add multiple recipents, carbon-copies(CC), blind-copies(BCC) and attachments + * For example: + * $mail->addRecipient("yourname@yourdomain.com"); + * $mail->addCC("yourname@yourdomain.com"); + * $mail->addBCC("yourname@yourdomain.com"); + * $mail->addAttachment("pathToAttachment"); + * + * To clear recipients and attachments use: + * $mail->clearRecipients(); + * $mail->clearCC(); + * $mail->clearBCC(); + * $mail->clearAttachments(); + * + **/ + +/** + * Copyright (c) 2011, Howard Walsh, KidMoses.com. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * * Neither the names of Howard Walsh or KidMoses.com, nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + **/ + + +//include("strip_html_tags.php"); /* this script provided by David R. Nadeau, NadeauSoftware.com */ + +class KM_Mailer { + public $server; + public $port; + public $username; + public $password; + public $secure; /* can be tls, ssl, or none */ + + public $charset = "\"utf-8\""; /* included double quotes on purpose */ + public $contentType = "multipart/mixed"; /* can be set to: text/plain, text/html, multipart/mixed */ + public $transferEncodeing = "base64"; /* or 8-bit */ + public $altBody = ""; + public $isLogin = false; + public $recipients = array(); + public $cc = array(); + public $bcc = array(); + public $attachments = array(); + + private $conn; + private $newline = "\r\n"; + private $localhost = 'localhost'; + private $timeout = '60'; + private $debug = false; + + public function __construct($server, $port, $username=null, $password=null, $secure=null) { + $this->server = $server; + $this->port = $port; + $this->username = $username; + $this->password = $password; + $this->secure = $secure; + + if(!$this->connect()) return; + if(!$this->auth()) return; + $this->isLogin = true; + return; + } + + /* Connect to the server */ + private function connect() { + if(strtolower(trim($this->secure)) == 'ssl') { + $this->server = 'ssl://' . $this->server; + } + $this->conn = fsockopen($this->server, $this->port, $errno, $errstr, $this->timeout); + if (substr($this->getServerResponse(),0,3)!='220') { return false; } + return true; + } + + /* sign in / authenicate */ + private function auth() { + fputs($this->conn, 'HELO ' . $this->localhost . $this->newline); + $this->getServerResponse(); + if(strtolower(trim($this->secure)) == 'tls') { + fputs($this->conn, 'STARTTLS' . $this->newline); + if (substr($this->getServerResponse(),0,3)!='220') { return false; } + + + stream_socket_enable_crypto($this->conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); + fputs($this->conn, 'HELO ' . $this->localhost . $this->newline); + if (substr($this->getServerResponse(),0,3)!='250') { return false; } + + } + if($this->server != 'localhost') { + fputs($this->conn, 'AUTH LOGIN' . $this->newline); + + if (substr($this->getServerResponse(),0,3)!='334') { return false; } + + fputs($this->conn, base64_encode($this->username) . $this->newline); + if (substr($this->getServerResponse(),0,3)!='334') { return false; } + + fputs($this->conn, base64_encode($this->password) . $this->newline); + if (substr($this->getServerResponse(),0,3)!='235') { return false; } + + } + + return true; + } + + /* send the email message */ + public function send($from, $to, $subject, $message, $headers=null) { + /* set up the headers and message body with attachments if necessary */ + $email = "Date: " . date("D, j M Y G:i:s") . " +0300" . $this->newline; + $email .= "From: $from" . $this->newline; + $email .= "Reply-To: $from" . $this->newline; + $email .= $this->setRecipients($to); + + if ($headers != null) { $email .= $headers . $this->newline; } + + $email .= "Subject: $subject" . $this->newline; + $email .= "MIME-Version: 1.0" . $this->newline; + if($this->contentType == "multipart/mixed") { + $boundary = $this->generateBoundary(); + $message = $this->multipartMessage($message,$boundary); + $email .= "Content-Type: $this->contentType;" . $this->newline; + $email .= " boundary=\"$boundary\""; + } else { + $email .= "Content-Type: $this->contentType; charset=$this->charset"; + } + $email .= $this->newline . $this->newline . $message . $this->newline; + $email .= "." . $this->newline; + + /* set up the server commands and send */ + fputs($this->conn, 'MAIL FROM: <'. $this->getMailAddr($from) .'>'. $this->newline); + $this->getServerResponse(); + + if(!$to=='') { + fputs($this->conn, 'RCPT TO: <'. $this->getMailAddr($to) .'>' . $this->newline); + $this->getServerResponse(); + } + + + $this->sendRecipients($this->recipients); + $this->sendRecipients($this->cc); + $this->sendRecipients($this->bcc); + + fputs($this->conn, 'DATA'. $this->newline); + $this->getServerResponse(); + fputs($this->conn, $email); /* transmit the entire email here */ + + if (substr($this->getServerResponse(),0,3)!='250') { return false; } + + + return true; + } + + private function setRecipients($to) { /* assumes there is at least one recipient */ + $r = 'To: '; + if(!($to=='')) { $r .= $to . ','; } + if(count($this->recipients)>0) { + for($i=0;$irecipients);$i++) { + $r .= $this->recipients[$i] . ','; + } + } + $r = substr($r,0,-1) . $this->newline; /* strip last comma */; + if(count($this->cc)>0) { /* now add in any CCs */ + $r .= 'CC: '; + for($i=0;$icc);$i++) { + $r .= $this->cc[$i] . ','; + } + $r = substr($r,0,-1) . $this->newline; /* strip last comma */ + } + return $r; + } + + private function sendRecipients($r) { + if(empty($r)) { return; } + for($i=0;$iconn, 'RCPT TO: <'. $this->getMailAddr($r[$i]) .'>'. $this->newline); + $this->getServerResponse(); + } + } + + public function addRecipient($recipient) { + $this->recipients[] = $recipient; + } + + public function clearRecipients() { + unset($this->recipients); + $this->recipients = array(); + } + + public function addCC($c) { + $this->cc[] = $c; + } + + public function clearCC() { + unset($this->cc); + $this->cc = array(); + } + + public function addBCC($bc) { + $this->bcc[] = $bc; + } + + public function clearBCC() { + unset($this->bcc); + $this->bcc = array(); + } + + public function addAttachment($filePath) { + $this->attachments[] = $filePath; + } + + public function clearAttachments() { + unset($this->attachments); + $this->attachments = array(); + } + + /* Quit and disconnect */ + function __destruct() { + fputs($this->conn, 'QUIT' . $this->newline); + $this->getServerResponse(); + fclose($this->conn); + } + + /* private functions used internally */ + private function getServerResponse() { + $data=""; + while($str = fgets($this->conn,4096)) { + $data .= $str; + if(substr($str,3,1) == " ") { break; } + } + if($this->debug) echo $data . "
    "; + return $data; + } + + private function getMailAddr($emailaddr) { + $addr = $emailaddr; + $strSpace = strrpos($emailaddr,' '); + if($strSpace > 0) { + $addr= substr($emailaddr,$strSpace+1); + $addr = str_replace("<","",$addr); + $addr = str_replace(">","",$addr); + } + return $addr; + } + + private function randID($len) { + $index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + $out = ""; + for ($t=0; $t<$len;$t++) { + $r = rand(0,61); + $out = $out . substr($index,$r,1); + } + return $out; + } + + private function generateBoundary() { + $boundary = "--=_NextPart_000_"; + $boundary .= $this->randID(4) . "_"; + $boundary .= $this->randID(8) . "."; + $boundary .= $this->randID(8); + return $boundary; + } + + private function multipartMessage($htmlpart,$boundary) { + if($this->altBody == "") { $this->altBody = strip_tags($htmlpart); } + $altBoundary = $this->generateBoundary(); + ob_start(); //Turn on output buffering + $parts = "This is a multi-part message in MIME format." . $this->newline . $this->newline; + $parts .= "--" . $boundary . $this->newline; + + $parts .= "Content-Type: multipart/alternative;" . $this->newline; + $parts .= " boundary=\"$altBoundary\"" . $this->newline . $this->newline; + + $parts .= "--" . $altBoundary . $this->newline; + $parts .= "Content-Type: text/plain; charset=$this->charset" . $this->newline; + $parts .= "Content-Transfer-Encoding: $this->transferEncodeing" . $this->newline . $this->newline; + $parts .= chunk_split(base64_encode($this->altBody)) . $this->newline . $this->newline; + + $parts .= "--" . $altBoundary . $this->newline; + $parts .= "Content-Type: text/html; charset=$this->charset" . $this->newline; + $parts .= "Content-Transfer-Encoding: $this->transferEncodeing" . $this->newline . $this->newline; + $parts .= chunk_split(base64_encode($htmlpart)) . $this->newline . $this->newline; + + $parts .= "--" . $altBoundary . "--" . $this->newline . $this->newline; + + if(count($this->attachments) > 0) { + for($i=0;$iattachments);$i++) { + $attachment = chunk_split(base64_encode(file_get_contents($this->attachments[$i]))); + $filename = basename($this->attachments[$i]); + $ext = pathinfo($filename, PATHINFO_EXTENSION); + $parts .= "--" . $boundary . $this->newline; + $parts .= "Content-Type: application/$ext; name=\"$filename\"" . $this->newline; + $parts .= "Content-Transfer-Encoding: base64" . $this->newline; + $parts .= "Content-Disposition: attachment; filename=\"$filename\"" . $this->newline . $this->newline; + $parts .= $attachment . $this->newline; + } + } + + $parts .= "--" . $boundary . "--"; + + $message = ob_get_clean(); //Turn off output buffering + return $parts; + } + +} + +?> diff --git a/app/engine/core/uauth.core.php b/app/engine/core/uauth.core.php new file mode 100644 index 0000000..538960d --- /dev/null +++ b/app/engine/core/uauth.core.php @@ -0,0 +1,91 @@ +sess_id = $sess_id; + $this->user_obj = new cobject( $this->obj_name ); + $this->sess_obj = new cobject( 'shop_user_sessions' ); + $db2 = $this->sess_obj->getDB()->q( $this->sess_obj->getSelect( ' AND `session_id` = "'.db_escape_string( $sess_id ).'" AND `shop_user_id` ' ) ); + if ( $db2->nr() ) { + $this->_intAuth($db2->f('shop_user_id')); + } else { + $this->is_login = false; + } + + + } + + function _intAuth( $user_id ) { + global $core_db; + $this->user_obj->byId($user_id); + if ($this->user_obj->id && !$this->user_obj->get('_sys_disabled') ) { + $this->is_login = true; + $this->user_id = $user_id; + if ( $this->user_obj->get('grp') ) { + $this->user_grps = explode( ',', $this->user_obj->get('grp') ); + foreach ( $this->user_grps as $v ) { + $grpobj = new cobject('shop_users_grp_'.$v); + $db3 = $grpobj->getDB()->q( $grpobj->getSelect( ' AND `shop_user` = "'.$this->user_id.'"' ) ); + if ( $db3->nr() ) { + $this->grp_data[$v] = $db3->lastRow; + } else { + $grpobj->set('shop_user', $this->user_id); + $grpobj->save(); + } + } + } + + $pcobj = new cobject('shop_price_columns'); + $pcobj->byId($this->user_obj->get('price_column')); + if ( $pcobj->get('attr_name') ) { + $this->my_price = $pcobj->get('attr_name'); + $this->my_discount = $pcobj->get('skidka_pr'); + $this->my_price_name = $pcobj->get('title'); + } + + } else { + $this->do_logout(); + } + } + + function addToGrp( $grp_id ) { + $grps = explode(',', $this->user_obj->get('grp')); + $grps = array_diff( $grps, array('')); + $grps[] = $grp_id; + $this->user_obj->set('grp',implode(',',$grps)); + $this->user_obj->save(); + } + + function do_login( $user_id ) { + $this->do_logout(); + $this->sess_obj->set('session_id', session_id() ); + $this->sess_obj->set('shop_user_id', $user_id ); + $this->sess_obj->save(); + $this->_intAuth($user_id); + } + + function do_logout() { + $this->sess_obj->getDB()->q( 'DELETE FROM `shop_user_sessions` WHERE `session_id` = "' . db_escape_string(session_id()) . '" ' ); + $this->is_login = false; + $this->user_obj->byId( 0 ); + $this->user_id = 0; + } + +} +?> \ No newline at end of file diff --git a/app/engine/core/utils.php b/app/engine/core/utils.php new file mode 100644 index 0000000..d144d74 --- /dev/null +++ b/app/engine/core/utils.php @@ -0,0 +1,819 @@ + $row){ + foreach($row AS $key=>$value){ + $sort_arr[$key][$uniqid] = $value; + } + } + array_multisort($sort_arr[$KEY],constant($ASC),$mass); + return $mass; + } + + function pr($arg) { + + $is_cli = false; + if (php_sapi_name() == 'cli') { + $is_cli = true; + } + + + if ($is_cli) echo PHP_EOL; else echo ""; + if (!isset($arg)) echo "pr(): value not set"; + elseif (is_object($arg)) echo print_r($arg); + elseif (is_bool($arg)) if($arg) echo "true"; else echo "false"; + elseif (!is_array($arg)) echo "pr() string: '$arg'"; + elseif (!count($arg)) echo "pr(): array empty"; + else print_r($arg); + if ($is_cli) echo PHP_EOL; else echo ""; + + } + + function cdie( $text = '' ) { + global $auth; + if (isset($auth)){ + $auth->saveSession(); + } + die( $text . '
    Перейти на главную страницу' ); + } + + function ajax_send( $text = '' ) { + global $auth; + $auth->saveSession(); + die( $text ); + } + + +function _redirect($url='', $frame_msg = 'OK', $frame_redirect = false) { + + // Сохраняем сессию + global $auth; + if ( is_object($auth) ) { + $auth->saveSession(); + } + + // Если ajax запрос + if ( $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ) { + + if ($_POST['ajaxsubmit'] || $_GET['ajaxsubmit']) { + $resp = []; + $resp['html'] = $frame_msg; + if ($url) { + $resp['redirect'] = $url; + } else { + $resp['reload'] = true; + } + echo json_encode($resp); + exit(); + } else { + echo ''; + if ( $url ) { + echo ""; + } else { + echo ''; + } + echo ''; + exit(); + } + } + + // Если ничего из прошлого - просто редирект + if (!$url ) $url = _SITE_ROOT_; + Header ('Location: '.$url, true, 301); + exit(); + +} + + function _getcurl ($isk='') { + if (!is_array($isk)) $iskl[] = $isk; + else $iskl=$isk; + foreach ($_GET as $key => $val) { + if (!is_array($val)) { + $val = htmlspecialchars($val); + if (!in_array($key,$iskl)) + $cmass[]="$key=$val"; + } else { + $cmass[] = http_build_query(array($key=>$val)); + } + } + $curl = "?" . @implode('&', $cmass); + return $curl; + } + + +function _getMonthName($day, $skl = false) { + $day = intval($day); + $months = array ( + 1 => 'Январь', + 2 => 'Февраль', + 3 => 'Март', + 4 => 'Апрель', + 5 => 'Май', + 6 => 'Июнь', + 7 => 'Июль', + 8 => 'Август', + 9 => 'Сентябрь', + 10 => 'Октябрь', + 11 => 'Ноябрь', + 12 => 'Декабрь' + ); + $months_skl = array ( + 1 => 'января', + 2 => 'февраля', + 3 => 'марта', + 4 => 'апреля', + 5 => 'мая', + 6 => 'июня', + 7 => 'июля', + 8 => 'августа', + 9 => 'сентября', + 10 => 'октября', + 11 => 'ноября', + 12 => 'декабря' + ); + if ($skl ) { + return $months_skl[$day]; + } else { + return $months[$day]; + } + } + +function _getNedName($day, $full = true) { + $day = intval($day); + if ($full) { + $months = array ( + 0 => 'Воскресение', + 1 => 'Понедельник', + 2 => 'Вторник', + 3 => 'Среда', + 4 => 'Четверг', + 5 => 'Пятница', + 6 => 'Суббота', + 7 => 'Воскресение', + ); + } else { + $months = array ( + 0 => 'Вс', + 1 => 'Пн', + 2 => 'Вт', + 3 => 'Ср', + 4 => 'Чт', + 5 => 'Пт', + 6 => 'Сб', + 7 => 'Вс', + ); + } + return $months[$day]; + } + + function trim_array( $val ) { + return array_diff($val, array('')); + } + /* karnaval utils */ + + + function translit($str) + { + $tr = array( + "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G", + "Д"=>"D","Е"=>"E","Ё"=>"E","Ж"=>"Zh","З"=>"Z","И"=>"I", + "Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N", + "О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T", + "У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"C","Ч"=>"Ch", + "Ш"=>"Sh","Щ"=>"Sch","Ъ"=>"","Ы"=>"Y","Ь"=>"", + "Э"=>"E","Ю"=>"Yu","Я"=>"Ya","а"=>"a","б"=>"b", + "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё"=>"e","ж"=>"zh", + "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l", + "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r", + "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h", + "ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"", + "ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"," "=>"-","("=>"",")"=>"","'"=>"",'"'=>"" + ); + return strtr($str,$tr); + } + + + function nf($str, $color = false) { + $c = number_format($str, 0, '.', ' '); + if ($color) { + if ($str < 0 ) { + return ''.$c.''; + } else { + return ''.$c.''; + } + } else { + return $c; + } + } + + function mf($str) { + return number_format($str, 2, '.', ' '); + } + + //цена прописью + function int2word($price) + { + $price = number_format($price, 2, '.', ''); + $point = strpos($price, '.'); + //отделяем рубли от копеек + if(!empty($point)) + { + $rub = substr($price, 0, $point); + $kop = substr($price, $point + 1); + } + //преобразуем рубли + $str = write_number_in_words($rub) ; + //пишем рублей(ь,я) + $word = " рублей"; + //последнее число + $last_digit = $rub[(strlen($rub) - 1)]; + //предпоследнее число + $pred_last_digit = $rub[(strlen($rub) - 2)]; + if($last_digit == '1' && $pred_last_digit != '1') + $word = " рубль"; + elseif(($last_digit == '2' || $last_digit == '3' || $last_digit == '4') && $pred_last_digit != '1') + $word = " рубля"; + $str .= $word; + //преобразуем копейки + if(!empty($kop)) + { + + $str .= write_number_in_words($kop, 'femininum') ; + //пишем копейка (и, ек) + $word = " копеек"; + //последнее число + $last_digit = $kop[(strlen($kop) - 1)]; + //предпоследнее число + $pred_last_digit = $kop[(strlen($kop) - 2)]; + if($last_digit == '1' && $pred_last_digit != '1') + $word = " копейка"; + elseif(($last_digit == '2' || $last_digit == '3' || $last_digit == '4') && $pred_last_digit != '1' ) + $word = " копейки"; + $str .= $word; + } + return $str; + } + + //допустимый диапазон чисел 0 .. 999999 + //число прописью + function write_number_in_words ($num, $genus = 'masculinum') + { + //разряд: единицы, десятки, сотни, тысячи + $cur_order = "единицы"; + $cur_thousands_order = "единицы"; + if($num == 0) + return " 00"; + $num = strval($num); + $limit = strlen($num) - 1; + for($i = $limit; $i >= 0; $i--) + { + //тысячный разряд + if($cur_order == "тысячи") + { + //сотни + if($cur_thousands_order == "сотни") + { + $str = write_units_hundreds($num[$i]).$str; + } + //десятки + if($cur_thousands_order == "десятки") + { + $str = write_units_tens($num[$i], $next_digit).$str; + $cur_thousands_order = "сотни"; + $next_digit = ''; + } + //единицы + if($cur_thousands_order == "единицы") + { + if($i > 0 && $num[$i-1] == "1") + { + $next_digit = $num[$i]; + $str = " тысяч".$str; + } + else + $str = write_units_thousands_units($num[$i]).$str; + $cur_thousands_order = "десятки"; + } + } + //сотни + if($cur_order == "сотни") + { + $str = write_units_hundreds($num[$i]).$str; + $cur_order = "тысячи"; + } + //десятки + if($cur_order == "десятки") + { + $str = write_units_tens($num[$i], $next_digit).$str; + $cur_order = "сотни"; + $next_digit = ''; + } + //единицы + if($cur_order == "единицы") + { + if($i > 0 && $num[$i-1] == "1") + $next_digit = $num[$i]; + else + $str = write_units($num[$i], $genus); + $cur_order = "десятки"; + } + } + return($str); + } + + //принадлежит функции write_number_in_words + //преобразует десятки + function write_units_tens ($tens, $next_digit) + { + $tens .= $next_digit; + if($tens == 2) $str_tens = " двадцать"; + if($tens == 3) $str_tens = " тридцать"; + if($tens == 4) $str_tens = " сорок"; + if($tens == 5) $str_tens = " пятьдесят"; + if($tens == 6) $str_tens = " шестьдесят"; + if($tens == 7) $str_tens = " семьдесят"; + if($tens == 8) $str_tens = " восемьдесят"; + if($tens == 9) $str_tens = " девяносто"; + if($tens == 10) $str_tens = " десять"; + if($tens == 11) $str_tens = " одиннадцать"; + if($tens == 12) $str_tens = " двенадцать"; + if($tens == 13) $str_tens = " тринадцать"; + if($tens == 14) $str_tens = " четырнадцать"; + if($tens == 15) $str_tens = " пятнадцать"; + if($tens == 16) $str_tens = " шестнадцать"; + if($tens == 17) $str_tens = " семнадцать"; + if($tens == 18) $str_tens = " восемнадцать"; + if($tens == 19) $str_tens = " девятнадцать"; + return($str_tens); + } + + //принадлежит функции write_number_in_words + //преобразует сотни + function write_units_hundreds ($hundreds) + { + if($hundreds == 1) $str_hundreds = " сто"; + if($hundreds == 2) $str_hundreds = " двести"; + if($hundreds == 3) $str_hundreds = " триста"; + if($hundreds == 4) $str_hundreds = " четыреста"; + if($hundreds == 5) $str_hundreds = " пятьсот"; + if($hundreds == 6) $str_hundreds = " шестьсот"; + if($hundreds == 7) $str_hundreds = " семьсот"; + if($hundreds == 8) $str_hundreds = " восемьсот"; + if($hundreds == 9) $str_hundreds = " девятьсот"; + return($str_hundreds); + } + + //принадлежит функции write_number_in_words + //преобразует единицы тысячного разряда + function write_units_thousands_units ($hundreds) + { + if($hundreds == 0) $str_hundreds = " тысяч"; + if($hundreds == 1) $str_hundreds = " одна тысяча"; + if($hundreds == 2) $str_hundreds = " две тысячи"; + if($hundreds == 3) $str_hundreds = " три тысячи"; + if($hundreds == 4) $str_hundreds = " четыре тысячи"; + if($hundreds == 5) $str_hundreds = " пять тысяч"; + if($hundreds == 6) $str_hundreds = " шесть тысяч"; + if($hundreds == 7) $str_hundreds = " семь тысяч"; + if($hundreds == 8) $str_hundreds = " восемь тысяч"; + if($hundreds == 9) $str_hundreds = " девять тысяч"; + return($str_hundreds); + } + + //принадлежит функции write_number_in_words + //преобразует единицы + function write_units ($units, $genus='masculinum') + { + if($genus == 'masculinum') + { + if($units == 1) $str_units = " один"; + if($units == 2) $str_units = " два"; + } + if($genus == 'femininum') + { + if($units == 1) $str_units = " одна"; + if($units == 2) $str_units = " две"; + + } + if($units == 3) $str_units = " три"; + if($units == 4) $str_units = " четыре"; + if($units == 5) $str_units = " пять"; + if($units == 6) $str_units = " шесть"; + if($units == 7) $str_units = " семь"; + if($units == 8) $str_units = " восемь"; + if($units == 9) $str_units = " девять"; + return($str_units); + } + + + /** + * Переключает раскладку с англ. на русскую + */ + function textswitch($text, $revert = false) { + + + $remap_table = ["q"=>"й","w"=>"ц","e"=>"у","r"=>"к","t"=>"е","y"=>"н","u"=>"г","i"=>"ш","o"=>"щ","p"=>"з","["=>"х","]"=>"ъ", + "a"=>"ф","s"=>"ы","d"=>"в","f"=>"а","g"=>"п","h"=>"р","j"=>"о","k"=>"л","l"=>"д",";"=>"ж","'"=>"э", + "z"=>"я","x"=>"ч","c"=>"с","v"=>"м","b"=>"и","n"=>"т","m"=>"ь",","=>"б","."=>"ю", + "Q"=>"Й","W"=>"Ц","E"=>"У","R"=>"К","T"=>"Е","Y"=>"Н","U"=>"Г","I"=>"Ш","O"=>"Щ","P"=>"З","{"=>"Х","}"=>"Ъ", + "A"=>"Ф","S"=>"Ы","D"=>"В","F"=>"А","G"=>"П","H"=>"Р","J"=>"О","K"=>"Л","L"=>"Д",":"=>"Ж",'"'=>"Э", + "Z"=>"Я","X"=>"Ч","C"=>"С","V"=>"М","B"=>"И","N"=>"Т","M"=>"Ь","<"=>"Б",">"=>"Ю","/"=>".","?"=>",", + "~"=>"Ё","@"=>'"',"#"=>"№","$"=>";","^"=>":","&"=>"?","|"=>"/","`"=>"ё"]; + + if ($revert) { + $remap_table = array_flip($remap_table); + } + + return strtr($text, $remap_table); + } + + +function addLog($str, $file = "global_log" ) { + $filename = _PROJECT_DIR.'engine/logs/'.$file.'_'.date('Y-m').'.log'; + + if(!file_exists(dirname($filename))) { + mkdir(dirname($filename), 0777, true); + chmod(dirname($filename), 0777); + } + + if (!file_exists($filename)) { + file_put_contents($filename,""); + chmod($filename, 0777); + } + + file_put_contents($filename, '['.date('d.m.Y H:i:s')."]\n". $_SERVER['REMOTE_ADDR'] ."\n" . $str ."\n\n", FILE_APPEND ); +} + + + function getFirst() { + $args = func_get_args(); + foreach( $args as $v ){ + if ($v) return $v; + } + } + function wordForm($n, $form1, $form2, $form5) { + $n = abs($n) % 100; + $n1 = $n % 10; + if ($n > 10 && $n < 20) return $form5; + if ($n1 > 1 && $n1 < 5) return $form2; + if ($n1 == 1) return $form1; + return $form5; + } + + function admin_report($msg = '', $title = 'Оповещение для администрации') { + if ($msg) { + require_once( _CFG_DIR . '/core/mail.core.php' ); + $mail = new send_mail(); + $mail->to_pool( _ADMIN_MAIL, $title, $msg ); + } + } + + function s_natksort(&$array) { + $keys = array_keys($array); + natcasesort($keys); + + foreach ($keys as $k) { + $new_array[$k] = $array[$k]; + } + + $array = $new_array; + return true; + } + + + + +function column_sort($arr, $columns = 3) { +// Сортировка массива для вывода в нужное количество колонок + if ($columns < 2 ) return $arr; + $acnt = count($arr); + if ($columns >= $acnt ) { + return $arr; + } + + $karr = array_keys($arr); + + $step = ceil($acnt / $columns); + $ost = $acnt % $columns; + if (!$ost) $ost = $columns; + + for( $i = 0; $i < $step; $i++ ) { + $step_once = $step; + $k = 0; + for( $j = $i; $j <= $acnt; $j+=$step_once ) { + if (isset( $karr[$j] ) ) { + $key = $karr[$j]; + $ret[] = $arr[$key]; + } + if (++$k > $ost ) { + $step_once = $step - 1; + } + } + } + + /* Удаляем лишние элементы */ + if (count($ret) > $acnt ) { + $todel = count($ret) - $acnt; + for( $i = 1; $i<=$todel; $i++ ) { + array_pop($ret); + } + + } + + return $ret; +} + +function sec2str($sec, $reverse = false, $short = false, $ret_count = 0) { + $data = secondsToTime($sec); + $str = array(); + if (!$short ) { + if ($data['d']) $str[] = $data['d'] . wordForm($data['d'], ' день', ' дня', ' дней'); + if ($data['h']) $str[] = $data['h'] . wordForm($data['h'], ' час', ' часа', ' часов'); + if ($reverse) { + // склонение в прошлом + if ($data['m']) $str[] = $data['m'] . wordForm($data['m'], ' минуту', ' минуты', ' минут'); + $str[] = $data['s'] . wordForm($data['s'], ' секунду', ' секунды', ' секунд'); + } else { + if ($data['m']) $str[] = $data['m'] . wordForm($data['m'], ' минута', ' минуты', ' минут'); + $str[] = $data['s'] . wordForm($data['s'], ' секунда', ' секунды', ' секунд'); + } + } else { + if ($data['d']) $str[] = $data['d'] . ' дн'; + if ($data['h']) $str[] = $data['h'] . ' ч'; + if ($data['m']) $str[] = $data['m'] . ' мин'; + $str[] = $data['s'] . ' сек'; + + } + + if ($ret_count) { + $str = array_slice($str, 0, $ret_count); + } + + return implode(" ", $str); +} + + +function secondsToTime($inputSeconds) { + + $secondsInAMinute = 60; + $secondsInAnHour = 60 * $secondsInAMinute; + $secondsInADay = 24 * $secondsInAnHour; + + // extract days + $days = floor($inputSeconds / $secondsInADay); + + // extract hours + $hourSeconds = $inputSeconds % $secondsInADay; + $hours = floor($hourSeconds / $secondsInAnHour); + + // extract minutes + $minuteSeconds = $hourSeconds % $secondsInAnHour; + $minutes = floor($minuteSeconds / $secondsInAMinute); + + // extract the remaining seconds + $remainingSeconds = $minuteSeconds % $secondsInAMinute; + $seconds = ceil($remainingSeconds); + + // return the final array + $obj = array( + 'd' => (int) $days, + 'h' => (int) $hours, + 'm' => (int) $minutes, + 's' => (int) $seconds, + ); + return $obj; +} + + +function getImagePath($val) { + $val = sprintf('%02d/%02d/%d', substr(intval($val), 0, 2), substr(intval($val), 2, 2), $val ); + return $val; +} + + + +function getImageUrl($val) { + $val = sprintf('%02d/%02d/%d', substr(intval($val), 0, 2), substr(intval($val), 2, 2), $val); + return _STATIC_ROOT_ . 'images/'.$val.'.jpg'; +} + + +function gen_uuid() { + $uuid = array( + 'time_low' => 0, + 'time_mid' => 0, + 'time_hi' => 0, + 'clock_seq_hi' => 0, + 'clock_seq_low' => 0, + 'node' => array() + ); + + $uuid['time_low'] = mt_rand(0, 0xffff) + (mt_rand(0, 0xffff) << 16); + $uuid['time_mid'] = mt_rand(0, 0xffff); + $uuid['time_hi'] = (4 << 12) | (mt_rand(0, 0x1000)); + $uuid['clock_seq_hi'] = (1 << 7) | (mt_rand(0, 128)); + $uuid['clock_seq_low'] = mt_rand(0, 255); + + for ($i = 0; $i < 6; $i++) { + $uuid['node'][$i] = mt_rand(0, 255); + } + + $uuid = sprintf('%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x', + $uuid['time_low'], + $uuid['time_mid'], + $uuid['time_hi'], + $uuid['clock_seq_hi'], + $uuid['clock_seq_low'], + $uuid['node'][0], + $uuid['node'][1], + $uuid['node'][2], + $uuid['node'][3], + $uuid['node'][4], + $uuid['node'][5] + ); + + return $uuid; +} + + +function time_ago( $timestamp = 0, $now = 0 ) { + + // Set up our variables. + $minute_in_seconds = 60; + $hour_in_seconds = $minute_in_seconds * 60; + $day_in_seconds = $hour_in_seconds * 24; + $week_in_seconds = $day_in_seconds * 7; + $month_in_seconds = $day_in_seconds * 30; + $year_in_seconds = $day_in_seconds * 365; + + // Get the current time if a reference point has not been provided. + if ( 0 === $now ) { + $now = time(); + } + + // Make sure the timestamp to check is in the past. + if ( $timestamp > $now ) { + /*throw new Exception( 'Timestamp is in the future' );*/ + return 'в будущем'; + } + + // Calculate the time difference between the current time reference point and the timestamp we're comparing. + $time_difference = (int) abs( $now - $timestamp ); + + // Calculate the time ago using the smallest applicable unit. + if ( $time_difference < $hour_in_seconds ) { + $difference_value = round( $time_difference / $minute_in_seconds ); + $difference_label = array('минуту', 'минуты', 'минут'); + } elseif ( $time_difference < $day_in_seconds ) { + $difference_value = round( $time_difference / $hour_in_seconds ); + $difference_label = array('час', 'часа', 'часов'); + } elseif ( $time_difference < $week_in_seconds ) { + $difference_value = round( $time_difference / $day_in_seconds ); + $difference_label = array('день', 'дня', 'дней'); + } elseif ( $time_difference < $month_in_seconds ) { + $difference_value = round( $time_difference / $week_in_seconds ); + $difference_label = array('неделю', 'недели', 'недель'); + } elseif ( $time_difference < $year_in_seconds ) { + $difference_value = round( $time_difference / $month_in_seconds ); + $difference_label = array('месяц', 'месяца', 'месяцев'); + } else { + $difference_value = round( $time_difference / $year_in_seconds ); + $difference_label = array('год', 'года', 'лет'); + } + + $label = wordForm($difference_value, $difference_label[0], $difference_label[1], $difference_label[2]); + $time_ago = sprintf( '%s %s назад', + $difference_value, + $label + ); + + + return $time_ago; +} + + +function human_filesize($size, $precision = 2) { + for($i = 0; ($size / 1024) > 0.9; $i++, $size /= 1024) {} + return round($size, $precision).['Б','Кб','Мб','Гб','Тб','Пб','Еб','Зб','Юб'][$i]; +} + +function xml_escape($str ) { + return htmlspecialchars($str, ENT_XML1 | ENT_COMPAT, 'UTF-8'); +} + +function get_cfrm() { + global $uauth; + $ts = time(); + $data = md5($ts . $uauth->sess_id . $_SERVER['REMOTE_ADDR']); + $data = $ts.'.'.$data; + return $data; +} + + +function check_cfrm($str = '') { + if ( !$str ) return false; + global $uauth; + list($ts,$data) = explode('.', $str); + if ((time() - $ts) > 600) return false; + $check = md5($ts . $uauth->sess_id . $_SERVER['REMOTE_ADDR']); + if ($check != $data) return false; + return true; +} + + +function ceilCoefficient($number, $rate = 50) +{ + // если число дробное, то округляем его до целого + $number = ceil($number); + // разделим число на коэффициент, а результат округлим в большую сторону. Потом умножим число на округленный коэффициент + $rest = ceil($number / $rate) * $rate; + return $rest; +} + +function doDebug($level = 'errors') { + switch ($level) { + case 'full': + error_reporting(E_ALL & ~E_NOTICE); + break; + default: + error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING & ~E_DEPRECATED); + break; + } + ini_set('display_errors', 'On'); + $whoops = new \Whoops\Run(); + $whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler()); + $whoops->register(); +} + +function date2humanString($ts) { + static $d1, $d2, $d3; + + if (!$d1 ) $d1 = date('Ymd'); + if (!$d2 ) $d2 = date('Ymd', mktime(0,0,0,date('m'),date('d')+1, date('Y'))); + if (!$d3 ) $d3 = date('Ymd', mktime(0,0,0,date('m'),date('d')+2, date('Y'))); + + switch( date('Ymd',$ts) ) { + case $d1: + return 'сегодня'; + break; + case $d2: + return 'завтра'; + break; + case $d3: + return 'послезавтра'; + break; + default: + return date('d', $ts) . ' ' . _getMonthName(date('m', $ts), true); + break; + } + +} + + +// Не работает если в разных проектах файлы с одинаковым именем +function multiRunCheck() { + if(php_sapi_name() !=="cli") return true; + + global $argv; + $cmd = "ps aux | grep '" . $argv[0] . "' | grep -v 'grep'"; + exec($cmd, $output); + if (count($output) > 2) { + // В ответе 2 строки, т.к. cron пораждает дочерний процесс, в котором тоже присутсвует название файла + die('double run'); + } + return true; +} + + +function displayError($body, $title ="", $btns = []) { + global $R; + $tpl = $R->getTpl('order_blanks/generalErrorTemplate.htm'); + + if (!$title) $title = "Ошибка"; + + $tpl = $R->set('title', $title, $tpl); + $tpl = $R->set('body', $body, $tpl); + + if (!empty($btns)) { + foreach ($btns as $btn) { + + if (!isset($btn['class'])) $btn['class'] = 'btn-primary'; + + $btnHtml = ''.$btn['title'].''; + + $tpl = $R->parse('btns', $btnHtml, $tpl); + } + } else { + if ( $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest' ) { + $tpl = $R->set('btns', "Вернуться назад", $tpl); + } + } + + return $R->clear($tpl); + +} + +?> \ No newline at end of file diff --git a/app/engine/core/walker.core.php b/app/engine/core/walker.core.php new file mode 100644 index 0000000..5b9939a --- /dev/null +++ b/app/engine/core/walker.core.php @@ -0,0 +1,97 @@ +onpage = $onpage; + } + $this->allcount = intval($allcount); + $this->page = intval($_GET[$this->prefix]); + } + + function setPrefix($prefix) { + $this->prefix = $prefix; + $this->page = intval($_GET[$this->prefix]); + } + + function setTempl( $templ ) { + $this->templ = $templ; + } + + function process() { + global $R, $url_arr; + + $tpl = $R->getTpl( $this->templ, 'body' ); + $tpln = $R->getTpl( $this->templ, 'num' ); + $tplnc = $R->getTpl( $this->templ, 'num_c' ); + $tplnf = $R->getTpl( $this->templ, 'num_first' ); + $tplpp = $R->getTpl( $this->templ, 'page_prev' ); + $tplpn = $R->getTpl( $this->templ, 'page_next' ); + + $this->parsed_url[] = $this->prefix; + + $this->html = ""; + $pages = $this->allcount/$this->onpage; + + if ( $this->allcount < $this->onpage ) return false; + + if ( $this->page >= 1 ) { + $tt = $R->set('url', $this->getUrl($this->page - 1), $tplpp ); + $tpl = $R->parse('pages', $tt, $tpl ); + } + + for($i=max(0, $this->page - 5);$ipage + 5);$i++) { + if ($i == $this->page) $tt = $tplnc; else $tt = $tpln; + $tt = $R->set('page_num', $i+1, $tt ); + $tt = $R->set('url', $this->getUrl( $i ), $tt ); + $tpl = $R->parse('pages', $tt, $tpl ); + } + + if ( $this->page < ($pages-1) ) { + $tt = $R->set('url', $this->getUrl( $this->page + 1 ), $tplpn ); + $tpl = $R->parse('pages', $tt, $tpl ); + } + + $this->sql = ' LIMIT ' . max(0, intval($this->page) * $this->onpage ) . ', ' . $this->onpage ; + $this->html = $tpl; + } + + function getHTML() { + if (!$this->html) $this->process(); + return $this->html; + } + + function getSQL() { + if (!$this->sql) $this->process(); + return $this->sql; + } + + function getUrl($page_id = 0) { + $uri = $_SERVER['REQUEST_URI']; + $ua = parse_url($uri); + parse_str($ua['query'], $query); + if ($page_id > 0 ) { + $query[$this->prefix] = $page_id; + } else { + unset($query[$this->prefix]); + } + $pars = http_build_query($query); + if ($pars) { + return $ua['path'] . '?' . $pars; + } else { + return $ua['path']; + } + } +} + +?> diff --git a/app/engine/cron/skeleton.php b/app/engine/cron/skeleton.php new file mode 100644 index 0000000..20f60f6 --- /dev/null +++ b/app/engine/cron/skeleton.php @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/app/engine/logs/.placeholder b/app/engine/logs/.placeholder new file mode 100644 index 0000000..b3a4252 --- /dev/null +++ b/app/engine/logs/.placeholder @@ -0,0 +1 @@ +placeholder \ No newline at end of file diff --git a/app/engine/migrations/.placeholder b/app/engine/migrations/.placeholder new file mode 100644 index 0000000..b3a4252 --- /dev/null +++ b/app/engine/migrations/.placeholder @@ -0,0 +1 @@ +placeholder \ No newline at end of file diff --git a/app/engine/migrations/0000001_sys_files.sql b/app/engine/migrations/0000001_sys_files.sql new file mode 100644 index 0000000..7b39bf7 --- /dev/null +++ b/app/engine/migrations/0000001_sys_files.sql @@ -0,0 +1,2 @@ +ALTER TABLE `_sys_files` ADD `private` int(1) NOT NULL; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("checkbox" , "" , "Приватный файл" , "0" , "0" , "100" , "0" , "_sys_files" , "private"); diff --git a/app/engine/migrations/0000002_tag_engine.sql b/app/engine/migrations/0000002_tag_engine.sql new file mode 100644 index 0000000..6888c05 --- /dev/null +++ b/app/engine/migrations/0000002_tag_engine.sql @@ -0,0 +1,97 @@ +CREATE TABLE `global_tags` ( + `id` int(12) NOT NULL AUTO_INCREMENT, + `entity_id` int(12) NOT NULL, + `tag_id` int(12) NOT NULL, + `tag_group_id` int(12) NOT NULL, + PRIMARY KEY (`id`), + KEY `entity_id` (`entity_id`), + KEY `tag_id` (`tag_id`), + KEY `tag_group_id` (`tag_group_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='Таблица тэгов'; + +REPLACE INTO `_sys_datatypes` + (`obj_name`,`attr_name`,`attr_type`,`attr_templ`,`attr_desc`,`attr_hide`,`attr_mand`,`attr_order`) + VALUES + ('global_tags','entity_id','int12','[title]','ID сущности','0','0','100'); +REPLACE INTO `_sys_datatypes` + (`obj_name`,`attr_name`,`attr_type`,`attr_templ`,`attr_desc`,`attr_hide`,`attr_mand`,`attr_order`) + VALUES + ( + 'global_tags','tag_group_id','LINK|global_tags_groups','[title]','Группа тэга','0','0','100'); +REPLACE INTO `_sys_datatypes` + (`obj_name`,`attr_name`,`attr_type`,`attr_templ`,`attr_desc`,`attr_hide`,`attr_mand`,`attr_order`) + VALUES + ( + 'global_tags', + 'tag_id', + 'LINK|global_tags_titles', + '[title]', + 'Тэг', + '0', + '0', + '100') + ; +CREATE TABLE `global_tags_groups` ( + `id` int(12) NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; +REPLACE INTO `_sys_datatypes` + (`obj_name`,`attr_name`,`attr_type`,`attr_templ`,`attr_desc`,`attr_hide`,`attr_mand`,`attr_order`) + VALUES + ( + 'global_tags_groups', + 'title', + 'input', + '', + 'Название группы', + '0', + '0', + '100') + ; +CREATE TABLE `global_tags_titles` ( + `id` int(12) NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + `tag_group_id` int(12) NOT NULL, + `url_part` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + KEY `tag_group_id` (`tag_group_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; +REPLACE INTO `_sys_datatypes` + (`obj_name`,`attr_name`,`attr_type`,`attr_templ`,`attr_desc`,`attr_hide`,`attr_mand`,`attr_order`) + VALUES + ( + 'global_tags_titles', + 'tag_group_id', + 'LINK|global_tags_groups', + '[title]', + 'Группа тэга', + '0', + '0', + '999') + ; +REPLACE INTO `_sys_datatypes` + (`obj_name`,`attr_name`,`attr_type`,`attr_templ`,`attr_desc`,`attr_hide`,`attr_mand`,`attr_order`) + VALUES + ( + 'global_tags_titles', + 'title', + 'input', + '', + 'Тэг', + '0', + '0', + '100') + ; +REPLACE INTO `_sys_datatypes` + (`obj_name`,`attr_name`,`attr_type`,`attr_templ`,`attr_desc`,`attr_hide`,`attr_mand`,`attr_order`) + VALUES + ( + 'global_tags_titles', + 'url_part', + 'input', + '', + 'Часть URL', + '0', + '0', + '200'); diff --git a/app/engine/migrations/20251113-1234-_sys_users.sql b/app/engine/migrations/20251113-1234-_sys_users.sql new file mode 100644 index 0000000..d641173 --- /dev/null +++ b/app/engine/migrations/20251113-1234-_sys_users.sql @@ -0,0 +1,6 @@ +-- [2025-11-13 12:34:43] Удаление атрибута user_office; +DELETE FROM `_sys_datatypes` WHERE `obj_name` = '_sys_users' AND `attr_name` = 'user_office'; +ALTER TABLE `_sys_users` DROP `user_office`; +-- [2025-11-13 12:34:48] Удаление атрибута default_work_tarif; +DELETE FROM `_sys_datatypes` WHERE `obj_name` = '_sys_users' AND `attr_name` = 'default_work_tarif'; +ALTER TABLE `_sys_users` DROP `default_work_tarif`; diff --git a/app/engine/migrations/20251113-1243-shop_delivery_zones.sql b/app/engine/migrations/20251113-1243-shop_delivery_zones.sql new file mode 100644 index 0000000..972c7ea --- /dev/null +++ b/app/engine/migrations/20251113-1243-shop_delivery_zones.sql @@ -0,0 +1,2 @@ +-- [2025-11-13 12:43:59] Изменение атрибута color; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("color_picker" , "" , "Цвет зоны" , "0" , "0" , "100" , "0" , "shop_delivery_zones" , "color"); diff --git a/app/engine/migrations/20251113-1244-admin-cats.sql b/app/engine/migrations/20251113-1244-admin-cats.sql new file mode 100644 index 0000000..c96a66f --- /dev/null +++ b/app/engine/migrations/20251113-1244-admin-cats.sql @@ -0,0 +1,2 @@ +INSERT INTO `_sys_cat_admin` (`access_group`, `cat_id`, `cat_name`, `data`, `module`, `parent_cat`) VALUES ( "1,2", "core-zone-admin", "Участки", "$obj_name=shop_delivery_zones;", "object_admin.php", "index"); +UPDATE `_sys_cat_admin` SET `_sys_cat_admin`.`module` = "admin_polygon.php" WHERE `_sys_cat_admin`.`cat_id` = "core-zone-admin"; diff --git a/app/engine/migrations/20251113-1258-shop_delivery_zones.sql b/app/engine/migrations/20251113-1258-shop_delivery_zones.sql new file mode 100644 index 0000000..022379c --- /dev/null +++ b/app/engine/migrations/20251113-1258-shop_delivery_zones.sql @@ -0,0 +1,4 @@ +-- [2025-11-13 12:58:05] Изменение атрибута color; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("color_picker" , "" , "Цвет участка" , "0" , "0" , "100" , "0" , "shop_delivery_zones" , "color"); +-- [2025-11-13 12:58:05] Изменение атрибута title; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("input" , "" , "Название участка" , "0" , "0" , "100" , "0" , "shop_delivery_zones" , "title"); diff --git a/app/engine/migrations/20251113-1318-_sys_cat.sql b/app/engine/migrations/20251113-1318-_sys_cat.sql new file mode 100644 index 0000000..36d2923 --- /dev/null +++ b/app/engine/migrations/20251113-1318-_sys_cat.sql @@ -0,0 +1,2 @@ +-- [2025-11-13 13:18:49] Изменение атрибута parent_cat; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("input" , "[cat_name]" , "Родительский элемент" , "0" , "0" , "0" , "0" , "_sys_cat" , "parent_cat"); diff --git a/app/engine/migrations/20251113-1318-user-cats.sql b/app/engine/migrations/20251113-1318-user-cats.sql new file mode 100644 index 0000000..f1caeda --- /dev/null +++ b/app/engine/migrations/20251113-1318-user-cats.sql @@ -0,0 +1 @@ +UPDATE `_sys_cat` SET `_sys_cat`.`module` = "site_index.php" WHERE `_sys_cat`.`cat_id` = "index"; diff --git a/app/engine/migrations/20251113-1400-user-cats.sql b/app/engine/migrations/20251113-1400-user-cats.sql new file mode 100644 index 0000000..de4d091 --- /dev/null +++ b/app/engine/migrations/20251113-1400-user-cats.sql @@ -0,0 +1 @@ +UPDATE `_sys_cat` SET `_sys_cat`.`cat_name` = "ПНД 8" WHERE `_sys_cat`.`cat_id` = "index"; diff --git a/app/engine/migrations/20251113-1614-pnd_doctors.sql b/app/engine/migrations/20251113-1614-pnd_doctors.sql new file mode 100644 index 0000000..426e531 --- /dev/null +++ b/app/engine/migrations/20251113-1614-pnd_doctors.sql @@ -0,0 +1,4 @@ +-- [2025-11-13 16:14:34] Создание атрибута; +CREATE TABLE IF NOT EXISTS `pnd_doctors` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `pnd_doctors` ADD `name` varchar(255) NOT NULL; +REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("pnd_doctors","name","input","","","100"); diff --git a/app/engine/migrations/20251113-1615-pnd_zones.sql b/app/engine/migrations/20251113-1615-pnd_zones.sql new file mode 100644 index 0000000..9f347b6 --- /dev/null +++ b/app/engine/migrations/20251113-1615-pnd_zones.sql @@ -0,0 +1,12 @@ +-- [2025-11-13 16:15:04] Создание атрибута; +CREATE TABLE IF NOT EXISTS `pnd_zones` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `pnd_zones` ADD `external_zone_id` int(12) NOT NULL; +REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("pnd_zones","external_zone_id","int12","","","100"); +-- [2025-11-13 16:15:19] Создание атрибута; +CREATE TABLE IF NOT EXISTS `pnd_zones` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `pnd_zones` ADD `title` varchar(255) NOT NULL; +REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("pnd_zones","title","input","","","100"); +-- [2025-11-13 16:15:39] Изменение атрибута external_zone_id; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("int12" , "" , "Внешний ID зоны" , "0" , "0" , "100" , "0" , "pnd_zones" , "external_zone_id"); +-- [2025-11-13 16:15:39] Изменение атрибута title; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("input" , "" , "Название зоны" , "0" , "0" , "100" , "0" , "pnd_zones" , "title"); diff --git a/app/engine/migrations/20251113-1615-shop_delivery_zones.sql b/app/engine/migrations/20251113-1615-shop_delivery_zones.sql new file mode 100644 index 0000000..820a796 --- /dev/null +++ b/app/engine/migrations/20251113-1615-shop_delivery_zones.sql @@ -0,0 +1,5 @@ +-- [2025-11-13 16:15:51] Создание атрибута; +CREATE TABLE IF NOT EXISTS `shop_delivery_zones` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `shop_delivery_zones` ADD `zone_id` int(12) NOT NULL; +ALTER TABLE `shop_delivery_zones` ADD INDEX ( `zone_id` ); +REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("shop_delivery_zones","zone_id","LINK|pnd_zones","","","100"); diff --git a/app/engine/migrations/20251113-1616-shop_delivery_zones.sql b/app/engine/migrations/20251113-1616-shop_delivery_zones.sql new file mode 100644 index 0000000..e0f63a1 --- /dev/null +++ b/app/engine/migrations/20251113-1616-shop_delivery_zones.sql @@ -0,0 +1,5 @@ +-- [2025-11-13 16:16:02] Изменение атрибута zone_id; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("LINK|pnd_zones" , "[title]" , "Участок" , "0" , "0" , "100" , "0" , "shop_delivery_zones" , "zone_id"); +-- [2025-11-13 16:16:51] Удаление атрибута title; +DELETE FROM `_sys_datatypes` WHERE `obj_name` = 'shop_delivery_zones' AND `attr_name` = 'title'; +ALTER TABLE `shop_delivery_zones` DROP `title`; diff --git a/app/engine/migrations/20251113-1617-shop_delivery_zones.sql b/app/engine/migrations/20251113-1617-shop_delivery_zones.sql new file mode 100644 index 0000000..bf72f82 --- /dev/null +++ b/app/engine/migrations/20251113-1617-shop_delivery_zones.sql @@ -0,0 +1,6 @@ +-- [2025-11-13 16:17:09] Создание атрибута; +CREATE TABLE IF NOT EXISTS `shop_delivery_zones` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `shop_delivery_zones` ADD `title` varchar(255) NOT NULL; +REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("shop_delivery_zones","title","input","","","100"); +-- [2025-11-13 16:17:15] Изменение атрибута title; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("input" , "" , "Название участка" , "0" , "0" , "100" , "0" , "shop_delivery_zones" , "title"); diff --git a/app/engine/migrations/_migrate.php b/app/engine/migrations/_migrate.php new file mode 100644 index 0000000..b461325 --- /dev/null +++ b/app/engine/migrations/_migrate.php @@ -0,0 +1,25 @@ +q('SELECT apply_datetime FROM _sys_db_migrations WHERE `filename` = "'.db_escape_string($filename).'" '); + if (!$core_db->nr()) { + $sql = file_get_contents($filename); + $sql_a = preg_split("/;(\n|\r\n)/", $sql); + foreach($sql_a as $sql ) { + if (trim($sql)) { + $core_db->q($sql); + echo '.'; + } + } + echo 'done' . PHP_EOL; + $core_db->q('INSERT INTO _sys_db_migrations (`filename`,`apply_datetime`) values ("'.db_escape_string($filename).'", "'.date('Y-m-d H:i:s').'" ) '); + } else { + echo 'skip' . PHP_EOL; + } + } + +?> \ No newline at end of file diff --git a/app/engine/rewrite.php b/app/engine/rewrite.php new file mode 100644 index 0000000..28b8c33 --- /dev/null +++ b/app/engine/rewrite.php @@ -0,0 +1,83 @@ + $v ) { + if (empty($v) ) unset($url_arr[$k]); +} + + + +if ( !empty($url_arr) ) { + // page1...999 , $_GET[curpage] + foreach( $url_arr as $k => $url ) { + if ( preg_match( '/page(\d{1,})/', $url, $page_id ) ) { + $_GET['page'] = $page_id[1]; + unset($url_arr[$k]); + } + } + + foreach( $url_arr as $k => $url ) { + if ( preg_match( '/start(\d{1,})/', $url, $page_id ) ) { + $_GET['start'] = $page_id[1]; + unset($url_arr[$k]); + } + } + + + // _f_*--* , $_GET[_f][k] = v + foreach( $url_arr as $k => $url ) { + if ( preg_match( '/_f_(.*?)--(\d{1,})/', $url, $arr ) ) { + $_GET['_f'][$arr[1]] = $arr[2]; + unset($url_arr[$k]); + } + } + + $url_arr = array_values($url_arr); + $cnt = count($url_arr); + if ($cnt > 1 ) { + $l1_url = $url_arr[0]; + } else { + $l1_url = ''; + } + $full_url = db_escape_string(implode('/', $url_arr)); + + $db2 = $core_db->q('SELECT `obj_name`, `attr_templ` FROM `_sys_datatypes` WHERE `attr_type` = "full_url" AND `attr_templ` LIKE "'.db_escape_string($l1_url).'|%"'); + while($db2->nr()) { + $obj_name = $db2->f('obj_name'); + list( $url_prefix, $url_cat, $postfix ) = explode('|', $db2->f('attr_templ')); + $db3 = $core_db->q('SELECT `id` FROM `' . $obj_name . '` WHERE `url` = "' . $full_url . '"'); + if ($db3->nr() ) { + $_GET['cat'] = $url_cat; + $_GET['id'] = $db3->f('id'); + break; + } + } + + if ( !$_GET['cat'] ) { + // , /cat/key/val/key/val + $_GET['cat'] = $url_arr[0]; + for($i=1; $i<=count($url_arr); $i+=2 ) { + $_GET[$url_arr[$i]] = $url_arr[$i+1]; + } + define('NOINDEX', 1); + } + +} else { + if (!$_GET['cat']) { + $_GET['cat'] = 'index'; + } +} +if ( !$_GET['cat'] ) { + header("HTTP/1.1 404 Not Found"); + $_GET['cat'] = '404'; +} + +?> \ No newline at end of file diff --git a/app/engine/www/bladetpl/cache/.placeholder b/app/engine/www/bladetpl/cache/.placeholder new file mode 100644 index 0000000..e69de29 diff --git a/app/engine/www/bladetpl/cache/56c7a1591596cbb4221c1c6fa03a4ccda02d74c1.bladec b/app/engine/www/bladetpl/cache/56c7a1591596cbb4221c1c6fa03a4ccda02d74c1.bladec new file mode 100644 index 0000000..3212d46 --- /dev/null +++ b/app/engine/www/bladetpl/cache/56c7a1591596cbb4221c1c6fa03a4ccda02d74c1.bladec @@ -0,0 +1,132 @@ + + +
    +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/app/engine/www/bladetpl/cache/cdbbedc0e665b8bf2c330ea231b6a0409bc3107e.bladec b/app/engine/www/bladetpl/cache/cdbbedc0e665b8bf2c330ea231b6a0409bc3107e.bladec new file mode 100644 index 0000000..88e7d74 --- /dev/null +++ b/app/engine/www/bladetpl/cache/cdbbedc0e665b8bf2c330ea231b6a0409bc3107e.bladec @@ -0,0 +1,17 @@ +
    +is_login): ?> +

    Привет, user_obj->get('name'), ENT_QUOTES, 'UTF-8', false); ?>

    + + +

    Добро пожаловать, незнакомец!

    +

    Этот шаблон написан на Blade

    +

    Авторизируйся в админке, чтобы увидеть больше!

    + +
    + diff --git a/app/engine/www/bladetpl/cache/db96a3dc7e7cb5fa7e5c21f03ac1e1d5bc9cfdeb.bladec b/app/engine/www/bladetpl/cache/db96a3dc7e7cb5fa7e5c21f03ac1e1d5bc9cfdeb.bladec new file mode 100644 index 0000000..996542d --- /dev/null +++ b/app/engine/www/bladetpl/cache/db96a3dc7e7cb5fa7e5c21f03ac1e1d5bc9cfdeb.bladec @@ -0,0 +1,57 @@ +
    +

    Ваш участок обслуживания

    +
    + Адрес: ул. Примерная, дом 12 +
    +
    + +
    +
    +

    + Терапевт участка +

    + +
    +
    + 🩺 +
    +
    + Иванова Мария Сергеевна
    + Врач-терапевт высшей категории
    + Кабинет: 208
    +
    +
    + +
    Расписание приема
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Понедельник09:00 — 17:00
    Вторник12:00 — 20:00
    Среда09:00 — 17:00
    Четверг12:00 — 20:00
    Пятница09:00 — 15:00
    СубботаВыходной
    ВоскресеньеВыходной
    +
    +
    diff --git a/app/engine/www/bladetpl/cache/decf3914d3856b1a7f37474c63abd946c9c06fb9.bladec b/app/engine/www/bladetpl/cache/decf3914d3856b1a7f37474c63abd946c9c06fb9.bladec new file mode 100644 index 0000000..1c5b064 --- /dev/null +++ b/app/engine/www/bladetpl/cache/decf3914d3856b1a7f37474c63abd946c9c06fb9.bladec @@ -0,0 +1,349 @@ +
    + + + + + + + + + + + + + + + diff --git a/app/engine/www/modules/auto_title.php b/app/engine/www/modules/auto_title.php new file mode 100644 index 0000000..c3e9bd8 --- /dev/null +++ b/app/engine/www/modules/auto_title.php @@ -0,0 +1,15 @@ +path_name); + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/www/modules/core_menuconfig.php b/app/engine/www/modules/core_menuconfig.php new file mode 100644 index 0000000..6a8337b --- /dev/null +++ b/app/engine/www/modules/core_menuconfig.php @@ -0,0 +1,37 @@ +is_login() == false) return 'not loginned'; + if (!$this->id) return 'no id'; + + $curFavorites = (array)json_decode($auth->user_obj->get('favorite_menu'), true); + + $curFavorites = array_merge($curFavorites, [$this->id]); + + $auth->user_obj->set('favorite_menu', json_encode($curFavorites)); + $auth->user_obj->save(); + + return 'ok'; + } + + public function _ajax_delFromFav() { + global $auth; + if ($auth->is_login() == false) return 'not loginned'; + if (!$this->id) return 'no id'; + + $curFavorites = (array)json_decode($auth->user_obj->get('favorite_menu'), true); + + $curFavorites = array_diff($curFavorites, [$this->id]); + $auth->user_obj->set('favorite_menu', json_encode($curFavorites)); + $auth->user_obj->save(); + return 'ok'; + } + +} + +?> \ No newline at end of file diff --git a/app/engine/www/modules/core_start_menu.php b/app/engine/www/modules/core_start_menu.php new file mode 100644 index 0000000..fe8465c --- /dev/null +++ b/app/engine/www/modules/core_start_menu.php @@ -0,0 +1,90 @@ +getDB()->q($obj->getSelect(' AND _sys_unvisible = 0 ORDER BY `_sys_order` ASC ')); + $menuItems = $db2->fetchAll(); + $tree = $this->buildTree($menuItems); + + $tree = $tree[0]['children']; + $data['html'] = $this->renderTree($tree); + + if ($auth->is_login()) { + $favIds = (array)json_decode($auth->user_obj->get('favorite_menu'), true); + if (!$favIds) { + $favIds = []; + } + } else { + $favIds = []; + } + if (is_array($favIds) && !empty($favIds)) { + $db2 = $obj->getDB()->q($obj->getSelect(' AND `cat_id` in ("' . implode('", "', $favIds) . '") ORDER BY field(`cat_id`, "' . implode('", "', $favIds) . '") ')); + $favLinks = $db2->fetchAll(); + } else { + $favLinks = []; + } + $data['favLinks'] = $favLinks; + + + + + return $blade2->runChild($this->getBladeTempl('line_menu'), $data); + } + + // Функции для построения дерева и рендеринга в HTML + function buildTree(&$elements, $parentCat = '') { + $branch = array(); + + foreach ($elements as &$element) { + if ($element['parent_cat'] == $parentCat) { + $children = $this->buildTree($elements, $element['cat_id']); + if ($children) { + $element['children'] = $children; + } + $branch[] = $element; + unset($element); // Удаляем элемент после добавления в дерево для оптимизации + } + } + return $branch; + } + + function renderTree($tree) { + global $cat, $auth; + + $curFavorites = json_decode($auth->user_obj->get('favorite_menu'), true); + + $html = ''; + return $html; + } + +} + +?> \ No newline at end of file diff --git a/app/engine/www/modules/line_menu.php b/app/engine/www/modules/line_menu.php new file mode 100644 index 0000000..9a09ef1 --- /dev/null +++ b/app/engine/www/modules/line_menu.php @@ -0,0 +1,77 @@ +getTpl($this->templ, 'body'); + $tpli = $R->getTpl($this->templ, 'item'); + $tplis = $R->getTpl($this->templ, 'item_sel'); + $tplsep = $R->getTpl($this->templ, 'sep'); + if (!$this->root) { + + + if (isset($this->autoLevel) && $this->autoLevel) { + $this->autoLevel = intval($this->autoLevel); // Приводим к числу + + $path = $cat->getPath(); + if (count($path) == 1) return ''; + $path = array_reverse($path); + + if ($this->autoLevel > count($path)) { + $this->autoLevel = count($path) - 1; + } + + $this->root = $path[$this->autoLevel]; + } else { + $this->root = $cat->cat; + } + } + $this->obj = new cobject(__REAL_CAT_OBJ_); + + $sql_where = ''; + if ($this->noexit) { + $sql_where = ' AND id not in (18) '; + global $auth; + if ($auth->is_login) { + $tpl = $R->set('current_user_name', $auth->user_obj->assign('{name}'), $tpl); + } + } + + $tpl = $R->set('root', 'root'.crc32($this->root), $tpl); + + $db2 = $core_db->q($this->obj->getSelect(' AND `cat_id` = "'.db_escape_string($this->root).'"')); + if ($db2->nr()) { + $this->obj->lRow($db2); + $tpl = $this->obj->assign($tpl); + } + + $db2 = $core_db->q($this->obj->getSelect(' AND `parent_cat` = "' . $this->root . '" AND `_sys_unvisible` = "0" '.$sql_where.' ORDER BY `_sys_order`')); + $first = true; + while ($db2->r()) { + $this->obj->lRow($db2); + if (!in_array($db2->f('cat_id'), $cat->path)) { + $tt = $this->obj->assign($tpli); + } else { + $tt = $this->obj->assign($tplis); + } + if ($first) { + $first = false; + } else { + $tpl = $R->parse('menu_item', $tplsep, $tpl); + } + + $tpl = $R->parse('menu_item', $tt, $tpl); + } + + return $R->clear($tpl); + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/www/modules/site_404.php b/app/engine/www/modules/site_404.php new file mode 100644 index 0000000..7372889 --- /dev/null +++ b/app/engine/www/modules/site_404.php @@ -0,0 +1,35 @@ +obj = new cobject( $this->obj_name ); + return parent::_init(); + } + + function _on_() { + global $R, $cat, $shop; + + $tpl = $R->getTpl( $this->templ ); + $this->obj->byId( $this->id ); + $tpl = $R->set('title_or_h1', getFirst($this->obj->get('page_h1'), $this->obj->get('title')), $tpl ); + $tpl = $this->obj->assign( $tpl ); + $cat->setKeywords( $this->obj->get('page_keywords') ) or $cat->setKeywords( $this->obj->get('title') ); + $cat->setDescription( $this->obj->get('page_description') ); + $cat->addTitle($this->obj->get('page_title')) or $cat->addTitle($this->obj->get('page_h1')) or $cat->addTitle($this->obj->get('title')); + + + return $R->clear( $tpl ); + } + + +} + + + +?> \ No newline at end of file diff --git a/app/engine/www/modules/site_index.php b/app/engine/www/modules/site_index.php new file mode 100644 index 0000000..28f1293 --- /dev/null +++ b/app/engine/www/modules/site_index.php @@ -0,0 +1,66 @@ +apiKey; + $data['suggest_apikey'] = $this->suggestKey; + + + $obj = new cobject('shop_delivery_zones'); + + // полигоны + $db2 = $obj->getDB()->q($obj->getSelectEx('id, title, ASTEXT(`geom`) as `geom`, color ')); + while($db2->nr()) { + + $coords = $this->mysql2json($db2->f('geom')); + $row = []; + $row['coords'] = $coords; + $row['id'] = $db2->f('id'); + $row['title'] = $db2->f('title'); + $row['color'] = $db2->f('color'); + + $data['rows'][] = $row; + } + + return $blade->run($this->getBladeTempl('main'), $data); + } + + function _on_getInfo() + { + global $blade; + + $data = []; + return $blade->run($this->getBladeTempl('data'), $data); + } + + public function mysql2json($str) { + // POLYGON((59.94778267548529 30.047386140625,60.12503918773836 30.468986482421876,59.92986664045532 30.963371248046883,59.84083181279909 30.456626863281247,59.960180395813275 30.38933560351563,59.94778267548529 30.047386140625)) + preg_match_all('/POLYGON\(\((.*?)\)\)/', $str, $arr); + $points = explode(',', $arr[1][0]); + + foreach($points as $point) { + $ret[0][] = explode(' ', $point); + } + + return json_encode($ret); + } + +} + + + + +?> \ No newline at end of file diff --git a/app/engine/www/modules/site_sitemap.php b/app/engine/www/modules/site_sitemap.php new file mode 100644 index 0000000..c7718c2 --- /dev/null +++ b/app/engine/www/modules/site_sitemap.php @@ -0,0 +1,53 @@ +getTpl( $this->templ, 'body' ); + $tplr = $R->getTpl( $this->templ, 'row' ); + + $tt = $tplr; + $tt = $R->set('url', _SITE_ROOT_, $tt ); + $tt = $R->set('freq', 'daily', $tt ); + $tt = $R->set('prio', '1', $tt ); + $tt = $R->set('lastmod', (date('Y-m-d').'T01:00:00+00:00'), $tt ); + + $tpl = $R->parse('rows', $tt, $tpl ); + + $db3 = $core_db->q('SELECT `cat_id` FROM `_sys_cat` WHERE !`_sys_unvisible` AND !`_sys_deleted` AND `parent_cat` != "" '); + while ($db3->nr() ) { + $url = $db3->f('cat_id'); + $tt = $R->set('url', _SITE_ROOT_.$url, $tplr ); + $tt = $R->set('prio', '0.9', $tt ); + $tt = $R->set('lastmod', (date('Y-m-d').'T00:00:00+00:00'), $tt ); + $tpl = $R->parse('rows', $tt, $tpl ); + } + + + $db2 = $core_db->q('SELECT `obj_name`, `attr_templ` FROM `_sys_datatypes` WHERE `attr_type` = "full_url" '); + while ( $db2->nr() ) { + $obj_name = $db2->f('obj_name'); + list( $url_prefix, $url_cat ) = explode('|', $db2->f('attr_templ')); + $db3 = $core_db->q('SELECT `url`,`_sys_lastchange` FROM `' . $obj_name . '` WHERE !`_sys_unvisible` AND !`_sys_deleted`'); + while ($db3->nr() ) { + $url = $db3->f('url'); + $tt = $R->set('url', _SITE_ROOT_.$url, $tplr ); + $tt = $R->set('prio', '0.8', $tt ); + $tt = $R->set('lastmod', (date('Y-m-d',$db3->f('_sys_lastchange')).'T01:00:00+00:00'), $tt ); + $tpl = $R->parse('rows', $tt, $tpl ); + } + } + + return $R->clear( $tpl ); + } + + +} + +?> \ No newline at end of file diff --git a/app/engine/www/modules/static_page.php b/app/engine/www/modules/static_page.php new file mode 100644 index 0000000..74f4df3 --- /dev/null +++ b/app/engine/www/modules/static_page.php @@ -0,0 +1,35 @@ +obj = new cobject( $this->obj_name ); + return parent::_init(); + } + + function _on_() { + global $R, $cat; + + $tpl = $R->getTpl( $this->templ ); + $this->obj->byId( $this->id ); + $tpl = $R->set('title_or_h1', getFirst($this->obj->get('page_h1'), $this->obj->get('title')), $tpl ); + $tpl = $this->obj->assign( $tpl ); + $cat->setKeywords( $this->obj->get('page_keywords') ) or $cat->setKeywords( $this->obj->get('title') ); + $cat->setDescription( $this->obj->get('page_description') ); + $cat->addTitle($this->obj->get('page_title')) or $cat->addTitle($this->obj->get('page_h1')) or $cat->addTitle($this->obj->get('title')); + + return $R->clear( $tpl ); + } + + +} + + + +?> \ No newline at end of file diff --git a/app/engine/www/tpls/404.htm b/app/engine/www/tpls/404.htm new file mode 100644 index 0000000..74626a9 --- /dev/null +++ b/app/engine/www/tpls/404.htm @@ -0,0 +1,4 @@ +
    +

    404 - страница не найдена

    +

    Мы не смогли найти страницу, которую Вы запрашиваете :(

    +
    \ No newline at end of file diff --git a/app/engine/www/tpls/admin_top_menu.htm b/app/engine/www/tpls/admin_top_menu.htm new file mode 100644 index 0000000..f78605b --- /dev/null +++ b/app/engine/www/tpls/admin_top_menu.htm @@ -0,0 +1,52 @@ +#[body]# +{cat_name} + + + + +#[!body]# +#[item]# + +#[!item]# +#[item_sel]# + +#[!item_sel]# +#[sep]##[!sep]# diff --git a/app/engine/www/tpls/admin_top_menu_root.htm b/app/engine/www/tpls/admin_top_menu_root.htm new file mode 100644 index 0000000..3f5fcfb --- /dev/null +++ b/app/engine/www/tpls/admin_top_menu_root.htm @@ -0,0 +1,65 @@ +#[body]# + + + +#[!body]# +#[item]# + +#[!item]# +#[item_sel]# + +#[!item_sel]# +#[sep]##[!sep]# diff --git a/app/engine/www/tpls/attrs/form.htm b/app/engine/www/tpls/attrs/form.htm new file mode 100644 index 0000000..d874fc3 --- /dev/null +++ b/app/engine/www/tpls/attrs/form.htm @@ -0,0 +1,48 @@ +#[body]# +
    +
    + {form_rows} + +
    + +
    + +
    +
    + {hidden_attrs} + + + + +
    +
    +#[!body]# +#[row]# +
    + +
    + {attr_html} + {attr_error} +
    +
    +#[!row]# +#[mand]# +* +#[!mand]# + + +#[row_checkbox]# +
    + +
    +
    +
    + {attr_html} + +
    + {attr_error} +
    +
    +
    + +#[!row_checkbox]# \ No newline at end of file diff --git a/app/engine/www/tpls/breadcrumbs.htm b/app/engine/www/tpls/breadcrumbs.htm new file mode 100644 index 0000000..4a932a3 --- /dev/null +++ b/app/engine/www/tpls/breadcrumbs.htm @@ -0,0 +1,10 @@ +#[body]# + +#[!body]# +#[row]# + +#[!row]# +#[sep]##[!sep]# +#[last_row]# + +#[!last_row]# diff --git a/app/engine/www/tpls/include/_static_css_headers.htm b/app/engine/www/tpls/include/_static_css_headers.htm new file mode 100644 index 0000000..0f58065 --- /dev/null +++ b/app/engine/www/tpls/include/_static_css_headers.htm @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/app/engine/www/tpls/include/_static_js_headers.htm b/app/engine/www/tpls/include/_static_js_headers.htm new file mode 100644 index 0000000..143d459 --- /dev/null +++ b/app/engine/www/tpls/include/_static_js_headers.htm @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/app/engine/www/tpls/index.htm b/app/engine/www/tpls/index.htm new file mode 100644 index 0000000..0b32afc --- /dev/null +++ b/app/engine/www/tpls/index.htm @@ -0,0 +1,20 @@ + + + + + {auto_title} + + + + + + {include:include/_static_css_headers.htm} + {include:include/_static_js_headers.htm} + {add_headers} + + +
    + {body} +
    + + \ No newline at end of file diff --git a/app/engine/www/tpls/loginbox.htm b/app/engine/www/tpls/loginbox.htm new file mode 100644 index 0000000..a1cdfaf --- /dev/null +++ b/app/engine/www/tpls/loginbox.htm @@ -0,0 +1,46 @@ +#[form]# +
    +
    +

    Авторизация

    +
    +
    + + +
    +
    + + +
    +
    {err_msg}
    + +
    +
    +
    + +#[!form]# + +#[islogin]# +
    +
    +

    {_SITE_TITLE_}

    +
    +
    + +
    +
    +
    +
    Имя
    +
    {name}
    +
    Привелегии: {group}
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +#[!islogin]# \ No newline at end of file diff --git a/app/engine/www/tpls/object_view.htm b/app/engine/www/tpls/object_view.htm new file mode 100644 index 0000000..4956912 --- /dev/null +++ b/app/engine/www/tpls/object_view.htm @@ -0,0 +1,22 @@ +#[body]# +

    Новости

    +{rows} +{walker} +#[!body]# +#[row]# +
    + +
    {title}
    +
    +#[!row]# +#[body_void]# +

    Новости

    +Новостей пока нет :( +#[!body_void]# +#[card]# +

    Новости

    +

    {title}

    +{description} +

    +Назад +#[!card]# diff --git a/app/engine/www/tpls/pagewalker.htm b/app/engine/www/tpls/pagewalker.htm new file mode 100644 index 0000000..ed531c1 --- /dev/null +++ b/app/engine/www/tpls/pagewalker.htm @@ -0,0 +1,5 @@ +#[body]##[!body]# +#[num]#
  • {page_num}
  • #[!num]# +#[num_c]#
  • {page_num}
  • #[!num_c]# +#[page_prev]##[!page_prev]# +#[page_next]#
  • #[!page_next]# diff --git a/app/engine/www/tpls/shop_workers.htm b/app/engine/www/tpls/shop_workers.htm new file mode 100644 index 0000000..b2514ec --- /dev/null +++ b/app/engine/www/tpls/shop_workers.htm @@ -0,0 +1,289 @@ +#[body]# + +{panel} +
    +
    +
    +

    Сотрудники

    +
    + + + + {rows} + +
    IDФотоИмяМесто работыСтавкаВн. номерПосл. активность
    +
    + {pagewalker} + +
    +
    + +
    +#[!body]# + +#[row]# + +{id} + +{full_name} +{user_office} +{default_work_tarif} +{sip_number} +{time_ago} + +#[!row]# + +#[view]# +{panel} +
    +
    +
    +

    {full_name}

    +
    + + + +
    +
    + Фото:
    + + +
    +
    + + +
    +
    + + +
    +
    Информация о входах
    +
    + Последний вход:
    {login_time}

    + Адрес входа:
    {login_ip}

    + Последняя активность:
    {update_time}

    + Дата регистрации:
    {regtime}
    +
    +
    +
    +
    +
    +
    Данные сотрудника
    +
    +

    Основное

    +
    + +
    + {login_html} +
    {login_error}
    +
    +
    +
    + +
    + {passwd_html} +
    {passwd_error}
    +
    +
    +
    +
    + +
    + {full_name_html} +
    полное имя, для отображения в системе
    +
    {full_name_error}
    +
    +
    +
    + +
    + {name_html} +
    будет отображаться в бухгалтерских документах и логах
    +
    {name_error}
    +
    +
    + +
    + +
    + {email_html} +
    для оповещений
    +
    {email_error}
    +
    +
    + +
    + +
    + {phone_html} +
    для экстренной связи
    +
    {phone_error}
    +
    +
    + +
    + +

    Расписание и зарплата

    +
    + +
    + {user_office_html} +
    {user_office_error}
    +
    +
    + +
    + +
    + {default_work_tarif_html} +
    если учитывается почасовая ставка
    +
    {default_work_tarif_error}
    +
    +
    +
    + +

    Руководители отдела

    +
    + +
    + {money_agent_admin_html} +
    {money_agent_admin_error}
    +
    выдает зарплаты из этих касс и может корректировать в них деньги
    +
    +
    +
    +
    + +
    + {user_description_html} +
    {user_description_error}
    +
    виден только тут
    +
    +
    +
    +
    +
    +
    +
    +
    Доступы
    +
    +
    + +
    + {group_html} + {group_error} +
    +
    +
    + +
    + +
    +
    +
    + {long_session_html} + +
    +
    +
    +
    + +
    + + +
    + +
    +
    +
    + {_sys_deleted_html} + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + +#[!view]# + + + +#[panel]# + +#[!panel]# diff --git a/app/engine/www/tpls/shop_workers_pay.htm b/app/engine/www/tpls/shop_workers_pay.htm new file mode 100644 index 0000000..c788eab --- /dev/null +++ b/app/engine/www/tpls/shop_workers_pay.htm @@ -0,0 +1,222 @@ +#[body]# + +{panel} +
    +
    +
    +
    +
    +

    Выдача зарплаты

    +
    + {kassa_btns} +
    +
    + + + + + + + + + + + + + {rows} + + + + +
    ФотоСотрудникПоследняя выдачаБалансКасса выдачиК выдаче
    Итого{balance_sum} руб.
    +
    + {pagewalker} +
    +
    +
    +
    +
    +
    +

    Доступно средств

    + + + + + + {kassa_rows} + +
    КассаБаланс
    +
    +
    + +
    +
    +

    Информация

    +

    Для выдачи зарплаты сотруднику введите сумму, которую выдаёте и нажмите "выдать"

    +

    Для корректировки баланса, начисления премий или штрафов кликните на сотрудника.

    +

    Оплата за часы начисляется 2 раза в месяц
    + - 28 числа за смены с 1 по 14 число текущего месяца
    + - 14 числа следующего за смены с 15 по конец предыдущего месяца
    + - 14 числа следующего месяца начисляется окладная часть за предыдущий месяц
    +

    +
    +

    + Например:
    + Сотрудник получает 100 руб в час и 5000 руб оклада.
    + C 1 по 31 января он работал каждый день по 1 часу (итого 31 час)
    +

      +
    • 28 января будет начисление за 1-14 января (14 часов, 1400 руб)
    • +
    • 14 февраля будет начисление за 15-31 января (17 часов, 1700 руб)
    • +
    • 14 февраля начислится окладная часть за январь (5000 руб)
    • +
    +

    + + +
    +
    +
    +
    +
    +#[!body]# + +#[row]# + + +{name} +
    {inn}
    + +{last_dump} г. +{balance_formated} руб + + + + +
    + + + +
    + +
    + +
    +
    +
    + + + +#[!row]# + + +#[logBody]# +
    +
    +
    +
    +
    +

    {name}

    +

    баланс: {balance} руб.

    +
    + + + + + + + + + + + + {rows} + +
    IDДатаСумма (руб)КомментарийОтветственный
    +
    + {walker} +
    +
    +
    +
    +
    +
    +

    Корректировка баланса

    + +
    + + + + +
    +
    +
    + Сумма +
    + +
    + руб. +
    +
    +
    +
    + +
    + + +
    +
    +
    +
    +
    +

    В этом интерфейсе НЕ выдается зарплата, а только корректируется. Например, начисляются премии или штрафы.

    +

    Положительная сумма увеличивает зарплату, отрицательная уменьшает.

    +

    Примеры
    100 руб - премия 100 руб.
    -100 руб - штраф 100 руб.

    +
    +
    +
    +
    +
    +
    +
    +

    {name}

    + ИНН: {inn}
    + Оклад: {salary_sum_nf} руб.
    + Неначисленные часы: {nopaid_rubs} руб. ({nopaid_hours} ч.)
    + Оплата за часы начисляется 14 и 28 числа. +
    + +
    + +
    +
    +
    +
    +
    +#[!logBody]# + +#[logRow]# + + {id} + {datetime} + {summa_nf} + {comment} + {creator_id} + +#[!logRow]# + +#[agent_balance]# + + {title} + {balance} руб. + +#[!agent_balance]# \ No newline at end of file diff --git a/app/engine/www/tpls/shop_workers_pay_my.htm b/app/engine/www/tpls/shop_workers_pay_my.htm new file mode 100644 index 0000000..385baa8 --- /dev/null +++ b/app/engine/www/tpls/shop_workers_pay_my.htm @@ -0,0 +1,76 @@ +#[logBody]# +
    +
    +
    +
    +
    +

    {name}

    +

    Доступно к получению: {balance} руб.

    +
    + + + + + + + + + + + + {rows} + +
    IDДатаСумма (руб)КомментарийОтветственный
    +
    + {walker} +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    {name}

    + ИНН: {inn}
    + Оклад: {salary_sum_nf} руб.
    + Неначисленные часы: {nopaid_rubs} руб. ({nopaid_hours} ч.) +
    +
    +

    Оплата за часы начисляется 2 раза в месяц
    + - 28 числа за смены с 1 по 14 число текущего месяца
    + - 14 числа следующего за смены с 15 по конец предыдущего месяца
    + - 14 числа следующего месяца начисляется окладная часть за предыдущий месяц
    +

    +
    +

    + Например:
    + Сотрудник получает 100 руб в час и 5000 руб оклада.
    + C 1 по 31 января он работал каждый день по 1 часу (итого 31 час)
    +

      +
    • 28 января будет начисление за 1-14 января (14 часов, 1400 руб)
    • +
    • 14 февраля будет начисление за 15-31 января (17 часов, 1700 руб)
    • +
    • 14 февраля начислится окладная часть за январь (5000 руб)
    • +
    +

    +
    + +
    + +
    +
    +
    +
    +
    +#[!logBody]# + +#[logRow]# + + {id} + {datetime} + {summa_nf} + {comment} + {creator_id} + +#[!logRow]# \ No newline at end of file diff --git a/app/engine/www/tpls/shop_workers_time.htm b/app/engine/www/tpls/shop_workers_time.htm new file mode 100644 index 0000000..517535f --- /dev/null +++ b/app/engine/www/tpls/shop_workers_time.htm @@ -0,0 +1,604 @@ +#[body]# + + + + + +
    +
    +
    +
    +
    +
    + + + +
    {selected_month} {readonlymark}
    + + + +
    +
    +
    + {office_seletector} + {show_neighbor} +
    +
    +
    +
    +
    Понедельник
    +
    Вторник
    +
    Среда
    +
    Четверг
    +
    Пятница
    +
    Суббота
    +
    Воскресенье
    + +
    + {days} +
    + +
    +
    +
    + {monthstat} +
    + +
    +
    +
    +
    Удалить смену
    +
    +
    + +
    + + +#[!body]# + +#[del_smena]# + + + + + + + + +#[!del_smena]# + +#[del_smena_emp]# +
    + + +
    +#[!del_smena_emp]# + +#[cell]# +
    +
    +
    +
    + {date} +
    {dned}
    +
    +
    + {day_comments} +
    +
    +
    +
    + {workers} +
    Добавить
    +
    +
    +#[!cell]# + +#[workerline]# +
    +
    +
    + +
    +
    + {intervals} +
    +
    +
    +
    {name}
    + {intervals_text} +
    +
    +#[!workerline]# + +#[user_table_body]# + + + + + + {userlist} + +
    СотрудникЧасовРуб
    +#[!user_table_body]# + +#[userlist_row]# + + {name} + {hours} + {summa} р. +
    +{summa_oklad} р.
    + + +#[!userlist_row]# + + +#[userlist_tarif_row]# + + {tarif_name} + +#[!userlist_tarif_row]# + +#[cell_edit_form]# +
    +
    +
    +
    +
    +
    {user_name} +
    +
    +
    {date}
    +
    +
    {time_start_time}
    +
    + +
    +
    {time_end_time}
    +
    +
    {date_error}
    + + + + + + + + + + + {tarif_id_html} +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +#[!cell_edit_form]# + + +#[office_selector]# +
    + {office_row} +
    +#[!office_selector]# + +#[show_neighbor]# +
    + + +
    + +#[!show_neighbor]# + + +#[day_comments]# +
    +
    + +
    +
    + {showed_comments} +
    +
    +#[!day_comments]# + + +#[comments_block_body]# +
    +

    {weekday_name}, {date}

    +{rows} +
    + + + + +
    + +
    + +
    +
    +
    + + +
    +
    +
    +#[!comments_block_body]# + +#[comment_block_row]# +
    +
    +
    +

    {showInRaspIcon} {text}

    +
    {user_name}
    +
    + +
    +
    +
    +#[!comment_block_row]# + +#[selectUserList]# +
    +

    Добавить в расписание

    +

    на {date_str} г.

    + {rows} +
    +#[!selectUserList]# + +#[selectUserListItem]# +
    +
    + +
    +
    + {name} +
    +
    +#[!selectUserListItem]# \ No newline at end of file diff --git a/app/engine/www/tpls/site_index.htm b/app/engine/www/tpls/site_index.htm new file mode 100644 index 0000000..913b5d0 --- /dev/null +++ b/app/engine/www/tpls/site_index.htm @@ -0,0 +1,3 @@ +
    +

    Добро пожаловать!

    +
    \ No newline at end of file diff --git a/app/engine/www/tpls/site_sitemap.htm b/app/engine/www/tpls/site_sitemap.htm new file mode 100644 index 0000000..daf626a --- /dev/null +++ b/app/engine/www/tpls/site_sitemap.htm @@ -0,0 +1,10 @@ +#[body]# +{rows} +#[!body]# +#[row]# +{url} +weekly +{lastmod} +{prio} + +#[!row]# diff --git a/app/engine/www/tpls/site_top_menu.htm b/app/engine/www/tpls/site_top_menu.htm new file mode 100644 index 0000000..80b0e60 --- /dev/null +++ b/app/engine/www/tpls/site_top_menu.htm @@ -0,0 +1,13 @@ +#[body]# + +#[!body]# +#[item]# + +#[!item]# +#[item_sel]# + +#[!item_sel]# +#[sep]# +#[!sep]# diff --git a/app/engine/www/tpls/sitemap.htm b/app/engine/www/tpls/sitemap.htm new file mode 100644 index 0000000..f2c939f --- /dev/null +++ b/app/engine/www/tpls/sitemap.htm @@ -0,0 +1,4 @@ + + +{body} + \ No newline at end of file diff --git a/app/engine/www/tpls/static_page.htm b/app/engine/www/tpls/static_page.htm new file mode 100644 index 0000000..e1eb638 --- /dev/null +++ b/app/engine/www/tpls/static_page.htm @@ -0,0 +1,12 @@ +
    +
    +
    +

    {title_or_h1}

    +
    +
    +
    +
    + {description} +
    +
    +
    diff --git a/app/engine/www/xml/index.xml b/app/engine/www/xml/index.xml new file mode 100644 index 0000000..64b7b27 --- /dev/null +++ b/app/engine/www/xml/index.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/engine/www/xml/sitemap.xml b/app/engine/www/xml/sitemap.xml new file mode 100644 index 0000000..297ec75 --- /dev/null +++ b/app/engine/www/xml/sitemap.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/install.sql b/app/install.sql new file mode 100644 index 0000000..ecd9e45 --- /dev/null +++ b/app/install.sql @@ -0,0 +1,345 @@ +CREATE TABLE `_sys_cat` ( + `id` int(12) NOT NULL, + `cat_id` varchar(255) NOT NULL, + `cat_name` varchar(255) NOT NULL, + `access_group` varchar(255) NOT NULL, + `module` varchar(255) NOT NULL, + `data` text NOT NULL, + `parent_cat` varchar(255) NOT NULL, + `xml` varchar(255) NOT NULL, + `_sys_deleted` int(1) NOT NULL, + `_sys_unvisible` int(1) NOT NULL, + `_sys_order` int(12) NOT NULL, + `img` text NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +INSERT INTO `_sys_cat` (`id`, `cat_id`, `cat_name`, `access_group`, `module`, `data`, `parent_cat`, `xml`, `_sys_deleted`, `_sys_unvisible`, `_sys_order`, `img`) VALUES +(1, 'index', 'Название сайта', '', 'site_index.php', '$id=1;', '', 'index.xml', 0, 0, 0, ''), +(2, '404', '404', '', 'static_page.php', '$id=2;', 'index', '', 0, 1, 0, ''), +(3, 'sitemap.xml', 'СайтМэп', '', 'site_sitemap.php', '', 'index', 'sitemap.xml', 0, 1, 0, ''); + + +CREATE TABLE `_sys_cat_admin` ( + `id` int(12) NOT NULL, + `cat_id` varchar(255) NOT NULL, + `cat_name` varchar(255) NOT NULL, + `access_group` varchar(255) NOT NULL, + `module` varchar(255) NOT NULL, + `data` text NOT NULL, + `parent_cat` varchar(255) NOT NULL, + `xml` varchar(255) NOT NULL, + `_sys_deleted` int(1) NOT NULL, + `_sys_unvisible` int(1) NOT NULL, + `_sys_order` int(12) NOT NULL, + `icon` text NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +INSERT INTO `_sys_cat_admin` (`id`, `cat_id`, `cat_name`, `access_group`, `module`, `data`, `parent_cat`, `xml`, `_sys_deleted`, `_sys_unvisible`, `_sys_order`, `icon`) VALUES +(2, 'index', 'Админка', '', 'loginbox.php', '', '', 'admin.xml', 0, 0, 0, ''), +(3, 'core_cats', 'Категории сайта', '1', 'admin_cats.php', '', 'core_programmer', '', 0, 0, 0, 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAATlJREFUeNrsltERgyAMhqXXgToCG9QVugEb4QpOYDewmzACDT3w0hgBFepdz9zloUDJlz8QFNba5kgTRwNcJxIhUiSiqgInwAlwAuQC5PYN2G9fIwpAML8p8/8FKH1WqgBwezpF3PhMGTfIuZva6OPCmGKTrQAQcwPe1i7BE7wHf/nfN/A7uERrHuDdJ3ZKgRXKGBKE/k/6NWF9WxLA+ExnwX39NVIjQJiSADISPKwJEBKNqdUAzObDguTcbQgQQ7gdlx3vSJC8Zw7wSEtCrJ/2KFACmZE5zv6rDJfmN9b5q1elESn0TOvI4cOmpvkCAAMCsARCLygyHUIcMKpI6hqSOR0pB38NdwKYxKlvko0oZltbMZP5rBXjb8IoQI3HiLbNXAU4a0l22c9xFkAOmN9DpT5IaLy3AAMAEEzA2rYo6FcAAAAASUVORK5CYII='), +(9, 'core_objects', 'Объекты', '1', 'admin_schema.php', '', 'core_programmer', '', 0, 0, 0, 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAgAAAAIACH+pydAAAG2klEQVRYw+2Wa4xV1RXHf3ufx71z586LdnjOwAyMlRBGKVCpj0aNYGwbglKjTUU7NITYpKmJhCYktU1rG0hLa6pJa2y0EfulIbQmisRqSYiGAgUdBsEHMDMMwzzuzJ17L/dxnnvvfuASgcwILR/aD/6TnZzknLPWb//XOmcv+Fyf638scb0BOh7dfyGQMQIpzMkdt/1H79vXk/y+p46xeF6KSJlOY2hun5Hcu7O5m/2/WXLNMeT1ACxur2WiopLzZ9VsaZuZ3HaktzRrUVvtf+/AW/fcQ3lkRLTcfXeTnUrNVWGYjvL5bPHUqYGV77xT3mbbbFEKgK5nT7KsI81QLlrT3OisCSKTmjktsWH7+vanv/xkN+//9tpcEAB7lizhho0bKff1zU5Mn77eSqXWImWbDoJEXCqVgvHxD7wzZ17OHj7812RTU/nenh5+sWuQMNZzOmYkX62rsZaXA0V/Jhg8cLJ0f12NdeTV58/gfbTqqgDWP5Yupf2xxwiGhjpTra0vuU1NXXZNzWwpZY0AV0BaWtZ8y3G+YScSM8snT+5fe/Nt3uOHF4uH7p2x+Yv1zrcRgqKvyRTj+sFckH7t0OCels5UnPvXS1cH2Pzgg4TDwzNT8+a96DY23ilAaM8jzueJslmisTGiTIZ4YsJWQbA08n1n5L2Db694buutsxudX0kp0sOFiLO5kLynSdh6QUOKEze11Z/IzV1L4fCOz+6Blq4uMrt2PWq77p3x+DjK90EITBRhSiV0Lkc0OkqYyxHEsVBGd4mOm/Y2NybXh0bNyBQipADXtcjnIgazXmq04G/6eLjwrm2J4av2wHurVjXWdna+Jl33DquuDmFZBIODeH19BENDhJkMQTaLH4Z4QhBoRfnub33Ez/441w/jlG0JTo8FHB/y6c/6eOUSRJ7BqJ9aC6KnVZ/D2d+tnBJAUijMMdlsu5tOo86do7BnD8W9e/GPHiXu7UVlMsRBQGgMgVKEEuobvIU6nEjFQnJ0OOSTbEQ+MmhLIlwLXEtgy43xQGKZkZLWTfumLoHI52sc13W9Q4cod3djwhDCEFGpQBAQG0MAxDU2TUtbaVmzjOm3L6KUfosDY62cUK0UVR0VJMqS4FiAjRGqBa2eNCLeYBDelCXoaW1ttxoa/u739naoIMAASmsiYwgB1ZgkdfsCZty/hGnL23DqkqAFAoE2mqFygn0js9l9tp0PJ+oJ/AgRlTGRh4nDCjruQlo7g4FusrueuuA6OIABQtHjOK4fx6/ExjwUAwqIBchZ9TSuvJHmNYuoXViPlbAxGowKMLqM0R5Gh0gUCItxP827Iy280ddB99A0yp4CFYHWB40KHxh94XsZIAWkgVogB0zYhSgKJeyI4L4I6kMg9ZU65v1oOY0334h0FFIk0fEEKvwEFY1gVAWMAgyqamWTJVg9x+aW2jRvigU8f/wu8mEKIcQtJvJ+gBAvYEwacKu7zwHG+i5gQX8ANQHcGoCV/mqKhhUlgkI/xgg051DxQRAjCCtEOhrpGCwXhAsxklzB5uwZwfhZD7s8xj+H53DeA1QghKADy+6JRk6dr5ZAAXnAt+8CdkNkwdYIigH8UDvMlihMWCEY/YDABpkSOPWOdlIayzZSGyiXLLIZm9ywwSvE6FghhcZIC6MCdORpwnhA+5Xd8Vj/BJ8e/7oKceEw+ibwFyjb8Gsf3mjoTPxSWGa1uOSsNBVD5EuipFQ6STwyJp3CqBZxJQSjEAIsBwQCSxnl6uKRaMJ7Ww107w/6jw1jNFMCADwMjB6+QwfZo8dkItljdLgac8nnAoCSIhbSGxMmPxgIoxVykomixvjFBbnXn+neVzhRzXHp4GOqyfVlAABGewgnQDomYbRhMglhkDFCOhqtp/q7YSwRqgvthQbi6oqAEChXry8HkC5ghUgH10yeHwFIxyAdQBsmm+okBiExgFft9nIVQFWXqa4rAJyLIMaZygEEyFggbBD6oqOX3xdAY5MoAeeqyafw6soSyAjtgJa6LCyMFJMPrcIxSMdgFIgrntAGY2Jz+ob59mlj5heF6OWzdBlAGJ3Hp5GgHG53XT52Xb5j22KFlKQ+7QGQ0QUH5KVfiUZFsTkeBLxSLOqd3SfCgW0/znA1TbrD3z9Tz/fXpTj2YVxXXye+5iZ4xHHEKilpFgJKZUFvf4zWBm2I4si8HwS8XCzpv617vDD88y1pfrK1dNXkUwJc1KYnatjwSC2lknG/ME10JpM87LrigYov5p/ui6PA1wf9gD8Vi+b1dRvrxjc/kWP7s+VrSnxNAJfqwN5pTOS0WPglq8335df7zsTZsXH15pJOJ//inys89wfvWkP9f+nfBvtt/9QBBhYAAAAldEVYdGNyZWF0ZS1kYXRlADIwMDktMDktMjhUMTE6Mjc6NTQtMDQ6MDBKi7o9AAAAJXRFWHRtb2RpZnktZGF0ZQAyMDA5LTA1LTIxVDEzOjUzOjMwLTA0OjAwWiT/lgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII='), +(10, 'core_data', 'Управление', '2', 'line_menu.php', '$templ=admin_content_menu.htm;\r\n$root=core_data;', 'core_shopadmin', '', 0, 1, 0, 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kBCRUYBVERjDAAAAdBSURBVFjDzZdNbFxXFcd/5943M47Hses4iRMnbdUodWkMtEUs2lJVQFErvoW6YwHtEtQNSLBiwxKx6QoJIVEJsQFFQUgUkBBSUqmiiI+qpWnAykfjxHXjJK6/Zjzv3XvOYfGe3TTUI3bwpKv75s5ozv/+z9f/wP/4kdsP5u6/Pzz7zDP77picbLm7dmU93js7rnv2Hgy9/nqeGN8fl99dzocOHJKFpbf16KEZzi8s24njx3R+YSG0pEiVagyeKyn2tq68dXHw01Mv2csv/tr/GwDxU4899o2Pzs39IIiEkXabmUN7efqz97mICCKOgwTBHSREdzchRANEiEoIAUKWINFdUoxFROJVLbrfP3TPY7+8HUBx2+dOr9f7cK/XG8WM1OmwMSZ4HuAi/4FdRN67gwhIaNZ776YB4EQebP7whZ/96FfPfu2baRgAySlFzRnMyCEwGAzIuazNNCAEAdkGEHbeXcItZ+8H4zlPXbl0cQK4cavBcDsAEYmqSs6ZnDOpHGB5gGqJpQGWKzSXzV5hljBNmGVMm2X1csuYKaYZxEa/9e3vvfT888/fNYwBNGdRVSxngghl6Wgq61siyC23khDAFJGAWGxYECREnFD/TCKI4B6k027Nzs7OTgMLuwIA4jaADFSlktMACbUBkbgDQisneaS9Z4oQ26hWaLnOSLsgFq3GHYZIwBzcVVqt1tjQGDCzkHPGVAHIGVQTwbUxbhiChgn2HX2IVmFUm8uYVoQ947Sn76Xf32Tr5jwj7WKHKVPDNUm32x0d6gIzC6qKplQHYhIsJYgFiGEOnak5pmfuY+Xyy2i50QRhQCTQX7lEu7uPiZkHWFt8lXYrIh7A8TOn/3D2Jy+cfGsoAHevg1AV3DEVTBNgQKA1Ocv+mfu4du5F3BJVhjh6ECGQt1bpjB0kr98AD3Qm7iRvXEYs4m7y6CMPn7jn3o89cfLkybO7ZUFQVVFVNGdSSqScUa1X9sjh2ce59s/fk8tNBpVz6MQXOHzs49yxb5qZ+5/k6InP4JrYWn+bzugkmiosV7gqlssQY9w/LA0BWpozuUlFTYmcKjQnxg7MMlhbYrCxTEoV07NP0O50eOfN37Cy8BdarQ791at4LuvMwTGtME2oVlgeEGMcHwpg2/j2bm6YZjRVjIwdZHN1Ec2J0JlkYvo4Kwt/I5Vb5KzEdpfezbdQTWQ1LJeYKqoJNyWVW25mYWgWiEg0VdQM3KlKwUxxtzr1VDFTOt1J3Iz1a/OYJlrdw8SiQ29lAc0VrfHDDFavorlCQkEIgflzry2f/vv1N0MImNkuDJgFc8fMMFXclZwSZkrVu0HRmSClijRYBxEGZUmqSsYOzmKubKzdZJAj4weOsX59Hs0J1YTmxN13HZl+7rnnvtrtdsPuDNSBiDcgsgXcDU3GypXXOfbIs1zWgs0bl1h9+w1m5j5Pf3WJcu0K69fu4M4Hvohuvcv182ewXIEIwQ2XgKUB7r63ubh9cCk2i+7ONgueHVNDAvRXr3Lj0p+468GvcPHPP+fyX39Ba3QC10yu+qwuniUUbcqkdLr78bxJCBE3RySQyj5FUYy5u+zajNg2rFrvsu0Ow8xYOvdHypULHH/k69ieGdZXb7KxdpOtrQGDHCkmjnP0xJMU0XDNWE6o1k2p3Fq3xcXFd+bm5sLuhQgKM9thIGfqshyk6fzK0vwZ2ldeY9+Rj1Ac/RBuBjiuJZs3LrH4xusIDk3pDg2jK8uLW9dXzy0cOXIk7l6KVWvjDYAggqoRanJ2ImXQW2Fp/sx26jQCpdYDEmotIOJICLg5RGdsYqT76Oe+9OV+r/fdU6dO9T84CEOIbva+IDR3XL0xBG7WdEapOWu8GcRqIDGCGEEc8YBLRNxJZR93L4qi6O6uB1TFrPa3u4M5mnMt9XZkmTeqiFtkmdWyTUC01gguIO61LnCnKvuIENvt9uiwNIzecG3uGI47aPOntS6VxscC7kioxYoHQdxxQIIjYmBOLAKmSjXo+9k3/nHh4sWLG8PasewUoib6NWdCDOCKhwCNEWjcYo0j3JAQEGhSr76Sp4SESNXbKJ/69Ce+s3Szf2X3NBTB3dmuBdtertPQ0ax1oDal2swbtVMz5Q478JwGbB3AmlP/6U/efRqohimiuJ2GbkZuWNgeC6jJRwSyGyEWoIaHgOC4WiPZjCABqwU0ZkqvX/ZfuWD9oc1oq6p834EDTE1NYapM7m2xWhyo/R9CXdmamWBbcIoEHAgS6luHsB0lSIiYCxnnd6+c/vHC4rIOA+D9waB84qmnePChh1BVRjotOu1Qu0TrwcdMMXOc+kyaLikCOWUccKtbOQ45Z9bWVry/NXh1+fq7Q0ezPSGEh/dPTT2OiItImBzv2PjYSARXkCiCunmQIG5mxBhRNY8xiKpZiCFiro5HEVE3DyGEqj+oLvzr/NXfllXaHDqcNqy0b/ne36vSyAfMlj5k8PWdIgEJyPy/Pf8G8SnnlfU3yrkAAAAASUVORK5CYII='), +(12, 'core_user', 'Пользователи', '1', 'object_admin.php', '$obj_name=_sys_users;\r\n$templ=object_admin.htm;', 'core_programmer', '', 0, 0, 0, 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAwRSURBVHjaYpwdxMuADH79ZmD49oeV4etfJj4GJo4IXhEJb1EZOT1m5v/sr589v3/vwZMjG84+W/r40/9L/xn+o+jdwcTEIM7IyPD4718GJiCfDYi7gXg3A24AEEAs2AR///qhJamoPdsmPNNKVteYgZebnYHhzxeGHx+fSb59cMPKYcf2xLkbTnZvvfFtAkg5AwUAIIDQHPCf4e/vP+qaZnabXAv6lbnFNIFC3xgYfrwFOuAnAweXAIO0lhZDoKK4qKyscNf/SZt5d9z62f7vP8N3kO5/ZDgAIICYkDl///xmllRQnOyV36LMLSoNFPgJxIxARzAxgEMbGLQM34Fiv/8ymHi6MeSFGpdIczMEgPT6AbEQyAv/IUr/E+kAgABiEuX4wwDCYkDMw/TLVd/Fz5VNSJSB4et7cLCD8b9fQBP/APE/MP7/7y/DXyDT3MWWM8yEPwtojoQpkOD890/697+/+sBgNQU6WxOoQ/AbAQcABBAL039IFP4HhqOoqFCIvJ4JA8Pn1wwMjOwQi8FBAwzhP0D87wdQ4S+wA/78/s3AKizKYGYkrmN34GOkMS+vDr+rs4OYkb60Eicn2/cHD768O3Dojv/laxsfMDBMesrA8B6bAwACiIXxzx8w498fBlYBIUElNnZmYFb4yADMARCLQYEJcgjIAX++gtPC3/9/wY74BhSXefaTb56fd6dSaxsro6YWAwPzP7Aahh/feGXfvjLU2LzNULetx630+Zv0KwwMV9AdABBATH9A6oH49x8GJmAOYmb48xnigF8fGBh+Ah398wMEg8SADvj75xcQ/2H4DbTo2aZjDHIizkzKK1axMurogZPh/68/GP5//sLw/8tXhv/MTAzs4YEM7vOmWDXrKs7jYmBQQXcAQAAxm8sxMHwAevDtT4Z/XFxMXiomFlpAh0CC+99PSCj8/QZMAt/Blv/5C4wCxn8Mzx88YmA9/YFBsbaTgYGPD5SCgZoYwUEJzEpg/n9gNP3/8pnhv6Iig7q4sPS740c5Tnz5dQBU3MAcABBAzLeAnjz1jIHhODCSuBi+iVqaqnmz8YsCzQD65B/QAKCF/4BB/Rdo6F+goX+BYj+Ajnpx8DyDkqEPA6uRCcP/799AVkMcAXQkmAY5Asr+ByzdGKUkGUQe3ZJffuXeEaDoQ5gDAAKI+QPQgyD8CZS7PjM80hX66C2vZyj6B5goQZb+A6f4P2DL/wDj9uf3zwyv3zxnYL79hkHaNpDhPzc3JHsC1UEsBfkeGEq/f4Ed8P/fP6B+IGZlYxD49o5rz4mz9x7/+HMKaDc48QEEEDODBTDRyTCB8XPO/1+vMb3hNWT/5SIiIsXwG5ipQZb+AYbGz+9fGb5+fsvw5eMrhrcvnzDwfmRiEDb2ACZWoF6gBRAH/AFbzgCy/PdPsGP+M0JyGEgNy8eXDDuOnrxz48OPI0C7wTkUIIBYGEJYIHEH1Mz4lyWOS8s9f8vrXwxMZw4yCIoIM7Dx8TP8BDrk94/vQDM/Mfx69ZLh+ZsnDFys6uD4/v/rB8QRTNAyDewQiGNAJeNfoOWgUPwPqh+A7F+MzEAfM7DCogAggFgY3jGBi3NWVqaEyQFT5wix8jA/U/jIwCWlzrB/ewcD5/HjDJJ8nAx/mf4yfHj5leGpHC8De5QFA+tVFgaDt+8Z/slwMDD9AvoWnHIhRSGoNARZ/u8/xPJ/wBBh+gEMwbfv/9989/UdLPhBACCAmBi+AB3w6Y9JulnW5AAVD2ZRDmEGHzkXhi/s3Az/PdIYPiv6Myj1X2cw7r7F8OetPsO74CyGPyoyDN/5dBl+vn4JDGImYLkA8SnYtyA20GKgnyGW/wKmgx/fGDg/v2c4fP7aq7sfv98F2vsV5gCAAGJmMGFiVZHVnNEf1KBz9eUFBkMZYwYpXmlgLvzHIMsqxqBh7sbAcfQSA/Od1wxc61Yy6EirMEh+kWMwVwhi+H3nDAMHMM5/8wkAg/gPxOfAovofqKACxf9PYOr+/oWBDZhw3549+TNz0Ybdz779WsuAlAsAAoiF4R+TeaCBu/P3/28ZODnYgWHzk+HNz+cMQtx8DKxM7EDMyfCmqprhuc8NBg1FLXD5wMyuyPD+13uGpf8sGexPHmPQNvvL8FNYEmQ7OK7B6QAULb++M7B8fsPA9ugxw/xn2n9OMxrcYmA4ch25rgIIIGZ2U6GMaCdPx98MnxgEOAUZgCHK8AuY738B8/rP/98ZvgNLRiYFcQYuMx2GHz/fMvxk/MLw5uszhjmbvjF8Z9FiuPJJhMHs73UG9ud3GVj//2Rg//WFgfXbJwY2YG5hfXqP4dfzNwxLvtsw3Jb1ZzN1CdO6fuvJvV9vL8OLZIAAYhHhFDJl5/wNLNd/A5Pid6DPgBoZORjYgb5n+csGbNmwMDD9gaRwUDr79+srw/zVjAx2uqYMLN/fMrzml2T4YJbM8Hj/WYY3Z24Ao+QZsFb8xfDuDxvDLz5Dhj+mJgzvWGUY1B4/Y3CyEBbmYeic0lP95MefVwfXgcwECCBmaRfFRgN9MUFWJhawBSDf/wGWlL+Avvn19weQBoYEsCj+AawH/rN+Yti69yMDG6MZ0AGswJD+x+Bqzs/w6BUTwwcBaQYWLX2G3ax6DBsY9RnYje0YJI10GJ7+4mNwkmVgsNPnZLhx+x2Dr5MU57mnCmb3z63aB0worwACiFnQSqJMV4+fl5WFheEPsGr+AwoJoOVg/A/kAGAh9O87wx/G7wyv3r5mOHJIgSHSR4Ph9oOPDOoqAgwcbEwM3Kz/GQSADUBtSUYGAxl2Bg0pLgY/dVYGBWAVIcf7n0FFgpGBhZWJ4S0w7X//85dBVlFBcMeeq79+f7x6CCCAmJlU+BO1jXnFWIEG/QKl6H8gDPQ9yHJgCPz49w0YAt8Z/gF9f+TwLwYOBicGBQVOYCpiYhASZGP4Dix5mVgYGbg4GMG5ANR8lOUDVqvAWGMEFjkg8Y/A9AjCrJysDDcf/2CQleVkOHOJUeL5ze3HAAKI5f3T35cev3yrwwXU9P83GwM7MP5BqZ+FiRVYN7MADWJmANXSX4AhceemPIO5niDD4zfAFhQ/K8M7YGHKxgzyFQNQPRAzQgtFaDIHlw/ADPEbSP/6C6r2GRl+A6P6HTB3KqurSp1lFjEFCCCWv7c+LT+++0OkqPxfRjag/779AlrODMx+jEAHgDET0FBg6Hz+xvDhjTEDKy8bwzdg8+wX1CB2YEnOxgRxADPQAcxM8PYtuDSEtTfADgCKMXOyM7wGRoW4nDgwhXPJAgQQC8PTtzvubuKYtpmBMds64CeDkDgLMDewMPwE9g2Y/gMxEDID8VdgafbzOwewvwCMz//M4CAF+Z7tD6oDmNAcAKqnfkEd8RPoiJ//mBg+/gCWlEBPMjOz8AMEEDDlAWuUu09r7iz+9fXZGaEEOWN2MQk1ZgZhYO3IwQW0HBiuzEBffv/8g+H7tx/gapsTGCog33MAxYFpC+wAZihmYmRgYIS1ssElI9ByUDRAQwFE/wYq+vQFVEH9YwUIIBZoi/QDw+uX9d/evNl24xS32w02VlVgdSfKwsPMy8zOzAEMbeZ/wCY657/bUm/c/vBxCbEAyw2IA0CWszIjLGdmRDS3/kEd8Bsa/CD6B6jNAqwLH9x6BixTvv8CCCDkjgmwCfT3IMOPT6eALAFgwcgHVMsNxBzQXtaPX6wnw+5delEopCYD7q+wQ0MA5gBwFDBAand4FEBD4A8sKoBy34E1+L0TF4G11PvXAAGErWv2HYqfo0v8/3P9yaX1OzwFlMM0JLX4wH0UkAGsSMHPxIiWBsA1JSQn/GeBOOL8ymsML66sBNYL764ABBAzaR2pT59+fnh658kZBse///n52CWEGf6yMTL8BRr8mxEUt1CaEdLq/Ank/wQHLbD+BTJe3PvCcHLWIYYbGyc9+f9nw0qgk7YCBBAjeV1KfisGBttCbnFLGwEFeSF+GVk2LhFBBlZuTmAuYIFGAbAd+OsPMEY/M3x+9vzfx8ePf76/d/nD358HLjMwXN8DVLEFiG8CBBAjBR1bYWA5Zw5MCcC2Gbs4MDJ4gJgdVC5CysB/0GII1DT+DerhAtvfn58A9d0GYmDwM7wGORMgwAAa6D7Uo5815AAAAABJRU5ErkJggg=='), +(11, 'core_static', 'Статические страницы', '2', 'object_admin.php', '$obj_name=_sys_static;\r\n$templ=object_admin.htm;\r\n$del=0;\r\n$add=0;\r\n', 'core_shopadmin', '', 0, 0, 0, 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAABpZJREFUWIXll1tsHFcZx38zs96r1157fY3jOEnrXeeCG6PaTtoQNRIXiQoZIREQTwFFAmHE5aXiAaHAC7yAREVAiBb80IKESqqQNpT0QtJgklrYTRzbkS/JOrEdZ+211zszO7O7c+Mh3s3aXrtOJZ74pKM558zZ8/3m/33nsvD/bsL6jjNnznzJ5XL1AUFJkhBFEdu2sSyrUEzTLDyL61v1AYppmif7+vrOFvtzbSAShJdPnToVXK1jmiYulwvHcdaMK25vsx7s7e19GdgawLKsEEAsFkMQBCzLIhAIkMvl8oAIwiPhiuul2nmQuro6crlcaP27DQCO4xSc5CdbXy/13Mz5R9kGANu21zgtdjQ1NVV4vx2nkiQRiUTWfNy2APIqrAdpbW393ytgWdaaCYtV+DgKRKPRQnvbCpRyLggCkUjkYymQ798WQF6BUkk4OTmJZVnbll2SJNra2grtxwIAGBoaoqOjowCQl7MYzrIcBgbGudJ/i/GJOZSUCkCwspxopIlkEjo7I48HkE/Crq6uNet/YmJijQKjo3P87Y2btH3iSZ491sE3vtlDTciPljGJzSsMj97l/Nsj/O73/+AH3/vi44fAtu01Ekej0UL7j33vcH1kjp/87Fu07a1lQc7SWOkmGCznUv8A3ton6Dq8n+eO7md8cpbfvnSBdKocHm7/BRJpPcDRo0dPHz9+HFVVEQQBx3Fwu904jsPExAQLCwu88uol5pcMXvzFKSzHZOLePDkTdHmZwVt38ZTXkHMkNEUhKKZ5+sAuOrtb+WBonmBgn3d2ZuCdvD9xqxCsT8K2tjYMw0dsRuWXPz9JbDaOkcvSVOWnvqGBQN1eWve1U1XbgE/IgakSX5Jxe9w0N4b56Y9OUBGu6u3u7v3MpgCrJ1dJGxu7xYtn3uCFF76M3+flYKSFPc0NzNyPo6cV3B4PbrcLl0vCsqFz3y4+e6wTn9eLKIqEq4J8/eQxv+Aq+w2cFjdVoPiri4uiiOzY08yhg3sA0DSdy9eu0xztoKKqFscBURARBJH6oMPF9//Dubf7mbwdw+VyYRgGn+reJ+7Y3dRw5Mhiz5YApezylTE+9+lDiKu58daVQVqfega3x4cD2PniOCyl0hzrbsfn9TE4leDdqzdW5zfp6mz2I0lfg49Yhuvz4OZIjG/39nD+vQ9Y0iUaW54ipRlUB8pweJjehmmRXp7n8KF9ADQ11gMwdGMMNa0xNDJJU1M1wNGSChTnwMDAAKL4aIimZvD7PdSEKjBd5WQNGzmdJaFk0bMmWsZA1Q18krFBvSd27+Ta9XF21FaSFoMOthPeVIG8HTlyhGw2W1AAx+HOA53puEy4DHxZG00T0MsbSLokRMC0bAKZ9Jo5HcfBNA0aw0FeuzRGpK298G7TEOTrxWGoqAqysKyQlmpYUFS+czyKJElcuDTAsqcF23EwDItMxs/8m5dJrGh89flncLskdF2nqjKAZkioKc1EFJIlQ7D+OC62nU0hRsfuUe6RqPKaSNLDfezzz3URDa6gLN1nRdFZ0UzG5Gpi2Tom7sygqirpdJrXL14jGKpnZm5RBP5VEiCfA6VOuS88f5hbH45T6ZeYjqsYxqNYdxyMYqTmSSoaK4pOStWR0xk+HJ9FlmUURSGxkqYxHGB65HYGy/rTpgqUOjQAKiocUvEH3BqfIRyu5VevvIUsy2iaRjabJbYMy7K+CpBBTmcwcxlSqRQzs/cJVdcxH1f0pbkH8atXa89tGYJSEAcO7Of73+3h/XPvUekRyHqbWFxcJJFI8Ou+syRyPpKyRrIIYuRukmQySXwpRUVNMzfe/bejKfEfwml7yxBsZu3tu/lk+w7OvXqBHZVlZLI5YtP3uHLHJqlmSco6SUUjqeikVYW4IrK4LKPaIfr/3k/iQezc8PCfbwJlsHEVBEVRlB3HqQiFQgVFysrKCoqYpslXTjyL+oeLnH3pr2R7nsZbGWJ/ZDdzCZW0lsXjGHgDAvWV5TSEGxm+rzL8z2usLI2bw9dfex3w8HDTXPPXLAjUdnd3n2hpafkx4NtMhVwuh67raJobw95JQ8sudkafpK4hhD/gw7YdFFllIZ5ibnyKxOwsjhWz5uZG/zI7O3seGASmALsYwA3UA2EgtEq54b6wbnyVKHqqm5oOdYaq9x7yekM7XZLoBTAtO6Pryw+SS7dH5+eHB207JwN3gUlgGlDXK5A3D+BddbCdi764Oj4A+Fd/JwEWkAE0QFl1mAGyFN2I/gvS/HoYn59lpwAAAABJRU5ErkJggg=='), +(18, 'admin_exit', 'Выход', '', 'loginbox.php', '', 'index', '', 0, 1, 0, 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAkgSURBVHjaYvz//z/DQAKAAGJiGGAAEEAD7gCAAGJB5qxmZMSpEBRR/xgYZP8wMDj8ZmAwBrI1gGJiQJrpLwPDWyB9A6jkAtCE/UD2HaAYwx80DAP1SNEOEEAsxLgSqFwZaGk+kPYSkBRVFjMxYuBVUmJg5+Vl+PfnL8PPd28Z3j946PTs2g2GF0+ePwGq3QMM2okgBxEyGyCACDoA6JMUoI9aZM0NxVWSkxnEXd0YmEUlGBg4OIFBAnTSl68MDO/fMTA8e8rw99ljhmdnTstc2rMn4dqFKyFA6TZgiPQCjfmFy3yAAGJEzgVoUcAM9EknJzdHsWFFMYNCdj4Dg6AoRObnT4Ynp88wnN2wnuEvkK1jZMSgrKLC8OfDBwbWn78YmN69ZLh1+ADD7i07GN5++LyUmYEhGxgFH7FFAUAA4QoBRqCGLl5+3iKrOTMYhEOioMHxl+H/t28Mf4H4+IrlDGJAizkFBBhOrF7NIMbJycDKxMjw6/MXBuaffxnUDMwYBDi4GdZu3BT97PU7FlYGhligtb/RLQIIIKy5ABjkKey8XIXW82aiWA7yOcgBv9++ZeACWmgZEcFgFhTEwCciwvDt5UsGxm/fGRi/f2f4+fUrw4f3HxlEBUQYQpwdGQT5eMKBcVDzDxKlKAAggJiwJDhFoKIWo9JCRqGgSKiL/oHxV6Al/3/8AFvC/OcPwx+gg8DBCGQzAsUZgPj7ixcMLED5vz++M7z7CHQEBw+Dp4E+w39mpnKg9y3RHQAQQCzoWQ2oqFjO3FBMPq8YYTkQnJsxg+HBqVMMUoqKDIaengysQHFGaJphAcYpy+/fDFcOH2Z4+OULg/CnTwyGamoMf4AOev/5M4MmLx+DvowU+8mHT4rZGRjCkQMCIICY0IJeGugIb5WEeAZGfkFg5gWmBCYmhnMTJjC8u3+fwbm9neEHMCru7dnDwM7CwvAf6ACQ89iBal5evszwEZgtPebNY2D382M4c+QIAzMwJL4Do+zXh88MJsLCDMxMTK5AE/WQ7QQIIBQHACWdBKTEFMSEOBj+fwBmLaAlz3fuZHh96RKDfVsbA7+MDIOYjg7Di9OnGViBvgblIFCosQHxi1u3GIQMDBh4gRZZFRYysLi7M9y/cIGB9dcvhg/fvjJw8XExSAsJ8AEjyhPZToAAQneAiZiBDgPz22cMPzoKGP69ec1wd8NGBt30dAYmDg6GV0ADny5bxqBha8vACEqQQJ//B2eZPwwqqqoM7+bPZ3h86BA4VAzLyhjeA4P+NzDdPHr9mOHDj68MUrw8oLA3QLYTIIDQo0CDT1yU4f+n9ww/li9meJYRwcAhLMIgYmoKTnC3gVGhaQbMXsBUzwAMXli6YQI6gJ2ZmUETKH6nvp7hBzDx8UpIMIj4+zPcuHuT4cX7Nww/gemCj40VpF4B2U6AAGJCS4SirJzsDH8/fWT4C8y4b7bsY+CRlmZgBkbFa2CccgATlCiwwPkBSunQxPkPmgh/AwshLm5uBp6HDxle7NgBlhM0MmR4948RnIN/AwsokPXAZMuHbCdAAC7K5QZAEAiiT9SDxOCR/rvCRhQDLg7etID57Cbz/h9wrRq3+G4S2TKyqEAPOVJiE3TsKgylMg2OKQREOWZd77ImeWbWZuR9fzU+RmbvkZ1KGK37wge3jwBiQSv33/0Alu3/hQXA+QTkOmDKhfgSmOI/7N8GDIWnQIvFGP4/fsLwtLefgQXo6z83rjP8+vWN4ePrhwyvnz9nkAS6Hhw1QEcyA/X9+A/yGbCY+PUHlM6+INsJEEDoDrjx4eVrR0ZdRYa/XJwMjC+/M/x79RLsGG5gvn759AXD648vGP6xMzH8BQbt+wP7wfURCy/QVBagRb/+A+sGBgYeRWVw9fv3zRuG/8BQ+Q/0MxsTCzA3fAeVM4+Q7QQIIPSS8Pyz2/cY/jKyMTCKSDCwgKLh8kWwA3gsrRj4Le0YfgErv39M/4Ch8peBTZgBjP8DvfEbmA7+fAMmIg01Bn53N3Co/QLq/QHMhmzAxMcGjKYnQAcA3XsZ2UKAAGJC4+x98ejZ8xcPnzFwKmsyMPIAo3XzRgYGYHD/4uJgkG5uZWDjEmD49RZkIaSO/fUfgn9+ZmDgZ2JjUG5pY/gjIc7ABEz1b9auY/gGSoxc3Azvf/xiuPft2w+gW3ci2wkQQOjlwD1gEO26dvQUA4ecGgO7shTDj7sPGL729QHjEhjsFuYMyus2MIjpWzCwvgKmptdA/AYYCsAyS15Vm0FnxQoGRl9fYCpjZPg5Zy7DQ2DRzcHJwiDOycVw6dNnhi//GQ4ArTmNbCdAAKG0ByYDEwwwuPX+MDIe9Qj14ZER4WF4sHktA9Pz3wyKU2Yy/EtPZfgFzH7swLj9t3c/w29gagfVFazKygwsTg4MP0BZFphouTZtYjgTGclw5+d3Bi0xEYYvwISy7NXbf7/+//cC5pqd85DsBAggFAdMgFYuwHRUySvA1+Yd5MXA/u09w6N9+xg43v1nUCopY2AqyGP4JiYGTCeMDCyIxAvOW9zAAohx7jyGi40NDDc/f2JQFhVi4AS2BFa/esvw+M+f6cAiOwukfj6SnQABhOKAXkSLiAWY1haKCQtFebjbM3AAU9fDkycY/j38yCCtoc4gEhHFwGRqwvBPXIKBEdgIYXz1muH/pYsMr1atZLh+5izDezZGBhVgCQqKtg1v3jHc+fV7H7AWDASa+wndAQABhNUB/yHpgR+YgGYI8vFG2JsbMkgL8jK8fnCX4e29BwzMb4AFDqgAYmUC14g/fv1leA/kfwaGL68gH4M0Fw/DS2DJt+PdB4ZHv//s52BgiAdKP4bZg+wAgADC5wAQZgfWXlWMTEzlmgoy7Npy0gwCbCwMP758Yvjy8RPDL2Ae/wcsOYHy4HzOBaQ/AFM7KMGd/fz137f//2cAg70S5nNsDgAIIEIOAGNgzrAGOqSAlZHRTVpYkE8CWKuBKhZQ2Q4qXkEl3Adg4+MJsO6/9+3Hjy///x8Apo9JwCy2HVuTD9kBAAFElAOQOhkGwLzvCaQNgVwFUMUCKtuBDvwMFHsEZF8CxsJuoNzx/5B6ioGQAwACiHGgO6cAATTgfUOAABpwBwAEGACCv5qFWrWrywAAAABJRU5ErkJggg=='), +(19, 'admin_news', 'Новости', '1,2', 'object_admin.php', '$obj_name=all_news;', 'core_data', '', 0, 1, 0, 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABsBJREFUeNq0V3tMlWUY/30XQHCat1atvCcTOCpKKkcoS5trhiGmJJZXdGLTtprl5lqtf1ym/WUqExARdAsVbOWNKKdDM0ubTTSNTXFKpcJBOHqEc77v7Xne7wLiwdv0O/vOd7738jy/5/dc3ucoAPTNRSW7VUV50zBNQOCRLkVRoGmqfAaDLTsDgZatS99fvIemzPvt7VawpUQ8jqv6zFmRV1AkLly4KN8Li3eWsYH3Us6TXQzDkC8+XyNUVQWxwSY9JAPAwP79YQoTe/dXIicnG1mZUzJMUVqaPSdzBi0xOgOgCNOaU0j5nn0V0CN0KI/gBnbhzBnTcOhQFUwy6s+/zmNq2qQMtXjHjvmzZ4QFofKXEIrrRyE4Dh4+EIhxmATgduCW3M5gevbsjguXL2PihNSMwpKdO2iZFo4BSZt80qbA7dsIhUISzMMCMAwTTX6/VG4Sq1F6JHoQiOs+H7zJozKKtpftmjtr2nRaHroDgLAtDhFt0zLSZRzcG4BwSXKW8TvL6flUd3BMaYqGqMhIaIYGvbeOpiY/RiR60letXpu+csXycic7XADMAjPAvzVNCwuAhxxFvFb6UFUt9lwjQhiX4kVpGekQilyrqOxrFU8/9yxiYqLn0rIf6G5pA0AfI2TKJwvcf6DCFWyrpnfFBRUKGZg0aaJcn7v+G3iGD0PqK+Oxcd06LF+xAiM8CUgc5rECmfZwVp06XY1jx35FdHTMFBqNugMAbAaE3KLI71GJIyBsKzk7LtZegp/8K5erplzHRi9Z9oEbPzlLl6HZf0sCc3zEDPCvAQP6SQOOH/+NhyPviAGDFoUMK/otegVag0EJQNg0s185yFgIzwvLF9i0YT3iEzwSQAqxkJ+7AfGeYW5c8bg3JQVBeiYO9+DI0WNu9rUxYAo7E4gDxfJvkBTKMZKjcEr16kUghXRFY4OPq4cEsGjJEhuUKVOY3xmwcJilcc4qBtQaIqMM8+40tKw27ACzhAVaWixGJNnWV59nektl9deuwykXeRs3Is7jsaimfRwLPDY0IcGV6/Wmyt8hO87CAnAm2WqO5HNnztrhp9iJ1wbEsNnhfdk5OVYBc3KRLh5z9jAAg4JWyrazLEwhoiyQDAgp/K30KW7EO09ro5BRLchlQaKTo7uyorItZYUNtF0GMyvjJ7wqJwwz5KbrXQzYMSWFFeTmSgq9KanYmp+H2Ph4Kcib+jKK8jdhyNChGJM8jrJBkbk+cmSiLUO0nSEy/VSc/OMUjWlyLhjqhAErVYTrgnmLF7sR/N7ChdJSYTM1Z9EiCYaZopCUzMmMaSeYjeCPRsGoIRqReldae8uuoA/AQHFeHlkZL8EkMwubiYW4eDenGcBor1fWDQZpyNOU3Sjgb/ZT2W1ChKbjhecH4+uayShv6IXVU88hMiJGMnZfBt4lq9mPpp2es7KzZfo5PmalpmHYNZRlKrjha0LdlTrrHOEP0V/jv4goOv8G92jAJ+UJ2DTnP2IzInwQOj5kzdvy88niOHdsdMo4lORvQSz53jkHkpK9VAqY4ig01bfi2j9+RKk9ZJZY9ZTmRLRkNSvlYxQdWYO1FW+jlzI9DANmmwu4KGUtyHYjWEY9jc+cN9/1r0wnLkqkvPLqZzhfW22nbIfDi8UxUWpXpI3KxL5TpTgZrOvEBYrlAla4vSAfQ4iBJG8ySrdswYtkObP0Evn928JCDIqNRdJYYkDRcaa5GruWrceN0F4SpLdDobhnjCp6o/rfUqQlzcb+yGK89gVyD34O2SG19QPC7SyIgQXuEZs5b167MiTwDr1bBQVWQNHzZmsDqmr22NR37Bx48Huo5Prqq8WYPHIBdH1zRuQq7D6wEhlux3rzZoDSqVUGz4/flaHvoMG2EhMJI5NwoHwn+g4c7KanJzEJphYFjk2/SbRGdN6swoUPnK/fhjFxHvxy9nQavUbrDkpfQ6M8NPgaM/51dwOj8NX7MJbG0H6s4Qa6aNwnAAFRB8LSaSNrd3wSrKm34HjNabQ24RANRehOYDX6mqm4hB68Daf4v00SWUKrfgVRXcMAEDKmQVXbCjhKyYuXgZ8P4vDh1eBGIsgAhL+5+ciJE8dTnDbrwQCoiFC6YoA+Cl9t/Z2O7HCNKndPwNws63dtLSn/SSr/kKY5HQIMuhvd/ejuc79/MY9wRbzxJfbNmU2+/5uU7yHla6TyS+x1JwsC9sBV4JH+j9zr6qkx7ST9aBXqSflH7ZU7dYAd32zfj/1iAFWH0VTxKbgZvdxeOZ6AxXcxwP2obegVuq9x4HWslk/y4u43xik1HZXz9b8AAwCPqh4VfKC+gAAAAABJRU5ErkJggg=='), +(21, 'core_object_admin', 'Редактирование', '1', 'admin_objects_all.php', '', 'core_objects', '', 0, 1, 0, ''), +(22, '404', '404', '', 'static_page.php', '$id=1;', 'index', '', 0, 1, 0, ''), +(24, 'core_programmer', 'Программист', '1', 'line_menu.php', '$templ=admin_content_menu.htm;\r\n$root=core_programmer;', 'index', '', 0, 0, 0, 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAACDVJREFUWIWtl2mMXlUZx3/Pufe+28x0ti7TBUoXWgsRZTPa1pCqkVg+FIxg5INQxGBAMSgmiAEx4YOJEE2IH5BEKCQgTUBDYoJEWbqhrJVaaWmpTKFD22lnpu96l3PO44d7ZzoDxRT1JOd9z3vee+7zO8/yP/cKH6PteITlitkYmGi993ap975LJGiLMWMi8pZNk9/ZMk+tu5pjp3tPOZ2LnnuQvnIQvRhWBhYvWnV12DNvTVSqLsRE/ahPcdk4SXOYiUPPdd7f/2TVpSc2rL2Wp/4vAK/cT5TUoj8uufD2dXOXXRNqdhjvRkHbqG+AAiZCpAsJBlGZw64/Xd5OGgeuWHMtz/xPANsfZq6R6InFF/zg4nkrby3b1nOgGYIUKz2oQzXLu09I4hJR7Vze2nZjpzWx9xeVjr37ohvIPhbAjs1Uic2PJCj9cMmFt9fmLL0ulKAL23oB8IhIsVABO2Xcu5jjI7vo7j+HSv8aRvY8kBzZs2nMZ/F9n7vG/1wE/aCt4FQA12+IHhhY9MXvnrPu0VpX/0rjs3eRoBd8G8EhEoAEiDE5AwrqcVlMa/w9qj0V8IfoG7o0nL/q+z2d1vAle7ce4Le/9y980Jb5kNs3saFUm3/V0s/cE6k/hkvexvsWuAnEVFACVAVVxXuHqkdVUYU0aaIIYVRGbQOX7AU3zJKL7gxrPWfdtu1BPv8fAXZvpiQmuP/sNffUvDuGt8dRAiDAuYliLHgF9R7vHV4d6vMwJO0TVLp68zkgiOajEpI2t7F89T1VE0YPbd480+szACZi852BMy7pKXevwMbvoOjU7tQloBmqAnrSsHcp3md4b0k6dSpdfai3iJRAyjjbJG3vJCgJc5deMX9hHFx3SgBVRERuW7DqppqN9xeJVSSYpnjfxtt6Mc7wPp3WE5xtY4wggeBdimLwro5t78b7jPb40wyt3FgVkZ+qnkz+KYDtj7Cm0nNmT7lrCVn8Dt4neB/jfQfv2njXwtk66lp418nnfYx3Cd4l2LRFqVqb+q2aYdNDJPF+vE8Lj7aYNbSmb/tDrJ20G04ORM035iy7rCtLDuJdG1FXdItIiBAURZtnvKoFtVMaYNMWYTkswBKMC8jScVzWKjbRoVPfwpyz1tdOHN62EdzWmQCGS7v6L5AsPojzbYw6RDPEp3nJSZ6AOYADcgjVDNTifYx4UJ+ApmQaY9M63rVxto53LZLmG/Qt+IoY0S/NCMGOTZwflYfOqvZ+mrSzH2+bONfA2Wa+2DaK7zrO1nGuibP5/962cLYBxDjbwrkmNmuSJsex2XGy9Cg2G8e5Dml8CBGo9Jy78IUHOXvKAypy58LzNpr2xPNk6SjGlBApISbK3S8GMKh2cNkxRCIwpTwsaK4FPkF9B+9aeN9EbROvKaqTcu1RdZw4+jhDK6+i/dLuO8B/Mw+B8oXu2Wtl4vAD4FLURIgp5cZNgMvGsekI3k6ACKdWcAVVQPGqSAGWh8pPgbQmtjC0/EqD6mXTckArpdJs4sY/CMJ+TFABFOfq+HQUxbFo5a8g6Ed9C5e8h8sOYbMjuHQUm43lIXEtbBpz6P0WC+dXUTzodBAHLiOIelDVWYCEBfuY952hcm05jeN/BjFTbhcRwNCc2MLYyGNFxuYekJN7n/ahtNspzpFXy1TVeBRPpbYCl02g0ARKYSFCu9LW/qHZi26gMf4s3saAFBACIth0AufahVmZEQSd9okqxlicc4VhBXzBHVDtOY8sHsE5hoGSAegk/LV+9CVngirzFt+KYIrkcnmp+QxvxwuRifGug5vWvesU8zHeJ/k6n+UunzJuqPaspFRdTNYeoZ2wGzAG4ESDnSdGX49tVqdcGWRgwWWYIJqRYs41TpF4p9fEhNRmfZKoNEhYXkCncTCrN/gnFDqwZQcv1Y+8FmG6iZtvUIp66e0/nzDqmbqJt83/yngYDTCrfy1ReR4iEVFlCfXRN+3wEXYBzgDc9yQTWZa93R5/BWuVLDkMqpSrC6h2LSEIZ+E/pgfCaIDu/tXMmr2OIOpDJCII+wnCATrju4OH/8BOIJuUYjs2zqax957/2byzv1aeGPklxpQAQxDNolYayBOoW7BZPVc/3y7qPo+vBFXCcICoPJcVfXPp6p5XCJAFHCCUuy+gNf4qjWbzxd0HaAPpJED21FYenzP4lzvmf+L6clhaTJYMF4eQIBIgUqJcPYNyrYTIpFBFoIIEVcSEwOR5AZMPrGiA+gwjEdXetezb/r328Ai/AVqATj6d6M49pFd+mT7sgfPnLb85jBuvgPqTcmzCwnA0DaCEMdViXJ6CysFNXk0iQEDX4Hoao9v00J4n9n/1Fn5MrgMzHo/swRFeXb3q/avL3bXewUXfEpuN4F0dIxEQIibCmAhkGsTkuSHlAqjwjOTHdxD00z24nqxzhH3bf9J49mW/4fmXGaYQjnAagG59neM793KFyKZn4sZI3/yVN4XGhKSdvbhsFG/H80NHXR57EyKEiKlggm7E1DCmggRVjOkiiGYTRIOMvvOQf/f1+5r7Dviv3/VrdjIpDpz6VJG7bmTZmk9xd6XM5d0D57j+havL1b4VQbl2JmFpABP2FDsOYFIti9NO8XjbJmn9ixNH/2aP7nssa9XHtu7eyy0338ubTEnmRwNMttJ5y+j79lV8dm4/F9dqnFstsywQekxUrpZKtaqRqCwixmMQgtj6NLFZ3LFZYzyO9e1Wm9cOHubpW+/l74A9lZHTeTktAVWgDOTJkHfDzPPIk9ebBTLyLO8Ucx/ZTuvteNq1wTSAoIDw03pWAPiPuMeH2r8BFSWyRUdlGNMAAAAASUVORK5CYII='), +(25, 'core_shopadmin', 'Администратор', '2', 'line_menu.php', '$templ=admin_content_menu.htm;\r\n$root=core_shopadmin;', 'index', '', 0, 0, 0, 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAAEEfUpiAAAACXBIWXMAAFxGAABcRgEUlENBAAAACXRFWHRDb21tZW50AACJKo0GAAACwklEQVR4nMWWz0uUQRjHXTVaNRa8VISnDhKx5aHokKAEJfgHSBB2kRWCfmBmQWgq2MWNTnnxKILgSTDKAjssUl0yiQgh2ENEhYKBSJaS+/Z9dp/Xnp2dnZn39Y0OHxnnfeaZ7zzzPM9shed5FZL8n1Qq5WUwBIP+xARP/DUlK4IGwyU+2HwFJPyJY0U+/PV5HzwRA0lV065PRVsRRdYwasdkBiyDNZ3BPLgpdCRoMACu6PbPa8DH/WRd1oDdvcN+MSHuCWhTT3HWeArrMdlgDiyCz2BLNeiWIfaFq3Hw1DEN+tRVQSjZAczsxcEFX4UuItZkECpe4ONEWAeHgqjQngsONsEbEDcQK4mBxlFcM1cHmkCD0QHlPcfjhDI/J6/bj/wwGKLUD5wHSvpNhXGwD1SCb3vKRCy+HFUqn8L9riv3nQNLYBx0geMmB09h8MgxlftUB8+58I84OrinOjgZsJjuliumc6GOwA5y4CU+zjg46NE5SHMckoDK+jWgvpvNFB6dDbDDDq5qC4iPYarEuPYalTjYuGYtZ43janAGHKSytpVzSZfG/808/9t4BOFgU5mr5Pm0rMbTfHW6c3YELa4w7YAa0i+x6Y4Yr/i9858JKBO+SSHixv8QcFhcy3dQRfNI/DEwD6bBQypFcAm0gKMgeEs3JNEDEYXbLOCV64ttgSp6gardJKCG31cSsEFPBxZcjEiAz5CtcG+JKAxwFLIRCui3CaCf0F9ZwE/qYVjUHaGAO9YkwaadIgojmcKv4dWIBPQ6ZSo2XmIB2+AALYxIwHVXAedFFNIua8qBTatBLUhQ2TovxMbPHJ8pG+9BvbUPaATUglnwFiyDLPgEvnDLXgPr4AfYMrwvxP3AAoSQJPjIGzymfmGpomnelOz7nTuhwekH5TSjBttWxTYnwx9KgEjKHtDoYFuVKvyQaNJ9/wN+gmjz6zdWwwAAAABJRU5ErkJggg=='), +(45, 'ajax-city', 'AJAX город', '', 'ajax_city.php', '', 'index', '', 0, 1, 0, ''), +(87, 'core_cats_admin', 'Категории адмики', '1', 'admin_core_cats.php', '', 'core_programmer', '', 0, 0, 0, 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAATlJREFUeNrsltERgyAMhqXXgToCG9QVugEb4QpOYDewmzACDT3w0hgBFepdz9zloUDJlz8QFNba5kgTRwNcJxIhUiSiqgInwAlwAuQC5PYN2G9fIwpAML8p8/8FKH1WqgBwezpF3PhMGTfIuZva6OPCmGKTrQAQcwPe1i7BE7wHf/nfN/A7uERrHuDdJ3ZKgRXKGBKE/k/6NWF9WxLA+ExnwX39NVIjQJiSADISPKwJEBKNqdUAzObDguTcbQgQQ7gdlx3vSJC8Zw7wSEtCrJ/2KFACmZE5zv6rDJfmN9b5q1elESn0TOvI4cOmpvkCAAMCsARCLygyHUIcMKpI6hqSOR0pB38NdwKYxKlvko0oZltbMZP5rBXjb8IoQI3HiLbNXAU4a0l22c9xFkAOmN9DpT5IaLy3AAMAEEzA2rYo6FcAAAAASUVORK5CYII='), +(100, 'core_seo_static', 'Статические страницы', '3', '', '$obj_name=_sys_static;\r\n$add=0;\r\n$del=0;', 'core_seo', '', 0, 0, 0, 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAB/ElEQVR4Xs2WzWryQBSGT2LUuoi0LgKfC0FxoQi6kA+7cdet0AvoPegV9EJ6E+EDERQRPqR4Ad0o6K4UFyIBKdr4k84MJCdNf0YyjvSFQ34Wvo/nnTMZBQKaTCZvh8NhA+Gkrlar12azeT8ajR7gCH0AGI/HTj6fh7Da7/fsOp/PrWq1ertYLP5ziUFYaL7b7cCyLFgul5fD4dDUdf36DAAoEh3Ytg2qqkImk7kaDAb/ksnk3/MAIASreDwOhULB6PV6bYQ4A8B2u2VRUCUSCSiVSka320UISQC07bRoDAyCyIMol8tGp9Npk/tPEBqcSIqiMIBUKgWz2Qz6/b73nhlpmmGaZrvRaNwQwCcJETATln2tVoNKpQLFYhFyuRxks1m6KKFerxvk3Z2EDmAXYrFY8NmNhMFFo9ELCQCoSCRCTf1rgl79U+JwARzHEV2QFIJG4o2kX1yAE0+G+89dOIExFNug8MqJgNLK2B0FdkIJ5rwOyDLHZ8kdoN8D+onmTJicDqAxGkqOAM048LwpQOpQWYeR9l1+MiR/HxDvAC4iWeKPoXwJLEKxs4LYFIgLf/f3R4CnWmyfoNzDyXFbcTqd5sUSzJPz0cHjmkL0I0Cr1XpZr9cbaugndp+/NmaAtPz3/nH2jKfT6SP4FOytTuoPSBHzskk9k/Iyfge2ZiJQCsHAKgAAAABJRU5ErkJggg=='); + + +CREATE TABLE `_sys_datatypes` ( + `obj_name` varchar(255) NOT NULL, + `attr_name` varchar(255) NOT NULL, + `attr_type` varchar(255) NOT NULL, + `attr_templ` varchar(255) NOT NULL, + `attr_desc` varchar(255) NOT NULL, + `attr_hide` int(1) NOT NULL, + `attr_mand` int(1) NOT NULL, + `attr_order` int(12) NOT NULL, + `_sys_deleted` int(1) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +INSERT INTO `_sys_datatypes` (`obj_name`, `attr_name`, `attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`) VALUES +('_sys_users', 'name', 'input', '', 'Имя', 0, 1, 100, 0), +('_sys_cat', 'cat_id', 'url', '', 'URL', 0, 1, 0, 0), +('_sys_cat', 'cat_name', 'input', '', 'Title', 0, 1, 0, 0), +('_sys_cat', 'access_group', 'MLINK|_sys_groups', '[title]', 'Доступ', 0, 0, 0, 0), +('_sys_cat', 'module', 'modulelist', 'www/modules;.php', 'Модуль', 0, 0, 0, 0), +('_sys_cat', 'data', 'textarea', '', 'Данные модуля', 0, 0, 0, 0), +('_sys_cat', 'parent_cat', 'input', '[cat_name]', 'Родительский элемент', 0, 1, 0, 0), +('_sys_cat', 'xml', 'modulelist', 'www/xml;.xml', 'XML', 0, 0, 50, 0), +('_sys_users', 'login', 'input', '', 'Логин', 0, 1, 50, 0), +('_sys_users', 'passwd', 'passwd', '', 'Пароль', 0, 1, 60, 0), +('_sys_groups', 'title', 'input', '', 'Название группы', 0, 1, 100, 0), +('_sys_users', 'group', 'MLINK|_sys_groups', '[title]', 'Доступ', 0, 1, 120, 0), +('_sys_static', 'description', 'textarea_html', '', 'Текстовый блок', 0, 0, 100, 0), +('_sys_users', '_sys_deleted', 'checkbox', '', 'Удален', 0, 0, 999, 0), +('_sys_files', 'filename', 'input', '', 'Имя файла', 0, 1, 100, 0), +('_sys_files', 'ext', 'input', '', 'Content-Type', 0, 1, 100, 0), +('_sys_files', 'realname', 'input', '', 'Реальное имя', 0, 1, 100, 0), +('_sys_cat', '_sys_deleted', 'checkbox', '', 'Удален', 0, 0, 999, 0), +('_sys_cat', '_sys_unvisible', 'checkbox', '', 'Невидимый', 0, 0, 990, 0), +('_sys_cat', '_sys_order', 'int12', '', 'Порядок', 0, 0, 900, 0), +('_sys_cat', 'img', 'image', '', 'Картинка', 0, 0, 100, 0), +('_sys_users', 'regtime', 'datetime', '', 'Дата регистрации', 0, 1, 200, 0), +('_sys_obj_log', 'datetime', 'datetime', '', 'Дата и время', 1, 0, 100, 0), +('_sys_obj_log', 'user_id', 'LINK|_sys_users', '[name]', 'Пользователь', 1, 0, 100, 0), +('_sys_obj_log', 'obj_name', 'input', '', 'Объект', 1, 0, 100, 0), +('_sys_obj_log', 'obj_id', 'int12', '', 'ID в объекте', 1, 0, 100, 0), +('_sys_obj_log', 'old_data', 'textarea', '', 'Старые данные', 1, 0, 100, 0), +('_sys_obj_log', 'user_ip', 'input', '', 'IP', 1, 0, 100, 0), +('_sys_obj_log', 'new_data', 'textarea', '', 'Новые данные', 1, 0, 100, 0), +('_sys_users', 'session_data', 'textarea', '', 'Сессия', 1, 0, 900, 0), +('_sys_sitemap', 'url', 'input', '', 'Урл для сайтмэпа', 0, 0, 100, 0), +('_sys_static', 'title', 'input', '', 'Название', 0, 1, 50, 0), +('_sys_users', 'email', 'input', '', 'Почта', 0, 0, 100, 0), +('_sys_users', 'phone', 'mobile_phone', '', 'Телефон', 0, 0, 100, 0), +('_sys_users', 'user_photo', 'image', '310x310', 'Фото', 0, 0, 100, 0), +('_sys_cat_admin', 'access_group', 'MLINK|_sys_groups', '[title]', 'Доступ', 0, 1, 0, 0), +('_sys_cat_admin', 'cat_id', 'url', '', 'URL', 0, 1, 0, 0), +('_sys_cat_admin', 'cat_name', 'input', '', 'Title', 0, 1, 0, 0), +('_sys_cat_admin', 'data', 'textarea', '', 'Данные модуля', 0, 0, 0, 0), +('_sys_cat_admin', 'icon', 'icon', '', 'Icon', 0, 0, 100, 0), +('_sys_cat_admin', 'module', 'modulelist', 'admin/modules;.php', 'Модуль', 0, 0, 0, 0), +('_sys_cat_admin', 'parent_cat', 'input', '[cat_name]', 'Родительский элемент', 0, 1, 0, 0), +('_sys_cat_admin', 'xml', 'modulelist', 'admin/xml;.xml', 'XML', 0, 0, 50, 0), +('_sys_cat_admin', '_sys_deleted', 'checkbox', '', 'Удален', 0, 0, 999, 0), +('_sys_cat_admin', '_sys_order', 'int12', '', 'Порядок', 0, 0, 900, 0), +('_sys_cat_admin', '_sys_unvisible', 'checkbox', '', 'Невидимый', 0, 0, 990, 0), +('_sys_static', 'page_description', 'input', '', 'seo description', 0, 0, 504, 0), +('_sys_static', 'page_h1', 'input', '', 'seo H1', 0, 0, 502, 0), +('_sys_static', 'page_keywords', 'input', '', 'seo keywords', 0, 0, 503, 0), +('_sys_static', 'page_title', 'input', '', 'seo title', 0, 0, 501, 0), +('_sys_static', '_sys_deleted', 'checkbox', '', 'Удалённый', 1, 0, 1000, 0), +('_sys_static', '_sys_order', 'int12', '', 'Порядок сортировки', 0, 0, 800, 0), +('_sys_static', '_sys_unvisible', 'checkbox', '', 'Невидимый', 0, 0, 999, 0), +('_sys_static', '_sys_lastchange', 'datetime_modify', '', 'Последнее изменение', 1, 0, 999, 0), +('_sys_files', 'filesize', 'int12', '', 'Размер файла', 0, 1, 100, 0), +('_sys_user_sessions', 'session_id', 'input', '', 'Сессия', 0, 0, 100, 0), +('_sys_user_sessions', 'user_id', 'int12', '', 'Пользователь', 0, 0, 100, 0), +('_sys_users', 'user_photo_preview', 'image', 'x150', 'Фото Пре', 0, 0, 100, 0); + + +CREATE TABLE `_sys_files` ( + `id` int(12) NOT NULL, + `filename` varchar(255) NOT NULL, + `ext` varchar(255) NOT NULL, + `realname` varchar(255) NOT NULL, + `filesize` int(12) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +CREATE TABLE `_sys_groups` ( + `id` int(12) NOT NULL, + `title` varchar(255) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +INSERT INTO `_sys_groups` (`id`, `title`) VALUES +(1, 'Программист'), +(2, 'Администратор'), +(3, 'SEO'); + + +CREATE TABLE `_sys_obj_log` ( + `id` int(12) NOT NULL, + `datetime` int(12) NOT NULL, + `user_id` int(12) NOT NULL, + `obj_name` varchar(255) NOT NULL, + `obj_id` int(12) NOT NULL, + `old_data` text NOT NULL, + `user_ip` varchar(255) NOT NULL, + `new_data` text NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +CREATE TABLE `_sys_static` ( + `id` int(12) NOT NULL, + `title` varchar(255) NOT NULL, + `description` text NOT NULL, + `page_description` varchar(255) NOT NULL, + `page_h1` varchar(255) NOT NULL, + `page_keywords` varchar(255) NOT NULL, + `page_title` varchar(255) NOT NULL, + `_sys_deleted` int(1) NOT NULL, + `_sys_order` int(12) NOT NULL, + `_sys_unvisible` int(1) NOT NULL, + `_sys_lastchange` int(12) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +INSERT INTO `_sys_static` (`id`, `title`, `description`, `page_description`, `page_h1`, `page_keywords`, `page_title`, `_sys_deleted`, `_sys_order`, `_sys_unvisible`, `_sys_lastchange`) VALUES +(1, 'Главная страница', '<p>Текст главной страниц</p>', 'Дискрипшн', 'Н1 заголовок', 'кейворды', 'Заголовок', 0, 0, 0, 1455117710), +(2, '404', '<p>Ошибочка вышла</p>', 'Страница не найдена 404', 'Страница не найдена 404', 'Страница не найдена 404', 'Страница не найдена 404', 0, 0, 0, 1453821473); + +CREATE TABLE `_sys_users` ( + `id` int(12) NOT NULL, + `name` varchar(255) NOT NULL, + `login` varchar(255) NOT NULL, + `passwd` varchar(255) NOT NULL, + `group` varchar(255) NOT NULL, + `_sys_deleted` varchar(255) NOT NULL, + `regtime` int(12) NOT NULL, + `session_data` text NOT NULL, + `email` varchar(255) NOT NULL, + `phone` bigint(10) NOT NULL, + `user_photo` int(12) NOT NULL, + `user_photo_preview` int(12) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +CREATE TABLE `_sys_user_sessions` ( + `id` int(12) NOT NULL, + `session_id` varchar(255) NOT NULL, + `user_id` int(12) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +ALTER TABLE `_sys_cat` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `cat_id` (`cat_id`); + +ALTER TABLE `_sys_cat_admin` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `cat_id` (`cat_id`); + + +ALTER TABLE `_sys_datatypes` + ADD PRIMARY KEY (`obj_name`(50),`attr_name`(50)); + +ALTER TABLE `_sys_files` + ADD PRIMARY KEY (`id`); + +ALTER TABLE `_sys_groups` + ADD PRIMARY KEY (`id`); + +ALTER TABLE `_sys_obj_log` + ADD PRIMARY KEY (`id`), + ADD KEY `user_id` (`user_id`); + +ALTER TABLE `_sys_static` + ADD PRIMARY KEY (`id`); + +ALTER TABLE `_sys_users` + ADD PRIMARY KEY (`id`); + +ALTER TABLE `_sys_user_sessions` + ADD PRIMARY KEY (`id`); + + +ALTER TABLE `_sys_cat` + MODIFY `id` int(12) NOT NULL AUTO_INCREMENT; + +ALTER TABLE `_sys_cat_admin` + MODIFY `id` int(12) NOT NULL AUTO_INCREMENT; + + +ALTER TABLE `_sys_files` + MODIFY `id` int(12) NOT NULL AUTO_INCREMENT; + + +ALTER TABLE `_sys_groups` + MODIFY `id` int(12) NOT NULL AUTO_INCREMENT; + + +ALTER TABLE `_sys_obj_log` + MODIFY `id` int(12) NOT NULL AUTO_INCREMENT; + + +ALTER TABLE `_sys_static` + MODIFY `id` int(12) NOT NULL AUTO_INCREMENT; + + +ALTER TABLE `_sys_users` + MODIFY `id` int(12) NOT NULL AUTO_INCREMENT; + +ALTER TABLE `_sys_user_sessions` + MODIFY `id` int(12) NOT NULL AUTO_INCREMENT; +COMMIT; + + +CREATE TABLE `_sys_db_migrations` ( `id` int(12) NOT NULL, `filename` varchar(255) NOT NULL, `apply_datetime` datetime NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +ALTER TABLE `_sys_db_migrations` ADD PRIMARY KEY (`id`); +ALTER TABLE `_sys_db_migrations` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT; + +ALTER TABLE `_sys_files` ADD `private` int(1) NOT NULL; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("checkbox" , "" , "Приватный файл" , "0" , "0" , "100" , "0" , "_sys_files" , "private"); + + +UPDATE `_sys_cat` SET `_sys_cat`.`cat_name` = "Система" , `_sys_cat`.`module` = "loginbox.php" WHERE `_sys_cat`.`cat_id` = "index"; +ALTER TABLE `_sys_users` ADD `favorite_menu` text NOT NULL; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("json" , "" , "Избранное меню" , "0" , "0" , "100" , "0" , "_sys_users" , "favorite_menu"); + +-- [2024-10-14 16:29:46] Создание атрибута; +CREATE TABLE IF NOT EXISTS `_sys_users` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `_sys_users` ADD `user_office` int(12) NOT NULL; +ALTER TABLE `_sys_users` ADD INDEX ( `user_office` ); +REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("_sys_users","user_office","LINK|_sys_users_offices","","","100"); + +-- [2024-10-14 16:30:44] Создание атрибута; +CREATE TABLE IF NOT EXISTS `_sys_users` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `_sys_users` ADD `default_work_tarif` int(12) NOT NULL; +ALTER TABLE `_sys_users` ADD INDEX ( `default_work_tarif` ); +REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("_sys_users","default_work_tarif","LINK|crm_workers_tarif","","","100"); + +-- [2024-10-14 16:31:08] Изменение атрибута user_office; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("LINK|_sys_users_offices" , "" , "Отдел" , "0" , "0" , "100" , "0" , "_sys_users" , "user_office"); +-- [2024-10-14 16:31:08] Изменение атрибута default_work_tarif; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("LINK|crm_workers_tarif" , "" , "Тариф ЗП по умолчанию" , "0" , "0" , "100" , "0" , "_sys_users" , "default_work_tarif"); + +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("icon" , "" , "Картинка" , "0" , "0" , "100" , "0" , "_sys_cat" , "img"); + +INSERT INTO `_sys_cat` (`cat_id`, `cat_name`, `parent_cat`) VALUES ( "-no-auth-links-", "Ссылки без авторизации", "index"); + +UPDATE `_sys_cat` SET `_sys_cat`.`_sys_unvisible` = "1" WHERE `_sys_cat`.`cat_id` = "-no-auth-links-"; +INSERT INTO `_sys_cat` (`cat_id`, `cat_name`, `module`, `parent_cat`) VALUES ( "core-menuconfig", "Конфигуратор меню", "core_menuconfig.php", "-no-auth-links-"); +UPDATE `_sys_cat` SET `_sys_cat`.`_sys_unvisible` = "1" WHERE `_sys_cat`.`cat_id` = "core-menuconfig"; + +-- [2024-10-14 20:03:20] Создание атрибута; +CREATE TABLE IF NOT EXISTS `_sys_users` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `_sys_users` ADD `full_name` varchar(255) NOT NULL; +REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("_sys_users","full_name","input","","","100"); +-- [2024-10-14 20:05:06] Создание атрибута; +CREATE TABLE IF NOT EXISTS `_sys_users` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `_sys_users` ADD `long_session` int(1) NOT NULL; +REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("_sys_users","long_session","checkbox","","","100"); +-- [2024-10-14 20:05:34] Создание атрибута; +CREATE TABLE IF NOT EXISTS `_sys_users` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `_sys_users` ADD `money_agent_admin` varchar(255) NOT NULL; +REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("_sys_users","money_agent_admin","input","","","100"); +-- [2024-10-14 20:05:55] Создание атрибута; +CREATE TABLE IF NOT EXISTS `_sys_users` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `_sys_users` ADD `user_description` text NOT NULL; +REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("_sys_users","user_description","textarea","","","100"); + +-- [2024-10-14 20:06:17] Изменение атрибута full_name; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("input" , "" , "Полное имя" , "0" , "0" , "100" , "0" , "_sys_users" , "full_name"); +-- [2024-10-14 20:06:17] Изменение атрибута long_session; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("checkbox" , "" , "Длинная сессия" , "0" , "0" , "100" , "0" , "_sys_users" , "long_session"); +-- [2024-10-14 20:06:17] Изменение атрибута money_agent_admin; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("input" , "" , "ID агента выдачи денег" , "0" , "0" , "100" , "0" , "_sys_users" , "money_agent_admin"); +-- [2024-10-14 20:06:17] Изменение атрибута user_description; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("textarea" , "" , "Комментарий" , "0" , "0" , "100" , "0" , "_sys_users" , "user_description"); + +-- [2024-10-14 20:08:28] Создание атрибута; +CREATE TABLE IF NOT EXISTS `_sys_users` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `_sys_users` ADD `login_ip` varchar(255) NOT NULL; +REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("_sys_users","login_ip","input","","","100"); +-- [2024-10-14 20:08:40] Создание атрибута; +CREATE TABLE IF NOT EXISTS `_sys_users` ( `id` INT(12) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `_sys_users` ADD `login_time` int(12) NOT NULL; +REPLACE INTO `_sys_datatypes` (`obj_name`, `attr_name`,`attr_type`,`attr_desc`,`attr_templ`,`attr_order`) VALUES ("_sys_users","login_time","datetime","","","100"); +-- [2024-10-14 20:08:52] Изменение атрибута login_ip; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("input" , "" , "Последний вход" , "0" , "0" , "100" , "0" , "_sys_users" , "login_ip"); +-- [2024-10-14 20:08:52] Изменение атрибута login_time; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("datetime" , "" , "Время последнего входа" , "0" , "0" , "100" , "0" , "_sys_users" , "login_time"); + +-- [2024-10-14 20:10:28] Изменение атрибута user_office; +REPLACE INTO `_sys_datatypes` (`attr_type`, `attr_templ`, `attr_desc`, `attr_hide`, `attr_mand`, `attr_order`, `_sys_deleted`, `obj_name`, `attr_name`) VALUES ("LINK|_sys_users_offices" , "[title]" , "Отдел" , "0" , "0" , "100" , "0" , "_sys_users" , "user_office"); diff --git a/app/php-cs-fixer.cmd b/app/php-cs-fixer.cmd new file mode 100644 index 0000000..0c14f9f --- /dev/null +++ b/app/php-cs-fixer.cmd @@ -0,0 +1,2 @@ +php vendor/bin/php-cs-fixer --config=tools/.php-cs-fixer.php --allow-risky=no fix +pause \ No newline at end of file diff --git a/app/public_html/.htaccess b/app/public_html/.htaccess new file mode 100644 index 0000000..4de3d35 --- /dev/null +++ b/app/public_html/.htaccess @@ -0,0 +1,24 @@ +Options +FollowSymlinks +RewriteEngine On +RewriteBase / + + +RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC] +RewriteRule .* - [F,L] + +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d + +RewriteRule ^index$ / [R=301,L] + + + +#RewriteRule ^images/(\d{1,}).jpg$ img.php?id=$1 [L,QSA] +#RewriteRule ^images/-(\d{1,}).jpg$ img.php?id=-$1 [L,QSA] +#RewriteRule \.(jpg|jpeg|png|gif|ico|css|js|html|php)$ - [L] + +# For Friendly URLs +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] + diff --git a/app/public_html/admin/ajax-city.php b/app/public_html/admin/ajax-city.php new file mode 100644 index 0000000..c6f6d1d --- /dev/null +++ b/app/public_html/admin/ajax-city.php @@ -0,0 +1,31 @@ +getDB()->q($obj->getSelect(' AND `title` LIKE "' . db_escape_string($_GET['str']) . '%" AND `_sys_enabled` ORDER BY _sys_city.big_city DESC, region_id ASC, `_sys_city`.`title` ASC LIMIT 100')); +while($db2->r()) { + $obj->lRow($db2); + $tt[] = $obj->assign("{title} ({city_fullname})|{_sys_city_id}"); + +} + +if ($tt) { + die(implode("\n", $tt)); +} else { + die('Такой населенный пункт не найден.|0'); +} diff --git a/app/public_html/admin/assets/css/bootstrap.css b/app/public_html/admin/assets/css/bootstrap.css new file mode 100644 index 0000000..3576a07 --- /dev/null +++ b/app/public_html/admin/assets/css/bootstrap.css @@ -0,0 +1,9601 @@ +/*! + * Bootstrap v4.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +:root { + --blue: #0280C1; + --indigo: #6610f2; + --purple: #844E9F; + --pink: #e83e8c; + --red: #FF2222; + --orange: #F08144; + --yellow: #FECC02; + --green: #28a745; + --teal: #20c997; + --cyan: #89D0F1; + --white: #fff; + --gray: #6c757d; + --gray-dark: #343a40; + --primary: #050505; + --secondary: #e6e8e8; + --success: #28a745; + --info: #3590dc; + --warning: #FECC02; + --danger: #FF2222; + --light: #e9ecef; + --dark: #212529; + --action: #844E9F; + --gray: #ced4da; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 979px; + --breakpoint-xl: 1240px; + --breakpoint-xxl: 1600px; + --font-family-sans-serif: Tahoma, -apple-system, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } + +*, +*::before, +*::after { + box-sizing: border-box; } + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; } + +body { + margin: 0; + font-family: Tahoma, -apple-system, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: left; + background-color: #fff; } + +[tabindex="-1"]:focus:not(:focus-visible) { + outline: 0 !important; } + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; } + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; } + +p { + margin-top: 0; + margin-bottom: 1rem; } + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + text-decoration-skip-ink: none; } + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; } + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; } + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; } + +dt { + font-weight: 700; } + +dd { + margin-bottom: .5rem; + margin-left: 0; } + +blockquote { + margin: 0 0 1rem; } + +b, +strong { + font-weight: bolder; } + +small { + font-size: 80%; } + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; } + +sub { + bottom: -.25em; } + +sup { + top: -.5em; } + +a { + color: #050505; + text-decoration: none; + background-color: transparent; } + a:hover { + color: black; + text-decoration: underline; } + +a:not([href]) { + color: inherit; + text-decoration: none; } + a:not([href]):hover { + color: inherit; + text-decoration: none; } + +pre, +code, +kbd, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em; } + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; } + +figure { + margin: 0 0 1rem; } + +img { + vertical-align: middle; + border-style: none; } + +svg { + overflow: hidden; + vertical-align: middle; } + +table { + border-collapse: collapse; } + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #6c757d; + text-align: left; + caption-side: bottom; } + +th { + text-align: inherit; } + +label { + display: inline-block; + margin-bottom: 0.5rem; } + +button { + border-radius: 0; } + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; } + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; } + +button, +input { + overflow: visible; } + +button, +select { + text-transform: none; } + +select { + word-wrap: normal; } + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; } + +button:not(:disabled), +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled) { + cursor: pointer; } + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; } + +input[type="radio"], +input[type="checkbox"] { + box-sizing: border-box; + padding: 0; } + +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="month"] { + -webkit-appearance: listbox; } + +textarea { + overflow: auto; + resize: vertical; } + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; } + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; } + @media (max-width: 1200px) { + legend { + font-size: calc(1.275rem + 0.3vw) ; } } + +progress { + vertical-align: baseline; } + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; } + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; } + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; } + +output { + display: inline-block; } + +summary { + display: list-item; + cursor: pointer; } + +template { + display: none; } + +[hidden] { + display: none !important; } + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; } + +h1, .h1 { + font-size: 1.5rem; } + @media (max-width: 1200px) { + h1, .h1 { + font-size: calc(1.275rem + 0.3vw) ; } } + +h2, .h2 { + font-size: 1.3rem; } + @media (max-width: 1200px) { + h2, .h2 { + font-size: calc(1.255rem + 0.06vw) ; } } + +h3, .h3 { + font-size: 1.2rem; } + +h4, .h4 { + font-size: 1.1rem; } + +h5, .h5 { + font-size: 1.1rem; } + +h6, .h6 { + font-size: 1rem; } + +.lead { + font-size: 1.25rem; + font-weight: 300; } + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2; } + @media (max-width: 1200px) { + .display-1 { + font-size: calc(1.725rem + 5.7vw) ; } } + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2; } + @media (max-width: 1200px) { + .display-2 { + font-size: calc(1.675rem + 5.1vw) ; } } + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2; } + @media (max-width: 1200px) { + .display-3 { + font-size: calc(1.575rem + 3.9vw) ; } } + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2; } + @media (max-width: 1200px) { + .display-4 { + font-size: calc(1.475rem + 2.7vw) ; } } + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); } + +small, +.small { + font-size: 80%; + font-weight: 400; } + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; } + +.list-unstyled { + padding-left: 0; + list-style: none; } + +.list-inline { + padding-left: 0; + list-style: none; } + +.list-inline-item { + display: inline-block; } + .list-inline-item:not(:last-child) { + margin-right: 0.5rem; } + +.initialism { + font-size: 90%; + text-transform: uppercase; } + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; } + +.blockquote-footer { + display: block; + font-size: 80%; + color: #6c757d; } + .blockquote-footer::before { + content: "\2014\00A0"; } + +.img-fluid { + max-width: 100%; + height: auto; } + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + max-width: 100%; + height: auto; } + +.figure { + display: inline-block; } + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; } + +.figure-caption { + font-size: 90%; + color: #6c757d; } + +code { + font-size: 87.5%; + color: #e83e8c; + word-wrap: break-word; } + a > code { + color: inherit; } + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #fff; + background-color: #212529; + border-radius: 0.2rem; } + kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; } + +pre { + display: block; + font-size: 87.5%; + color: #212529; } + pre code { + font-size: inherit; + color: inherit; + word-break: normal; } + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; } + +.container { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } + @media (min-width: 576px) { + .container { + max-width: 540px; } } + @media (min-width: 768px) { + .container { + max-width: 720px; } } + @media (min-width: 979px) { + .container { + max-width: 960px; } } + @media (min-width: 1240px) { + .container { + max-width: 1240px; } } + @media (min-width: 1600px) { + .container { + max-width: 1600px; } } + +.container-fluid, .container-sm, .container-md, .container-lg, .container-xl, .container-xxl { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } + +@media (min-width: 576px) { + .container, .container-sm { + max-width: 540px; } } +@media (min-width: 768px) { + .container, .container-sm, .container-md { + max-width: 720px; } } +@media (min-width: 979px) { + .container, .container-sm, .container-md, .container-lg { + max-width: 960px; } } +@media (min-width: 1240px) { + .container, .container-sm, .container-md, .container-lg, .container-xl { + max-width: 1240px; } } +@media (min-width: 1600px) { + .container, .container-sm, .container-md, .container-lg, .container-xl, .container-xxl { + max-width: 1600px; } } +.row { + display: flex; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; } + +.no-gutters { + margin-right: 0; + margin-left: 0; } + .no-gutters > .col, + .no-gutters > [class*="col-"] { + padding-right: 0; + padding-left: 0; } + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, +.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, +.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, +.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, +.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, +.col-xl-auto, .col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12, .col-xxl, +.col-xxl-auto { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; } + +.col { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; } + +.row-cols-1 > * { + flex: 0 0 100%; + max-width: 100%; } + +.row-cols-2 > * { + flex: 0 0 50%; + max-width: 50%; } + +.row-cols-3 > * { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } + +.row-cols-4 > * { + flex: 0 0 25%; + max-width: 25%; } + +.row-cols-5 > * { + flex: 0 0 20%; + max-width: 20%; } + +.row-cols-6 > * { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } + +.row-cols-7 > * { + flex: 0 0 14.2857142857%; + max-width: 14.2857142857%; } + +.row-cols-8 > * { + flex: 0 0 12.5%; + max-width: 12.5%; } + +.row-cols-9 > * { + flex: 0 0 11.1111111111%; + max-width: 11.1111111111%; } + +.row-cols-10 > * { + flex: 0 0 10%; + max-width: 10%; } + +.row-cols-11 > * { + flex: 0 0 9.0909090909%; + max-width: 9.0909090909%; } + +.row-cols-12 > * { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } + +.col-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; } + +.col-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } + +.col-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } + +.col-3 { + flex: 0 0 25%; + max-width: 25%; } + +.col-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } + +.col-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; } + +.col-6 { + flex: 0 0 50%; + max-width: 50%; } + +.col-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; } + +.col-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; } + +.col-9 { + flex: 0 0 75%; + max-width: 75%; } + +.col-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; } + +.col-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; } + +.col-12 { + flex: 0 0 100%; + max-width: 100%; } + +.order-first { + order: -1; } + +.order-last { + order: 13; } + +.order-0 { + order: 0; } + +.order-1 { + order: 1; } + +.order-2 { + order: 2; } + +.order-3 { + order: 3; } + +.order-4 { + order: 4; } + +.order-5 { + order: 5; } + +.order-6 { + order: 6; } + +.order-7 { + order: 7; } + +.order-8 { + order: 8; } + +.order-9 { + order: 9; } + +.order-10 { + order: 10; } + +.order-11 { + order: 11; } + +.order-12 { + order: 12; } + +.offset-1 { + margin-left: 8.3333333333%; } + +.offset-2 { + margin-left: 16.6666666667%; } + +.offset-3 { + margin-left: 25%; } + +.offset-4 { + margin-left: 33.3333333333%; } + +.offset-5 { + margin-left: 41.6666666667%; } + +.offset-6 { + margin-left: 50%; } + +.offset-7 { + margin-left: 58.3333333333%; } + +.offset-8 { + margin-left: 66.6666666667%; } + +.offset-9 { + margin-left: 75%; } + +.offset-10 { + margin-left: 83.3333333333%; } + +.offset-11 { + margin-left: 91.6666666667%; } + +@media (min-width: 576px) { + .col-sm { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; } + + .row-cols-sm-1 > * { + flex: 0 0 100%; + max-width: 100%; } + + .row-cols-sm-2 > * { + flex: 0 0 50%; + max-width: 50%; } + + .row-cols-sm-3 > * { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } + + .row-cols-sm-4 > * { + flex: 0 0 25%; + max-width: 25%; } + + .row-cols-sm-5 > * { + flex: 0 0 20%; + max-width: 20%; } + + .row-cols-sm-6 > * { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } + + .row-cols-sm-7 > * { + flex: 0 0 14.2857142857%; + max-width: 14.2857142857%; } + + .row-cols-sm-8 > * { + flex: 0 0 12.5%; + max-width: 12.5%; } + + .row-cols-sm-9 > * { + flex: 0 0 11.1111111111%; + max-width: 11.1111111111%; } + + .row-cols-sm-10 > * { + flex: 0 0 10%; + max-width: 10%; } + + .row-cols-sm-11 > * { + flex: 0 0 9.0909090909%; + max-width: 9.0909090909%; } + + .row-cols-sm-12 > * { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } + + .col-sm-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; } + + .col-sm-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } + + .col-sm-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } + + .col-sm-3 { + flex: 0 0 25%; + max-width: 25%; } + + .col-sm-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } + + .col-sm-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; } + + .col-sm-6 { + flex: 0 0 50%; + max-width: 50%; } + + .col-sm-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; } + + .col-sm-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; } + + .col-sm-9 { + flex: 0 0 75%; + max-width: 75%; } + + .col-sm-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; } + + .col-sm-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; } + + .col-sm-12 { + flex: 0 0 100%; + max-width: 100%; } + + .order-sm-first { + order: -1; } + + .order-sm-last { + order: 13; } + + .order-sm-0 { + order: 0; } + + .order-sm-1 { + order: 1; } + + .order-sm-2 { + order: 2; } + + .order-sm-3 { + order: 3; } + + .order-sm-4 { + order: 4; } + + .order-sm-5 { + order: 5; } + + .order-sm-6 { + order: 6; } + + .order-sm-7 { + order: 7; } + + .order-sm-8 { + order: 8; } + + .order-sm-9 { + order: 9; } + + .order-sm-10 { + order: 10; } + + .order-sm-11 { + order: 11; } + + .order-sm-12 { + order: 12; } + + .offset-sm-0 { + margin-left: 0; } + + .offset-sm-1 { + margin-left: 8.3333333333%; } + + .offset-sm-2 { + margin-left: 16.6666666667%; } + + .offset-sm-3 { + margin-left: 25%; } + + .offset-sm-4 { + margin-left: 33.3333333333%; } + + .offset-sm-5 { + margin-left: 41.6666666667%; } + + .offset-sm-6 { + margin-left: 50%; } + + .offset-sm-7 { + margin-left: 58.3333333333%; } + + .offset-sm-8 { + margin-left: 66.6666666667%; } + + .offset-sm-9 { + margin-left: 75%; } + + .offset-sm-10 { + margin-left: 83.3333333333%; } + + .offset-sm-11 { + margin-left: 91.6666666667%; } } +@media (min-width: 768px) { + .col-md { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; } + + .row-cols-md-1 > * { + flex: 0 0 100%; + max-width: 100%; } + + .row-cols-md-2 > * { + flex: 0 0 50%; + max-width: 50%; } + + .row-cols-md-3 > * { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } + + .row-cols-md-4 > * { + flex: 0 0 25%; + max-width: 25%; } + + .row-cols-md-5 > * { + flex: 0 0 20%; + max-width: 20%; } + + .row-cols-md-6 > * { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } + + .row-cols-md-7 > * { + flex: 0 0 14.2857142857%; + max-width: 14.2857142857%; } + + .row-cols-md-8 > * { + flex: 0 0 12.5%; + max-width: 12.5%; } + + .row-cols-md-9 > * { + flex: 0 0 11.1111111111%; + max-width: 11.1111111111%; } + + .row-cols-md-10 > * { + flex: 0 0 10%; + max-width: 10%; } + + .row-cols-md-11 > * { + flex: 0 0 9.0909090909%; + max-width: 9.0909090909%; } + + .row-cols-md-12 > * { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } + + .col-md-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; } + + .col-md-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } + + .col-md-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } + + .col-md-3 { + flex: 0 0 25%; + max-width: 25%; } + + .col-md-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } + + .col-md-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; } + + .col-md-6 { + flex: 0 0 50%; + max-width: 50%; } + + .col-md-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; } + + .col-md-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; } + + .col-md-9 { + flex: 0 0 75%; + max-width: 75%; } + + .col-md-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; } + + .col-md-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; } + + .col-md-12 { + flex: 0 0 100%; + max-width: 100%; } + + .order-md-first { + order: -1; } + + .order-md-last { + order: 13; } + + .order-md-0 { + order: 0; } + + .order-md-1 { + order: 1; } + + .order-md-2 { + order: 2; } + + .order-md-3 { + order: 3; } + + .order-md-4 { + order: 4; } + + .order-md-5 { + order: 5; } + + .order-md-6 { + order: 6; } + + .order-md-7 { + order: 7; } + + .order-md-8 { + order: 8; } + + .order-md-9 { + order: 9; } + + .order-md-10 { + order: 10; } + + .order-md-11 { + order: 11; } + + .order-md-12 { + order: 12; } + + .offset-md-0 { + margin-left: 0; } + + .offset-md-1 { + margin-left: 8.3333333333%; } + + .offset-md-2 { + margin-left: 16.6666666667%; } + + .offset-md-3 { + margin-left: 25%; } + + .offset-md-4 { + margin-left: 33.3333333333%; } + + .offset-md-5 { + margin-left: 41.6666666667%; } + + .offset-md-6 { + margin-left: 50%; } + + .offset-md-7 { + margin-left: 58.3333333333%; } + + .offset-md-8 { + margin-left: 66.6666666667%; } + + .offset-md-9 { + margin-left: 75%; } + + .offset-md-10 { + margin-left: 83.3333333333%; } + + .offset-md-11 { + margin-left: 91.6666666667%; } } +@media (min-width: 979px) { + .col-lg { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; } + + .row-cols-lg-1 > * { + flex: 0 0 100%; + max-width: 100%; } + + .row-cols-lg-2 > * { + flex: 0 0 50%; + max-width: 50%; } + + .row-cols-lg-3 > * { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } + + .row-cols-lg-4 > * { + flex: 0 0 25%; + max-width: 25%; } + + .row-cols-lg-5 > * { + flex: 0 0 20%; + max-width: 20%; } + + .row-cols-lg-6 > * { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } + + .row-cols-lg-7 > * { + flex: 0 0 14.2857142857%; + max-width: 14.2857142857%; } + + .row-cols-lg-8 > * { + flex: 0 0 12.5%; + max-width: 12.5%; } + + .row-cols-lg-9 > * { + flex: 0 0 11.1111111111%; + max-width: 11.1111111111%; } + + .row-cols-lg-10 > * { + flex: 0 0 10%; + max-width: 10%; } + + .row-cols-lg-11 > * { + flex: 0 0 9.0909090909%; + max-width: 9.0909090909%; } + + .row-cols-lg-12 > * { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } + + .col-lg-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; } + + .col-lg-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } + + .col-lg-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } + + .col-lg-3 { + flex: 0 0 25%; + max-width: 25%; } + + .col-lg-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } + + .col-lg-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; } + + .col-lg-6 { + flex: 0 0 50%; + max-width: 50%; } + + .col-lg-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; } + + .col-lg-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; } + + .col-lg-9 { + flex: 0 0 75%; + max-width: 75%; } + + .col-lg-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; } + + .col-lg-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; } + + .col-lg-12 { + flex: 0 0 100%; + max-width: 100%; } + + .order-lg-first { + order: -1; } + + .order-lg-last { + order: 13; } + + .order-lg-0 { + order: 0; } + + .order-lg-1 { + order: 1; } + + .order-lg-2 { + order: 2; } + + .order-lg-3 { + order: 3; } + + .order-lg-4 { + order: 4; } + + .order-lg-5 { + order: 5; } + + .order-lg-6 { + order: 6; } + + .order-lg-7 { + order: 7; } + + .order-lg-8 { + order: 8; } + + .order-lg-9 { + order: 9; } + + .order-lg-10 { + order: 10; } + + .order-lg-11 { + order: 11; } + + .order-lg-12 { + order: 12; } + + .offset-lg-0 { + margin-left: 0; } + + .offset-lg-1 { + margin-left: 8.3333333333%; } + + .offset-lg-2 { + margin-left: 16.6666666667%; } + + .offset-lg-3 { + margin-left: 25%; } + + .offset-lg-4 { + margin-left: 33.3333333333%; } + + .offset-lg-5 { + margin-left: 41.6666666667%; } + + .offset-lg-6 { + margin-left: 50%; } + + .offset-lg-7 { + margin-left: 58.3333333333%; } + + .offset-lg-8 { + margin-left: 66.6666666667%; } + + .offset-lg-9 { + margin-left: 75%; } + + .offset-lg-10 { + margin-left: 83.3333333333%; } + + .offset-lg-11 { + margin-left: 91.6666666667%; } } +@media (min-width: 1240px) { + .col-xl { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; } + + .row-cols-xl-1 > * { + flex: 0 0 100%; + max-width: 100%; } + + .row-cols-xl-2 > * { + flex: 0 0 50%; + max-width: 50%; } + + .row-cols-xl-3 > * { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } + + .row-cols-xl-4 > * { + flex: 0 0 25%; + max-width: 25%; } + + .row-cols-xl-5 > * { + flex: 0 0 20%; + max-width: 20%; } + + .row-cols-xl-6 > * { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } + + .row-cols-xl-7 > * { + flex: 0 0 14.2857142857%; + max-width: 14.2857142857%; } + + .row-cols-xl-8 > * { + flex: 0 0 12.5%; + max-width: 12.5%; } + + .row-cols-xl-9 > * { + flex: 0 0 11.1111111111%; + max-width: 11.1111111111%; } + + .row-cols-xl-10 > * { + flex: 0 0 10%; + max-width: 10%; } + + .row-cols-xl-11 > * { + flex: 0 0 9.0909090909%; + max-width: 9.0909090909%; } + + .row-cols-xl-12 > * { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } + + .col-xl-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; } + + .col-xl-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } + + .col-xl-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } + + .col-xl-3 { + flex: 0 0 25%; + max-width: 25%; } + + .col-xl-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } + + .col-xl-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; } + + .col-xl-6 { + flex: 0 0 50%; + max-width: 50%; } + + .col-xl-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; } + + .col-xl-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; } + + .col-xl-9 { + flex: 0 0 75%; + max-width: 75%; } + + .col-xl-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; } + + .col-xl-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; } + + .col-xl-12 { + flex: 0 0 100%; + max-width: 100%; } + + .order-xl-first { + order: -1; } + + .order-xl-last { + order: 13; } + + .order-xl-0 { + order: 0; } + + .order-xl-1 { + order: 1; } + + .order-xl-2 { + order: 2; } + + .order-xl-3 { + order: 3; } + + .order-xl-4 { + order: 4; } + + .order-xl-5 { + order: 5; } + + .order-xl-6 { + order: 6; } + + .order-xl-7 { + order: 7; } + + .order-xl-8 { + order: 8; } + + .order-xl-9 { + order: 9; } + + .order-xl-10 { + order: 10; } + + .order-xl-11 { + order: 11; } + + .order-xl-12 { + order: 12; } + + .offset-xl-0 { + margin-left: 0; } + + .offset-xl-1 { + margin-left: 8.3333333333%; } + + .offset-xl-2 { + margin-left: 16.6666666667%; } + + .offset-xl-3 { + margin-left: 25%; } + + .offset-xl-4 { + margin-left: 33.3333333333%; } + + .offset-xl-5 { + margin-left: 41.6666666667%; } + + .offset-xl-6 { + margin-left: 50%; } + + .offset-xl-7 { + margin-left: 58.3333333333%; } + + .offset-xl-8 { + margin-left: 66.6666666667%; } + + .offset-xl-9 { + margin-left: 75%; } + + .offset-xl-10 { + margin-left: 83.3333333333%; } + + .offset-xl-11 { + margin-left: 91.6666666667%; } } +@media (min-width: 1600px) { + .col-xxl { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; } + + .row-cols-xxl-1 > * { + flex: 0 0 100%; + max-width: 100%; } + + .row-cols-xxl-2 > * { + flex: 0 0 50%; + max-width: 50%; } + + .row-cols-xxl-3 > * { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } + + .row-cols-xxl-4 > * { + flex: 0 0 25%; + max-width: 25%; } + + .row-cols-xxl-5 > * { + flex: 0 0 20%; + max-width: 20%; } + + .row-cols-xxl-6 > * { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } + + .row-cols-xxl-7 > * { + flex: 0 0 14.2857142857%; + max-width: 14.2857142857%; } + + .row-cols-xxl-8 > * { + flex: 0 0 12.5%; + max-width: 12.5%; } + + .row-cols-xxl-9 > * { + flex: 0 0 11.1111111111%; + max-width: 11.1111111111%; } + + .row-cols-xxl-10 > * { + flex: 0 0 10%; + max-width: 10%; } + + .row-cols-xxl-11 > * { + flex: 0 0 9.0909090909%; + max-width: 9.0909090909%; } + + .row-cols-xxl-12 > * { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } + + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; } + + .col-xxl-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } + + .col-xxl-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } + + .col-xxl-3 { + flex: 0 0 25%; + max-width: 25%; } + + .col-xxl-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } + + .col-xxl-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; } + + .col-xxl-6 { + flex: 0 0 50%; + max-width: 50%; } + + .col-xxl-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; } + + .col-xxl-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; } + + .col-xxl-9 { + flex: 0 0 75%; + max-width: 75%; } + + .col-xxl-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; } + + .col-xxl-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; } + + .col-xxl-12 { + flex: 0 0 100%; + max-width: 100%; } + + .order-xxl-first { + order: -1; } + + .order-xxl-last { + order: 13; } + + .order-xxl-0 { + order: 0; } + + .order-xxl-1 { + order: 1; } + + .order-xxl-2 { + order: 2; } + + .order-xxl-3 { + order: 3; } + + .order-xxl-4 { + order: 4; } + + .order-xxl-5 { + order: 5; } + + .order-xxl-6 { + order: 6; } + + .order-xxl-7 { + order: 7; } + + .order-xxl-8 { + order: 8; } + + .order-xxl-9 { + order: 9; } + + .order-xxl-10 { + order: 10; } + + .order-xxl-11 { + order: 11; } + + .order-xxl-12 { + order: 12; } + + .offset-xxl-0 { + margin-left: 0; } + + .offset-xxl-1 { + margin-left: 8.3333333333%; } + + .offset-xxl-2 { + margin-left: 16.6666666667%; } + + .offset-xxl-3 { + margin-left: 25%; } + + .offset-xxl-4 { + margin-left: 33.3333333333%; } + + .offset-xxl-5 { + margin-left: 41.6666666667%; } + + .offset-xxl-6 { + margin-left: 50%; } + + .offset-xxl-7 { + margin-left: 58.3333333333%; } + + .offset-xxl-8 { + margin-left: 66.6666666667%; } + + .offset-xxl-9 { + margin-left: 75%; } + + .offset-xxl-10 { + margin-left: 83.3333333333%; } + + .offset-xxl-11 { + margin-left: 91.6666666667%; } } +@media print { + .col-print-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } } +@media print { + .col-print-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } } +@media print { + .col-print-3 { + flex: 0 0 25%; + max-width: 25%; } } +@media print { + .col-print-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } } +@media print { + .col-print-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; } } +@media print { + .col-print-6 { + flex: 0 0 50%; + max-width: 50%; } } +@media print { + .col-print-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; } } +@media print { + .col-print-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; } } +@media print { + .col-print-9 { + flex: 0 0 75%; + max-width: 75%; } } +@media print { + .col-print-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; } } +@media print { + .col-print-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; } } +@media print { + .col-print-12 { + flex: 0 0 100%; + max-width: 100%; } } +@media print and (min-width: 576px) { + .col-print-sm-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } } +@media print and (min-width: 576px) { + .col-print-sm-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } } +@media print and (min-width: 576px) { + .col-print-sm-3 { + flex: 0 0 25%; + max-width: 25%; } } +@media print and (min-width: 576px) { + .col-print-sm-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } } +@media print and (min-width: 576px) { + .col-print-sm-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; } } +@media print and (min-width: 576px) { + .col-print-sm-6 { + flex: 0 0 50%; + max-width: 50%; } } +@media print and (min-width: 576px) { + .col-print-sm-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; } } +@media print and (min-width: 576px) { + .col-print-sm-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; } } +@media print and (min-width: 576px) { + .col-print-sm-9 { + flex: 0 0 75%; + max-width: 75%; } } +@media print and (min-width: 576px) { + .col-print-sm-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; } } +@media print and (min-width: 576px) { + .col-print-sm-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; } } +@media print and (min-width: 576px) { + .col-print-sm-12 { + flex: 0 0 100%; + max-width: 100%; } } +@media print and (min-width: 768px) { + .col-print-md-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } } +@media print and (min-width: 768px) { + .col-print-md-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } } +@media print and (min-width: 768px) { + .col-print-md-3 { + flex: 0 0 25%; + max-width: 25%; } } +@media print and (min-width: 768px) { + .col-print-md-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } } +@media print and (min-width: 768px) { + .col-print-md-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; } } +@media print and (min-width: 768px) { + .col-print-md-6 { + flex: 0 0 50%; + max-width: 50%; } } +@media print and (min-width: 768px) { + .col-print-md-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; } } +@media print and (min-width: 768px) { + .col-print-md-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; } } +@media print and (min-width: 768px) { + .col-print-md-9 { + flex: 0 0 75%; + max-width: 75%; } } +@media print and (min-width: 768px) { + .col-print-md-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; } } +@media print and (min-width: 768px) { + .col-print-md-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; } } +@media print and (min-width: 768px) { + .col-print-md-12 { + flex: 0 0 100%; + max-width: 100%; } } +@media print and (min-width: 979px) { + .col-print-lg-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } } +@media print and (min-width: 979px) { + .col-print-lg-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } } +@media print and (min-width: 979px) { + .col-print-lg-3 { + flex: 0 0 25%; + max-width: 25%; } } +@media print and (min-width: 979px) { + .col-print-lg-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } } +@media print and (min-width: 979px) { + .col-print-lg-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; } } +@media print and (min-width: 979px) { + .col-print-lg-6 { + flex: 0 0 50%; + max-width: 50%; } } +@media print and (min-width: 979px) { + .col-print-lg-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; } } +@media print and (min-width: 979px) { + .col-print-lg-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; } } +@media print and (min-width: 979px) { + .col-print-lg-9 { + flex: 0 0 75%; + max-width: 75%; } } +@media print and (min-width: 979px) { + .col-print-lg-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; } } +@media print and (min-width: 979px) { + .col-print-lg-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; } } +@media print and (min-width: 979px) { + .col-print-lg-12 { + flex: 0 0 100%; + max-width: 100%; } } +@media print and (min-width: 1240px) { + .col-print-xl-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } } +@media print and (min-width: 1240px) { + .col-print-xl-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } } +@media print and (min-width: 1240px) { + .col-print-xl-3 { + flex: 0 0 25%; + max-width: 25%; } } +@media print and (min-width: 1240px) { + .col-print-xl-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } } +@media print and (min-width: 1240px) { + .col-print-xl-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; } } +@media print and (min-width: 1240px) { + .col-print-xl-6 { + flex: 0 0 50%; + max-width: 50%; } } +@media print and (min-width: 1240px) { + .col-print-xl-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; } } +@media print and (min-width: 1240px) { + .col-print-xl-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; } } +@media print and (min-width: 1240px) { + .col-print-xl-9 { + flex: 0 0 75%; + max-width: 75%; } } +@media print and (min-width: 1240px) { + .col-print-xl-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; } } +@media print and (min-width: 1240px) { + .col-print-xl-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; } } +@media print and (min-width: 1240px) { + .col-print-xl-12 { + flex: 0 0 100%; + max-width: 100%; } } +@media print and (min-width: 1600px) { + .col-print-xxl-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; } } +@media print and (min-width: 1600px) { + .col-print-xxl-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; } } +@media print and (min-width: 1600px) { + .col-print-xxl-3 { + flex: 0 0 25%; + max-width: 25%; } } +@media print and (min-width: 1600px) { + .col-print-xxl-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; } } +@media print and (min-width: 1600px) { + .col-print-xxl-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; } } +@media print and (min-width: 1600px) { + .col-print-xxl-6 { + flex: 0 0 50%; + max-width: 50%; } } +@media print and (min-width: 1600px) { + .col-print-xxl-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; } } +@media print and (min-width: 1600px) { + .col-print-xxl-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; } } +@media print and (min-width: 1600px) { + .col-print-xxl-9 { + flex: 0 0 75%; + max-width: 75%; } } +@media print and (min-width: 1600px) { + .col-print-xxl-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; } } +@media print and (min-width: 1600px) { + .col-print-xxl-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; } } +@media print and (min-width: 1600px) { + .col-print-xxl-12 { + flex: 0 0 100%; + max-width: 100%; } } +.table { + width: 100%; + margin-bottom: 1rem; + color: #212529; } + .table th, + .table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #dee2e6; } + .table thead th { + vertical-align: bottom; + border-bottom: 2px solid #dee2e6; } + .table tbody + tbody { + border-top: 2px solid #dee2e6; } + +.table-sm th, +.table-sm td { + padding: 0.3rem; } + +.table-bordered { + border: 1px solid #dee2e6; } + .table-bordered th, + .table-bordered td { + border: 1px solid #dee2e6; } + .table-bordered thead th, + .table-bordered thead td { + border-bottom-width: 2px; } + +.table-borderless th, +.table-borderless td, +.table-borderless thead th, +.table-borderless tbody + tbody { + border: 0; } + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); } + +.table-hover tbody tr:hover { + color: #212529; + background-color: rgba(0, 0, 0, 0.075); } + +.table-primary, +.table-primary > th, +.table-primary > td { + background-color: whitesmoke; } +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #7d7d7d; } + +.table-hover .table-primary:hover { + background-color: #e8e8e8; } + .table-hover .table-primary:hover > td, + .table-hover .table-primary:hover > th { + background-color: #e8e8e8; } + +.table-secondary, +.table-secondary > th, +.table-secondary > td { + background-color: #fefefe; } +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #f2f3f3; } + +.table-hover .table-secondary:hover { + background-color: #f1f1f1; } + .table-hover .table-secondary:hover > td, + .table-hover .table-secondary:hover > th { + background-color: #f1f1f1; } + +.table-success, +.table-success > th, +.table-success > td { + background-color: #f6fbf8; } +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #8fd19e; } + +.table-hover .table-success:hover { + background-color: #e4f3ea; } + .table-hover .table-success:hover > td, + .table-hover .table-success:hover > th { + background-color: #e4f3ea; } + +.table-info, +.table-info > th, +.table-info > td { + background-color: #f7fbfe; } +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #96c5ed; } + +.table-hover .table-info:hover { + background-color: #e0f0fb; } + .table-hover .table-info:hover > td, + .table-hover .table-info:hover > th { + background-color: #e0f0fb; } + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #fffdf5; } +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #fee47b; } + +.table-hover .table-warning:hover { + background-color: cornsilk; } + .table-hover .table-warning:hover > td, + .table-hover .table-warning:hover > th { + background-color: cornsilk; } + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #fff6f6; } +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #ff8c8c; } + +.table-hover .table-danger:hover { + background-color: #ffdddd; } + .table-hover .table-danger:hover > td, + .table-hover .table-danger:hover > th { + background-color: #ffdddd; } + +.table-light, +.table-light > th, +.table-light > td { + background-color: #fefefe; } +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #f4f5f7; } + +.table-hover .table-light:hover { + background-color: #f1f1f1; } + .table-hover .table-light:hover > td, + .table-hover .table-light:hover > th { + background-color: #f1f1f1; } + +.table-dark, +.table-dark > th, +.table-dark > td { + background-color: #f6f6f6; } +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #8c8e90; } + +.table-hover .table-dark:hover { + background-color: #e9e9e9; } + .table-hover .table-dark:hover > td, + .table-hover .table-dark:hover > th { + background-color: #e9e9e9; } + +.table-action, +.table-action > th, +.table-action > td { + background-color: #faf8fb; } +.table-action th, +.table-action td, +.table-action thead th, +.table-action tbody + tbody { + border-color: #bfa3cd; } + +.table-hover .table-action:hover { + background-color: #eee8f2; } + .table-hover .table-action:hover > td, + .table-hover .table-action:hover > th { + background-color: #eee8f2; } + +.table-gray, +.table-gray > th, +.table-gray > td { + background-color: #fdfdfe; } +.table-gray th, +.table-gray td, +.table-gray thead th, +.table-gray tbody + tbody { + border-color: #e6e9ec; } + +.table-hover .table-gray:hover { + background-color: #ececf6; } + .table-hover .table-gray:hover > td, + .table-hover .table-gray:hover > th { + background-color: #ececf6; } + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); } + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); } + .table-hover .table-active:hover > td, + .table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); } + +.table .thead-dark th { + color: #fff; + background-color: #343a40; + border-color: #454d55; } +.table .thead-light th { + color: #495057; + background-color: #e9ecef; + border-color: #dee2e6; } + +.table-dark { + color: #fff; + background-color: #343a40; } + .table-dark th, + .table-dark td, + .table-dark thead th { + border-color: #454d55; } + .table-dark.table-bordered { + border: 0; } + .table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, 0.05); } + .table-dark.table-hover tbody tr:hover { + color: #fff; + background-color: rgba(255, 255, 255, 0.075); } + +@media (max-width: 575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive-sm > .table-bordered { + border: 0; } } +@media (max-width: 767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive-md > .table-bordered { + border: 0; } } +@media (max-width: 978.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive-lg > .table-bordered { + border: 0; } } +@media (max-width: 1239.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive-xl > .table-bordered { + border: 0; } } +@media (max-width: 1599.98px) { + .table-responsive-xxl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive-xxl > .table-bordered { + border: 0; } } +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive > .table-bordered { + border: 0; } + +.form-control { + display: block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; } } + .form-control::-ms-expand { + background-color: transparent; + border: 0; } + .form-control:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #495057; } + .form-control:focus { + color: #495057; + background-color: #fff; + border-color: #454545; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(5, 5, 5, 0.25); } + .form-control::placeholder { + color: #6c757d; + opacity: 1; } + .form-control:disabled, .form-control[readonly] { + background-color: #e9ecef; + opacity: 1; } + +select.form-control:focus::-ms-value { + color: #495057; + background-color: #fff; } + +.form-control-file, +.form-control-range { + display: block; + width: 100%; } + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; } + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5; } + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; + line-height: 1.5; } + +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + font-size: 1rem; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; } + .form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; } + +.form-control-sm, +.form-sm .form-control { + height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; } + +.form-control-lg, +.form-lg .form-control { + height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; } + +select.form-control[size], select.form-control[multiple] { + height: auto; } + +textarea.form-control { + height: auto; } + +.form-group { + margin-bottom: 1rem; } + +.form-text { + display: block; + margin-top: 0.25rem; } + +.form-row { + display: flex; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; } + .form-row > .col, + .form-row > [class*="col-"] { + padding-right: 5px; + padding-left: 5px; } + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem; } + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem; } + .form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { + color: #6c757d; } + +.form-check-label { + margin-bottom: 0; } + +.form-check-inline { + display: inline-flex; + align-items: center; + padding-left: 0; + margin-right: 0.75rem; } + .form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0; } + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #28a745; } + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(40, 167, 69, 0.9); + border-radius: 0.25rem; } + +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; } + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #28a745; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #28a745; + padding-right: calc(0.75em + 2.3125rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } + +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #28a745; } +.was-validated .form-check-input:valid ~ .valid-feedback, +.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, +.form-check-input.is-valid ~ .valid-tooltip { + display: block; } + +.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { + color: #28a745; } + .was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { + border-color: #28a745; } +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #34ce57; + background-color: #34ce57; } +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #28a745; } + +.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { + border-color: #28a745; } +.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #FF2222; } + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(255, 34, 34, 0.9); + border-radius: 0.25rem; } + +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; } + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #FF2222; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23FF2222' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23FF2222' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #FF2222; + box-shadow: 0 0 0 0.2rem rgba(255, 34, 34, 0.25); } + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #FF2222; + padding-right: calc(0.75em + 2.3125rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23FF2222' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23FF2222' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #FF2222; + box-shadow: 0 0 0 0.2rem rgba(255, 34, 34, 0.25); } + +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #FF2222; } +.was-validated .form-check-input:invalid ~ .invalid-feedback, +.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, +.form-check-input.is-invalid ~ .invalid-tooltip { + display: block; } + +.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { + color: #FF2222; } + .was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { + border-color: #FF2222; } +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #ff5555; + background-color: #ff5555; } +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(255, 34, 34, 0.25); } +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #FF2222; } + +.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { + border-color: #FF2222; } +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #FF2222; + box-shadow: 0 0 0 0.2rem rgba(255, 34, 34, 0.25); } + +.form-inline { + display: flex; + flex-flow: row wrap; + align-items: center; } + .form-inline .form-check { + width: 100%; } + @media (min-width: 576px) { + .form-inline label { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 0; } + .form-inline .form-group { + display: flex; + flex: 0 0 auto; + flex-flow: row wrap; + align-items: center; + margin-bottom: 0; } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; } + .form-inline .form-control-plaintext { + display: inline-block; } + .form-inline .input-group, + .form-inline .custom-select { + width: auto; } + .form-inline .form-check { + display: flex; + align-items: center; + justify-content: center; + width: auto; + padding-left: 0; } + .form-inline .form-check-input { + position: relative; + flex-shrink: 0; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; } + .form-inline .custom-control { + align-items: center; + justify-content: center; } + .form-inline .custom-control-label { + margin-bottom: 0; } } + +.btn { + display: inline-block; + font-weight: 400; + color: #212529; + text-align: center; + vertical-align: middle; + cursor: pointer; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .btn { + transition: none; } } + .btn:hover { + color: #212529; + text-decoration: none; } + .btn:focus, .btn.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(5, 5, 5, 0.25); } + .btn.disabled, .btn:disabled { + opacity: 0.65; } + +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; } + +.btn-primary { + color: #fff; + background-color: #050505; + border-color: #050505; } + .btn-primary:hover { + color: #fff; + background-color: black; + border-color: black; } + .btn-primary:focus, .btn-primary.focus { + color: #fff; + background-color: black; + border-color: black; + box-shadow: 0 0 0 0.2rem rgba(43, 43, 43, 0.5); } + .btn-primary.disabled, .btn-primary:disabled { + color: #fff; + background-color: #050505; + border-color: #050505; } + .btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: black; + border-color: black; } + .btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(43, 43, 43, 0.5); } + +.btn-secondary { + color: #212529; + background-color: #e6e8e8; + border-color: #e6e8e8; } + .btn-secondary:hover { + color: #212529; + background-color: #d2d6d6; + border-color: #cbd0d0; } + .btn-secondary:focus, .btn-secondary.focus { + color: #212529; + background-color: #d2d6d6; + border-color: #cbd0d0; + box-shadow: 0 0 0 0.2rem rgba(200, 203, 203, 0.5); } + .btn-secondary.disabled, .btn-secondary:disabled { + color: #212529; + background-color: #e6e8e8; + border-color: #e6e8e8; } + .btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, .show > .btn-secondary.dropdown-toggle { + color: #212529; + background-color: #cbd0d0; + border-color: #c5c9c9; } + .btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(200, 203, 203, 0.5); } + +.btn-success { + color: #fff; + background-color: #28a745; + border-color: #28a745; } + .btn-success:hover { + color: #fff; + background-color: #218838; + border-color: #1e7e34; } + .btn-success:focus, .btn-success.focus { + color: #fff; + background-color: #218838; + border-color: #1e7e34; + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); } + .btn-success.disabled, .btn-success:disabled { + color: #fff; + background-color: #28a745; + border-color: #28a745; } + .btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, .show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #1e7e34; + border-color: #1c7430; } + .btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); } + +.btn-info { + color: #fff; + background-color: #3590dc; + border-color: #3590dc; } + .btn-info:hover { + color: #fff; + background-color: #237dc8; + border-color: #2176bd; } + .btn-info:focus, .btn-info.focus { + color: #fff; + background-color: #237dc8; + border-color: #2176bd; + box-shadow: 0 0 0 0.2rem rgba(83, 161, 225, 0.5); } + .btn-info.disabled, .btn-info:disabled { + color: #fff; + background-color: #3590dc; + border-color: #3590dc; } + .btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle { + color: #fff; + background-color: #2176bd; + border-color: #1f6fb2; } + .btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, .show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(83, 161, 225, 0.5); } + +.btn-warning { + color: #212529; + background-color: #FECC02; + border-color: #FECC02; } + .btn-warning:hover { + color: #212529; + background-color: #d9ae01; + border-color: #cca401; } + .btn-warning:focus, .btn-warning.focus { + color: #212529; + background-color: #d9ae01; + border-color: #cca401; + box-shadow: 0 0 0 0.2rem rgba(221, 179, 8, 0.5); } + .btn-warning.disabled, .btn-warning:disabled { + color: #212529; + background-color: #FECC02; + border-color: #FECC02; } + .btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, .show > .btn-warning.dropdown-toggle { + color: #212529; + background-color: #cca401; + border-color: #bf9a01; } + .btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(221, 179, 8, 0.5); } + +.btn-danger { + color: #fff; + background-color: #FF2222; + border-color: #FF2222; } + .btn-danger:hover { + color: #fff; + background-color: #fb0000; + border-color: #ee0000; } + .btn-danger:focus, .btn-danger.focus { + color: #fff; + background-color: #fb0000; + border-color: #ee0000; + box-shadow: 0 0 0 0.2rem rgba(255, 67, 67, 0.5); } + .btn-danger.disabled, .btn-danger:disabled { + color: #fff; + background-color: #FF2222; + border-color: #FF2222; } + .btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, .show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #ee0000; + border-color: #e10000; } + .btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(255, 67, 67, 0.5); } + +.btn-light { + color: #212529; + background-color: #e9ecef; + border-color: #e9ecef; } + .btn-light:hover { + color: #212529; + background-color: #d3d9df; + border-color: #cbd3da; } + .btn-light:focus, .btn-light.focus { + color: #212529; + background-color: #d3d9df; + border-color: #cbd3da; + box-shadow: 0 0 0 0.2rem rgba(203, 206, 209, 0.5); } + .btn-light.disabled, .btn-light:disabled { + color: #212529; + background-color: #e9ecef; + border-color: #e9ecef; } + .btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, .show > .btn-light.dropdown-toggle { + color: #212529; + background-color: #cbd3da; + border-color: #c4ccd4; } + .btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, .show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(203, 206, 209, 0.5); } + +.btn-dark { + color: #fff; + background-color: #212529; + border-color: #212529; } + .btn-dark:hover { + color: #fff; + background-color: #101214; + border-color: #0a0c0d; } + .btn-dark:focus, .btn-dark.focus { + color: #fff; + background-color: #101214; + border-color: #0a0c0d; + box-shadow: 0 0 0 0.2rem rgba(66, 70, 73, 0.5); } + .btn-dark.disabled, .btn-dark:disabled { + color: #fff; + background-color: #212529; + border-color: #212529; } + .btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, .show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #0a0c0d; + border-color: #050506; } + .btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(66, 70, 73, 0.5); } + +.btn-action { + color: #fff; + background-color: #844E9F; + border-color: #844E9F; } + .btn-action:hover { + color: #fff; + background-color: #6f4185; + border-color: #683d7d; } + .btn-action:focus, .btn-action.focus { + color: #fff; + background-color: #6f4185; + border-color: #683d7d; + box-shadow: 0 0 0 0.2rem rgba(150, 105, 173, 0.5); } + .btn-action.disabled, .btn-action:disabled { + color: #fff; + background-color: #844E9F; + border-color: #844E9F; } + .btn-action:not(:disabled):not(.disabled):active, .btn-action:not(:disabled):not(.disabled).active, .show > .btn-action.dropdown-toggle { + color: #fff; + background-color: #683d7d; + border-color: #603974; } + .btn-action:not(:disabled):not(.disabled):active:focus, .btn-action:not(:disabled):not(.disabled).active:focus, .show > .btn-action.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(150, 105, 173, 0.5); } + +.btn-gray { + color: #212529; + background-color: #ced4da; + border-color: #ced4da; } + .btn-gray:hover { + color: #212529; + background-color: #b8c1ca; + border-color: #b1bbc4; } + .btn-gray:focus, .btn-gray.focus { + color: #212529; + background-color: #b8c1ca; + border-color: #b1bbc4; + box-shadow: 0 0 0 0.2rem rgba(180, 186, 191, 0.5); } + .btn-gray.disabled, .btn-gray:disabled { + color: #212529; + background-color: #ced4da; + border-color: #ced4da; } + .btn-gray:not(:disabled):not(.disabled):active, .btn-gray:not(:disabled):not(.disabled).active, .show > .btn-gray.dropdown-toggle { + color: #212529; + background-color: #b1bbc4; + border-color: #aab4bf; } + .btn-gray:not(:disabled):not(.disabled):active:focus, .btn-gray:not(:disabled):not(.disabled).active:focus, .show > .btn-gray.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(180, 186, 191, 0.5); } + +.btn-outline-primary { + color: #050505; + border-color: #050505; } + .btn-outline-primary:hover { + color: #fff; + background-color: #050505; + border-color: #050505; } + .btn-outline-primary:focus, .btn-outline-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(5, 5, 5, 0.5); } + .btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #050505; + background-color: transparent; } + .btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, .show > .btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #050505; + border-color: #050505; } + .btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(5, 5, 5, 0.5); } + +.btn-outline-secondary { + color: #e6e8e8; + border-color: #e6e8e8; } + .btn-outline-secondary:hover { + color: #212529; + background-color: #e6e8e8; + border-color: #e6e8e8; } + .btn-outline-secondary:focus, .btn-outline-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(230, 232, 232, 0.5); } + .btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #e6e8e8; + background-color: transparent; } + .btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, .show > .btn-outline-secondary.dropdown-toggle { + color: #212529; + background-color: #e6e8e8; + border-color: #e6e8e8; } + .btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(230, 232, 232, 0.5); } + +.btn-outline-success { + color: #28a745; + border-color: #28a745; } + .btn-outline-success:hover { + color: #fff; + background-color: #28a745; + border-color: #28a745; } + .btn-outline-success:focus, .btn-outline-success.focus { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } + .btn-outline-success.disabled, .btn-outline-success:disabled { + color: #28a745; + background-color: transparent; } + .btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, .show > .btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #28a745; + border-color: #28a745; } + .btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } + +.btn-outline-info { + color: #3590dc; + border-color: #3590dc; } + .btn-outline-info:hover { + color: #fff; + background-color: #3590dc; + border-color: #3590dc; } + .btn-outline-info:focus, .btn-outline-info.focus { + box-shadow: 0 0 0 0.2rem rgba(53, 144, 220, 0.5); } + .btn-outline-info.disabled, .btn-outline-info:disabled { + color: #3590dc; + background-color: transparent; } + .btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, .show > .btn-outline-info.dropdown-toggle { + color: #fff; + background-color: #3590dc; + border-color: #3590dc; } + .btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(53, 144, 220, 0.5); } + +.btn-outline-warning { + color: #FECC02; + border-color: #FECC02; } + .btn-outline-warning:hover { + color: #212529; + background-color: #FECC02; + border-color: #FECC02; } + .btn-outline-warning:focus, .btn-outline-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(254, 204, 2, 0.5); } + .btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #FECC02; + background-color: transparent; } + .btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, .show > .btn-outline-warning.dropdown-toggle { + color: #212529; + background-color: #FECC02; + border-color: #FECC02; } + .btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(254, 204, 2, 0.5); } + +.btn-outline-danger { + color: #FF2222; + border-color: #FF2222; } + .btn-outline-danger:hover { + color: #fff; + background-color: #FF2222; + border-color: #FF2222; } + .btn-outline-danger:focus, .btn-outline-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(255, 34, 34, 0.5); } + .btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #FF2222; + background-color: transparent; } + .btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, .show > .btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #FF2222; + border-color: #FF2222; } + .btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(255, 34, 34, 0.5); } + +.btn-outline-light { + color: #e9ecef; + border-color: #e9ecef; } + .btn-outline-light:hover { + color: #212529; + background-color: #e9ecef; + border-color: #e9ecef; } + .btn-outline-light:focus, .btn-outline-light.focus { + box-shadow: 0 0 0 0.2rem rgba(233, 236, 239, 0.5); } + .btn-outline-light.disabled, .btn-outline-light:disabled { + color: #e9ecef; + background-color: transparent; } + .btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, .show > .btn-outline-light.dropdown-toggle { + color: #212529; + background-color: #e9ecef; + border-color: #e9ecef; } + .btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(233, 236, 239, 0.5); } + +.btn-outline-dark { + color: #212529; + border-color: #212529; } + .btn-outline-dark:hover { + color: #fff; + background-color: #212529; + border-color: #212529; } + .btn-outline-dark:focus, .btn-outline-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(33, 37, 41, 0.5); } + .btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #212529; + background-color: transparent; } + .btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, .show > .btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #212529; + border-color: #212529; } + .btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(33, 37, 41, 0.5); } + +.btn-outline-action { + color: #844E9F; + border-color: #844E9F; } + .btn-outline-action:hover { + color: #fff; + background-color: #844E9F; + border-color: #844E9F; } + .btn-outline-action:focus, .btn-outline-action.focus { + box-shadow: 0 0 0 0.2rem rgba(132, 78, 159, 0.5); } + .btn-outline-action.disabled, .btn-outline-action:disabled { + color: #844E9F; + background-color: transparent; } + .btn-outline-action:not(:disabled):not(.disabled):active, .btn-outline-action:not(:disabled):not(.disabled).active, .show > .btn-outline-action.dropdown-toggle { + color: #fff; + background-color: #844E9F; + border-color: #844E9F; } + .btn-outline-action:not(:disabled):not(.disabled):active:focus, .btn-outline-action:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-action.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(132, 78, 159, 0.5); } + +.btn-outline-gray { + color: #ced4da; + border-color: #ced4da; } + .btn-outline-gray:hover { + color: #212529; + background-color: #ced4da; + border-color: #ced4da; } + .btn-outline-gray:focus, .btn-outline-gray.focus { + box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); } + .btn-outline-gray.disabled, .btn-outline-gray:disabled { + color: #ced4da; + background-color: transparent; } + .btn-outline-gray:not(:disabled):not(.disabled):active, .btn-outline-gray:not(:disabled):not(.disabled).active, .show > .btn-outline-gray.dropdown-toggle { + color: #212529; + background-color: #ced4da; + border-color: #ced4da; } + .btn-outline-gray:not(:disabled):not(.disabled):active:focus, .btn-outline-gray:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-gray.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); } + +.btn-link { + font-weight: 400; + color: #050505; + text-decoration: none; } + .btn-link:hover { + color: black; + text-decoration: underline; } + .btn-link:focus, .btn-link.focus { + text-decoration: underline; + box-shadow: none; } + .btn-link:disabled, .btn-link.disabled { + color: #6c757d; + pointer-events: none; } + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; } + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; } + +.btn-block { + display: block; + width: 100%; } + .btn-block + .btn-block { + margin-top: 0.5rem; } + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; } + +.fade { + transition: opacity 0.15s linear; } + @media (prefers-reduced-motion: reduce) { + .fade { + transition: none; } } + .fade:not(.show) { + opacity: 0; } + +.collapse:not(.show) { + display: none; } + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height 0.35s ease; } + @media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; } } + +.dropup, +.dropright, +.dropdown, +.dropleft { + position: relative; } + +.dropdown-toggle { + white-space: nowrap; } + .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; } + .dropdown-toggle:empty::after { + margin-left: 0; } + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; } + +.dropdown-menu-left { + right: auto; + left: 0; } + +.dropdown-menu-right { + right: 0; + left: auto; } + +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; } + + .dropdown-menu-sm-right { + right: 0; + left: auto; } } +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; } + + .dropdown-menu-md-right { + right: 0; + left: auto; } } +@media (min-width: 979px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; } + + .dropdown-menu-lg-right { + right: 0; + left: auto; } } +@media (min-width: 1240px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; } + + .dropdown-menu-xl-right { + right: 0; + left: auto; } } +@media (min-width: 1600px) { + .dropdown-menu-xxl-left { + right: auto; + left: 0; } + + .dropdown-menu-xxl-right { + right: 0; + left: auto; } } +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; } +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; } +.dropup .dropdown-toggle:empty::after { + margin-left: 0; } + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; } +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; } +.dropright .dropdown-toggle:empty::after { + margin-left: 0; } +.dropright .dropdown-toggle::after { + vertical-align: 0; } + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; } +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; } +.dropleft .dropdown-toggle::after { + display: none; } +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; } +.dropleft .dropdown-toggle:empty::after { + margin-left: 0; } +.dropleft .dropdown-toggle::before { + vertical-align: 0; } + +.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] { + right: auto; + bottom: auto; } + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #e9ecef; } + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0; } + .dropdown-item:hover, .dropdown-item:focus { + color: #16181b; + text-decoration: none; + background-color: #f8f9fa; } + .dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #050505; } + .dropdown-item.disabled, .dropdown-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: transparent; } + +.dropdown-menu.show { + display: block; } + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #6c757d; + white-space: nowrap; } + +.dropdown-item-text { + display: block; + padding: 0.25rem 1.5rem; + color: #212529; } + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; } + .btn-group > .btn, + .btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; } + .btn-group > .btn:hover, + .btn-group-vertical > .btn:hover { + z-index: 1; } + .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, + .btn-group-vertical > .btn:focus, + .btn-group-vertical > .btn:active, + .btn-group-vertical > .btn.active { + z-index: 1; } + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + .btn-toolbar .input-group { + width: auto; } + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; } +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; } + .dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropright .dropdown-toggle-split::after { + margin-left: 0; } + .dropleft .dropdown-toggle-split::before { + margin-right: 0; } + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; } + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; } + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; } + .btn-group-vertical > .btn, + .btn-group-vertical > .btn-group { + width: 100%; } + .btn-group-vertical > .btn:not(:first-child), + .btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; } + .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), + .btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + .btn-group-vertical > .btn:not(:first-child), + .btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.btn-group-toggle > .btn, +.btn-group-toggle > .btn-group > .btn { + margin-bottom: 0; } + .btn-group-toggle > .btn input[type="radio"], + .btn-group-toggle > .btn input[type="checkbox"], + .btn-group-toggle > .btn-group > .btn input[type="radio"], + .btn-group-toggle > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; } + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; } + .input-group > .form-control, + .input-group > .form-control-plaintext, + .input-group > .custom-select, + .input-group > .custom-file { + position: relative; + flex: 1 1 0%; + min-width: 0; + margin-bottom: 0; } + .input-group > .form-control + .form-control, + .input-group > .form-control + .custom-select, + .input-group > .form-control + .custom-file, + .input-group > .form-control-plaintext + .form-control, + .input-group > .form-control-plaintext + .custom-select, + .input-group > .form-control-plaintext + .custom-file, + .input-group > .custom-select + .form-control, + .input-group > .custom-select + .custom-select, + .input-group > .custom-select + .custom-file, + .input-group > .custom-file + .form-control, + .input-group > .custom-file + .custom-select, + .input-group > .custom-file + .custom-file { + margin-left: -1px; } + .input-group > .form-control:focus, + .input-group > .custom-select:focus, + .input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { + z-index: 3; } + .input-group > .custom-file .custom-file-input:focus { + z-index: 4; } + .input-group > .form-control:not(:last-child), + .input-group > .custom-select:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .input-group > .form-control:not(:first-child), + .input-group > .custom-select:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .input-group > .custom-file { + display: flex; + align-items: center; } + .input-group > .custom-file:not(:last-child) .custom-file-label, .input-group > .custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .input-group > .custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.input-group-prepend, +.input-group-append { + display: flex; } + .input-group-prepend .btn, + .input-group-append .btn { + position: relative; + z-index: 2; } + .input-group-prepend .btn:focus, + .input-group-append .btn:focus { + z-index: 3; } + .input-group-prepend .btn + .btn, + .input-group-prepend .btn + .input-group-text, + .input-group-prepend .input-group-text + .input-group-text, + .input-group-prepend .input-group-text + .btn, + .input-group-append .btn + .btn, + .input-group-append .btn + .input-group-text, + .input-group-append .input-group-text + .input-group-text, + .input-group-append .input-group-text + .btn { + margin-left: -1px; } + +.input-group-prepend { + margin-right: -1px; } + +.input-group-append { + margin-left: -1px; } + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 0.25rem; } + .input-group-text input[type="radio"], + .input-group-text input[type="checkbox"] { + margin-top: 0; } + +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(1.5em + 1rem + 2px); } + +.input-group-lg > .form-control, +.input-group-lg > .custom-select, +.input-group-lg > .input-group-prepend > .input-group-text, +.input-group-lg > .input-group-append > .input-group-text, +.input-group-lg > .input-group-prepend > .btn, +.input-group-lg > .input-group-append > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; } + +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(1.5em + 0.5rem + 2px); } + +.input-group-sm > .form-control, +.input-group-sm > .custom-select, +.input-group-sm > .input-group-prepend > .input-group-text, +.input-group-sm > .input-group-append > .input-group-text, +.input-group-sm > .input-group-prepend > .btn, +.input-group-sm > .input-group-append > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; } + +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; } + +.input-group > .input-group-prepend > .btn, +.input-group > .input-group-prepend > .input-group-text, +.input-group > .input-group-append:not(:last-child) > .btn, +.input-group > .input-group-append:not(:last-child) > .input-group-text, +.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.input-group > .input-group-append > .btn, +.input-group > .input-group-append > .input-group-text, +.input-group > .input-group-prepend:not(:first-child) > .btn, +.input-group > .input-group-prepend:not(:first-child) > .input-group-text, +.input-group > .input-group-prepend:first-child > .btn:not(:first-child), +.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.custom-control { + position: relative; + display: block; + min-height: 1.5rem; + padding-left: 1.5rem; } + +.custom-control-inline { + display: inline-flex; + margin-right: 1rem; } + +.custom-control-input { + position: absolute; + left: 0; + z-index: -1; + width: 1rem; + height: 1.25rem; + opacity: 0; } + .custom-control-input:checked ~ .custom-control-label::before { + color: #fff; + border-color: #050505; + background-color: #050505; } + .custom-control-input:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(5, 5, 5, 0.25); } + .custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #454545; } + .custom-control-input:not(:disabled):active ~ .custom-control-label::before { + color: #fff; + background-color: #5e5e5e; + border-color: #5e5e5e; } + .custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label { + color: #6c757d; } + .custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before { + background-color: #e9ecef; } + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top; } + .custom-control-label::before { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #fff; + border: #adb5bd solid 1px; } + .custom-control-label::after { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background: no-repeat 50% / 50% 50%; } + +.custom-checkbox .custom-control-label::before { + border-radius: 0.25rem; } +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e"); } +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #050505; + background-color: #050505; } +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); } +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(5, 5, 5, 0.5); } +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background-color: rgba(5, 5, 5, 0.5); } + +.custom-radio .custom-control-label::before { + border-radius: 50%; } +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); } +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(5, 5, 5, 0.5); } + +.custom-switch { + padding-left: 2.25rem; } + .custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; } + .custom-switch .custom-control-label::after { + top: calc(0.25rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #adb5bd; + border-radius: 0.5rem; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + transition: none; } } + .custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #fff; + transform: translateX(0.75rem); } + .custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(5, 5, 5, 0.5); } + +.custom-select { + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; + border: 1px solid #ced4da; + border-radius: 0.25rem; + appearance: none; } + .custom-select:focus { + border-color: #454545; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(5, 5, 5, 0.25); } + .custom-select:focus::-ms-value { + color: #495057; + background-color: #fff; } + .custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; } + .custom-select:disabled { + color: #6c757d; + background-color: #e9ecef; } + .custom-select::-ms-expand { + display: none; } + .custom-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #495057; } + +.custom-select-sm { + height: calc(1.5em + 0.5rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; } + +.custom-select-lg { + height: calc(1.5em + 1rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; } + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin-bottom: 0; } + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin: 0; + opacity: 0; } + .custom-file-input:focus ~ .custom-file-label { + border-color: #454545; + box-shadow: 0 0 0 0.2rem rgba(5, 5, 5, 0.25); } + .custom-file-input[disabled] ~ .custom-file-label, .custom-file-input:disabled ~ .custom-file-label { + background-color: #e9ecef; } + .custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse"; } + .custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); } + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + border: 1px solid #ced4da; + border-radius: 0.25rem; } + .custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: calc(1.5em + 0.75rem); + padding: 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + content: "Browse"; + background-color: #e9ecef; + border-left: inherit; + border-radius: 0 0.25rem 0.25rem 0; } + +.custom-range { + width: 100%; + height: 1.4rem; + padding: 0; + background-color: transparent; + appearance: none; } + .custom-range:focus { + outline: none; } + .custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(5, 5, 5, 0.25); } + .custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(5, 5, 5, 0.25); } + .custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(5, 5, 5, 0.25); } + .custom-range::-moz-focus-outer { + border: 0; } + .custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #050505; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; } + @media (prefers-reduced-motion: reduce) { + .custom-range::-webkit-slider-thumb { + transition: none; } } + .custom-range::-webkit-slider-thumb:active { + background-color: #5e5e5e; } + .custom-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; } + .custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #050505; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; } + @media (prefers-reduced-motion: reduce) { + .custom-range::-moz-range-thumb { + transition: none; } } + .custom-range::-moz-range-thumb:active { + background-color: #5e5e5e; } + .custom-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; } + .custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: 0.2rem; + margin-left: 0.2rem; + background-color: #050505; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; } + @media (prefers-reduced-motion: reduce) { + .custom-range::-ms-thumb { + transition: none; } } + .custom-range::-ms-thumb:active { + background-color: #5e5e5e; } + .custom-range::-ms-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: 0.5rem; } + .custom-range::-ms-fill-lower { + background-color: #dee2e6; + border-radius: 1rem; } + .custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #dee2e6; + border-radius: 1rem; } + .custom-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; } + .custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; } + .custom-range:disabled::-moz-range-thumb { + background-color: #adb5bd; } + .custom-range:disabled::-moz-range-track { + cursor: default; } + .custom-range:disabled::-ms-thumb { + background-color: #adb5bd; } + +.custom-control-label::before, +.custom-file-label, +.custom-select { + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .custom-control-label::before, + .custom-file-label, + .custom-select { + transition: none; } } + +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; } + +.nav-link { + display: block; + padding: 0.5rem 1rem; } + .nav-link:hover, .nav-link:focus { + text-decoration: none; } + .nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default; } + +.nav-tabs { + border-bottom: 1px solid #dee2e6; } + .nav-tabs .nav-item { + margin-bottom: -1px; } + .nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; } + .nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #e9ecef #e9ecef #dee2e6; } + .nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent; } + .nav-tabs .nav-link.active, + .nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff; } + .nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.nav-pills .nav-link { + border-radius: 0.25rem; } +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #050505; } + +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; } + +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; } + +.tab-content > .tab-pane { + display: none; } +.tab-content > .active { + display: block; } + +.navbar { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: 0.5rem 1rem; } + .navbar .container, + .navbar .container-fluid, + .navbar .container-sm, + .navbar .container-md, + .navbar .container-lg, + .navbar .container-xl, + .navbar .container-xxl { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; } + +.navbar-brand { + display: inline-block; + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap; } + .navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; } + +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; } + .navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; } + .navbar-nav .dropdown-menu { + position: static; + float: none; } + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; } + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; } + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; } + .navbar-toggler:hover, .navbar-toggler:focus { + text-decoration: none; } + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100%; } + +@media (max-width: 575.98px) { + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid, + .navbar-expand-sm > .container-sm, + .navbar-expand-sm > .container-md, + .navbar-expand-sm > .container-lg, + .navbar-expand-sm > .container-xl, + .navbar-expand-sm > .container-xxl { + padding-right: 0; + padding-left: 0; } } +@media (min-width: 576px) { + .navbar-expand-sm { + flex-flow: row nowrap; + justify-content: flex-start; } + .navbar-expand-sm .navbar-nav { + flex-direction: row; } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid, + .navbar-expand-sm > .container-sm, + .navbar-expand-sm > .container-md, + .navbar-expand-sm > .container-lg, + .navbar-expand-sm > .container-xl, + .navbar-expand-sm > .container-xxl { + flex-wrap: nowrap; } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; } + .navbar-expand-sm .navbar-toggler { + display: none; } } +@media (max-width: 767.98px) { + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid, + .navbar-expand-md > .container-sm, + .navbar-expand-md > .container-md, + .navbar-expand-md > .container-lg, + .navbar-expand-md > .container-xl, + .navbar-expand-md > .container-xxl { + padding-right: 0; + padding-left: 0; } } +@media (min-width: 768px) { + .navbar-expand-md { + flex-flow: row nowrap; + justify-content: flex-start; } + .navbar-expand-md .navbar-nav { + flex-direction: row; } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid, + .navbar-expand-md > .container-sm, + .navbar-expand-md > .container-md, + .navbar-expand-md > .container-lg, + .navbar-expand-md > .container-xl, + .navbar-expand-md > .container-xxl { + flex-wrap: nowrap; } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; } + .navbar-expand-md .navbar-toggler { + display: none; } } +@media (max-width: 978.98px) { + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid, + .navbar-expand-lg > .container-sm, + .navbar-expand-lg > .container-md, + .navbar-expand-lg > .container-lg, + .navbar-expand-lg > .container-xl, + .navbar-expand-lg > .container-xxl { + padding-right: 0; + padding-left: 0; } } +@media (min-width: 979px) { + .navbar-expand-lg { + flex-flow: row nowrap; + justify-content: flex-start; } + .navbar-expand-lg .navbar-nav { + flex-direction: row; } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid, + .navbar-expand-lg > .container-sm, + .navbar-expand-lg > .container-md, + .navbar-expand-lg > .container-lg, + .navbar-expand-lg > .container-xl, + .navbar-expand-lg > .container-xxl { + flex-wrap: nowrap; } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; } + .navbar-expand-lg .navbar-toggler { + display: none; } } +@media (max-width: 1239.98px) { + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid, + .navbar-expand-xl > .container-sm, + .navbar-expand-xl > .container-md, + .navbar-expand-xl > .container-lg, + .navbar-expand-xl > .container-xl, + .navbar-expand-xl > .container-xxl { + padding-right: 0; + padding-left: 0; } } +@media (min-width: 1240px) { + .navbar-expand-xl { + flex-flow: row nowrap; + justify-content: flex-start; } + .navbar-expand-xl .navbar-nav { + flex-direction: row; } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid, + .navbar-expand-xl > .container-sm, + .navbar-expand-xl > .container-md, + .navbar-expand-xl > .container-lg, + .navbar-expand-xl > .container-xl, + .navbar-expand-xl > .container-xxl { + flex-wrap: nowrap; } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; } + .navbar-expand-xl .navbar-toggler { + display: none; } } +@media (max-width: 1599.98px) { + .navbar-expand-xxl > .container, + .navbar-expand-xxl > .container-fluid, + .navbar-expand-xxl > .container-sm, + .navbar-expand-xxl > .container-md, + .navbar-expand-xxl > .container-lg, + .navbar-expand-xxl > .container-xl, + .navbar-expand-xxl > .container-xxl { + padding-right: 0; + padding-left: 0; } } +@media (min-width: 1600px) { + .navbar-expand-xxl { + flex-flow: row nowrap; + justify-content: flex-start; } + .navbar-expand-xxl .navbar-nav { + flex-direction: row; } + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand-xxl > .container, + .navbar-expand-xxl > .container-fluid, + .navbar-expand-xxl > .container-sm, + .navbar-expand-xxl > .container-md, + .navbar-expand-xxl > .container-lg, + .navbar-expand-xxl > .container-xl, + .navbar-expand-xxl > .container-xxl { + flex-wrap: nowrap; } + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + flex-basis: auto; } + .navbar-expand-xxl .navbar-toggler { + display: none; } } +.navbar-expand { + flex-flow: row nowrap; + justify-content: flex-start; } + .navbar-expand > .container, + .navbar-expand > .container-fluid, + .navbar-expand > .container-sm, + .navbar-expand > .container-md, + .navbar-expand > .container-lg, + .navbar-expand > .container-xl, + .navbar-expand > .container-xxl { + padding-right: 0; + padding-left: 0; } + .navbar-expand .navbar-nav { + flex-direction: row; } + .navbar-expand .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand > .container, + .navbar-expand > .container-fluid, + .navbar-expand > .container-sm, + .navbar-expand > .container-md, + .navbar-expand > .container-lg, + .navbar-expand > .container-xl, + .navbar-expand > .container-xxl { + flex-wrap: nowrap; } + .navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; } + .navbar-expand .navbar-toggler { + display: none; } + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); } + .navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); } +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); } + .navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); } + .navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); } +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); } +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); } +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); } + .navbar-light .navbar-text a { + color: rgba(0, 0, 0, 0.9); } + .navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); } + +.navbar-dark .navbar-brand { + color: #fff; } + .navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #fff; } +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); } + .navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); } + .navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); } +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; } +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.5); + border-color: rgba(255, 255, 255, 0.1); } +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='%23fff' stroke-linecap='round' stroke-miterlimit='10' stroke-width='3' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.5); } + .navbar-dark .navbar-text a { + color: #fff; } + .navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { + color: #fff; } + +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; } + .card > hr { + margin-right: 0; + margin-left: 0; } + .card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; } + .card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; } + +.card-body { + flex: 1 1 auto; + min-height: 1px; + padding: 1.25rem; } + +.card-title { + margin-bottom: 0.75rem; } + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; } + +.card-text:last-child { + margin-bottom: 0; } + +.card-link:hover { + text-decoration: none; } +.card-link + .card-link { + margin-left: 1.25rem; } + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); } + .card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; } + .card-header + .list-group .list-group-item:first-child { + border-top: 0; } + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); } + .card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); } + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; } + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; } + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; } + +.card-img, +.card-img-top, +.card-img-bottom { + flex-shrink: 0; + width: 100%; } + +.card-img, +.card-img-top { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); } + +.card-img, +.card-img-bottom { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); } + +.card-deck .card { + margin-bottom: 15px; } +@media (min-width: 576px) { + .card-deck { + display: flex; + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px; } + .card-deck .card { + flex: 1 0 0%; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px; } } + +.card-group > .card { + margin-bottom: 15px; } +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; } } + +.card-columns .card { + margin-bottom: 0.75rem; } +@media (min-width: 576px) { + .card-columns { + column-count: 3; + column-gap: 1.25rem; + orphans: 1; + widows: 1; } + .card-columns .card { + display: inline-block; + width: 100%; } } + +.accordion > .card { + overflow: hidden; } + .accordion > .card:not(:last-of-type) { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + .accordion > .card:not(:first-of-type) { + border-top-left-radius: 0; + border-top-right-radius: 0; } + .accordion > .card > .card-header { + border-radius: 0; + margin-bottom: -1px; } + +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #e9ecef; + border-radius: 0.25rem; } + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; } + .breadcrumb-item + .breadcrumb-item::before { + display: inline-block; + padding-right: 0.5rem; + color: #6c757d; + content: "/"; } +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; } +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; } +.breadcrumb-item.active { + color: #6c757d; } + +.pagination { + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.25rem; } + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #050505; + background-color: #fff; + border: 1px solid #dee2e6; } + .page-link:hover { + z-index: 2; + color: black; + text-decoration: none; + background-color: #e9ecef; + border-color: #dee2e6; } + .page-link:focus { + z-index: 3; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(5, 5, 5, 0.25); } + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; } +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; } +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #050505; + border-color: #050505; } +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + cursor: auto; + background-color: #fff; + border-color: #dee2e6; } + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; } +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; } +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; } + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; } +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; } +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; } + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .badge { + transition: none; } } + a.badge:hover, a.badge:focus { + text-decoration: none; } + .badge:empty { + display: none; } + +.btn .badge { + position: relative; + top: -1px; } + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem; } + +.badge-primary { + color: #fff; + background-color: #050505; } + a.badge-primary:hover, a.badge-primary:focus { + color: #fff; + background-color: black; } + a.badge-primary:focus, a.badge-primary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(5, 5, 5, 0.5); } + +.badge-secondary { + color: #212529; + background-color: #e6e8e8; } + a.badge-secondary:hover, a.badge-secondary:focus { + color: #212529; + background-color: #cbd0d0; } + a.badge-secondary:focus, a.badge-secondary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(230, 232, 232, 0.5); } + +.badge-success { + color: #fff; + background-color: #28a745; } + a.badge-success:hover, a.badge-success:focus { + color: #fff; + background-color: #1e7e34; } + a.badge-success:focus, a.badge-success.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } + +.badge-info { + color: #fff; + background-color: #3590dc; } + a.badge-info:hover, a.badge-info:focus { + color: #fff; + background-color: #2176bd; } + a.badge-info:focus, a.badge-info.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(53, 144, 220, 0.5); } + +.badge-warning { + color: #212529; + background-color: #FECC02; } + a.badge-warning:hover, a.badge-warning:focus { + color: #212529; + background-color: #cca401; } + a.badge-warning:focus, a.badge-warning.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(254, 204, 2, 0.5); } + +.badge-danger { + color: #fff; + background-color: #FF2222; } + a.badge-danger:hover, a.badge-danger:focus { + color: #fff; + background-color: #ee0000; } + a.badge-danger:focus, a.badge-danger.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(255, 34, 34, 0.5); } + +.badge-light { + color: #212529; + background-color: #e9ecef; } + a.badge-light:hover, a.badge-light:focus { + color: #212529; + background-color: #cbd3da; } + a.badge-light:focus, a.badge-light.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(233, 236, 239, 0.5); } + +.badge-dark { + color: #fff; + background-color: #212529; } + a.badge-dark:hover, a.badge-dark:focus { + color: #fff; + background-color: #0a0c0d; } + a.badge-dark:focus, a.badge-dark.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(33, 37, 41, 0.5); } + +.badge-action { + color: #fff; + background-color: #844E9F; } + a.badge-action:hover, a.badge-action:focus { + color: #fff; + background-color: #683d7d; } + a.badge-action:focus, a.badge-action.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(132, 78, 159, 0.5); } + +.badge-gray { + color: #212529; + background-color: #ced4da; } + a.badge-gray:hover, a.badge-gray:focus { + color: #212529; + background-color: #b1bbc4; } + a.badge-gray:focus, a.badge-gray.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(206, 212, 218, 0.5); } + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #e9ecef; + border-radius: 0.3rem; } + @media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; } } + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; } + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; } + +.alert-heading { + color: inherit; } + +.alert-link { + font-weight: 700; } + +.alert-dismissible { + padding-right: 4rem; } + .alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 0.75rem 1.25rem; + color: inherit; } + +.alert-primary { + color: #030303; + background-color: #cdcdcd; + border-color: #b9b9b9; } + .alert-primary hr { + border-top-color: #acacac; } + .alert-primary .alert-link { + color: black; } + +.alert-secondary { + color: #787979; + background-color: #fafafa; + border-color: #f8f9f9; } + .alert-secondary hr { + border-top-color: #eaeded; } + .alert-secondary .alert-link { + color: #5f5f5f; } + +.alert-success { + color: #155724; + background-color: #d4edda; + border-color: #c3e6cb; } + .alert-success hr { + border-top-color: #b1dfbb; } + .alert-success .alert-link { + color: #0b2e13; } + +.alert-info { + color: #1c4b72; + background-color: #d7e9f8; + border-color: #c6e0f5; } + .alert-info hr { + border-top-color: #b0d4f1; } + .alert-info .alert-link { + color: #123049; } + +.alert-warning { + color: #846a01; + background-color: #fff5cc; + border-color: #fff1b8; } + .alert-warning hr { + border-top-color: #ffec9f; } + .alert-warning .alert-link { + color: #514101; } + +.alert-danger { + color: #851212; + background-color: #ffd3d3; + border-color: #ffc1c1; } + .alert-danger hr { + border-top-color: #ffa8a8; } + .alert-danger .alert-link { + color: #580c0c; } + +.alert-light { + color: #797b7c; + background-color: #fbfbfc; + border-color: #f9fafb; } + .alert-light hr { + border-top-color: #eaedf1; } + .alert-light .alert-link { + color: #606162; } + +.alert-dark { + color: #111315; + background-color: #d3d3d4; + border-color: #c1c2c3; } + .alert-dark hr { + border-top-color: #b4b5b6; } + .alert-dark .alert-link { + color: black; } + +.alert-action { + color: #452953; + background-color: #e6dcec; + border-color: #ddcde4; } + .alert-action hr { + border-top-color: #d2bcdb; } + .alert-action .alert-link { + color: #291831; } + +.alert-gray { + color: #6b6e71; + background-color: #f5f6f8; + border-color: #f1f3f5; } + .alert-gray hr { + border-top-color: #e2e6ea; } + .alert-gray .alert-link { + color: #525557; } + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; } + to { + background-position: 0 0; } } +.progress { + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.25rem; } + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #050505; + transition: width 0.6s ease; } + @media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; } } + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; } + +.progress-bar-animated { + animation: progress-bar-stripes 1s linear infinite; } + @media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none; } } + +.media { + display: flex; + align-items: flex-start; } + +.media-body { + flex: 1; } + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; } + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit; } + .list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa; } + .list-group-item-action:active { + color: #212529; + background-color: #e9ecef; } + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); } + .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; } + .list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; } + .list-group-item.disabled, .list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff; } + .list-group-item.active { + z-index: 2; + color: #fff; + background-color: #050505; + border-color: #050505; } + .list-group-item + .list-group-item { + border-top-width: 0; } + .list-group-item + .list-group-item.active { + margin-top: -1px; + border-top-width: 1px; } + +.list-group-horizontal { + flex-direction: row; } + .list-group-horizontal .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; } + .list-group-horizontal .list-group-item.active { + margin-top: 0; } + .list-group-horizontal .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; } + .list-group-horizontal .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; } + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; } + .list-group-horizontal-sm .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-sm .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; } + .list-group-horizontal-sm .list-group-item.active { + margin-top: 0; } + .list-group-horizontal-sm .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; } + .list-group-horizontal-sm .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; } } +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; } + .list-group-horizontal-md .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-md .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; } + .list-group-horizontal-md .list-group-item.active { + margin-top: 0; } + .list-group-horizontal-md .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; } + .list-group-horizontal-md .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; } } +@media (min-width: 979px) { + .list-group-horizontal-lg { + flex-direction: row; } + .list-group-horizontal-lg .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-lg .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; } + .list-group-horizontal-lg .list-group-item.active { + margin-top: 0; } + .list-group-horizontal-lg .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; } + .list-group-horizontal-lg .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; } } +@media (min-width: 1240px) { + .list-group-horizontal-xl { + flex-direction: row; } + .list-group-horizontal-xl .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-xl .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; } + .list-group-horizontal-xl .list-group-item.active { + margin-top: 0; } + .list-group-horizontal-xl .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; } + .list-group-horizontal-xl .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; } } +@media (min-width: 1600px) { + .list-group-horizontal-xxl { + flex-direction: row; } + .list-group-horizontal-xxl .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-xxl .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; } + .list-group-horizontal-xxl .list-group-item.active { + margin-top: 0; } + .list-group-horizontal-xxl .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; } + .list-group-horizontal-xxl .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; } } +.list-group-flush .list-group-item { + border-right-width: 0; + border-left-width: 0; + border-radius: 0; } + .list-group-flush .list-group-item:first-child { + border-top-width: 0; } +.list-group-flush:last-child .list-group-item:last-child { + border-bottom-width: 0; } + +.list-group-item-primary { + color: #030303; + background-color: #b9b9b9; } + .list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #030303; + background-color: #acacac; } + .list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #030303; + border-color: #030303; } + +.list-group-item-secondary { + color: #787979; + background-color: #f8f9f9; } + .list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #787979; + background-color: #eaeded; } + .list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #787979; + border-color: #787979; } + +.list-group-item-success { + color: #155724; + background-color: #c3e6cb; } + .list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #155724; + background-color: #b1dfbb; } + .list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #155724; + border-color: #155724; } + +.list-group-item-info { + color: #1c4b72; + background-color: #c6e0f5; } + .list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #1c4b72; + background-color: #b0d4f1; } + .list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #1c4b72; + border-color: #1c4b72; } + +.list-group-item-warning { + color: #846a01; + background-color: #fff1b8; } + .list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #846a01; + background-color: #ffec9f; } + .list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #846a01; + border-color: #846a01; } + +.list-group-item-danger { + color: #851212; + background-color: #ffc1c1; } + .list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #851212; + background-color: #ffa8a8; } + .list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #851212; + border-color: #851212; } + +.list-group-item-light { + color: #797b7c; + background-color: #f9fafb; } + .list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #797b7c; + background-color: #eaedf1; } + .list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #797b7c; + border-color: #797b7c; } + +.list-group-item-dark { + color: #111315; + background-color: #c1c2c3; } + .list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #111315; + background-color: #b4b5b6; } + .list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #111315; + border-color: #111315; } + +.list-group-item-action { + color: #452953; + background-color: #ddcde4; } + .list-group-item-action.list-group-item-action:hover, .list-group-item-action.list-group-item-action:focus { + color: #452953; + background-color: #d2bcdb; } + .list-group-item-action.list-group-item-action.active { + color: #fff; + background-color: #452953; + border-color: #452953; } + +.list-group-item-gray { + color: #6b6e71; + background-color: #f1f3f5; } + .list-group-item-gray.list-group-item-action:hover, .list-group-item-gray.list-group-item-action:focus { + color: #6b6e71; + background-color: #e2e6ea; } + .list-group-item-gray.list-group-item-action.active { + color: #fff; + background-color: #6b6e71; + border-color: #6b6e71; } + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5; } + @media (max-width: 1200px) { + .close { + font-size: calc(1.275rem + 0.3vw) ; } } + .close:hover { + color: #000; + text-decoration: none; } + .close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: .75; } + +button.close { + padding: 0; + background-color: transparent; + border: 0; + appearance: none; } + +a.close.disabled { + pointer-events: none; } + +.toast { + max-width: 350px; + overflow: hidden; + font-size: 0.875rem; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); + opacity: 0; + border-radius: 0.25rem; } + .toast:not(:last-child) { + margin-bottom: 0.75rem; } + .toast.showing { + opacity: 1; } + .toast.show { + display: block; + opacity: 1; } + .toast.hide { + display: none; } + +.toast-header { + display: flex; + align-items: center; + padding: 0.25rem 0.75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); } + +.toast-body { + padding: 0.75rem; } + +.modal-open { + overflow: hidden; } + .modal-open .modal { + overflow-x: hidden; + overflow-y: auto; } + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0; } + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; } + .modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); } + @media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; } } + .modal.show .modal-dialog { + transform: none; } + .modal.modal-static .modal-dialog { + transform: scale(1.02); } + +.modal-dialog-scrollable { + display: flex; + max-height: calc(100% - 1rem); } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 1rem); + overflow: hidden; } + .modal-dialog-scrollable .modal-header, + .modal-dialog-scrollable .modal-footer { + flex-shrink: 0; } + .modal-dialog-scrollable .modal-body { + overflow-y: auto; } + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - 1rem); } + .modal-dialog-centered::before { + display: block; + height: calc(100vh - 1rem); + content: ""; } + .modal-dialog-centered.modal-dialog-scrollable { + flex-direction: column; + justify-content: center; + height: 100%; } + .modal-dialog-centered.modal-dialog-scrollable .modal-content { + max-height: none; } + .modal-dialog-centered.modal-dialog-scrollable::before { + content: none; } + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; } + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; } + .modal-backdrop.fade { + opacity: 0; } + .modal-backdrop.show { + opacity: 0.5; } + +.modal-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); } + .modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto; } + +.modal-title { + margin-bottom: 0; + line-height: 1.5; } + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: 1rem; } + +.modal-footer { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + padding: 0.75rem; + border-top: 1px solid #dee2e6; + border-bottom-right-radius: calc(0.3rem - 1px); + border-bottom-left-radius: calc(0.3rem - 1px); } + .modal-footer > * { + margin: 0.25rem; } + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; } + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; } + + .modal-dialog-scrollable { + max-height: calc(100% - 3.5rem); } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 3.5rem); } + + .modal-dialog-centered { + min-height: calc(100% - 3.5rem); } + .modal-dialog-centered::before { + height: calc(100vh - 3.5rem); } + + .modal-sm { + max-width: 300px; } } +@media (min-width: 979px) { + .modal-lg, + .modal-xl { + max-width: 800px; } } +@media (min-width: 1240px) { + .modal-xl { + max-width: 1140px; } } +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: Tahoma, -apple-system, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; } + .tooltip.show { + opacity: 0.9; } + .tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; } + .tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; } + +.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] { + padding: 0.4rem 0; } + .bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow { + bottom: 0; } + .bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; } + +.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] { + padding: 0 0.4rem; } + .bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; } + .bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; } + +.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] { + padding: 0.4rem 0; } + .bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow { + top: 0; } + .bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; } + +.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] { + padding: 0 0.4rem; } + .bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; } + .bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; } + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.25rem; } + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: Tahoma, -apple-system, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; } + .popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem; } + .popover .arrow::before, .popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; } + +.bs-popover-top, .bs-popover-auto[x-placement^="top"] { + margin-bottom: 0.5rem; } + .bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow { + bottom: calc(-0.5rem - 1px); } + .bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); } + .bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; } + +.bs-popover-right, .bs-popover-auto[x-placement^="right"] { + margin-left: 0.5rem; } + .bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow { + left: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; } + .bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); } + .bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; } + +.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] { + margin-top: 0.5rem; } + .bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow { + top: calc(-0.5rem - 1px); } + .bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); } + .bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; } + .bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f7f7f7; } + +.bs-popover-left, .bs-popover-auto[x-placement^="left"] { + margin-right: 0.5rem; } + .bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow { + right: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; } + .bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); } + .bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; } + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); } + .popover-header:empty { + display: none; } + +.popover-body { + padding: 0.5rem 0.75rem; + color: #212529; } + +.carousel { + position: relative; } + +.carousel.pointer-event { + touch-action: pan-y; } + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; } + .carousel-inner::after { + display: block; + clear: both; + content: ""; } + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; } } + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; } + +.carousel-item-next:not(.carousel-item-left), +.active.carousel-item-right { + transform: translateX(100%); } + +.carousel-item-prev:not(.carousel-item-right), +.active.carousel-item-left { + transform: translateX(-100%); } + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; } +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; + opacity: 1; } +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; } + @media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-left, + .carousel-fade .active.carousel-item-right { + transition: none; } } + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: 0.5; + transition: opacity 0.15s ease; } + @media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; } } + .carousel-control-prev:hover, .carousel-control-prev:focus, + .carousel-control-next:hover, + .carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; } + +.carousel-control-prev { + left: 0; } + +.carousel-control-next { + right: 0; } + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: no-repeat 50% / 100% 100%; } + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e"); } + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e"); } + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: flex; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; } + .carousel-indicators li { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + transition: opacity 0.6s ease; } + @media (prefers-reduced-motion: reduce) { + .carousel-indicators li { + transition: none; } } + .carousel-indicators .active { + opacity: 1; } + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; } + +@keyframes spinner-border { + to { + transform: rotate(360deg); } } +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + animation: spinner-border .75s linear infinite; } + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; } + +@keyframes spinner-grow { + 0% { + transform: scale(0); } + 50% { + opacity: 1; } } +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + animation: spinner-grow .75s linear infinite; } + +.spinner-grow-sm { + width: 1rem; + height: 1rem; } + +.align-baseline { + vertical-align: baseline !important; } + +.align-top { + vertical-align: top !important; } + +.align-middle { + vertical-align: middle !important; } + +.align-bottom { + vertical-align: bottom !important; } + +.align-text-bottom { + vertical-align: text-bottom !important; } + +.align-text-top { + vertical-align: text-top !important; } + +.bg-primary { + background-color: #050505 !important; } + +a.bg-primary:hover, a.bg-primary:focus, +button.bg-primary:hover, +button.bg-primary:focus { + background-color: black !important; } + +.bg-secondary { + background-color: #e6e8e8 !important; } + +a.bg-secondary:hover, a.bg-secondary:focus, +button.bg-secondary:hover, +button.bg-secondary:focus { + background-color: #cbd0d0 !important; } + +.bg-success { + background-color: #28a745 !important; } + +a.bg-success:hover, a.bg-success:focus, +button.bg-success:hover, +button.bg-success:focus { + background-color: #1e7e34 !important; } + +.bg-info { + background-color: #3590dc !important; } + +a.bg-info:hover, a.bg-info:focus, +button.bg-info:hover, +button.bg-info:focus { + background-color: #2176bd !important; } + +.bg-warning { + background-color: #FECC02 !important; } + +a.bg-warning:hover, a.bg-warning:focus, +button.bg-warning:hover, +button.bg-warning:focus { + background-color: #cca401 !important; } + +.bg-danger { + background-color: #FF2222 !important; } + +a.bg-danger:hover, a.bg-danger:focus, +button.bg-danger:hover, +button.bg-danger:focus { + background-color: #ee0000 !important; } + +.bg-light { + background-color: #e9ecef !important; } + +a.bg-light:hover, a.bg-light:focus, +button.bg-light:hover, +button.bg-light:focus { + background-color: #cbd3da !important; } + +.bg-dark { + background-color: #212529 !important; } + +a.bg-dark:hover, a.bg-dark:focus, +button.bg-dark:hover, +button.bg-dark:focus { + background-color: #0a0c0d !important; } + +.bg-action { + background-color: #844E9F !important; } + +a.bg-action:hover, a.bg-action:focus, +button.bg-action:hover, +button.bg-action:focus { + background-color: #683d7d !important; } + +.bg-gray { + background-color: #ced4da !important; } + +a.bg-gray:hover, a.bg-gray:focus, +button.bg-gray:hover, +button.bg-gray:focus { + background-color: #b1bbc4 !important; } + +.bg-white { + background-color: #fff !important; } + +.bg-transparent { + background-color: transparent !important; } + +.border { + border: 1px solid #dee2e6 !important; } + +.border-top { + border-top: 1px solid #dee2e6 !important; } + +.border-right { + border-right: 1px solid #dee2e6 !important; } + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important; } + +.border-left { + border-left: 1px solid #dee2e6 !important; } + +.border-0 { + border: 0 !important; } + +.border-top-0 { + border-top: 0 !important; } + +.border-right-0 { + border-right: 0 !important; } + +.border-bottom-0 { + border-bottom: 0 !important; } + +.border-left-0 { + border-left: 0 !important; } + +.border-primary { + border-color: #050505 !important; } + +.border-secondary { + border-color: #e6e8e8 !important; } + +.border-success { + border-color: #28a745 !important; } + +.border-info { + border-color: #3590dc !important; } + +.border-warning { + border-color: #FECC02 !important; } + +.border-danger { + border-color: #FF2222 !important; } + +.border-light { + border-color: #e9ecef !important; } + +.border-dark { + border-color: #212529 !important; } + +.border-action { + border-color: #844E9F !important; } + +.border-gray { + border-color: #ced4da !important; } + +.border-white { + border-color: #fff !important; } + +.rounded-sm { + border-radius: 0.2rem !important; } + +.rounded { + border-radius: 0.25rem !important; } + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; } + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; } + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; } + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; } + +.rounded-lg { + border-radius: 0.3rem !important; } + +.rounded-circle { + border-radius: 50% !important; } + +.rounded-pill { + border-radius: 50rem !important; } + +.rounded-0 { + border-radius: 0 !important; } + +.clearfix::after { + display: block; + clear: both; + content: ""; } + +.d-none { + display: none !important; } + +.d-inline { + display: inline !important; } + +.d-inline-block { + display: inline-block !important; } + +.d-block { + display: block !important; } + +.d-table { + display: table !important; } + +.d-table-row { + display: table-row !important; } + +.d-table-cell { + display: table-cell !important; } + +.d-flex { + display: flex !important; } + +.d-inline-flex { + display: inline-flex !important; } + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; } + + .d-sm-inline { + display: inline !important; } + + .d-sm-inline-block { + display: inline-block !important; } + + .d-sm-block { + display: block !important; } + + .d-sm-table { + display: table !important; } + + .d-sm-table-row { + display: table-row !important; } + + .d-sm-table-cell { + display: table-cell !important; } + + .d-sm-flex { + display: flex !important; } + + .d-sm-inline-flex { + display: inline-flex !important; } } +@media (min-width: 768px) { + .d-md-none { + display: none !important; } + + .d-md-inline { + display: inline !important; } + + .d-md-inline-block { + display: inline-block !important; } + + .d-md-block { + display: block !important; } + + .d-md-table { + display: table !important; } + + .d-md-table-row { + display: table-row !important; } + + .d-md-table-cell { + display: table-cell !important; } + + .d-md-flex { + display: flex !important; } + + .d-md-inline-flex { + display: inline-flex !important; } } +@media (min-width: 979px) { + .d-lg-none { + display: none !important; } + + .d-lg-inline { + display: inline !important; } + + .d-lg-inline-block { + display: inline-block !important; } + + .d-lg-block { + display: block !important; } + + .d-lg-table { + display: table !important; } + + .d-lg-table-row { + display: table-row !important; } + + .d-lg-table-cell { + display: table-cell !important; } + + .d-lg-flex { + display: flex !important; } + + .d-lg-inline-flex { + display: inline-flex !important; } } +@media (min-width: 1240px) { + .d-xl-none { + display: none !important; } + + .d-xl-inline { + display: inline !important; } + + .d-xl-inline-block { + display: inline-block !important; } + + .d-xl-block { + display: block !important; } + + .d-xl-table { + display: table !important; } + + .d-xl-table-row { + display: table-row !important; } + + .d-xl-table-cell { + display: table-cell !important; } + + .d-xl-flex { + display: flex !important; } + + .d-xl-inline-flex { + display: inline-flex !important; } } +@media (min-width: 1600px) { + .d-xxl-none { + display: none !important; } + + .d-xxl-inline { + display: inline !important; } + + .d-xxl-inline-block { + display: inline-block !important; } + + .d-xxl-block { + display: block !important; } + + .d-xxl-table { + display: table !important; } + + .d-xxl-table-row { + display: table-row !important; } + + .d-xxl-table-cell { + display: table-cell !important; } + + .d-xxl-flex { + display: flex !important; } + + .d-xxl-inline-flex { + display: inline-flex !important; } } +@media print { + .d-print-none { + display: none !important; } + + .d-print-inline { + display: inline !important; } + + .d-print-inline-block { + display: inline-block !important; } + + .d-print-block { + display: block !important; } + + .d-print-table { + display: table !important; } + + .d-print-table-row { + display: table-row !important; } + + .d-print-table-cell { + display: table-cell !important; } + + .d-print-flex { + display: flex !important; } + + .d-print-inline-flex { + display: inline-flex !important; } } +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; } + .embed-responsive::before { + display: block; + content: ""; } + .embed-responsive .embed-responsive-item, + .embed-responsive iframe, + .embed-responsive embed, + .embed-responsive object, + .embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; } + +.embed-responsive-21by9::before { + padding-top: 42.8571428571%; } + +.embed-responsive-16by9::before { + padding-top: 56.25%; } + +.embed-responsive-4by3::before { + padding-top: 75%; } + +.embed-responsive-1by1::before { + padding-top: 100%; } + +.flex-row { + flex-direction: row !important; } + +.flex-column { + flex-direction: column !important; } + +.flex-row-reverse { + flex-direction: row-reverse !important; } + +.flex-column-reverse { + flex-direction: column-reverse !important; } + +.flex-wrap { + flex-wrap: wrap !important; } + +.flex-nowrap { + flex-wrap: nowrap !important; } + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; } + +.flex-fill { + flex: 1 1 auto !important; } + +.flex-grow-0 { + flex-grow: 0 !important; } + +.flex-grow-1 { + flex-grow: 1 !important; } + +.flex-shrink-0 { + flex-shrink: 0 !important; } + +.flex-shrink-1 { + flex-shrink: 1 !important; } + +.justify-content-start { + justify-content: flex-start !important; } + +.justify-content-end { + justify-content: flex-end !important; } + +.justify-content-center { + justify-content: center !important; } + +.justify-content-between { + justify-content: space-between !important; } + +.justify-content-around { + justify-content: space-around !important; } + +.align-items-start { + align-items: flex-start !important; } + +.align-items-end { + align-items: flex-end !important; } + +.align-items-center { + align-items: center !important; } + +.align-items-baseline { + align-items: baseline !important; } + +.align-items-stretch { + align-items: stretch !important; } + +.align-content-start { + align-content: flex-start !important; } + +.align-content-end { + align-content: flex-end !important; } + +.align-content-center { + align-content: center !important; } + +.align-content-between { + align-content: space-between !important; } + +.align-content-around { + align-content: space-around !important; } + +.align-content-stretch { + align-content: stretch !important; } + +.align-self-auto { + align-self: auto !important; } + +.align-self-start { + align-self: flex-start !important; } + +.align-self-end { + align-self: flex-end !important; } + +.align-self-center { + align-self: center !important; } + +.align-self-baseline { + align-self: baseline !important; } + +.align-self-stretch { + align-self: stretch !important; } + +@media (min-width: 576px) { + .flex-sm-row { + flex-direction: row !important; } + + .flex-sm-column { + flex-direction: column !important; } + + .flex-sm-row-reverse { + flex-direction: row-reverse !important; } + + .flex-sm-column-reverse { + flex-direction: column-reverse !important; } + + .flex-sm-wrap { + flex-wrap: wrap !important; } + + .flex-sm-nowrap { + flex-wrap: nowrap !important; } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; } + + .flex-sm-fill { + flex: 1 1 auto !important; } + + .flex-sm-grow-0 { + flex-grow: 0 !important; } + + .flex-sm-grow-1 { + flex-grow: 1 !important; } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important; } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important; } + + .justify-content-sm-start { + justify-content: flex-start !important; } + + .justify-content-sm-end { + justify-content: flex-end !important; } + + .justify-content-sm-center { + justify-content: center !important; } + + .justify-content-sm-between { + justify-content: space-between !important; } + + .justify-content-sm-around { + justify-content: space-around !important; } + + .align-items-sm-start { + align-items: flex-start !important; } + + .align-items-sm-end { + align-items: flex-end !important; } + + .align-items-sm-center { + align-items: center !important; } + + .align-items-sm-baseline { + align-items: baseline !important; } + + .align-items-sm-stretch { + align-items: stretch !important; } + + .align-content-sm-start { + align-content: flex-start !important; } + + .align-content-sm-end { + align-content: flex-end !important; } + + .align-content-sm-center { + align-content: center !important; } + + .align-content-sm-between { + align-content: space-between !important; } + + .align-content-sm-around { + align-content: space-around !important; } + + .align-content-sm-stretch { + align-content: stretch !important; } + + .align-self-sm-auto { + align-self: auto !important; } + + .align-self-sm-start { + align-self: flex-start !important; } + + .align-self-sm-end { + align-self: flex-end !important; } + + .align-self-sm-center { + align-self: center !important; } + + .align-self-sm-baseline { + align-self: baseline !important; } + + .align-self-sm-stretch { + align-self: stretch !important; } } +@media (min-width: 768px) { + .flex-md-row { + flex-direction: row !important; } + + .flex-md-column { + flex-direction: column !important; } + + .flex-md-row-reverse { + flex-direction: row-reverse !important; } + + .flex-md-column-reverse { + flex-direction: column-reverse !important; } + + .flex-md-wrap { + flex-wrap: wrap !important; } + + .flex-md-nowrap { + flex-wrap: nowrap !important; } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; } + + .flex-md-fill { + flex: 1 1 auto !important; } + + .flex-md-grow-0 { + flex-grow: 0 !important; } + + .flex-md-grow-1 { + flex-grow: 1 !important; } + + .flex-md-shrink-0 { + flex-shrink: 0 !important; } + + .flex-md-shrink-1 { + flex-shrink: 1 !important; } + + .justify-content-md-start { + justify-content: flex-start !important; } + + .justify-content-md-end { + justify-content: flex-end !important; } + + .justify-content-md-center { + justify-content: center !important; } + + .justify-content-md-between { + justify-content: space-between !important; } + + .justify-content-md-around { + justify-content: space-around !important; } + + .align-items-md-start { + align-items: flex-start !important; } + + .align-items-md-end { + align-items: flex-end !important; } + + .align-items-md-center { + align-items: center !important; } + + .align-items-md-baseline { + align-items: baseline !important; } + + .align-items-md-stretch { + align-items: stretch !important; } + + .align-content-md-start { + align-content: flex-start !important; } + + .align-content-md-end { + align-content: flex-end !important; } + + .align-content-md-center { + align-content: center !important; } + + .align-content-md-between { + align-content: space-between !important; } + + .align-content-md-around { + align-content: space-around !important; } + + .align-content-md-stretch { + align-content: stretch !important; } + + .align-self-md-auto { + align-self: auto !important; } + + .align-self-md-start { + align-self: flex-start !important; } + + .align-self-md-end { + align-self: flex-end !important; } + + .align-self-md-center { + align-self: center !important; } + + .align-self-md-baseline { + align-self: baseline !important; } + + .align-self-md-stretch { + align-self: stretch !important; } } +@media (min-width: 979px) { + .flex-lg-row { + flex-direction: row !important; } + + .flex-lg-column { + flex-direction: column !important; } + + .flex-lg-row-reverse { + flex-direction: row-reverse !important; } + + .flex-lg-column-reverse { + flex-direction: column-reverse !important; } + + .flex-lg-wrap { + flex-wrap: wrap !important; } + + .flex-lg-nowrap { + flex-wrap: nowrap !important; } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; } + + .flex-lg-fill { + flex: 1 1 auto !important; } + + .flex-lg-grow-0 { + flex-grow: 0 !important; } + + .flex-lg-grow-1 { + flex-grow: 1 !important; } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important; } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important; } + + .justify-content-lg-start { + justify-content: flex-start !important; } + + .justify-content-lg-end { + justify-content: flex-end !important; } + + .justify-content-lg-center { + justify-content: center !important; } + + .justify-content-lg-between { + justify-content: space-between !important; } + + .justify-content-lg-around { + justify-content: space-around !important; } + + .align-items-lg-start { + align-items: flex-start !important; } + + .align-items-lg-end { + align-items: flex-end !important; } + + .align-items-lg-center { + align-items: center !important; } + + .align-items-lg-baseline { + align-items: baseline !important; } + + .align-items-lg-stretch { + align-items: stretch !important; } + + .align-content-lg-start { + align-content: flex-start !important; } + + .align-content-lg-end { + align-content: flex-end !important; } + + .align-content-lg-center { + align-content: center !important; } + + .align-content-lg-between { + align-content: space-between !important; } + + .align-content-lg-around { + align-content: space-around !important; } + + .align-content-lg-stretch { + align-content: stretch !important; } + + .align-self-lg-auto { + align-self: auto !important; } + + .align-self-lg-start { + align-self: flex-start !important; } + + .align-self-lg-end { + align-self: flex-end !important; } + + .align-self-lg-center { + align-self: center !important; } + + .align-self-lg-baseline { + align-self: baseline !important; } + + .align-self-lg-stretch { + align-self: stretch !important; } } +@media (min-width: 1240px) { + .flex-xl-row { + flex-direction: row !important; } + + .flex-xl-column { + flex-direction: column !important; } + + .flex-xl-row-reverse { + flex-direction: row-reverse !important; } + + .flex-xl-column-reverse { + flex-direction: column-reverse !important; } + + .flex-xl-wrap { + flex-wrap: wrap !important; } + + .flex-xl-nowrap { + flex-wrap: nowrap !important; } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; } + + .flex-xl-fill { + flex: 1 1 auto !important; } + + .flex-xl-grow-0 { + flex-grow: 0 !important; } + + .flex-xl-grow-1 { + flex-grow: 1 !important; } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important; } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important; } + + .justify-content-xl-start { + justify-content: flex-start !important; } + + .justify-content-xl-end { + justify-content: flex-end !important; } + + .justify-content-xl-center { + justify-content: center !important; } + + .justify-content-xl-between { + justify-content: space-between !important; } + + .justify-content-xl-around { + justify-content: space-around !important; } + + .align-items-xl-start { + align-items: flex-start !important; } + + .align-items-xl-end { + align-items: flex-end !important; } + + .align-items-xl-center { + align-items: center !important; } + + .align-items-xl-baseline { + align-items: baseline !important; } + + .align-items-xl-stretch { + align-items: stretch !important; } + + .align-content-xl-start { + align-content: flex-start !important; } + + .align-content-xl-end { + align-content: flex-end !important; } + + .align-content-xl-center { + align-content: center !important; } + + .align-content-xl-between { + align-content: space-between !important; } + + .align-content-xl-around { + align-content: space-around !important; } + + .align-content-xl-stretch { + align-content: stretch !important; } + + .align-self-xl-auto { + align-self: auto !important; } + + .align-self-xl-start { + align-self: flex-start !important; } + + .align-self-xl-end { + align-self: flex-end !important; } + + .align-self-xl-center { + align-self: center !important; } + + .align-self-xl-baseline { + align-self: baseline !important; } + + .align-self-xl-stretch { + align-self: stretch !important; } } +@media (min-width: 1600px) { + .flex-xxl-row { + flex-direction: row !important; } + + .flex-xxl-column { + flex-direction: column !important; } + + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; } + + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; } + + .flex-xxl-wrap { + flex-wrap: wrap !important; } + + .flex-xxl-nowrap { + flex-wrap: nowrap !important; } + + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; } + + .flex-xxl-fill { + flex: 1 1 auto !important; } + + .flex-xxl-grow-0 { + flex-grow: 0 !important; } + + .flex-xxl-grow-1 { + flex-grow: 1 !important; } + + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; } + + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; } + + .justify-content-xxl-start { + justify-content: flex-start !important; } + + .justify-content-xxl-end { + justify-content: flex-end !important; } + + .justify-content-xxl-center { + justify-content: center !important; } + + .justify-content-xxl-between { + justify-content: space-between !important; } + + .justify-content-xxl-around { + justify-content: space-around !important; } + + .align-items-xxl-start { + align-items: flex-start !important; } + + .align-items-xxl-end { + align-items: flex-end !important; } + + .align-items-xxl-center { + align-items: center !important; } + + .align-items-xxl-baseline { + align-items: baseline !important; } + + .align-items-xxl-stretch { + align-items: stretch !important; } + + .align-content-xxl-start { + align-content: flex-start !important; } + + .align-content-xxl-end { + align-content: flex-end !important; } + + .align-content-xxl-center { + align-content: center !important; } + + .align-content-xxl-between { + align-content: space-between !important; } + + .align-content-xxl-around { + align-content: space-around !important; } + + .align-content-xxl-stretch { + align-content: stretch !important; } + + .align-self-xxl-auto { + align-self: auto !important; } + + .align-self-xxl-start { + align-self: flex-start !important; } + + .align-self-xxl-end { + align-self: flex-end !important; } + + .align-self-xxl-center { + align-self: center !important; } + + .align-self-xxl-baseline { + align-self: baseline !important; } + + .align-self-xxl-stretch { + align-self: stretch !important; } } +.float-left { + float: left !important; } + +.float-right { + float: right !important; } + +.float-none { + float: none !important; } + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; } + + .float-sm-right { + float: right !important; } + + .float-sm-none { + float: none !important; } } +@media (min-width: 768px) { + .float-md-left { + float: left !important; } + + .float-md-right { + float: right !important; } + + .float-md-none { + float: none !important; } } +@media (min-width: 979px) { + .float-lg-left { + float: left !important; } + + .float-lg-right { + float: right !important; } + + .float-lg-none { + float: none !important; } } +@media (min-width: 1240px) { + .float-xl-left { + float: left !important; } + + .float-xl-right { + float: right !important; } + + .float-xl-none { + float: none !important; } } +@media (min-width: 1600px) { + .float-xxl-left { + float: left !important; } + + .float-xxl-right { + float: right !important; } + + .float-xxl-none { + float: none !important; } } +.overflow-auto { + overflow: auto !important; } + +.overflow-hidden { + overflow: hidden !important; } + +.position-static { + position: static !important; } + +.position-relative { + position: relative !important; } + +.position-absolute { + position: absolute !important; } + +.position-fixed { + position: fixed !important; } + +.position-sticky { + position: sticky !important; } + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; } + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; } + +@supports (position: sticky) { + .sticky-top { + position: sticky; + top: 0; + z-index: 1020; } } + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; } + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; } + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; } + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; } + +.shadow-none { + box-shadow: none !important; } + +.w-25 { + width: 25% !important; } + +.w-50 { + width: 50% !important; } + +.w-75 { + width: 75% !important; } + +.w-100 { + width: 100% !important; } + +.w-auto { + width: auto !important; } + +.h-25 { + height: 25% !important; } + +.h-50 { + height: 50% !important; } + +.h-75 { + height: 75% !important; } + +.h-100 { + height: 100% !important; } + +.h-auto { + height: auto !important; } + +.mw-100 { + max-width: 100% !important; } + +.mh-100 { + max-height: 100% !important; } + +.min-vw-100 { + min-width: 100vw !important; } + +.min-vh-100 { + min-height: 100vh !important; } + +.vw-100 { + width: 100vw !important; } + +.vh-100 { + height: 100vh !important; } + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + pointer-events: auto; + content: ""; + background-color: rgba(0, 0, 0, 0); } + +.m-0 { + margin: 0 !important; } + +.mt-0, +.my-0 { + margin-top: 0 !important; } + +.mr-0, +.mx-0 { + margin-right: 0 !important; } + +.mb-0, +.my-0 { + margin-bottom: 0 !important; } + +.ml-0, +.mx-0 { + margin-left: 0 !important; } + +.m-1 { + margin: 0.25rem !important; } + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; } + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; } + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; } + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; } + +.m-2 { + margin: 0.5rem !important; } + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; } + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; } + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; } + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; } + +.m-3 { + margin: 1rem !important; } + +.mt-3, +.my-3 { + margin-top: 1rem !important; } + +.mr-3, +.mx-3 { + margin-right: 1rem !important; } + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; } + +.ml-3, +.mx-3 { + margin-left: 1rem !important; } + +.m-4 { + margin: 1.5rem !important; } + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; } + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; } + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; } + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; } + +.m-5 { + margin: 3rem !important; } + +.mt-5, +.my-5 { + margin-top: 3rem !important; } + +.mr-5, +.mx-5 { + margin-right: 3rem !important; } + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; } + +.ml-5, +.mx-5 { + margin-left: 3rem !important; } + +.p-0 { + padding: 0 !important; } + +.pt-0, +.py-0 { + padding-top: 0 !important; } + +.pr-0, +.px-0 { + padding-right: 0 !important; } + +.pb-0, +.py-0 { + padding-bottom: 0 !important; } + +.pl-0, +.px-0 { + padding-left: 0 !important; } + +.p-1 { + padding: 0.25rem !important; } + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; } + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; } + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; } + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; } + +.p-2 { + padding: 0.5rem !important; } + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; } + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; } + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; } + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; } + +.p-3 { + padding: 1rem !important; } + +.pt-3, +.py-3 { + padding-top: 1rem !important; } + +.pr-3, +.px-3 { + padding-right: 1rem !important; } + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; } + +.pl-3, +.px-3 { + padding-left: 1rem !important; } + +.p-4 { + padding: 1.5rem !important; } + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; } + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; } + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; } + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; } + +.p-5 { + padding: 3rem !important; } + +.pt-5, +.py-5 { + padding-top: 3rem !important; } + +.pr-5, +.px-5 { + padding-right: 3rem !important; } + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; } + +.pl-5, +.px-5 { + padding-left: 3rem !important; } + +.m-n1 { + margin: -0.25rem !important; } + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; } + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; } + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; } + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; } + +.m-n2 { + margin: -0.5rem !important; } + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; } + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; } + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; } + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; } + +.m-n3 { + margin: -1rem !important; } + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; } + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; } + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; } + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; } + +.m-n4 { + margin: -1.5rem !important; } + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; } + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; } + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; } + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; } + +.m-n5 { + margin: -3rem !important; } + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; } + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; } + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; } + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; } + +.m-auto { + margin: auto !important; } + +.mt-auto, +.my-auto { + margin-top: auto !important; } + +.mr-auto, +.mx-auto { + margin-right: auto !important; } + +.mb-auto, +.my-auto { + margin-bottom: auto !important; } + +.ml-auto, +.mx-auto { + margin-left: auto !important; } + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; } + + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important; } + + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important; } + + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important; } + + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important; } + + .m-sm-1 { + margin: 0.25rem !important; } + + .mt-sm-1, + .my-sm-1 { + margin-top: 0.25rem !important; } + + .mr-sm-1, + .mx-sm-1 { + margin-right: 0.25rem !important; } + + .mb-sm-1, + .my-sm-1 { + margin-bottom: 0.25rem !important; } + + .ml-sm-1, + .mx-sm-1 { + margin-left: 0.25rem !important; } + + .m-sm-2 { + margin: 0.5rem !important; } + + .mt-sm-2, + .my-sm-2 { + margin-top: 0.5rem !important; } + + .mr-sm-2, + .mx-sm-2 { + margin-right: 0.5rem !important; } + + .mb-sm-2, + .my-sm-2 { + margin-bottom: 0.5rem !important; } + + .ml-sm-2, + .mx-sm-2 { + margin-left: 0.5rem !important; } + + .m-sm-3 { + margin: 1rem !important; } + + .mt-sm-3, + .my-sm-3 { + margin-top: 1rem !important; } + + .mr-sm-3, + .mx-sm-3 { + margin-right: 1rem !important; } + + .mb-sm-3, + .my-sm-3 { + margin-bottom: 1rem !important; } + + .ml-sm-3, + .mx-sm-3 { + margin-left: 1rem !important; } + + .m-sm-4 { + margin: 1.5rem !important; } + + .mt-sm-4, + .my-sm-4 { + margin-top: 1.5rem !important; } + + .mr-sm-4, + .mx-sm-4 { + margin-right: 1.5rem !important; } + + .mb-sm-4, + .my-sm-4 { + margin-bottom: 1.5rem !important; } + + .ml-sm-4, + .mx-sm-4 { + margin-left: 1.5rem !important; } + + .m-sm-5 { + margin: 3rem !important; } + + .mt-sm-5, + .my-sm-5 { + margin-top: 3rem !important; } + + .mr-sm-5, + .mx-sm-5 { + margin-right: 3rem !important; } + + .mb-sm-5, + .my-sm-5 { + margin-bottom: 3rem !important; } + + .ml-sm-5, + .mx-sm-5 { + margin-left: 3rem !important; } + + .p-sm-0 { + padding: 0 !important; } + + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important; } + + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important; } + + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important; } + + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important; } + + .p-sm-1 { + padding: 0.25rem !important; } + + .pt-sm-1, + .py-sm-1 { + padding-top: 0.25rem !important; } + + .pr-sm-1, + .px-sm-1 { + padding-right: 0.25rem !important; } + + .pb-sm-1, + .py-sm-1 { + padding-bottom: 0.25rem !important; } + + .pl-sm-1, + .px-sm-1 { + padding-left: 0.25rem !important; } + + .p-sm-2 { + padding: 0.5rem !important; } + + .pt-sm-2, + .py-sm-2 { + padding-top: 0.5rem !important; } + + .pr-sm-2, + .px-sm-2 { + padding-right: 0.5rem !important; } + + .pb-sm-2, + .py-sm-2 { + padding-bottom: 0.5rem !important; } + + .pl-sm-2, + .px-sm-2 { + padding-left: 0.5rem !important; } + + .p-sm-3 { + padding: 1rem !important; } + + .pt-sm-3, + .py-sm-3 { + padding-top: 1rem !important; } + + .pr-sm-3, + .px-sm-3 { + padding-right: 1rem !important; } + + .pb-sm-3, + .py-sm-3 { + padding-bottom: 1rem !important; } + + .pl-sm-3, + .px-sm-3 { + padding-left: 1rem !important; } + + .p-sm-4 { + padding: 1.5rem !important; } + + .pt-sm-4, + .py-sm-4 { + padding-top: 1.5rem !important; } + + .pr-sm-4, + .px-sm-4 { + padding-right: 1.5rem !important; } + + .pb-sm-4, + .py-sm-4 { + padding-bottom: 1.5rem !important; } + + .pl-sm-4, + .px-sm-4 { + padding-left: 1.5rem !important; } + + .p-sm-5 { + padding: 3rem !important; } + + .pt-sm-5, + .py-sm-5 { + padding-top: 3rem !important; } + + .pr-sm-5, + .px-sm-5 { + padding-right: 3rem !important; } + + .pb-sm-5, + .py-sm-5 { + padding-bottom: 3rem !important; } + + .pl-sm-5, + .px-sm-5 { + padding-left: 3rem !important; } + + .m-sm-n1 { + margin: -0.25rem !important; } + + .mt-sm-n1, + .my-sm-n1 { + margin-top: -0.25rem !important; } + + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -0.25rem !important; } + + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -0.25rem !important; } + + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -0.25rem !important; } + + .m-sm-n2 { + margin: -0.5rem !important; } + + .mt-sm-n2, + .my-sm-n2 { + margin-top: -0.5rem !important; } + + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -0.5rem !important; } + + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -0.5rem !important; } + + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -0.5rem !important; } + + .m-sm-n3 { + margin: -1rem !important; } + + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important; } + + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important; } + + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important; } + + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important; } + + .m-sm-n4 { + margin: -1.5rem !important; } + + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important; } + + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important; } + + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important; } + + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important; } + + .m-sm-n5 { + margin: -3rem !important; } + + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important; } + + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important; } + + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important; } + + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important; } + + .m-sm-auto { + margin: auto !important; } + + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important; } + + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important; } + + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important; } + + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important; } } +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; } + + .mt-md-0, + .my-md-0 { + margin-top: 0 !important; } + + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important; } + + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important; } + + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important; } + + .m-md-1 { + margin: 0.25rem !important; } + + .mt-md-1, + .my-md-1 { + margin-top: 0.25rem !important; } + + .mr-md-1, + .mx-md-1 { + margin-right: 0.25rem !important; } + + .mb-md-1, + .my-md-1 { + margin-bottom: 0.25rem !important; } + + .ml-md-1, + .mx-md-1 { + margin-left: 0.25rem !important; } + + .m-md-2 { + margin: 0.5rem !important; } + + .mt-md-2, + .my-md-2 { + margin-top: 0.5rem !important; } + + .mr-md-2, + .mx-md-2 { + margin-right: 0.5rem !important; } + + .mb-md-2, + .my-md-2 { + margin-bottom: 0.5rem !important; } + + .ml-md-2, + .mx-md-2 { + margin-left: 0.5rem !important; } + + .m-md-3 { + margin: 1rem !important; } + + .mt-md-3, + .my-md-3 { + margin-top: 1rem !important; } + + .mr-md-3, + .mx-md-3 { + margin-right: 1rem !important; } + + .mb-md-3, + .my-md-3 { + margin-bottom: 1rem !important; } + + .ml-md-3, + .mx-md-3 { + margin-left: 1rem !important; } + + .m-md-4 { + margin: 1.5rem !important; } + + .mt-md-4, + .my-md-4 { + margin-top: 1.5rem !important; } + + .mr-md-4, + .mx-md-4 { + margin-right: 1.5rem !important; } + + .mb-md-4, + .my-md-4 { + margin-bottom: 1.5rem !important; } + + .ml-md-4, + .mx-md-4 { + margin-left: 1.5rem !important; } + + .m-md-5 { + margin: 3rem !important; } + + .mt-md-5, + .my-md-5 { + margin-top: 3rem !important; } + + .mr-md-5, + .mx-md-5 { + margin-right: 3rem !important; } + + .mb-md-5, + .my-md-5 { + margin-bottom: 3rem !important; } + + .ml-md-5, + .mx-md-5 { + margin-left: 3rem !important; } + + .p-md-0 { + padding: 0 !important; } + + .pt-md-0, + .py-md-0 { + padding-top: 0 !important; } + + .pr-md-0, + .px-md-0 { + padding-right: 0 !important; } + + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important; } + + .pl-md-0, + .px-md-0 { + padding-left: 0 !important; } + + .p-md-1 { + padding: 0.25rem !important; } + + .pt-md-1, + .py-md-1 { + padding-top: 0.25rem !important; } + + .pr-md-1, + .px-md-1 { + padding-right: 0.25rem !important; } + + .pb-md-1, + .py-md-1 { + padding-bottom: 0.25rem !important; } + + .pl-md-1, + .px-md-1 { + padding-left: 0.25rem !important; } + + .p-md-2 { + padding: 0.5rem !important; } + + .pt-md-2, + .py-md-2 { + padding-top: 0.5rem !important; } + + .pr-md-2, + .px-md-2 { + padding-right: 0.5rem !important; } + + .pb-md-2, + .py-md-2 { + padding-bottom: 0.5rem !important; } + + .pl-md-2, + .px-md-2 { + padding-left: 0.5rem !important; } + + .p-md-3 { + padding: 1rem !important; } + + .pt-md-3, + .py-md-3 { + padding-top: 1rem !important; } + + .pr-md-3, + .px-md-3 { + padding-right: 1rem !important; } + + .pb-md-3, + .py-md-3 { + padding-bottom: 1rem !important; } + + .pl-md-3, + .px-md-3 { + padding-left: 1rem !important; } + + .p-md-4 { + padding: 1.5rem !important; } + + .pt-md-4, + .py-md-4 { + padding-top: 1.5rem !important; } + + .pr-md-4, + .px-md-4 { + padding-right: 1.5rem !important; } + + .pb-md-4, + .py-md-4 { + padding-bottom: 1.5rem !important; } + + .pl-md-4, + .px-md-4 { + padding-left: 1.5rem !important; } + + .p-md-5 { + padding: 3rem !important; } + + .pt-md-5, + .py-md-5 { + padding-top: 3rem !important; } + + .pr-md-5, + .px-md-5 { + padding-right: 3rem !important; } + + .pb-md-5, + .py-md-5 { + padding-bottom: 3rem !important; } + + .pl-md-5, + .px-md-5 { + padding-left: 3rem !important; } + + .m-md-n1 { + margin: -0.25rem !important; } + + .mt-md-n1, + .my-md-n1 { + margin-top: -0.25rem !important; } + + .mr-md-n1, + .mx-md-n1 { + margin-right: -0.25rem !important; } + + .mb-md-n1, + .my-md-n1 { + margin-bottom: -0.25rem !important; } + + .ml-md-n1, + .mx-md-n1 { + margin-left: -0.25rem !important; } + + .m-md-n2 { + margin: -0.5rem !important; } + + .mt-md-n2, + .my-md-n2 { + margin-top: -0.5rem !important; } + + .mr-md-n2, + .mx-md-n2 { + margin-right: -0.5rem !important; } + + .mb-md-n2, + .my-md-n2 { + margin-bottom: -0.5rem !important; } + + .ml-md-n2, + .mx-md-n2 { + margin-left: -0.5rem !important; } + + .m-md-n3 { + margin: -1rem !important; } + + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important; } + + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important; } + + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important; } + + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important; } + + .m-md-n4 { + margin: -1.5rem !important; } + + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important; } + + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important; } + + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important; } + + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important; } + + .m-md-n5 { + margin: -3rem !important; } + + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important; } + + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important; } + + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important; } + + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important; } + + .m-md-auto { + margin: auto !important; } + + .mt-md-auto, + .my-md-auto { + margin-top: auto !important; } + + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important; } + + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important; } + + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important; } } +@media (min-width: 979px) { + .m-lg-0 { + margin: 0 !important; } + + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important; } + + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important; } + + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important; } + + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important; } + + .m-lg-1 { + margin: 0.25rem !important; } + + .mt-lg-1, + .my-lg-1 { + margin-top: 0.25rem !important; } + + .mr-lg-1, + .mx-lg-1 { + margin-right: 0.25rem !important; } + + .mb-lg-1, + .my-lg-1 { + margin-bottom: 0.25rem !important; } + + .ml-lg-1, + .mx-lg-1 { + margin-left: 0.25rem !important; } + + .m-lg-2 { + margin: 0.5rem !important; } + + .mt-lg-2, + .my-lg-2 { + margin-top: 0.5rem !important; } + + .mr-lg-2, + .mx-lg-2 { + margin-right: 0.5rem !important; } + + .mb-lg-2, + .my-lg-2 { + margin-bottom: 0.5rem !important; } + + .ml-lg-2, + .mx-lg-2 { + margin-left: 0.5rem !important; } + + .m-lg-3 { + margin: 1rem !important; } + + .mt-lg-3, + .my-lg-3 { + margin-top: 1rem !important; } + + .mr-lg-3, + .mx-lg-3 { + margin-right: 1rem !important; } + + .mb-lg-3, + .my-lg-3 { + margin-bottom: 1rem !important; } + + .ml-lg-3, + .mx-lg-3 { + margin-left: 1rem !important; } + + .m-lg-4 { + margin: 1.5rem !important; } + + .mt-lg-4, + .my-lg-4 { + margin-top: 1.5rem !important; } + + .mr-lg-4, + .mx-lg-4 { + margin-right: 1.5rem !important; } + + .mb-lg-4, + .my-lg-4 { + margin-bottom: 1.5rem !important; } + + .ml-lg-4, + .mx-lg-4 { + margin-left: 1.5rem !important; } + + .m-lg-5 { + margin: 3rem !important; } + + .mt-lg-5, + .my-lg-5 { + margin-top: 3rem !important; } + + .mr-lg-5, + .mx-lg-5 { + margin-right: 3rem !important; } + + .mb-lg-5, + .my-lg-5 { + margin-bottom: 3rem !important; } + + .ml-lg-5, + .mx-lg-5 { + margin-left: 3rem !important; } + + .p-lg-0 { + padding: 0 !important; } + + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important; } + + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important; } + + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important; } + + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important; } + + .p-lg-1 { + padding: 0.25rem !important; } + + .pt-lg-1, + .py-lg-1 { + padding-top: 0.25rem !important; } + + .pr-lg-1, + .px-lg-1 { + padding-right: 0.25rem !important; } + + .pb-lg-1, + .py-lg-1 { + padding-bottom: 0.25rem !important; } + + .pl-lg-1, + .px-lg-1 { + padding-left: 0.25rem !important; } + + .p-lg-2 { + padding: 0.5rem !important; } + + .pt-lg-2, + .py-lg-2 { + padding-top: 0.5rem !important; } + + .pr-lg-2, + .px-lg-2 { + padding-right: 0.5rem !important; } + + .pb-lg-2, + .py-lg-2 { + padding-bottom: 0.5rem !important; } + + .pl-lg-2, + .px-lg-2 { + padding-left: 0.5rem !important; } + + .p-lg-3 { + padding: 1rem !important; } + + .pt-lg-3, + .py-lg-3 { + padding-top: 1rem !important; } + + .pr-lg-3, + .px-lg-3 { + padding-right: 1rem !important; } + + .pb-lg-3, + .py-lg-3 { + padding-bottom: 1rem !important; } + + .pl-lg-3, + .px-lg-3 { + padding-left: 1rem !important; } + + .p-lg-4 { + padding: 1.5rem !important; } + + .pt-lg-4, + .py-lg-4 { + padding-top: 1.5rem !important; } + + .pr-lg-4, + .px-lg-4 { + padding-right: 1.5rem !important; } + + .pb-lg-4, + .py-lg-4 { + padding-bottom: 1.5rem !important; } + + .pl-lg-4, + .px-lg-4 { + padding-left: 1.5rem !important; } + + .p-lg-5 { + padding: 3rem !important; } + + .pt-lg-5, + .py-lg-5 { + padding-top: 3rem !important; } + + .pr-lg-5, + .px-lg-5 { + padding-right: 3rem !important; } + + .pb-lg-5, + .py-lg-5 { + padding-bottom: 3rem !important; } + + .pl-lg-5, + .px-lg-5 { + padding-left: 3rem !important; } + + .m-lg-n1 { + margin: -0.25rem !important; } + + .mt-lg-n1, + .my-lg-n1 { + margin-top: -0.25rem !important; } + + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -0.25rem !important; } + + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -0.25rem !important; } + + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -0.25rem !important; } + + .m-lg-n2 { + margin: -0.5rem !important; } + + .mt-lg-n2, + .my-lg-n2 { + margin-top: -0.5rem !important; } + + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -0.5rem !important; } + + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -0.5rem !important; } + + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -0.5rem !important; } + + .m-lg-n3 { + margin: -1rem !important; } + + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important; } + + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important; } + + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important; } + + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important; } + + .m-lg-n4 { + margin: -1.5rem !important; } + + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important; } + + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important; } + + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important; } + + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important; } + + .m-lg-n5 { + margin: -3rem !important; } + + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important; } + + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important; } + + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important; } + + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important; } + + .m-lg-auto { + margin: auto !important; } + + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important; } + + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important; } + + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important; } + + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important; } } +@media (min-width: 1240px) { + .m-xl-0 { + margin: 0 !important; } + + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important; } + + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important; } + + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important; } + + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important; } + + .m-xl-1 { + margin: 0.25rem !important; } + + .mt-xl-1, + .my-xl-1 { + margin-top: 0.25rem !important; } + + .mr-xl-1, + .mx-xl-1 { + margin-right: 0.25rem !important; } + + .mb-xl-1, + .my-xl-1 { + margin-bottom: 0.25rem !important; } + + .ml-xl-1, + .mx-xl-1 { + margin-left: 0.25rem !important; } + + .m-xl-2 { + margin: 0.5rem !important; } + + .mt-xl-2, + .my-xl-2 { + margin-top: 0.5rem !important; } + + .mr-xl-2, + .mx-xl-2 { + margin-right: 0.5rem !important; } + + .mb-xl-2, + .my-xl-2 { + margin-bottom: 0.5rem !important; } + + .ml-xl-2, + .mx-xl-2 { + margin-left: 0.5rem !important; } + + .m-xl-3 { + margin: 1rem !important; } + + .mt-xl-3, + .my-xl-3 { + margin-top: 1rem !important; } + + .mr-xl-3, + .mx-xl-3 { + margin-right: 1rem !important; } + + .mb-xl-3, + .my-xl-3 { + margin-bottom: 1rem !important; } + + .ml-xl-3, + .mx-xl-3 { + margin-left: 1rem !important; } + + .m-xl-4 { + margin: 1.5rem !important; } + + .mt-xl-4, + .my-xl-4 { + margin-top: 1.5rem !important; } + + .mr-xl-4, + .mx-xl-4 { + margin-right: 1.5rem !important; } + + .mb-xl-4, + .my-xl-4 { + margin-bottom: 1.5rem !important; } + + .ml-xl-4, + .mx-xl-4 { + margin-left: 1.5rem !important; } + + .m-xl-5 { + margin: 3rem !important; } + + .mt-xl-5, + .my-xl-5 { + margin-top: 3rem !important; } + + .mr-xl-5, + .mx-xl-5 { + margin-right: 3rem !important; } + + .mb-xl-5, + .my-xl-5 { + margin-bottom: 3rem !important; } + + .ml-xl-5, + .mx-xl-5 { + margin-left: 3rem !important; } + + .p-xl-0 { + padding: 0 !important; } + + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important; } + + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important; } + + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important; } + + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important; } + + .p-xl-1 { + padding: 0.25rem !important; } + + .pt-xl-1, + .py-xl-1 { + padding-top: 0.25rem !important; } + + .pr-xl-1, + .px-xl-1 { + padding-right: 0.25rem !important; } + + .pb-xl-1, + .py-xl-1 { + padding-bottom: 0.25rem !important; } + + .pl-xl-1, + .px-xl-1 { + padding-left: 0.25rem !important; } + + .p-xl-2 { + padding: 0.5rem !important; } + + .pt-xl-2, + .py-xl-2 { + padding-top: 0.5rem !important; } + + .pr-xl-2, + .px-xl-2 { + padding-right: 0.5rem !important; } + + .pb-xl-2, + .py-xl-2 { + padding-bottom: 0.5rem !important; } + + .pl-xl-2, + .px-xl-2 { + padding-left: 0.5rem !important; } + + .p-xl-3 { + padding: 1rem !important; } + + .pt-xl-3, + .py-xl-3 { + padding-top: 1rem !important; } + + .pr-xl-3, + .px-xl-3 { + padding-right: 1rem !important; } + + .pb-xl-3, + .py-xl-3 { + padding-bottom: 1rem !important; } + + .pl-xl-3, + .px-xl-3 { + padding-left: 1rem !important; } + + .p-xl-4 { + padding: 1.5rem !important; } + + .pt-xl-4, + .py-xl-4 { + padding-top: 1.5rem !important; } + + .pr-xl-4, + .px-xl-4 { + padding-right: 1.5rem !important; } + + .pb-xl-4, + .py-xl-4 { + padding-bottom: 1.5rem !important; } + + .pl-xl-4, + .px-xl-4 { + padding-left: 1.5rem !important; } + + .p-xl-5 { + padding: 3rem !important; } + + .pt-xl-5, + .py-xl-5 { + padding-top: 3rem !important; } + + .pr-xl-5, + .px-xl-5 { + padding-right: 3rem !important; } + + .pb-xl-5, + .py-xl-5 { + padding-bottom: 3rem !important; } + + .pl-xl-5, + .px-xl-5 { + padding-left: 3rem !important; } + + .m-xl-n1 { + margin: -0.25rem !important; } + + .mt-xl-n1, + .my-xl-n1 { + margin-top: -0.25rem !important; } + + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -0.25rem !important; } + + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -0.25rem !important; } + + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -0.25rem !important; } + + .m-xl-n2 { + margin: -0.5rem !important; } + + .mt-xl-n2, + .my-xl-n2 { + margin-top: -0.5rem !important; } + + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -0.5rem !important; } + + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -0.5rem !important; } + + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -0.5rem !important; } + + .m-xl-n3 { + margin: -1rem !important; } + + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important; } + + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important; } + + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important; } + + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important; } + + .m-xl-n4 { + margin: -1.5rem !important; } + + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important; } + + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important; } + + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important; } + + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important; } + + .m-xl-n5 { + margin: -3rem !important; } + + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important; } + + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important; } + + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important; } + + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important; } + + .m-xl-auto { + margin: auto !important; } + + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important; } + + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important; } + + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important; } + + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important; } } +@media (min-width: 1600px) { + .m-xxl-0 { + margin: 0 !important; } + + .mt-xxl-0, + .my-xxl-0 { + margin-top: 0 !important; } + + .mr-xxl-0, + .mx-xxl-0 { + margin-right: 0 !important; } + + .mb-xxl-0, + .my-xxl-0 { + margin-bottom: 0 !important; } + + .ml-xxl-0, + .mx-xxl-0 { + margin-left: 0 !important; } + + .m-xxl-1 { + margin: 0.25rem !important; } + + .mt-xxl-1, + .my-xxl-1 { + margin-top: 0.25rem !important; } + + .mr-xxl-1, + .mx-xxl-1 { + margin-right: 0.25rem !important; } + + .mb-xxl-1, + .my-xxl-1 { + margin-bottom: 0.25rem !important; } + + .ml-xxl-1, + .mx-xxl-1 { + margin-left: 0.25rem !important; } + + .m-xxl-2 { + margin: 0.5rem !important; } + + .mt-xxl-2, + .my-xxl-2 { + margin-top: 0.5rem !important; } + + .mr-xxl-2, + .mx-xxl-2 { + margin-right: 0.5rem !important; } + + .mb-xxl-2, + .my-xxl-2 { + margin-bottom: 0.5rem !important; } + + .ml-xxl-2, + .mx-xxl-2 { + margin-left: 0.5rem !important; } + + .m-xxl-3 { + margin: 1rem !important; } + + .mt-xxl-3, + .my-xxl-3 { + margin-top: 1rem !important; } + + .mr-xxl-3, + .mx-xxl-3 { + margin-right: 1rem !important; } + + .mb-xxl-3, + .my-xxl-3 { + margin-bottom: 1rem !important; } + + .ml-xxl-3, + .mx-xxl-3 { + margin-left: 1rem !important; } + + .m-xxl-4 { + margin: 1.5rem !important; } + + .mt-xxl-4, + .my-xxl-4 { + margin-top: 1.5rem !important; } + + .mr-xxl-4, + .mx-xxl-4 { + margin-right: 1.5rem !important; } + + .mb-xxl-4, + .my-xxl-4 { + margin-bottom: 1.5rem !important; } + + .ml-xxl-4, + .mx-xxl-4 { + margin-left: 1.5rem !important; } + + .m-xxl-5 { + margin: 3rem !important; } + + .mt-xxl-5, + .my-xxl-5 { + margin-top: 3rem !important; } + + .mr-xxl-5, + .mx-xxl-5 { + margin-right: 3rem !important; } + + .mb-xxl-5, + .my-xxl-5 { + margin-bottom: 3rem !important; } + + .ml-xxl-5, + .mx-xxl-5 { + margin-left: 3rem !important; } + + .p-xxl-0 { + padding: 0 !important; } + + .pt-xxl-0, + .py-xxl-0 { + padding-top: 0 !important; } + + .pr-xxl-0, + .px-xxl-0 { + padding-right: 0 !important; } + + .pb-xxl-0, + .py-xxl-0 { + padding-bottom: 0 !important; } + + .pl-xxl-0, + .px-xxl-0 { + padding-left: 0 !important; } + + .p-xxl-1 { + padding: 0.25rem !important; } + + .pt-xxl-1, + .py-xxl-1 { + padding-top: 0.25rem !important; } + + .pr-xxl-1, + .px-xxl-1 { + padding-right: 0.25rem !important; } + + .pb-xxl-1, + .py-xxl-1 { + padding-bottom: 0.25rem !important; } + + .pl-xxl-1, + .px-xxl-1 { + padding-left: 0.25rem !important; } + + .p-xxl-2 { + padding: 0.5rem !important; } + + .pt-xxl-2, + .py-xxl-2 { + padding-top: 0.5rem !important; } + + .pr-xxl-2, + .px-xxl-2 { + padding-right: 0.5rem !important; } + + .pb-xxl-2, + .py-xxl-2 { + padding-bottom: 0.5rem !important; } + + .pl-xxl-2, + .px-xxl-2 { + padding-left: 0.5rem !important; } + + .p-xxl-3 { + padding: 1rem !important; } + + .pt-xxl-3, + .py-xxl-3 { + padding-top: 1rem !important; } + + .pr-xxl-3, + .px-xxl-3 { + padding-right: 1rem !important; } + + .pb-xxl-3, + .py-xxl-3 { + padding-bottom: 1rem !important; } + + .pl-xxl-3, + .px-xxl-3 { + padding-left: 1rem !important; } + + .p-xxl-4 { + padding: 1.5rem !important; } + + .pt-xxl-4, + .py-xxl-4 { + padding-top: 1.5rem !important; } + + .pr-xxl-4, + .px-xxl-4 { + padding-right: 1.5rem !important; } + + .pb-xxl-4, + .py-xxl-4 { + padding-bottom: 1.5rem !important; } + + .pl-xxl-4, + .px-xxl-4 { + padding-left: 1.5rem !important; } + + .p-xxl-5 { + padding: 3rem !important; } + + .pt-xxl-5, + .py-xxl-5 { + padding-top: 3rem !important; } + + .pr-xxl-5, + .px-xxl-5 { + padding-right: 3rem !important; } + + .pb-xxl-5, + .py-xxl-5 { + padding-bottom: 3rem !important; } + + .pl-xxl-5, + .px-xxl-5 { + padding-left: 3rem !important; } + + .m-xxl-n1 { + margin: -0.25rem !important; } + + .mt-xxl-n1, + .my-xxl-n1 { + margin-top: -0.25rem !important; } + + .mr-xxl-n1, + .mx-xxl-n1 { + margin-right: -0.25rem !important; } + + .mb-xxl-n1, + .my-xxl-n1 { + margin-bottom: -0.25rem !important; } + + .ml-xxl-n1, + .mx-xxl-n1 { + margin-left: -0.25rem !important; } + + .m-xxl-n2 { + margin: -0.5rem !important; } + + .mt-xxl-n2, + .my-xxl-n2 { + margin-top: -0.5rem !important; } + + .mr-xxl-n2, + .mx-xxl-n2 { + margin-right: -0.5rem !important; } + + .mb-xxl-n2, + .my-xxl-n2 { + margin-bottom: -0.5rem !important; } + + .ml-xxl-n2, + .mx-xxl-n2 { + margin-left: -0.5rem !important; } + + .m-xxl-n3 { + margin: -1rem !important; } + + .mt-xxl-n3, + .my-xxl-n3 { + margin-top: -1rem !important; } + + .mr-xxl-n3, + .mx-xxl-n3 { + margin-right: -1rem !important; } + + .mb-xxl-n3, + .my-xxl-n3 { + margin-bottom: -1rem !important; } + + .ml-xxl-n3, + .mx-xxl-n3 { + margin-left: -1rem !important; } + + .m-xxl-n4 { + margin: -1.5rem !important; } + + .mt-xxl-n4, + .my-xxl-n4 { + margin-top: -1.5rem !important; } + + .mr-xxl-n4, + .mx-xxl-n4 { + margin-right: -1.5rem !important; } + + .mb-xxl-n4, + .my-xxl-n4 { + margin-bottom: -1.5rem !important; } + + .ml-xxl-n4, + .mx-xxl-n4 { + margin-left: -1.5rem !important; } + + .m-xxl-n5 { + margin: -3rem !important; } + + .mt-xxl-n5, + .my-xxl-n5 { + margin-top: -3rem !important; } + + .mr-xxl-n5, + .mx-xxl-n5 { + margin-right: -3rem !important; } + + .mb-xxl-n5, + .my-xxl-n5 { + margin-bottom: -3rem !important; } + + .ml-xxl-n5, + .mx-xxl-n5 { + margin-left: -3rem !important; } + + .m-xxl-auto { + margin: auto !important; } + + .mt-xxl-auto, + .my-xxl-auto { + margin-top: auto !important; } + + .mr-xxl-auto, + .mx-xxl-auto { + margin-right: auto !important; } + + .mb-xxl-auto, + .my-xxl-auto { + margin-bottom: auto !important; } + + .ml-xxl-auto, + .mx-xxl-auto { + margin-left: auto !important; } } +.text-monospace { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; } + +.text-justify { + text-align: justify !important; } + +.text-wrap { + white-space: normal !important; } + +.text-nowrap { + white-space: nowrap !important; } + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + +.text-left { + text-align: left !important; } + +.text-right { + text-align: right !important; } + +.text-center { + text-align: center !important; } + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; } + + .text-sm-right { + text-align: right !important; } + + .text-sm-center { + text-align: center !important; } } +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; } + + .text-md-right { + text-align: right !important; } + + .text-md-center { + text-align: center !important; } } +@media (min-width: 979px) { + .text-lg-left { + text-align: left !important; } + + .text-lg-right { + text-align: right !important; } + + .text-lg-center { + text-align: center !important; } } +@media (min-width: 1240px) { + .text-xl-left { + text-align: left !important; } + + .text-xl-right { + text-align: right !important; } + + .text-xl-center { + text-align: center !important; } } +@media (min-width: 1600px) { + .text-xxl-left { + text-align: left !important; } + + .text-xxl-right { + text-align: right !important; } + + .text-xxl-center { + text-align: center !important; } } +.text-lowercase { + text-transform: lowercase !important; } + +.text-uppercase { + text-transform: uppercase !important; } + +.text-capitalize { + text-transform: capitalize !important; } + +.font-weight-light { + font-weight: 300 !important; } + +.font-weight-lighter { + font-weight: lighter !important; } + +.font-weight-normal { + font-weight: 400 !important; } + +.font-weight-bold { + font-weight: 700 !important; } + +.font-weight-bolder { + font-weight: bolder !important; } + +.font-italic { + font-style: italic !important; } + +.text-white { + color: #fff !important; } + +.text-primary { + color: #050505 !important; } + +a.text-primary:hover, a.text-primary:focus { + color: black !important; } + +.text-secondary { + color: #e6e8e8 !important; } + +a.text-secondary:hover, a.text-secondary:focus { + color: #bec3c3 !important; } + +.text-success { + color: #28a745 !important; } + +a.text-success:hover, a.text-success:focus { + color: #19692c !important; } + +.text-info { + color: #3590dc !important; } + +a.text-info:hover, a.text-info:focus { + color: #1d68a7 !important; } + +.text-warning { + color: #FECC02 !important; } + +a.text-warning:hover, a.text-warning:focus { + color: #b38f01 !important; } + +.text-danger { + color: #FF2222 !important; } + +a.text-danger:hover, a.text-danger:focus { + color: #d50000 !important; } + +.text-light { + color: #e9ecef !important; } + +a.text-light:hover, a.text-light:focus { + color: #bdc6cf !important; } + +.text-dark { + color: #212529 !important; } + +a.text-dark:hover, a.text-dark:focus { + color: black !important; } + +.text-action { + color: #844E9F !important; } + +a.text-action:hover, a.text-action:focus { + color: #59356c !important; } + +.text-gray { + color: #ced4da !important; } + +a.text-gray:hover, a.text-gray:focus { + color: #a2aeb9 !important; } + +.text-body { + color: #212529 !important; } + +.text-muted { + color: #6c757d !important; } + +.text-black-50 { + color: rgba(0, 0, 0, 0.5) !important; } + +.text-white-50 { + color: rgba(255, 255, 255, 0.5) !important; } + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; } + +.text-decoration-none { + text-decoration: none !important; } + +.text-break { + word-break: break-word !important; + overflow-wrap: break-word !important; } + +.text-reset { + color: inherit !important; } + +.visible { + visibility: visible !important; } + +.invisible { + visibility: hidden !important; } + +.columns-1 { + -webkit-column-count: 1 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 1 !important; + /* Firefox */ + column-count: 1 !important; } + +.columns-2 { + -webkit-column-count: 2 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 2 !important; + /* Firefox */ + column-count: 2 !important; } + +.columns-3 { + -webkit-column-count: 3 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 3 !important; + /* Firefox */ + column-count: 3 !important; } + +.columns-4 { + -webkit-column-count: 4 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 4 !important; + /* Firefox */ + column-count: 4 !important; } + +.columns-5 { + -webkit-column-count: 5 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 5 !important; + /* Firefox */ + column-count: 5 !important; } + +.columns-6 { + -webkit-column-count: 6 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 6 !important; + /* Firefox */ + column-count: 6 !important; } + +@media (min-width: 576px) { + .columns-sm-1 { + -webkit-column-count: 1 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 1 !important; + /* Firefox */ + column-count: 1 !important; } + + .columns-sm-2 { + -webkit-column-count: 2 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 2 !important; + /* Firefox */ + column-count: 2 !important; } + + .columns-sm-3 { + -webkit-column-count: 3 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 3 !important; + /* Firefox */ + column-count: 3 !important; } + + .columns-sm-4 { + -webkit-column-count: 4 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 4 !important; + /* Firefox */ + column-count: 4 !important; } + + .columns-sm-5 { + -webkit-column-count: 5 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 5 !important; + /* Firefox */ + column-count: 5 !important; } + + .columns-sm-6 { + -webkit-column-count: 6 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 6 !important; + /* Firefox */ + column-count: 6 !important; } } +@media (min-width: 768px) { + .columns-md-1 { + -webkit-column-count: 1 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 1 !important; + /* Firefox */ + column-count: 1 !important; } + + .columns-md-2 { + -webkit-column-count: 2 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 2 !important; + /* Firefox */ + column-count: 2 !important; } + + .columns-md-3 { + -webkit-column-count: 3 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 3 !important; + /* Firefox */ + column-count: 3 !important; } + + .columns-md-4 { + -webkit-column-count: 4 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 4 !important; + /* Firefox */ + column-count: 4 !important; } + + .columns-md-5 { + -webkit-column-count: 5 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 5 !important; + /* Firefox */ + column-count: 5 !important; } + + .columns-md-6 { + -webkit-column-count: 6 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 6 !important; + /* Firefox */ + column-count: 6 !important; } } +@media (min-width: 979px) { + .columns-lg-1 { + -webkit-column-count: 1 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 1 !important; + /* Firefox */ + column-count: 1 !important; } + + .columns-lg-2 { + -webkit-column-count: 2 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 2 !important; + /* Firefox */ + column-count: 2 !important; } + + .columns-lg-3 { + -webkit-column-count: 3 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 3 !important; + /* Firefox */ + column-count: 3 !important; } + + .columns-lg-4 { + -webkit-column-count: 4 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 4 !important; + /* Firefox */ + column-count: 4 !important; } + + .columns-lg-5 { + -webkit-column-count: 5 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 5 !important; + /* Firefox */ + column-count: 5 !important; } + + .columns-lg-6 { + -webkit-column-count: 6 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 6 !important; + /* Firefox */ + column-count: 6 !important; } } +@media (min-width: 1240px) { + .columns-xl-1 { + -webkit-column-count: 1 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 1 !important; + /* Firefox */ + column-count: 1 !important; } + + .columns-xl-2 { + -webkit-column-count: 2 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 2 !important; + /* Firefox */ + column-count: 2 !important; } + + .columns-xl-3 { + -webkit-column-count: 3 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 3 !important; + /* Firefox */ + column-count: 3 !important; } + + .columns-xl-4 { + -webkit-column-count: 4 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 4 !important; + /* Firefox */ + column-count: 4 !important; } + + .columns-xl-5 { + -webkit-column-count: 5 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 5 !important; + /* Firefox */ + column-count: 5 !important; } + + .columns-xl-6 { + -webkit-column-count: 6 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 6 !important; + /* Firefox */ + column-count: 6 !important; } } +@media (min-width: 1600px) { + .columns-xxl-1 { + -webkit-column-count: 1 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 1 !important; + /* Firefox */ + column-count: 1 !important; } + + .columns-xxl-2 { + -webkit-column-count: 2 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 2 !important; + /* Firefox */ + column-count: 2 !important; } + + .columns-xxl-3 { + -webkit-column-count: 3 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 3 !important; + /* Firefox */ + column-count: 3 !important; } + + .columns-xxl-4 { + -webkit-column-count: 4 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 4 !important; + /* Firefox */ + column-count: 4 !important; } + + .columns-xxl-5 { + -webkit-column-count: 5 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 5 !important; + /* Firefox */ + column-count: 5 !important; } + + .columns-xxl-6 { + -webkit-column-count: 6 !important; + /* Chrome, Safari, Opera */ + -moz-column-count: 6 !important; + /* Firefox */ + column-count: 6 !important; } } +.width-fixed-100 { + width: 100px; } + +.width-fixed-200 { + width: 200px; } + +.width-fixed-300 { + width: 300px; } + +.width-fixed-400 { + width: 400px; } + +.width-fixed-500 { + width: 500px; } + +.width-fixed-600 { + width: 600px; } + +.width-fixed-700 { + width: 700px; } + +.width-fixed-800 { + width: 800px; } + +.width-fixed-900 { + width: 900px; } + +@media (min-width: 576px) { + .width-fixed-sm-100 { + width: 100px; } + + .width-fixed-sm-200 { + width: 200px; } + + .width-fixed-sm-300 { + width: 300px; } + + .width-fixed-sm-400 { + width: 400px; } + + .width-fixed-sm-500 { + width: 500px; } + + .width-fixed-sm-600 { + width: 600px; } + + .width-fixed-sm-700 { + width: 700px; } + + .width-fixed-sm-800 { + width: 800px; } + + .width-fixed-sm-900 { + width: 900px; } } +@media (min-width: 768px) { + .width-fixed-md-100 { + width: 100px; } + + .width-fixed-md-200 { + width: 200px; } + + .width-fixed-md-300 { + width: 300px; } + + .width-fixed-md-400 { + width: 400px; } + + .width-fixed-md-500 { + width: 500px; } + + .width-fixed-md-600 { + width: 600px; } + + .width-fixed-md-700 { + width: 700px; } + + .width-fixed-md-800 { + width: 800px; } + + .width-fixed-md-900 { + width: 900px; } } +@media (min-width: 979px) { + .width-fixed-lg-100 { + width: 100px; } + + .width-fixed-lg-200 { + width: 200px; } + + .width-fixed-lg-300 { + width: 300px; } + + .width-fixed-lg-400 { + width: 400px; } + + .width-fixed-lg-500 { + width: 500px; } + + .width-fixed-lg-600 { + width: 600px; } + + .width-fixed-lg-700 { + width: 700px; } + + .width-fixed-lg-800 { + width: 800px; } + + .width-fixed-lg-900 { + width: 900px; } } +@media (min-width: 1240px) { + .width-fixed-xl-100 { + width: 100px; } + + .width-fixed-xl-200 { + width: 200px; } + + .width-fixed-xl-300 { + width: 300px; } + + .width-fixed-xl-400 { + width: 400px; } + + .width-fixed-xl-500 { + width: 500px; } + + .width-fixed-xl-600 { + width: 600px; } + + .width-fixed-xl-700 { + width: 700px; } + + .width-fixed-xl-800 { + width: 800px; } + + .width-fixed-xl-900 { + width: 900px; } } +@media (min-width: 1600px) { + .width-fixed-xxl-100 { + width: 100px; } + + .width-fixed-xxl-200 { + width: 200px; } + + .width-fixed-xxl-300 { + width: 300px; } + + .width-fixed-xxl-400 { + width: 400px; } + + .width-fixed-xxl-500 { + width: 500px; } + + .width-fixed-xxl-600 { + width: 600px; } + + .width-fixed-xxl-700 { + width: 700px; } + + .width-fixed-xxl-800 { + width: 800px; } + + .width-fixed-xxl-900 { + width: 900px; } } +@media print { + *, + *::before, + *::after { + text-shadow: none !important; + box-shadow: none !important; } + + a:not(.btn) { + text-decoration: underline; } + + abbr[title]::after { + content: " (" attr(title) ")"; } + + pre { + white-space: pre-wrap !important; } + + pre, + blockquote { + border: 1px solid #adb5bd; + page-break-inside: avoid; } + + thead { + display: table-header-group; } + + tr, + img { + page-break-inside: avoid; } + + p, + h2, + h3 { + orphans: 3; + widows: 3; } + + h2, + h3 { + page-break-after: avoid; } + + @page { + size: a3; } + body { + min-width: 979px !important; } + + .container { + min-width: 979px !important; } + + .navbar { + display: none; } + + .badge { + border: 1px solid #000; } + + .table { + border-collapse: collapse !important; } + .table td, + .table th { + background-color: #fff !important; } + + .table-bordered th, + .table-bordered td { + border: 1px solid #dee2e6 !important; } + + .table-dark { + color: inherit; } + .table-dark th, + .table-dark td, + .table-dark thead th, + .table-dark tbody + tbody { + border-color: #dee2e6; } + + .table .thead-dark th { + color: inherit; + border-color: #dee2e6; } } + +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/app/public_html/admin/assets/css/chosen-sprite.png b/app/public_html/admin/assets/css/chosen-sprite.png new file mode 100644 index 0000000..3611ae4 Binary files /dev/null and b/app/public_html/admin/assets/css/chosen-sprite.png differ diff --git a/app/public_html/admin/assets/css/chosen-sprite@2x.png b/app/public_html/admin/assets/css/chosen-sprite@2x.png new file mode 100644 index 0000000..ffe4d7d Binary files /dev/null and b/app/public_html/admin/assets/css/chosen-sprite@2x.png differ diff --git a/app/public_html/admin/assets/css/chosen.min.css b/app/public_html/admin/assets/css/chosen.min.css new file mode 100644 index 0000000..d7bcf4b --- /dev/null +++ b/app/public_html/admin/assets/css/chosen.min.css @@ -0,0 +1 @@ +.chzn-container{font-size:13px;position:relative;display:inline-block;vertical-align:middle;zoom:1;*display:inline}.chzn-container .chzn-drop{background:#fff;border:1px solid #aaa;border-top:0;position:absolute;top:100%;left:-9999px;-webkit-box-shadow:0 4px 5px rgba(0,0,0,.15);-moz-box-shadow:0 4px 5px rgba(0,0,0,.15);box-shadow:0 4px 5px rgba(0,0,0,.15);z-index:1010;width:100%;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box;-khtml-box-sizing:border-box;box-sizing:border-box}.chzn-container.chzn-with-drop .chzn-drop{left:0}.chzn-container-single .chzn-single{background-color:#fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#fff),color-stop(50%,#f6f6f6),color-stop(52%,#eee),color-stop(100%,#f4f4f4));background-image:-webkit-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-image:-moz-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-image:-o-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-image:linear-gradient(#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #aaa;-webkit-box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);display:block;overflow:hidden;white-space:nowrap;position:relative;height:23px;line-height:24px;padding:0 0 0 8px;color:#444;text-decoration:none}.chzn-container-single .chzn-default{color:#999}.chzn-container-single .chzn-single span{margin-right:26px;display:block;overflow:hidden;white-space:nowrap;-o-text-overflow:ellipsis;-ms-text-overflow:ellipsis;text-overflow:ellipsis}.chzn-container-single .chzn-single-with-deselect span{margin-right:38px}.chzn-container-single .chzn-single abbr{display:block;position:absolute;right:26px;top:6px;width:12px;height:12px;font-size:1px;background:url(chosen-sprite.png) -42px 1px no-repeat}.chzn-container-single .chzn-single abbr:hover{background-position:-42px -10px}.chzn-container-single.chzn-disabled .chzn-single abbr:hover{background-position:-42px -10px}.chzn-container-single .chzn-single div{position:absolute;right:0;top:0;display:block;height:100%;width:18px}.chzn-container-single .chzn-single div b{background:url(chosen-sprite.png) no-repeat 0 2px;display:block;width:100%;height:100%}.chzn-container-single .chzn-search{padding:3px 4px;position:relative;margin:0;white-space:nowrap;z-index:1010}.chzn-container-single .chzn-search input{background:#fff url(chosen-sprite.png) no-repeat 100% -20px;background:url(chosen-sprite.png) no-repeat 100% -20px,-webkit-gradient(linear,0 0,0 100%,color-stop(1%,#eee),color-stop(15%,#fff));background:url(chosen-sprite.png) no-repeat 100% -20px,-webkit-linear-gradient(top,#eee 1%,#fff 15%);background:url(chosen-sprite.png) no-repeat 100% -20px,-moz-linear-gradient(top,#eee 1%,#fff 15%);background:url(chosen-sprite.png) no-repeat 100% -20px,-o-linear-gradient(top,#eee 1%,#fff 15%);background:url(chosen-sprite.png) no-repeat 100% -20px,linear-gradient(#eee 1%,#fff 15%);margin:1px 0;padding:4px 20px 4px 5px;outline:0;border:1px solid #aaa;font-family:sans-serif;font-size:1em;width:100%;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box;-khtml-box-sizing:border-box;box-sizing:border-box}.chzn-container-single .chzn-drop{margin-top:-1px;-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box}.chzn-container-single-nosearch .chzn-search{position:absolute;left:-9999px}.chzn-container-multi .chzn-choices{background-color:#fff;background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(1%,#eee),color-stop(15%,#fff));background-image:-webkit-linear-gradient(top,#eee 1%,#fff 15%);background-image:-moz-linear-gradient(top,#eee 1%,#fff 15%);background-image:-o-linear-gradient(top,#eee 1%,#fff 15%);background-image:linear-gradient(#eee 1%,#fff 15%);border:1px solid #aaa;margin:0;padding:0;cursor:text;overflow:hidden;height:auto!important;height:1%;position:relative;width:100%;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box;-khtml-box-sizing:border-box;box-sizing:border-box}.chzn-container-multi .chzn-choices li{float:left;list-style:none}.chzn-container-multi .chzn-choices .search-field{white-space:nowrap;margin:0;padding:0}.chzn-container-multi .chzn-choices .search-field input{color:#666;background:transparent!important;border:0!important;font-family:sans-serif;font-size:100%;height:15px;padding:5px;margin:1px 0;outline:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.chzn-container-multi .chzn-choices .search-field .default{color:#999}.chzn-container-multi .chzn-choices .search-choice{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;background-color:#e4e4e4;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);-moz-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);color:#333;border:1px solid #aaa;line-height:13px;padding:3px 20px 3px 5px;margin:3px 0 3px 5px;position:relative;cursor:default}.chzn-container-multi .chzn-choices .search-choice.search-choice-disabled{background-color:#e4e4e4;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-ms-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);color:#666;border:1px solid #ccc;padding-right:5px}.chzn-container-multi .chzn-choices .search-choice-focus{background:#d4d4d4}.chzn-container-multi .chzn-choices .search-choice .search-choice-close{display:block;position:absolute;right:3px;top:4px;width:12px;height:12px;font-size:1px;background:url(chosen-sprite.png) -42px 1px no-repeat}.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover{background-position:-42px -10px}.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close{background-position:-42px -10px}.chzn-container .chzn-results{margin:0 4px 4px 0;max-height:240px;padding:0 0 0 4px;position:relative;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.chzn-container-multi .chzn-results{margin:0;padding:0}.chzn-container .chzn-results li{display:none;line-height:15px;padding:5px 6px;margin:0;list-style:none}.chzn-container .chzn-results .active-result{cursor:pointer;display:list-item}.chzn-container .chzn-results .disabled-result{color:#ccc;cursor:default;display:list-item}.chzn-container .chzn-results .disabled-result em{background:transparent}.chzn-container .chzn-results .highlighted{background-color:#3875d7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#3875d7),color-stop(90%,#2a62bc));background-image:-webkit-linear-gradient(top,#3875d7 20%,#2a62bc 90%);background-image:-moz-linear-gradient(top,#3875d7 20%,#2a62bc 90%);background-image:-o-linear-gradient(top,#3875d7 20%,#2a62bc 90%);background-image:linear-gradient(#3875d7 20%,#2a62bc 90%);color:#fff}.chzn-container .chzn-results li em{background:#feffde;font-style:normal}.chzn-container .chzn-results .highlighted em{background:transparent}.chzn-container .chzn-results .no-results{background:#f4f4f4;display:list-item}.chzn-container .chzn-results .group-result{cursor:default;color:#999;font-weight:700}.chzn-container .chzn-results .group-option{padding-left:15px}.chzn-container-multi .chzn-drop .result-selected{color:#ccc;cursor:default;display:list-item}.chzn-container-multi .chzn-drop .result-selected em{background:transparent}.chzn-container .chzn-results-scroll{background:#fff;margin:0 4px;position:absolute;text-align:center;width:321px;z-index:1}.chzn-container .chzn-results-scroll span{display:inline-block;height:17px;text-indent:-5000px;width:9px}.chzn-container .chzn-results-scroll-down{bottom:0}.chzn-container .chzn-results-scroll-down span{background:url(chosen-sprite.png) no-repeat -4px -3px}.chzn-container .chzn-results-scroll-up span{background:url(chosen-sprite.png) no-repeat -22px -3px}.chzn-container-active .chzn-single{-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);-moz-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3);border:1px solid #5897fb}.chzn-container-active.chzn-with-drop .chzn-single{border:1px solid #aaa;-webkit-box-shadow:0 1px 0 #fff inset;-moz-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background-color:#eee;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#eee),color-stop(80%,#fff));background-image:-webkit-linear-gradient(top,#eee 20%,#fff 80%);background-image:-moz-linear-gradient(top,#eee 20%,#fff 80%);background-image:-o-linear-gradient(top,#eee 20%,#fff 80%);background-image:linear-gradient(#eee 20%,#fff 80%);-webkit-border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-bottomright:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.chzn-container-active.chzn-with-drop .chzn-single div{background:transparent;border-left:0}.chzn-container-active.chzn-with-drop .chzn-single div b{background-position:-18px 2px}.chzn-container-active .chzn-choices{-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);-moz-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3);border:1px solid #5897fb}.chzn-container-active .chzn-choices .search-field input{color:#111!important}.chzn-disabled{cursor:default;opacity:.5!important}.chzn-disabled .chzn-single{cursor:default}.chzn-disabled .chzn-choices .search-choice .search-choice-close{cursor:default}.chzn-rtl{text-align:right}.chzn-rtl .chzn-single{padding:0 8px 0 0;overflow:visible}.chzn-rtl .chzn-single span{margin-left:26px;margin-right:0;direction:rtl}.chzn-rtl .chzn-single-with-deselect span{margin-left:38px}.chzn-rtl .chzn-single div{left:3px;right:auto}.chzn-rtl .chzn-single abbr{left:26px;right:auto}.chzn-rtl .chzn-choices .search-field input{direction:rtl}.chzn-rtl .chzn-choices li{float:right}.chzn-rtl .chzn-choices .search-choice{padding:3px 5px 3px 19px;margin:3px 5px 3px 0}.chzn-rtl .chzn-choices .search-choice .search-choice-close{left:4px;right:auto}.chzn-rtl .chzn-container-single-nosearch .chzn-search{left:9999px}.chzn-rtl .chzn-drop{left:9999px}.chzn-rtl.chzn-container-single .chzn-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chzn-rtl .chzn-results .group-option{padding-left:0;padding-right:15px}.chzn-rtl.chzn-container-active.chzn-with-drop .chzn-single div{border-right:0}.chzn-rtl .chzn-search input{background:#fff url(chosen-sprite.png) no-repeat -30px -20px;background:url(chosen-sprite.png) no-repeat -30px -20px,-webkit-gradient(linear,0 0,0 100%,color-stop(1%,#eee),color-stop(15%,#fff));background:url(chosen-sprite.png) no-repeat -30px -20px,-webkit-linear-gradient(top,#eee 1%,#fff 15%);background:url(chosen-sprite.png) no-repeat -30px -20px,-moz-linear-gradient(top,#eee 1%,#fff 15%);background:url(chosen-sprite.png) no-repeat -30px -20px,-o-linear-gradient(top,#eee 1%,#fff 15%);background:url(chosen-sprite.png) no-repeat -30px -20px,linear-gradient(#eee 1%,#fff 15%);padding:4px 5px 4px 20px;direction:rtl}.chzn-container-single.chzn-rtl .chzn-single div b{background-position:6px 2px}.chzn-container-single.chzn-rtl.chzn-with-drop .chzn-single div b{background-position:-12px 2px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-resolution:144dpi){.chzn-rtl .chzn-search input,.chzn-container-single .chzn-single abbr,.chzn-container-single .chzn-single div b,.chzn-container-single .chzn-search input,.chzn-container-multi .chzn-choices .search-choice .search-choice-close,.chzn-container .chzn-results-scroll-down span,.chzn-container .chzn-results-scroll-up span{background-image:url(chosen-sprite@2x.png)!important;background-repeat:no-repeat!important;background-size:52px 37px!important}} diff --git a/app/public_html/admin/assets/css/custom.css b/app/public_html/admin/assets/css/custom.css new file mode 100644 index 0000000..46ad1dd --- /dev/null +++ b/app/public_html/admin/assets/css/custom.css @@ -0,0 +1,337 @@ +body { + background-color: #EFEFEF; +} + +.storage-cell { + padding: 0px 2px; + border: 1px solid black; + display: inline-block; +} + +.storage-cell + .storage-cell { + margin-left: 5px; +} + +/** + * Bootstrap theme v4.x + */ +.tablesorter-bootstrap { + width: 100%; +} +.tablesorter-bootstrap thead th, +.tablesorter-bootstrap thead td, +.tablesorter-bootstrap tfoot th, +.tablesorter-bootstrap tfoot td { +/* + font: 14px/20px Arial, Sans-serif; + font-weight: bold; + + padding: 4px; + margin: 0 0 18px; + */ +} + +.tablesorter-bootstrap thead .tablesorter-header { + background-position: right 5px center; + background-repeat: no-repeat; + cursor: pointer; + white-space: normal; +} +.tablesorter-bootstrap:not(.table-dark) thead:not(.thead-dark) .tablesorter-header, +.tablesorter-bootstrap:not(.table-dark) tfoot th, +.tablesorter-bootstrap:not(.table-dark) tfoot td { + background-color: #eee; +} + +.tablesorter-bootstrap thead .sorter-false { + cursor: default; + background-image: none; +} + +.tablesorter-bootstrap .tablesorter-header-inner { + position: relative; + padding: 4px 18px 4px 4px; +} +.tablesorter-bootstrap .sorter-false .tablesorter-header-inner { + padding: 4px; +} + +/* black icons */ +.tablesorter-bootstrap thead .tablesorter-headerUnSorted:not(.sorter-false) { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE0IDIwIj48cGF0aCBkPSJNMTQgMTNsLTIuNS0yLjVMNyAxNWwtNC41LTQuNUwwIDEzbDcgN3pNMTQgNy41TDExLjUgMTAgNyA1LjUgMi41IDEwIDAgNy41bDctN3oiLz48L3N2Zz4=); +} +.tablesorter-bootstrap thead .tablesorter-headerAsc { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBkPSJNMTQgOS41TDExLjUgMTIgNyA3LjUgMi41IDEyIDAgOS41bDctN3oiLz48L3N2Zz4=); +} +.tablesorter-bootstrap thead .tablesorter-headerDesc { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBkPSJNMTQgNWwtMi41LTIuNS00LjUgNC41LTQuNS00LjVMMCA1IDcgMTJ6Ii8+PC9zdmc+); +} + +/* white icons */ +.tablesorter-bootstrap thead.thead-dark .tablesorter-headerUnSorted:not(.sorter-false), +.tablesorter-bootstrap.table-dark thead .tablesorter-headerUnSorted:not(.sorter-false) { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE0IDIwIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTQgMTNsLTIuNS0yLjVMNyAxNWwtNC41LTQuNUwwIDEzbDcgN3pNMTQgNy41TDExLjUgMTAgNyA1LjUgMi41IDEwIDAgNy41bDctN3oiLz48L3N2Zz4=); +} +.tablesorter-bootstrap thead.thead-dark .tablesorter-headerAsc, +.tablesorter-bootstrap.table-dark thead .tablesorter-headerAsc { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTQgOS41TDExLjUgMTIgNyA3LjUgMi41IDEyIDAgOS41bDctN3oiLz48L3N2Zz4=); +} +.tablesorter-bootstrap thead.thead-dark .tablesorter-headerDesc, +.tablesorter-bootstrap.table-dark thead .tablesorter-headerDesc { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTQgNWwtMi41LTIuNS00LjUgNC41LTQuNS00LjVMMCA1IDcgMTJ6Ii8+PC9zdmc+); +} + +/* since bootstrap (table-striped) uses nth-child(), we just use this to add a zebra stripe color */ +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd > td, +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.tablesorter-hasChildRow.odd:hover ~ tr.tablesorter-hasChildRow.odd ~ .tablesorter-childRow.odd > td { + background-color: #f9f9f9; +} +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.hover > td, +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd:hover > td, +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.even:hover > td, +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.tablesorter-hasChildRow.odd:hover ~ .tablesorter-childRow.odd > td, +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.tablesorter-hasChildRow.even:hover ~ .tablesorter-childRow.even > td { + background-color: #f5f5f5; +} +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.even > td, +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.tablesorter-hasChildRow.even:hover ~ tr.tablesorter-hasChildRow.even ~ .tablesorter-childRow.even > td { + background-color: #fff; +} + +/* processing icon */ +.tablesorter-bootstrap .tablesorter-processing { + background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs='); + background-position: center center !important; + background-repeat: no-repeat !important; +} + +/* Column Widget - column sort colors */ +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd td.primary { + background-color: #bfbfbf; +} +.tablesorter-bootstrap:not(.table-dark) > tbody > tr td.primary, +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.even td.primary { + background-color: #d9d9d9; +} +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd td.secondary { + background-color: #d9d9d9; +} +.tablesorter-bootstrap:not(.table-dark) > tbody > tr td.secondary, +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.even td.secondary { + background-color: #e6e6e6; +} +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd td.tertiary { + background-color: #e6e6e6; +} +.tablesorter-bootstrap:not(.table-dark) > tbody > tr td.tertiary, +.tablesorter-bootstrap:not(.table-dark) > tbody > tr.even td.tertiary { + background-color: #f2f2f2; +} + +/* caption */ +.tablesorter-bootstrap:not(.table-dark) > .caption { + background-color: #fff; +} + +/* filter widget */ +.tablesorter-bootstrap .tablesorter-filter-row input.tablesorter-filter, +.tablesorter-bootstrap .tablesorter-filter-row select.tablesorter-filter { + width: 98%; + margin: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: height 0.1s ease; + -moz-transition: height 0.1s ease; + -o-transition: height 0.1s ease; + transition: height 0.1s ease; +} +.tablesorter-bootstrap:not(.table-dark) .tablesorter-filter-row { + background-color: #efefef; +} +.tablesorter-bootstrap:not(.table-dark) .tablesorter-filter-row input.tablesorter-filter, +.tablesorter-bootstrap:not(.table-dark) .tablesorter-filter-row select.tablesorter-filter { + color: #333; +} + +.tablesorter-bootstrap .tablesorter-filter-row .tablesorter-filter.disabled { + cursor: not-allowed; + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset; + box-sizing: border-box; + transition: height 0.1s ease; +} + +.tablesorter-bootstrap:not(.table-dark) .tablesorter-filter-row td { + line-height: normal; + text-align: center; + padding: 4px 6px; + vertical-align: middle; + -webkit-transition: line-height 0.1s ease; + -moz-transition: line-height 0.1s ease; + -o-transition: line-height 0.1s ease; + transition: line-height 0.1s ease; +} +/* hidden filter row */ +.tablesorter-bootstrap .tablesorter-filter-row.hideme td { + padding: 2px; /* change this to modify the thickness of the closed border row */ + margin: 0; + line-height: 0; +} +.tablesorter-bootstrap .tablesorter-filter-row.hideme * { + height: 1px; + min-height: 0; + border: 0; + padding: 0; + margin: 0; + /* don't use visibility: hidden because it disables tabbing */ + opacity: 0; + filter: alpha(opacity=0); +} +/* rows hidden by filtering */ +.tablesorter .filtered { + display: none; +} + +/* pager plugin */ +.tablesorter-bootstrap .tablesorter-pager .pagedisplay { + border: 0; +} + +/* ajax error row */ +.tablesorter:not(.table-dark) .tablesorter-errorRow td { + text-align: center; + cursor: pointer; + background-color: #e6bf99; +} + + +.storage .cell { + font-weight: bold; + padding: 4px; + background: yellow; + margin: 4px; + border: 1px solid black; + display: inline-block; +} + + +.attrgrpname { + background: #ddd; + padding: 1px; + border: 1px solid black; + border-radius: 3px; +} + +.alert:empty { + display: none; +} + + + + + +.top-menu-item img { + top: 0px; +} + + +.period_picker_input { + line-height: 34px; +} + +.chzn-container-single .chzn-single { + height: 34px !important; + line-height: 34px !important; +} + +.chzn-container-single .chzn-single div b { + background-position: 0 7px !important; +} + + +.chzn-container-multi .chzn-choices { + min-height: 30px; + line-height: 32px; + border-radius: 5px; +} + +.period_picker_input { + line-height: 32px; +} + +#menu { + font-size: .9em; +} + +.bg-grey { + background: #CBD0D0; +} + +.hide-empty:empty { + display: none; +} + +.error { + color: red; +} + +@media (max-width: 768px) { + .small-sm { + font-size: .8em; + } + .columns-response { + overflow-x: auto; + } + +} + + +.upload-file-filled { + border-bottom: 2px solid green !important; +} + +.font-size-85 { + font-size: .85em; +} + +.fancybox-content.popup-container { + padding: 20px; + background: #f5f5f5; +} + +.popup-container { + width: 90%; + margin: 0 auto; +} + +.popup-container .form-group label { + margin-bottom: 0px; + font-size: .9em; +} + + +@media (min-width: 576px) { + .popup-container { + width: 500px; + } +} + +@media (min-width: 768px) { + .popup-container { + width: 700px; + } +} + +.text-count-wrapper { + font-size: .8em; +} + +.show_0, +.hide_1 { + display: none !important; +} + + +.badge > a { + color: inherit; +} diff --git a/app/public_html/admin/assets/css/fonts_full.css b/app/public_html/admin/assets/css/fonts_full.css new file mode 100644 index 0000000..f23a4f1 --- /dev/null +++ b/app/public_html/admin/assets/css/fonts_full.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Pro 5.13.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + */ +.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-abacus:before{content:"\f640"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acorn:before{content:"\f6ae"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-conditioner:before{content:"\f8f4"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-alarm-clock:before{content:"\f34e"}.fa-alarm-exclamation:before{content:"\f843"}.fa-alarm-plus:before{content:"\f844"}.fa-alarm-snooze:before{content:"\f845"}.fa-album:before{content:"\f89f"}.fa-album-collection:before{content:"\f8a0"}.fa-algolia:before{content:"\f36c"}.fa-alicorn:before{content:"\f6b0"}.fa-alien:before{content:"\f8f5"}.fa-alien-monster:before{content:"\f8f6"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-align-slash:before{content:"\f846"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-amp-guitar:before{content:"\f8a1"}.fa-analytics:before{content:"\f643"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angel:before{content:"\f779"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-crate:before{content:"\f6b1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-alt-down:before{content:"\f354"}.fa-arrow-alt-from-bottom:before{content:"\f346"}.fa-arrow-alt-from-left:before{content:"\f347"}.fa-arrow-alt-from-right:before{content:"\f348"}.fa-arrow-alt-from-top:before{content:"\f349"}.fa-arrow-alt-left:before{content:"\f355"}.fa-arrow-alt-right:before{content:"\f356"}.fa-arrow-alt-square-down:before{content:"\f350"}.fa-arrow-alt-square-left:before{content:"\f351"}.fa-arrow-alt-square-right:before{content:"\f352"}.fa-arrow-alt-square-up:before{content:"\f353"}.fa-arrow-alt-to-bottom:before{content:"\f34a"}.fa-arrow-alt-to-left:before{content:"\f34b"}.fa-arrow-alt-to-right:before{content:"\f34c"}.fa-arrow-alt-to-top:before{content:"\f34d"}.fa-arrow-alt-up:before{content:"\f357"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-from-bottom:before{content:"\f342"}.fa-arrow-from-left:before{content:"\f343"}.fa-arrow-from-right:before{content:"\f344"}.fa-arrow-from-top:before{content:"\f345"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-square-down:before{content:"\f339"}.fa-arrow-square-left:before{content:"\f33a"}.fa-arrow-square-right:before{content:"\f33b"}.fa-arrow-square-up:before{content:"\f33c"}.fa-arrow-to-bottom:before{content:"\f33d"}.fa-arrow-to-left:before{content:"\f33e"}.fa-arrow-to-right:before{content:"\f340"}.fa-arrow-to-top:before{content:"\f341"}.fa-arrow-up:before{content:"\f062"}.fa-arrows:before{content:"\f047"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-arrows-h:before{content:"\f07e"}.fa-arrows-v:before{content:"\f07d"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-atom-alt:before{content:"\f5d3"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-axe:before{content:"\f6b2"}.fa-axe-battle:before{content:"\f6b3"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backpack:before{content:"\f5d4"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\f959"}.fa-bacterium:before{content:"\f95a"}.fa-badge:before{content:"\f335"}.fa-badge-check:before{content:"\f336"}.fa-badge-dollar:before{content:"\f645"}.fa-badge-percent:before{content:"\f646"}.fa-badge-sheriff:before{content:"\f8a2"}.fa-badger-honey:before{content:"\f6b4"}.fa-bags-shopping:before{content:"\f847"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ball-pile:before{content:"\f77e"}.fa-ballot:before{content:"\f732"}.fa-ballot-check:before{content:"\f733"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-banjo:before{content:"\f8a3"}.fa-barcode:before{content:"\f02a"}.fa-barcode-alt:before{content:"\f463"}.fa-barcode-read:before{content:"\f464"}.fa-barcode-scan:before{content:"\f465"}.fa-bars:before{content:"\f0c9"}.fa-baseball:before{content:"\f432"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-basketball-hoop:before{content:"\f435"}.fa-bat:before{content:"\f6b5"}.fa-bath:before{content:"\f2cd"}.fa-battery-bolt:before{content:"\f376"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-slash:before{content:"\f377"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-bed-alt:before{content:"\f8f7"}.fa-bed-bunk:before{content:"\f8f8"}.fa-bed-empty:before{content:"\f8f9"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-exclamation:before{content:"\f848"}.fa-bell-on:before{content:"\f8fa"}.fa-bell-plus:before{content:"\f849"}.fa-bell-school:before{content:"\f5d5"}.fa-bell-school-slash:before{content:"\f5d6"}.fa-bell-slash:before{content:"\f1f6"}.fa-bells:before{content:"\f77f"}.fa-betamax:before{content:"\f8a4"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-biking-mountain:before{content:"\f84b"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blanket:before{content:"\f498"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blinds:before{content:"\f8fb"}.fa-blinds-open:before{content:"\f8fc"}.fa-blinds-raised:before{content:"\f8fd"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bone-break:before{content:"\f5d8"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-alt:before{content:"\f5d9"}.fa-book-dead:before{content:"\f6b7"}.fa-book-heart:before{content:"\f499"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-book-spells:before{content:"\f6b8"}.fa-book-user:before{content:"\f7e7"}.fa-bookmark:before{content:"\f02e"}.fa-books:before{content:"\f5db"}.fa-books-medical:before{content:"\f7e8"}.fa-boombox:before{content:"\f8a5"}.fa-boot:before{content:"\f782"}.fa-booth-curtain:before{content:"\f734"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-bottom:before{content:"\f84d"}.fa-border-center-h:before{content:"\f89c"}.fa-border-center-v:before{content:"\f89d"}.fa-border-inner:before{content:"\f84e"}.fa-border-left:before{content:"\f84f"}.fa-border-none:before{content:"\f850"}.fa-border-outer:before{content:"\f851"}.fa-border-right:before{content:"\f852"}.fa-border-style:before{content:"\f853"}.fa-border-style-alt:before{content:"\f854"}.fa-border-top:before{content:"\f855"}.fa-bow-arrow:before{content:"\f6b9"}.fa-bowling-ball:before{content:"\f436"}.fa-bowling-pins:before{content:"\f437"}.fa-box:before{content:"\f466"}.fa-box-alt:before{content:"\f49a"}.fa-box-ballot:before{content:"\f735"}.fa-box-check:before{content:"\f467"}.fa-box-fragile:before{content:"\f49b"}.fa-box-full:before{content:"\f49c"}.fa-box-heart:before{content:"\f49d"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\f95b"}.fa-box-up:before{content:"\f49f"}.fa-box-usd:before{content:"\f4a0"}.fa-boxes:before{content:"\f468"}.fa-boxes-alt:before{content:"\f4a1"}.fa-boxing-glove:before{content:"\f438"}.fa-brackets:before{content:"\f7e9"}.fa-brackets-curly:before{content:"\f7ea"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-loaf:before{content:"\f7eb"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-bring-forward:before{content:"\f856"}.fa-bring-front:before{content:"\f857"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-browser:before{content:"\f37e"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-bullseye-arrow:before{content:"\f648"}.fa-bullseye-pointer:before{content:"\f649"}.fa-burger-soda:before{content:"\f858"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-burrito:before{content:"\f7ed"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-bus-school:before{content:"\f5dd"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-cabinet-filing:before{content:"\f64b"}.fa-cactus:before{content:"\f8a7"}.fa-calculator:before{content:"\f1ec"}.fa-calculator-alt:before{content:"\f64c"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-edit:before{content:"\f333"}.fa-calendar-exclamation:before{content:"\f334"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-star:before{content:"\f736"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camcorder:before{content:"\f8a8"}.fa-camera:before{content:"\f030"}.fa-camera-alt:before{content:"\f332"}.fa-camera-home:before{content:"\f8fe"}.fa-camera-movie:before{content:"\f8a9"}.fa-camera-polaroid:before{content:"\f8aa"}.fa-camera-retro:before{content:"\f083"}.fa-campfire:before{content:"\f6ba"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candle-holder:before{content:"\f6bc"}.fa-candy-cane:before{content:"\f786"}.fa-candy-corn:before{content:"\f6bd"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-building:before{content:"\f859"}.fa-car-bump:before{content:"\f5e0"}.fa-car-bus:before{content:"\f85a"}.fa-car-crash:before{content:"\f5e1"}.fa-car-garage:before{content:"\f5e2"}.fa-car-mechanic:before{content:"\f5e3"}.fa-car-side:before{content:"\f5e4"}.fa-car-tilt:before{content:"\f5e5"}.fa-car-wash:before{content:"\f5e6"}.fa-caravan:before{content:"\f8ff"}.fa-caravan-alt:before{content:"\f900"}.fa-caret-circle-down:before{content:"\f32d"}.fa-caret-circle-left:before{content:"\f32e"}.fa-caret-circle-right:before{content:"\f330"}.fa-caret-circle-up:before{content:"\f331"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cars:before{content:"\f85b"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cassette-tape:before{content:"\f8ab"}.fa-cat:before{content:"\f6be"}.fa-cat-space:before{content:"\f901"}.fa-cauldron:before{content:"\f6bf"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-cctv:before{content:"\f8ac"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chair-office:before{content:"\f6c1"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-line-down:before{content:"\f64d"}.fa-chart-network:before{content:"\f78a"}.fa-chart-pie:before{content:"\f200"}.fa-chart-pie-alt:before{content:"\f64e"}.fa-chart-scatter:before{content:"\f7ee"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-cheese-swiss:before{content:"\f7f0"}.fa-cheeseburger:before{content:"\f7f1"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-bishop-alt:before{content:"\f43b"}.fa-chess-board:before{content:"\f43c"}.fa-chess-clock:before{content:"\f43d"}.fa-chess-clock-alt:before{content:"\f43e"}.fa-chess-king:before{content:"\f43f"}.fa-chess-king-alt:before{content:"\f440"}.fa-chess-knight:before{content:"\f441"}.fa-chess-knight-alt:before{content:"\f442"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-pawn-alt:before{content:"\f444"}.fa-chess-queen:before{content:"\f445"}.fa-chess-queen-alt:before{content:"\f446"}.fa-chess-rook:before{content:"\f447"}.fa-chess-rook-alt:before{content:"\f448"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-double-down:before{content:"\f322"}.fa-chevron-double-left:before{content:"\f323"}.fa-chevron-double-right:before{content:"\f324"}.fa-chevron-double-up:before{content:"\f325"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-square-down:before{content:"\f329"}.fa-chevron-square-left:before{content:"\f32a"}.fa-chevron-square-right:before{content:"\f32b"}.fa-chevron-square-up:before{content:"\f32c"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chimney:before{content:"\f78b"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clarinet:before{content:"\f8ad"}.fa-claw-marks:before{content:"\f6c2"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clipboard-list-check:before{content:"\f737"}.fa-clipboard-prescription:before{content:"\f5e8"}.fa-clipboard-user:before{content:"\f7f3"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-drizzle:before{content:"\f738"}.fa-cloud-hail:before{content:"\f739"}.fa-cloud-hail-mixed:before{content:"\f73a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-music:before{content:"\f8ae"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-rainbow:before{content:"\f73e"}.fa-cloud-showers:before{content:"\f73f"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sleet:before{content:"\f741"}.fa-cloud-snow:before{content:"\f742"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload:before{content:"\f0ee"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-clouds:before{content:"\f744"}.fa-clouds-moon:before{content:"\f745"}.fa-clouds-sun:before{content:"\f746"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-club:before{content:"\f327"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-code-commit:before{content:"\f386"}.fa-code-merge:before{content:"\f387"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-coffee-pot:before{content:"\f902"}.fa-coffee-togo:before{content:"\f6c5"}.fa-coffin:before{content:"\f6c6"}.fa-coffin-cross:before{content:"\f951"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coin:before{content:"\f85c"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comet:before{content:"\f903"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-alt-check:before{content:"\f4a2"}.fa-comment-alt-dollar:before{content:"\f650"}.fa-comment-alt-dots:before{content:"\f4a3"}.fa-comment-alt-edit:before{content:"\f4a4"}.fa-comment-alt-exclamation:before{content:"\f4a5"}.fa-comment-alt-lines:before{content:"\f4a6"}.fa-comment-alt-medical:before{content:"\f7f4"}.fa-comment-alt-minus:before{content:"\f4a7"}.fa-comment-alt-music:before{content:"\f8af"}.fa-comment-alt-plus:before{content:"\f4a8"}.fa-comment-alt-slash:before{content:"\f4a9"}.fa-comment-alt-smile:before{content:"\f4aa"}.fa-comment-alt-times:before{content:"\f4ab"}.fa-comment-check:before{content:"\f4ac"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-edit:before{content:"\f4ae"}.fa-comment-exclamation:before{content:"\f4af"}.fa-comment-lines:before{content:"\f4b0"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-minus:before{content:"\f4b1"}.fa-comment-music:before{content:"\f8b0"}.fa-comment-plus:before{content:"\f4b2"}.fa-comment-slash:before{content:"\f4b3"}.fa-comment-smile:before{content:"\f4b4"}.fa-comment-times:before{content:"\f4b5"}.fa-comments:before{content:"\f086"}.fa-comments-alt:before{content:"\f4b6"}.fa-comments-alt-dollar:before{content:"\f652"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compass-slash:before{content:"\f5e9"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-compress-wide:before{content:"\f326"}.fa-computer-classic:before{content:"\f8b1"}.fa-computer-speaker:before{content:"\f8b2"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-construction:before{content:"\f85d"}.fa-container-storage:before{content:"\f4b7"}.fa-contao:before{content:"\f26d"}.fa-conveyor-belt:before{content:"\f46e"}.fa-conveyor-belt-alt:before{content:"\f46f"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-corn:before{content:"\f6c7"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cow:before{content:"\f6c8"}.fa-cowbell:before{content:"\f8b3"}.fa-cowbell-more:before{content:"\f8b4"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-credit-card-blank:before{content:"\f389"}.fa-credit-card-front:before{content:"\f38a"}.fa-cricket:before{content:"\f449"}.fa-critical-role:before{content:"\f6c9"}.fa-croissant:before{content:"\f7f6"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-crutches:before{content:"\f7f8"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-curling:before{content:"\f44a"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dagger:before{content:"\f6cb"}.fa-dailymotion:before{content:"\f952"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-debug:before{content:"\f7f9"}.fa-deer:before{content:"\f78e"}.fa-deer-rudolph:before{content:"\f78f"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-desktop-alt:before{content:"\f390"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dewpoint:before{content:"\f748"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diamond:before{content:"\f219"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d10:before{content:"\f6cd"}.fa-dice-d12:before{content:"\f6ce"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d4:before{content:"\f6d0"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-d8:before{content:"\f6d2"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digging:before{content:"\f85e"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-diploma:before{content:"\f5ea"}.fa-directions:before{content:"\f5eb"}.fa-disc-drive:before{content:"\f8b5"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-do-not-enter:before{content:"\f5ec"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dog-leashed:before{content:"\f6d4"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-empty:before{content:"\f473"}.fa-dolly-flatbed:before{content:"\f474"}.fa-dolly-flatbed-alt:before{content:"\f475"}.fa-dolly-flatbed-empty:before{content:"\f476"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-circle:before{content:"\f5ed"}.fa-draw-polygon:before{content:"\f5ee"}.fa-draw-square:before{content:"\f5ef"}.fa-dreidel:before{content:"\f792"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-drone:before{content:"\f85f"}.fa-drone-alt:before{content:"\f860"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick:before{content:"\f6d6"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dryer:before{content:"\f861"}.fa-dryer-alt:before{content:"\f862"}.fa-duck:before{content:"\f6d8"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-ear:before{content:"\f5f0"}.fa-ear-muffs:before{content:"\f795"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-eclipse:before{content:"\f749"}.fa-eclipse-alt:before{content:"\f74a"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-egg-fried:before{content:"\f7fc"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-elephant:before{content:"\f6da"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-h-alt:before{content:"\f39b"}.fa-ellipsis-v:before{content:"\f142"}.fa-ellipsis-v-alt:before{content:"\f39c"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-empty-set:before{content:"\f656"}.fa-engine-warning:before{content:"\f5f2"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-dollar:before{content:"\f657"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange:before{content:"\f0ec"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-square:before{content:"\f321"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows:before{content:"\f31d"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expand-wide:before{content:"\f320"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link:before{content:"\f08e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square:before{content:"\f14c"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-evil:before{content:"\f6db"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fan-table:before{content:"\f904"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-farm:before{content:"\f864"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\f905"}.fa-faucet-drip:before{content:"\f906"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-field-hockey:before{content:"\f44c"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-certificate:before{content:"\f5f3"}.fa-file-chart-line:before{content:"\f659"}.fa-file-chart-pie:before{content:"\f65a"}.fa-file-check:before{content:"\f316"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-edit:before{content:"\f31c"}.fa-file-excel:before{content:"\f1c3"}.fa-file-exclamation:before{content:"\f31a"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-minus:before{content:"\f318"}.fa-file-music:before{content:"\f8b6"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-plus:before{content:"\f319"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-search:before{content:"\f865"}.fa-file-signature:before{content:"\f573"}.fa-file-spreadsheet:before{content:"\f65b"}.fa-file-times:before{content:"\f317"}.fa-file-upload:before{content:"\f574"}.fa-file-user:before{content:"\f65c"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-files-medical:before{content:"\f7fd"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-film-alt:before{content:"\f3a0"}.fa-film-canister:before{content:"\f8b7"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-fire-smoke:before{content:"\f74b"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\f907"}.fa-fireplace:before{content:"\f79a"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fish-cooked:before{content:"\f7fe"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-alt:before{content:"\f74c"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flame:before{content:"\f6df"}.fa-flashlight:before{content:"\f8b8"}.fa-flask:before{content:"\f0c3"}.fa-flask-poison:before{content:"\f6e0"}.fa-flask-potion:before{content:"\f6e1"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flower:before{content:"\f7ff"}.fa-flower-daffodil:before{content:"\f800"}.fa-flower-tulip:before{content:"\f801"}.fa-flushed:before{content:"\f579"}.fa-flute:before{content:"\f8b9"}.fa-flux-capacitor:before{content:"\f8ba"}.fa-fly:before{content:"\f417"}.fa-fog:before{content:"\f74e"}.fa-folder:before{content:"\f07b"}.fa-folder-download:before{content:"\f953"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-folder-times:before{content:"\f65f"}.fa-folder-tree:before{content:"\f802"}.fa-folder-upload:before{content:"\f954"}.fa-folders:before{content:"\f660"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-font-case:before{content:"\f866"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-football-helmet:before{content:"\f44f"}.fa-forklift:before{content:"\f47a"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-fragile:before{content:"\f4bb"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-french-fries:before{content:"\f803"}.fa-frog:before{content:"\f52e"}.fa-frosty-head:before{content:"\f79b"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-function:before{content:"\f661"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-galaxy:before{content:"\f908"}.fa-game-board:before{content:"\f867"}.fa-game-board-alt:before{content:"\f868"}.fa-game-console-handheld:before{content:"\f8bb"}.fa-gamepad:before{content:"\f11b"}.fa-gamepad-alt:before{content:"\f8bc"}.fa-garage:before{content:"\f909"}.fa-garage-car:before{content:"\f90a"}.fa-garage-open:before{content:"\f90b"}.fa-gas-pump:before{content:"\f52f"}.fa-gas-pump-slash:before{content:"\f5f4"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gift-card:before{content:"\f663"}.fa-gifts:before{content:"\f79c"}.fa-gingerbread-man:before{content:"\f79d"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass:before{content:"\f804"}.fa-glass-champagne:before{content:"\f79e"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-citrus:before{content:"\f869"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glass-whiskey-rocks:before{content:"\f7a1"}.fa-glasses:before{content:"\f530"}.fa-glasses-alt:before{content:"\f5f5"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-globe-snow:before{content:"\f7a3"}.fa-globe-stand:before{content:"\f5f6"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-golf-club:before{content:"\f451"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gramophone:before{content:"\f8bd"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-guitar-electric:before{content:"\f8be"}.fa-guitars:before{content:"\f8bf"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-h1:before{content:"\f313"}.fa-h2:before{content:"\f314"}.fa-h3:before{content:"\f315"}.fa-h4:before{content:"\f86a"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hammer-war:before{content:"\f6e4"}.fa-hamsa:before{content:"\f665"}.fa-hand-heart:before{content:"\f4bc"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-box:before{content:"\f47b"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-magic:before{content:"\f6e5"}.fa-hand-holding-medical:before{content:"\f95c"}.fa-hand-holding-seedling:before{content:"\f4bf"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-receiving:before{content:"\f47c"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\f95d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-heart:before{content:"\f4c3"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-usd:before{content:"\f4c5"}.fa-hands-wash:before{content:"\f95e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt:before{content:"\f4c6"}.fa-handshake-alt-slash:before{content:"\f95f"}.fa-handshake-slash:before{content:"\f960"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-chef:before{content:"\f86b"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-santa:before{content:"\f7a7"}.fa-hat-winter:before{content:"\f7a8"}.fa-hat-witch:before{content:"\f6e7"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side:before{content:"\f6e9"}.fa-head-side-brain:before{content:"\f808"}.fa-head-side-cough:before{content:"\f961"}.fa-head-side-cough-slash:before{content:"\f962"}.fa-head-side-headphones:before{content:"\f8c2"}.fa-head-side-mask:before{content:"\f963"}.fa-head-side-medical:before{content:"\f809"}.fa-head-side-virus:before{content:"\f964"}.fa-head-vr:before{content:"\f6ea"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heart-circle:before{content:"\f4c7"}.fa-heart-rate:before{content:"\f5f8"}.fa-heart-square:before{content:"\f4c8"}.fa-heartbeat:before{content:"\f21e"}.fa-heat:before{content:"\f90c"}.fa-helicopter:before{content:"\f533"}.fa-helmet-battle:before{content:"\f6eb"}.fa-hexagon:before{content:"\f312"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-mask:before{content:"\f6ee"}.fa-hockey-puck:before{content:"\f453"}.fa-hockey-sticks:before{content:"\f454"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-home-alt:before{content:"\f80a"}.fa-home-heart:before{content:"\f4c9"}.fa-home-lg:before{content:"\f80b"}.fa-home-lg-alt:before{content:"\f80c"}.fa-hood-cloak:before{content:"\f6ef"}.fa-hooli:before{content:"\f427"}.fa-horizontal-rule:before{content:"\f86c"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-horse-saddle:before{content:"\f8c3"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hospitals:before{content:"\f80e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house:before{content:"\f90d"}.fa-house-damage:before{content:"\f6f1"}.fa-house-day:before{content:"\f90e"}.fa-house-flood:before{content:"\f74f"}.fa-house-leave:before{content:"\f90f"}.fa-house-night:before{content:"\f910"}.fa-house-return:before{content:"\f911"}.fa-house-signal:before{content:"\f912"}.fa-house-user:before{content:"\f965"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-humidity:before{content:"\f750"}.fa-hurricane:before{content:"\f751"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-ice-skate:before{content:"\f7ac"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-icons-alt:before{content:"\f86e"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\f913"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-image-polaroid:before{content:"\f8c4"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-inbox-in:before{content:"\f310"}.fa-inbox-out:before{content:"\f311"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-industry-alt:before{content:"\f3b3"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-info-square:before{content:"\f30f"}.fa-inhaler:before{content:"\f5f9"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\f955"}.fa-integral:before{content:"\f667"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-intersection:before{content:"\f668"}.fa-inventory:before{content:"\f480"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-island-tropical:before{content:"\f811"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-jack-o-lantern:before{content:"\f30e"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-joystick:before{content:"\f8c5"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-jug:before{content:"\f8c6"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-kazoo:before{content:"\f8c7"}.fa-kerning:before{content:"\f86f"}.fa-key:before{content:"\f084"}.fa-key-skeleton:before{content:"\f6f3"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-keynote:before{content:"\f66c"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kidneys:before{content:"\f5fb"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kite:before{content:"\f6f4"}.fa-kiwi-bird:before{content:"\f535"}.fa-knife-kitchen:before{content:"\f6f5"}.fa-korvue:before{content:"\f42f"}.fa-lambda:before{content:"\f66e"}.fa-lamp:before{content:"\f4ca"}.fa-lamp-desk:before{content:"\f914"}.fa-lamp-floor:before{content:"\f915"}.fa-landmark:before{content:"\f66f"}.fa-landmark-alt:before{content:"\f752"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\f966"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lasso:before{content:"\f8c8"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-layer-minus:before{content:"\f5fe"}.fa-layer-plus:before{content:"\f5ff"}.fa-leaf:before{content:"\f06c"}.fa-leaf-heart:before{content:"\f4cb"}.fa-leaf-maple:before{content:"\f6f6"}.fa-leaf-oak:before{content:"\f6f7"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down:before{content:"\f149"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up:before{content:"\f148"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-light-ceiling:before{content:"\f916"}.fa-light-switch:before{content:"\f917"}.fa-light-switch-off:before{content:"\f918"}.fa-light-switch-on:before{content:"\f919"}.fa-lightbulb:before{content:"\f0eb"}.fa-lightbulb-dollar:before{content:"\f670"}.fa-lightbulb-exclamation:before{content:"\f671"}.fa-lightbulb-on:before{content:"\f672"}.fa-lightbulb-slash:before{content:"\f673"}.fa-lights-holiday:before{content:"\f7b2"}.fa-line:before{content:"\f3c0"}.fa-line-columns:before{content:"\f870"}.fa-line-height:before{content:"\f871"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lips:before{content:"\f600"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-music:before{content:"\f8c9"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location:before{content:"\f601"}.fa-location-arrow:before{content:"\f124"}.fa-location-circle:before{content:"\f602"}.fa-location-slash:before{content:"\f603"}.fa-lock:before{content:"\f023"}.fa-lock-alt:before{content:"\f30d"}.fa-lock-open:before{content:"\f3c1"}.fa-lock-open-alt:before{content:"\f3c2"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-long-arrow-up:before{content:"\f176"}.fa-loveseat:before{content:"\f4cc"}.fa-low-vision:before{content:"\f2a8"}.fa-luchador:before{content:"\f455"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\f967"}.fa-lyft:before{content:"\f3c3"}.fa-mace:before{content:"\f6f8"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailbox:before{content:"\f813"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-mandolin:before{content:"\f6f9"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-marker-alt-slash:before{content:"\f605"}.fa-map-marker-check:before{content:"\f606"}.fa-map-marker-edit:before{content:"\f607"}.fa-map-marker-exclamation:before{content:"\f608"}.fa-map-marker-minus:before{content:"\f609"}.fa-map-marker-plus:before{content:"\f60a"}.fa-map-marker-question:before{content:"\f60b"}.fa-map-marker-slash:before{content:"\f60c"}.fa-map-marker-smile:before{content:"\f60d"}.fa-map-marker-times:before{content:"\f60e"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-meat:before{content:"\f814"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaphone:before{content:"\f675"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\f91a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microphone-stand:before{content:"\f8cb"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-microwave:before{content:"\f91b"}.fa-mind-share:before{content:"\f677"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-hexagon:before{content:"\f307"}.fa-minus-octagon:before{content:"\f308"}.fa-minus-square:before{content:"\f146"}.fa-mistletoe:before{content:"\f7b4"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\f956"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-mobile-android:before{content:"\f3ce"}.fa-mobile-android-alt:before{content:"\f3cf"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-money-check-edit:before{content:"\f872"}.fa-money-check-edit-alt:before{content:"\f873"}.fa-monitor-heart-rate:before{content:"\f611"}.fa-monkey:before{content:"\f6fb"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-moon-cloud:before{content:"\f754"}.fa-moon-stars:before{content:"\f755"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mountains:before{content:"\f6fd"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-alt:before{content:"\f8cd"}.fa-mouse-pointer:before{content:"\f245"}.fa-mp3-player:before{content:"\f8ce"}.fa-mug:before{content:"\f874"}.fa-mug-hot:before{content:"\f7b6"}.fa-mug-marshmallows:before{content:"\f7b7"}.fa-mug-tea:before{content:"\f875"}.fa-music:before{content:"\f001"}.fa-music-alt:before{content:"\f8cf"}.fa-music-alt-slash:before{content:"\f8d0"}.fa-music-slash:before{content:"\f8d1"}.fa-napster:before{content:"\f3d2"}.fa-narwhal:before{content:"\f6fe"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octagon:before{content:"\f306"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-oil-temp:before{content:"\f614"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-omega:before{content:"\f67a"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-ornament:before{content:"\f7b8"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-outlet:before{content:"\f91c"}.fa-oven:before{content:"\f91d"}.fa-overline:before{content:"\f876"}.fa-page-break:before{content:"\f877"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-brush-alt:before{content:"\f5a9"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-pallet-alt:before{content:"\f483"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-paragraph-rtl:before{content:"\f878"}.fa-parking:before{content:"\f540"}.fa-parking-circle:before{content:"\f615"}.fa-parking-circle-slash:before{content:"\f616"}.fa-parking-slash:before{content:"\f617"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paw-alt:before{content:"\f701"}.fa-paw-claws:before{content:"\f702"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pegasus:before{content:"\f703"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil:before{content:"\f040"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-paintbrush:before{content:"\f618"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-pennant:before{content:"\f456"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\f968"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-person-carry:before{content:"\f4cf"}.fa-person-dolly:before{content:"\f4d0"}.fa-person-dolly-empty:before{content:"\f4d1"}.fa-person-sign:before{content:"\f757"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-laptop:before{content:"\f87a"}.fa-phone-office:before{content:"\f67d"}.fa-phone-plus:before{content:"\f4d2"}.fa-phone-rotary:before{content:"\f8d3"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pi:before{content:"\f67e"}.fa-piano:before{content:"\f8d4"}.fa-piano-keyboard:before{content:"\f8d5"}.fa-pie:before{content:"\f705"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\f91e"}.fa-pig:before{content:"\f706"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza:before{content:"\f817"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-alt:before{content:"\f3de"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\f969"}.fa-planet-moon:before{content:"\f91f"}.fa-planet-ringed:before{content:"\f920"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-hexagon:before{content:"\f300"}.fa-plus-octagon:before{content:"\f301"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-podium:before{content:"\f680"}.fa-podium-star:before{content:"\f758"}.fa-police-box:before{content:"\f921"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poll-people:before{content:"\f759"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-popcorn:before{content:"\f819"}.fa-portal-enter:before{content:"\f922"}.fa-portal-exit:before{content:"\f923"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-presentation:before{content:"\f685"}.fa-print:before{content:"\f02f"}.fa-print-search:before{content:"\f81a"}.fa-print-slash:before{content:"\f686"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-projector:before{content:"\f8d6"}.fa-pump-medical:before{content:"\f96a"}.fa-pump-soap:before{content:"\f96b"}.fa-pumpkin:before{content:"\f707"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-question-square:before{content:"\f2fd"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-rabbit:before{content:"\f708"}.fa-rabbit-fast:before{content:"\f709"}.fa-racquet:before{content:"\f45a"}.fa-radar:before{content:"\f924"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-radio:before{content:"\f8d7"}.fa-radio-alt:before{content:"\f8d8"}.fa-rainbow:before{content:"\f75b"}.fa-raindrops:before{content:"\f75c"}.fa-ram:before{content:"\f70a"}.fa-ramp-loading:before{content:"\f4d4"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-raygun:before{content:"\f925"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-rectangle-landscape:before{content:"\f2fa"}.fa-rectangle-portrait:before{content:"\f2fb"}.fa-rectangle-wide:before{content:"\f2fc"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-refrigerator:before{content:"\f926"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-repeat:before{content:"\f363"}.fa-repeat-1:before{content:"\f365"}.fa-repeat-1-alt:before{content:"\f366"}.fa-repeat-alt:before{content:"\f364"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-retweet-alt:before{content:"\f361"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-rings-wedding:before{content:"\f81b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocket-launch:before{content:"\f927"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-route-highway:before{content:"\f61a"}.fa-route-interstate:before{content:"\f61b"}.fa-router:before{content:"\f8da"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-triangle:before{content:"\f61c"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rv:before{content:"\f7be"}.fa-sack:before{content:"\f81c"}.fa-sack-dollar:before{content:"\f81d"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salad:before{content:"\f81e"}.fa-salesforce:before{content:"\f83b"}.fa-sandwich:before{content:"\f81f"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-sausage:before{content:"\f820"}.fa-save:before{content:"\f0c7"}.fa-sax-hot:before{content:"\f8db"}.fa-saxophone:before{content:"\f8dc"}.fa-scalpel:before{content:"\f61d"}.fa-scalpel-path:before{content:"\f61e"}.fa-scanner:before{content:"\f488"}.fa-scanner-image:before{content:"\f8f3"}.fa-scanner-keyboard:before{content:"\f489"}.fa-scanner-touchscreen:before{content:"\f48a"}.fa-scarecrow:before{content:"\f70d"}.fa-scarf:before{content:"\f7c1"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-scroll-old:before{content:"\f70f"}.fa-scrubber:before{content:"\f2f8"}.fa-scythe:before{content:"\f710"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-send-back:before{content:"\f87e"}.fa-send-backward:before{content:"\f87f"}.fa-sensor:before{content:"\f928"}.fa-sensor-alert:before{content:"\f929"}.fa-sensor-fire:before{content:"\f92a"}.fa-sensor-on:before{content:"\f92b"}.fa-sensor-smoke:before{content:"\f92c"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-all:before{content:"\f367"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-sheep:before{content:"\f711"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield:before{content:"\f132"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-check:before{content:"\f2f7"}.fa-shield-cross:before{content:"\f712"}.fa-shield-virus:before{content:"\f96c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shipping-timed:before{content:"\f48c"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shish-kebab:before{content:"\f821"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\f957"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shovel:before{content:"\f713"}.fa-shovel-snow:before{content:"\f7c3"}.fa-shower:before{content:"\f2cc"}.fa-shredder:before{content:"\f68a"}.fa-shuttle-van:before{content:"\f5b6"}.fa-shuttlecock:before{content:"\f45b"}.fa-sickle:before{content:"\f822"}.fa-sigma:before{content:"\f68b"}.fa-sign:before{content:"\f4d9"}.fa-sign-in:before{content:"\f090"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out:before{content:"\f08b"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signal-1:before{content:"\f68c"}.fa-signal-2:before{content:"\f68d"}.fa-signal-3:before{content:"\f68e"}.fa-signal-4:before{content:"\f68f"}.fa-signal-alt:before{content:"\f690"}.fa-signal-alt-1:before{content:"\f691"}.fa-signal-alt-2:before{content:"\f692"}.fa-signal-alt-3:before{content:"\f693"}.fa-signal-alt-slash:before{content:"\f694"}.fa-signal-slash:before{content:"\f695"}.fa-signal-stream:before{content:"\f8dd"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\f96d"}.fa-siren:before{content:"\f92d"}.fa-siren-on:before{content:"\f92e"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-skeleton:before{content:"\f620"}.fa-sketch:before{content:"\f7c6"}.fa-ski-jump:before{content:"\f7c7"}.fa-ski-lift:before{content:"\f7c8"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-cow:before{content:"\f8de"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sledding:before{content:"\f7cb"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-sliders-h-square:before{content:"\f3f0"}.fa-sliders-v:before{content:"\f3f1"}.fa-sliders-v-square:before{content:"\f3f2"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-plus:before{content:"\f5b9"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoke:before{content:"\f760"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snake:before{content:"\f716"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snooze:before{content:"\f880"}.fa-snow-blowing:before{content:"\f761"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowflakes:before{content:"\f7cf"}.fa-snowman:before{content:"\f7d0"}.fa-snowmobile:before{content:"\f7d1"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\f96e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-solar-system:before{content:"\f92f"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-alt:before{content:"\f883"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-circle:before{content:"\f930"}.fa-sort-circle-down:before{content:"\f931"}.fa-sort-circle-up:before{content:"\f932"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-shapes-down:before{content:"\f888"}.fa-sort-shapes-down-alt:before{content:"\f889"}.fa-sort-shapes-up:before{content:"\f88a"}.fa-sort-shapes-up-alt:before{content:"\f88b"}.fa-sort-size-down:before{content:"\f88c"}.fa-sort-size-down-alt:before{content:"\f88d"}.fa-sort-size-up:before{content:"\f88e"}.fa-sort-size-up-alt:before{content:"\f88f"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-soup:before{content:"\f823"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-space-station-moon:before{content:"\f933"}.fa-space-station-moon-alt:before{content:"\f934"}.fa-spade:before{content:"\f2f4"}.fa-sparkles:before{content:"\f890"}.fa-speakap:before{content:"\f3f3"}.fa-speaker:before{content:"\f8df"}.fa-speaker-deck:before{content:"\f83c"}.fa-speakers:before{content:"\f8e0"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spider-black-widow:before{content:"\f718"}.fa-spider-web:before{content:"\f719"}.fa-spinner:before{content:"\f110"}.fa-spinner-third:before{content:"\f3f4"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-sprinkler:before{content:"\f935"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root:before{content:"\f697"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-squirrel:before{content:"\f71a"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-staff:before{content:"\f71b"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-christmas:before{content:"\f7d4"}.fa-star-exclamation:before{content:"\f2f3"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-star-shooting:before{content:"\f936"}.fa-starfighter:before{content:"\f937"}.fa-starfighter-alt:before{content:"\f938"}.fa-stars:before{content:"\f762"}.fa-starship:before{content:"\f939"}.fa-starship-freighter:before{content:"\f93a"}.fa-staylinked:before{content:"\f3f5"}.fa-steak:before{content:"\f824"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-steering-wheel:before{content:"\f622"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stocking:before{content:"\f7d5"}.fa-stomach:before{content:"\f623"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\f96f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\f970"}.fa-store-slash:before{content:"\f971"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-stretcher:before{content:"\f825"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-sun-cloud:before{content:"\f763"}.fa-sun-dust:before{content:"\f764"}.fa-sun-haze:before{content:"\f765"}.fa-sunglasses:before{content:"\f892"}.fa-sunrise:before{content:"\f766"}.fa-sunset:before{content:"\f767"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-sword:before{content:"\f71c"}.fa-sword-laser:before{content:"\f93b"}.fa-sword-laser-alt:before{content:"\f93c"}.fa-swords:before{content:"\f71d"}.fa-swords-laser:before{content:"\f93d"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablet-android:before{content:"\f3fb"}.fa-tablet-android-alt:before{content:"\f3fc"}.fa-tablet-rugged:before{content:"\f48f"}.fa-tablets:before{content:"\f490"}.fa-tachometer:before{content:"\f0e4"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tachometer-alt-average:before{content:"\f624"}.fa-tachometer-alt-fast:before{content:"\f625"}.fa-tachometer-alt-fastest:before{content:"\f626"}.fa-tachometer-alt-slow:before{content:"\f627"}.fa-tachometer-alt-slowest:before{content:"\f628"}.fa-tachometer-average:before{content:"\f629"}.fa-tachometer-fast:before{content:"\f62a"}.fa-tachometer-fastest:before{content:"\f62b"}.fa-tachometer-slow:before{content:"\f62c"}.fa-tachometer-slowest:before{content:"\f62d"}.fa-taco:before{content:"\f826"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tally:before{content:"\f69c"}.fa-tanakh:before{content:"\f827"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-tasks-alt:before{content:"\f828"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-telescope:before{content:"\f93e"}.fa-temperature-down:before{content:"\f93f"}.fa-temperature-frigid:before{content:"\f768"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-hot:before{content:"\f76a"}.fa-temperature-low:before{content:"\f76b"}.fa-temperature-up:before{content:"\f940"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-tennis-ball:before{content:"\f45e"}.fa-terminal:before{content:"\f120"}.fa-text:before{content:"\f893"}.fa-text-height:before{content:"\f034"}.fa-text-size:before{content:"\f894"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-theta:before{content:"\f69e"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-thunderstorm:before{content:"\f76c"}.fa-thunderstorm-moon:before{content:"\f76d"}.fa-thunderstorm-sun:before{content:"\f76e"}.fa-ticket:before{content:"\f145"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tilde:before{content:"\f69f"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-times-hexagon:before{content:"\f2ee"}.fa-times-octagon:before{content:"\f2f0"}.fa-times-square:before{content:"\f2d3"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tire:before{content:"\f631"}.fa-tire-flat:before{content:"\f632"}.fa-tire-pressure-warning:before{content:"\f633"}.fa-tire-rugged:before{content:"\f634"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-alt:before{content:"\f71f"}.fa-toilet-paper-slash:before{content:"\f972"}.fa-tombstone:before{content:"\f720"}.fa-tombstone-alt:before{content:"\f721"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-toothbrush:before{content:"\f635"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tornado:before{content:"\f76f"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-cone:before{content:"\f636"}.fa-traffic-light:before{content:"\f637"}.fa-traffic-light-go:before{content:"\f638"}.fa-traffic-light-slow:before{content:"\f639"}.fa-traffic-light-stop:before{content:"\f63a"}.fa-trailer:before{content:"\f941"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-transporter:before{content:"\f942"}.fa-transporter-1:before{content:"\f943"}.fa-transporter-2:before{content:"\f944"}.fa-transporter-3:before{content:"\f945"}.fa-transporter-empty:before{content:"\f946"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-trash-undo:before{content:"\f895"}.fa-trash-undo-alt:before{content:"\f896"}.fa-treasure-chest:before{content:"\f723"}.fa-tree:before{content:"\f1bb"}.fa-tree-alt:before{content:"\f400"}.fa-tree-christmas:before{content:"\f7db"}.fa-tree-decorated:before{content:"\f7dc"}.fa-tree-large:before{content:"\f7dd"}.fa-tree-palm:before{content:"\f82b"}.fa-trees:before{content:"\f724"}.fa-trello:before{content:"\f181"}.fa-triangle:before{content:"\f2ec"}.fa-triangle-music:before{content:"\f8e2"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-trophy-alt:before{content:"\f2eb"}.fa-truck:before{content:"\f0d1"}.fa-truck-container:before{content:"\f4dc"}.fa-truck-couch:before{content:"\f4dd"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-truck-plow:before{content:"\f7de"}.fa-truck-ramp:before{content:"\f4e0"}.fa-trumpet:before{content:"\f8e3"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-turkey:before{content:"\f725"}.fa-turntable:before{content:"\f8e4"}.fa-turtle:before{content:"\f726"}.fa-tv:before{content:"\f26c"}.fa-tv-alt:before{content:"\f8e5"}.fa-tv-music:before{content:"\f8e6"}.fa-tv-retro:before{content:"\f401"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typewriter:before{content:"\f8e7"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-ufo:before{content:"\f947"}.fa-ufo-beam:before{content:"\f948"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-unicorn:before{content:"\f727"}.fa-union:before{content:"\f6a2"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\f949"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-usb-drive:before{content:"\f8e9"}.fa-usd-circle:before{content:"\f2e8"}.fa-usd-square:before{content:"\f2e9"}.fa-user:before{content:"\f007"}.fa-user-alien:before{content:"\f94a"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-chart:before{content:"\f6a3"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-cowboy:before{content:"\f8ea"}.fa-user-crown:before{content:"\f6a4"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-hard-hat:before{content:"\f82c"}.fa-user-headset:before{content:"\f82d"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-md-chat:before{content:"\f82e"}.fa-user-minus:before{content:"\f503"}.fa-user-music:before{content:"\f8eb"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-robot:before{content:"\f94b"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-user-unlock:before{content:"\f958"}.fa-user-visor:before{content:"\f94c"}.fa-users:before{content:"\f0c0"}.fa-users-class:before{content:"\f63d"}.fa-users-cog:before{content:"\f509"}.fa-users-crown:before{content:"\f6a5"}.fa-users-medical:before{content:"\f830"}.fa-users-slash:before{content:"\f973"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-fork:before{content:"\f2e3"}.fa-utensil-knife:before{content:"\f2e4"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-utensils-alt:before{content:"\f2e6"}.fa-vaadin:before{content:"\f408"}.fa-vacuum:before{content:"\f94d"}.fa-vacuum-robot:before{content:"\f94e"}.fa-value-absolute:before{content:"\f6a6"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vhs:before{content:"\f8ec"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-plus:before{content:"\f4e1"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-violin:before{content:"\f8ed"}.fa-virus:before{content:"\f974"}.fa-virus-slash:before{content:"\f975"}.fa-viruses:before{content:"\f976"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volcano:before{content:"\f770"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume:before{content:"\f6a8"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-slash:before{content:"\f2e2"}.fa-volume-up:before{content:"\f028"}.fa-vote-nay:before{content:"\f771"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-wagon-covered:before{content:"\f8ee"}.fa-walker:before{content:"\f831"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-wand:before{content:"\f72a"}.fa-wand-magic:before{content:"\f72b"}.fa-warehouse:before{content:"\f494"}.fa-warehouse-alt:before{content:"\f495"}.fa-washer:before{content:"\f898"}.fa-watch:before{content:"\f2e1"}.fa-watch-calculator:before{content:"\f8f0"}.fa-watch-fitness:before{content:"\f63e"}.fa-water:before{content:"\f773"}.fa-water-lower:before{content:"\f774"}.fa-water-rise:before{content:"\f775"}.fa-wave-sine:before{content:"\f899"}.fa-wave-square:before{content:"\f83e"}.fa-wave-triangle:before{content:"\f89a"}.fa-waveform:before{content:"\f8f1"}.fa-waveform-path:before{content:"\f8f2"}.fa-waze:before{content:"\f83f"}.fa-webcam:before{content:"\f832"}.fa-webcam-slash:before{content:"\f833"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whale:before{content:"\f72c"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheat:before{content:"\f72d"}.fa-wheelchair:before{content:"\f193"}.fa-whistle:before{content:"\f460"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wifi-1:before{content:"\f6aa"}.fa-wifi-2:before{content:"\f6ab"}.fa-wifi-slash:before{content:"\f6ac"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-wind-turbine:before{content:"\f89b"}.fa-wind-warning:before{content:"\f776"}.fa-window:before{content:"\f40e"}.fa-window-alt:before{content:"\f40f"}.fa-window-close:before{content:"\f410"}.fa-window-frame:before{content:"\f94f"}.fa-window-frame-open:before{content:"\f950"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-windsock:before{content:"\f777"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wreath:before{content:"\f7e2"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../fonts/fa-brands-400.eot);src:url(../fonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-brands-400.woff2) format("woff2"),url(../fonts/fa-brands-400.woff) format("woff"),url(../fonts/fa-brands-400.ttf) format("truetype"),url(../fonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands";font-weight:400}@font-face{font-family:"Font Awesome 5 Duotone";font-style:normal;font-weight:900;font-display:block;src:url(../fonts/fa-duotone-900.eot);src:url(../fonts/fa-duotone-900.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-duotone-900.woff2) format("woff2"),url(../fonts/fa-duotone-900.woff) format("woff"),url(../fonts/fa-duotone-900.ttf) format("truetype"),url(../fonts/fa-duotone-900.svg#fontawesome) format("svg")}.fad{position:relative;font-family:"Font Awesome 5 Duotone";font-weight:900}.fad:before{position:absolute;color:var(--fa-primary-color,inherit);opacity:1;opacity:var(--fa-primary-opacity,1)}.fad:after{color:var(--fa-secondary-color,inherit)}.fa-swap-opacity .fad:before,.fad.fa-swap-opacity:before,.fad:after{opacity:.4;opacity:var(--fa-secondary-opacity,.4)}.fa-swap-opacity .fad:after,.fad.fa-swap-opacity:after{opacity:1;opacity:var(--fa-primary-opacity,1)}.fad.fa-inverse{color:#fff}.fad.fa-stack-1x,.fad.fa-stack-2x{position:absolute}.fad.fa-fw:before,.fad.fa-stack-1x:before,.fad.fa-stack-2x:before{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.fad.fa-abacus:after{content:"\10f640"}.fad.fa-acorn:after{content:"\10f6ae"}.fad.fa-ad:after{content:"\10f641"}.fad.fa-address-book:after{content:"\10f2b9"}.fad.fa-address-card:after{content:"\10f2bb"}.fad.fa-adjust:after{content:"\10f042"}.fad.fa-air-conditioner:after{content:"\10f8f4"}.fad.fa-air-freshener:after{content:"\10f5d0"}.fad.fa-alarm-clock:after{content:"\10f34e"}.fad.fa-alarm-exclamation:after{content:"\10f843"}.fad.fa-alarm-plus:after{content:"\10f844"}.fad.fa-alarm-snooze:after{content:"\10f845"}.fad.fa-album:after{content:"\10f89f"}.fad.fa-album-collection:after{content:"\10f8a0"}.fad.fa-alicorn:after{content:"\10f6b0"}.fad.fa-alien:after{content:"\10f8f5"}.fad.fa-alien-monster:after{content:"\10f8f6"}.fad.fa-align-center:after{content:"\10f037"}.fad.fa-align-justify:after{content:"\10f039"}.fad.fa-align-left:after{content:"\10f036"}.fad.fa-align-right:after{content:"\10f038"}.fad.fa-align-slash:after{content:"\10f846"}.fad.fa-allergies:after{content:"\10f461"}.fad.fa-ambulance:after{content:"\10f0f9"}.fad.fa-american-sign-language-interpreting:after{content:"\10f2a3"}.fad.fa-amp-guitar:after{content:"\10f8a1"}.fad.fa-analytics:after{content:"\10f643"}.fad.fa-anchor:after{content:"\10f13d"}.fad.fa-angel:after{content:"\10f779"}.fad.fa-angle-double-down:after{content:"\10f103"}.fad.fa-angle-double-left:after{content:"\10f100"}.fad.fa-angle-double-right:after{content:"\10f101"}.fad.fa-angle-double-up:after{content:"\10f102"}.fad.fa-angle-down:after{content:"\10f107"}.fad.fa-angle-left:after{content:"\10f104"}.fad.fa-angle-right:after{content:"\10f105"}.fad.fa-angle-up:after{content:"\10f106"}.fad.fa-angry:after{content:"\10f556"}.fad.fa-ankh:after{content:"\10f644"}.fad.fa-apple-alt:after{content:"\10f5d1"}.fad.fa-apple-crate:after{content:"\10f6b1"}.fad.fa-archive:after{content:"\10f187"}.fad.fa-archway:after{content:"\10f557"}.fad.fa-arrow-alt-circle-down:after{content:"\10f358"}.fad.fa-arrow-alt-circle-left:after{content:"\10f359"}.fad.fa-arrow-alt-circle-right:after{content:"\10f35a"}.fad.fa-arrow-alt-circle-up:after{content:"\10f35b"}.fad.fa-arrow-alt-down:after{content:"\10f354"}.fad.fa-arrow-alt-from-bottom:after{content:"\10f346"}.fad.fa-arrow-alt-from-left:after{content:"\10f347"}.fad.fa-arrow-alt-from-right:after{content:"\10f348"}.fad.fa-arrow-alt-from-top:after{content:"\10f349"}.fad.fa-arrow-alt-left:after{content:"\10f355"}.fad.fa-arrow-alt-right:after{content:"\10f356"}.fad.fa-arrow-alt-square-down:after{content:"\10f350"}.fad.fa-arrow-alt-square-left:after{content:"\10f351"}.fad.fa-arrow-alt-square-right:after{content:"\10f352"}.fad.fa-arrow-alt-square-up:after{content:"\10f353"}.fad.fa-arrow-alt-to-bottom:after{content:"\10f34a"}.fad.fa-arrow-alt-to-left:after{content:"\10f34b"}.fad.fa-arrow-alt-to-right:after{content:"\10f34c"}.fad.fa-arrow-alt-to-top:after{content:"\10f34d"}.fad.fa-arrow-alt-up:after{content:"\10f357"}.fad.fa-arrow-circle-down:after{content:"\10f0ab"}.fad.fa-arrow-circle-left:after{content:"\10f0a8"}.fad.fa-arrow-circle-right:after{content:"\10f0a9"}.fad.fa-arrow-circle-up:after{content:"\10f0aa"}.fad.fa-arrow-down:after{content:"\10f063"}.fad.fa-arrow-from-bottom:after{content:"\10f342"}.fad.fa-arrow-from-left:after{content:"\10f343"}.fad.fa-arrow-from-right:after{content:"\10f344"}.fad.fa-arrow-from-top:after{content:"\10f345"}.fad.fa-arrow-left:after{content:"\10f060"}.fad.fa-arrow-right:after{content:"\10f061"}.fad.fa-arrow-square-down:after{content:"\10f339"}.fad.fa-arrow-square-left:after{content:"\10f33a"}.fad.fa-arrow-square-right:after{content:"\10f33b"}.fad.fa-arrow-square-up:after{content:"\10f33c"}.fad.fa-arrow-to-bottom:after{content:"\10f33d"}.fad.fa-arrow-to-left:after{content:"\10f33e"}.fad.fa-arrow-to-right:after{content:"\10f340"}.fad.fa-arrow-to-top:after{content:"\10f341"}.fad.fa-arrow-up:after{content:"\10f062"}.fad.fa-arrows:after{content:"\10f047"}.fad.fa-arrows-alt:after{content:"\10f0b2"}.fad.fa-arrows-alt-h:after{content:"\10f337"}.fad.fa-arrows-alt-v:after{content:"\10f338"}.fad.fa-arrows-h:after{content:"\10f07e"}.fad.fa-arrows-v:after{content:"\10f07d"}.fad.fa-assistive-listening-systems:after{content:"\10f2a2"}.fad.fa-asterisk:after{content:"\10f069"}.fad.fa-at:after{content:"\10f1fa"}.fad.fa-atlas:after{content:"\10f558"}.fad.fa-atom:after{content:"\10f5d2"}.fad.fa-atom-alt:after{content:"\10f5d3"}.fad.fa-audio-description:after{content:"\10f29e"}.fad.fa-award:after{content:"\10f559"}.fad.fa-axe:after{content:"\10f6b2"}.fad.fa-axe-battle:after{content:"\10f6b3"}.fad.fa-baby:after{content:"\10f77c"}.fad.fa-baby-carriage:after{content:"\10f77d"}.fad.fa-backpack:after{content:"\10f5d4"}.fad.fa-backspace:after{content:"\10f55a"}.fad.fa-backward:after{content:"\10f04a"}.fad.fa-bacon:after{content:"\10f7e5"}.fad.fa-bacteria:after{content:"\10f959"}.fad.fa-bacterium:after{content:"\10f95a"}.fad.fa-badge:after{content:"\10f335"}.fad.fa-badge-check:after{content:"\10f336"}.fad.fa-badge-dollar:after{content:"\10f645"}.fad.fa-badge-percent:after{content:"\10f646"}.fad.fa-badge-sheriff:after{content:"\10f8a2"}.fad.fa-badger-honey:after{content:"\10f6b4"}.fad.fa-bags-shopping:after{content:"\10f847"}.fad.fa-bahai:after{content:"\10f666"}.fad.fa-balance-scale:after{content:"\10f24e"}.fad.fa-balance-scale-left:after{content:"\10f515"}.fad.fa-balance-scale-right:after{content:"\10f516"}.fad.fa-ball-pile:after{content:"\10f77e"}.fad.fa-ballot:after{content:"\10f732"}.fad.fa-ballot-check:after{content:"\10f733"}.fad.fa-ban:after{content:"\10f05e"}.fad.fa-band-aid:after{content:"\10f462"}.fad.fa-banjo:after{content:"\10f8a3"}.fad.fa-barcode:after{content:"\10f02a"}.fad.fa-barcode-alt:after{content:"\10f463"}.fad.fa-barcode-read:after{content:"\10f464"}.fad.fa-barcode-scan:after{content:"\10f465"}.fad.fa-bars:after{content:"\10f0c9"}.fad.fa-baseball:after{content:"\10f432"}.fad.fa-baseball-ball:after{content:"\10f433"}.fad.fa-basketball-ball:after{content:"\10f434"}.fad.fa-basketball-hoop:after{content:"\10f435"}.fad.fa-bat:after{content:"\10f6b5"}.fad.fa-bath:after{content:"\10f2cd"}.fad.fa-battery-bolt:after{content:"\10f376"}.fad.fa-battery-empty:after{content:"\10f244"}.fad.fa-battery-full:after{content:"\10f240"}.fad.fa-battery-half:after{content:"\10f242"}.fad.fa-battery-quarter:after{content:"\10f243"}.fad.fa-battery-slash:after{content:"\10f377"}.fad.fa-battery-three-quarters:after{content:"\10f241"}.fad.fa-bed:after{content:"\10f236"}.fad.fa-bed-alt:after{content:"\10f8f7"}.fad.fa-bed-bunk:after{content:"\10f8f8"}.fad.fa-bed-empty:after{content:"\10f8f9"}.fad.fa-beer:after{content:"\10f0fc"}.fad.fa-bell:after{content:"\10f0f3"}.fad.fa-bell-exclamation:after{content:"\10f848"}.fad.fa-bell-on:after{content:"\10f8fa"}.fad.fa-bell-plus:after{content:"\10f849"}.fad.fa-bell-school:after{content:"\10f5d5"}.fad.fa-bell-school-slash:after{content:"\10f5d6"}.fad.fa-bell-slash:after{content:"\10f1f6"}.fad.fa-bells:after{content:"\10f77f"}.fad.fa-betamax:after{content:"\10f8a4"}.fad.fa-bezier-curve:after{content:"\10f55b"}.fad.fa-bible:after{content:"\10f647"}.fad.fa-bicycle:after{content:"\10f206"}.fad.fa-biking:after{content:"\10f84a"}.fad.fa-biking-mountain:after{content:"\10f84b"}.fad.fa-binoculars:after{content:"\10f1e5"}.fad.fa-biohazard:after{content:"\10f780"}.fad.fa-birthday-cake:after{content:"\10f1fd"}.fad.fa-blanket:after{content:"\10f498"}.fad.fa-blender:after{content:"\10f517"}.fad.fa-blender-phone:after{content:"\10f6b6"}.fad.fa-blind:after{content:"\10f29d"}.fad.fa-blinds:after{content:"\10f8fb"}.fad.fa-blinds-open:after{content:"\10f8fc"}.fad.fa-blinds-raised:after{content:"\10f8fd"}.fad.fa-blog:after{content:"\10f781"}.fad.fa-bold:after{content:"\10f032"}.fad.fa-bolt:after{content:"\10f0e7"}.fad.fa-bomb:after{content:"\10f1e2"}.fad.fa-bone:after{content:"\10f5d7"}.fad.fa-bone-break:after{content:"\10f5d8"}.fad.fa-bong:after{content:"\10f55c"}.fad.fa-book:after{content:"\10f02d"}.fad.fa-book-alt:after{content:"\10f5d9"}.fad.fa-book-dead:after{content:"\10f6b7"}.fad.fa-book-heart:after{content:"\10f499"}.fad.fa-book-medical:after{content:"\10f7e6"}.fad.fa-book-open:after{content:"\10f518"}.fad.fa-book-reader:after{content:"\10f5da"}.fad.fa-book-spells:after{content:"\10f6b8"}.fad.fa-book-user:after{content:"\10f7e7"}.fad.fa-bookmark:after{content:"\10f02e"}.fad.fa-books:after{content:"\10f5db"}.fad.fa-books-medical:after{content:"\10f7e8"}.fad.fa-boombox:after{content:"\10f8a5"}.fad.fa-boot:after{content:"\10f782"}.fad.fa-booth-curtain:after{content:"\10f734"}.fad.fa-border-all:after{content:"\10f84c"}.fad.fa-border-bottom:after{content:"\10f84d"}.fad.fa-border-center-h:after{content:"\10f89c"}.fad.fa-border-center-v:after{content:"\10f89d"}.fad.fa-border-inner:after{content:"\10f84e"}.fad.fa-border-left:after{content:"\10f84f"}.fad.fa-border-none:after{content:"\10f850"}.fad.fa-border-outer:after{content:"\10f851"}.fad.fa-border-right:after{content:"\10f852"}.fad.fa-border-style:after{content:"\10f853"}.fad.fa-border-style-alt:after{content:"\10f854"}.fad.fa-border-top:after{content:"\10f855"}.fad.fa-bow-arrow:after{content:"\10f6b9"}.fad.fa-bowling-ball:after{content:"\10f436"}.fad.fa-bowling-pins:after{content:"\10f437"}.fad.fa-box:after{content:"\10f466"}.fad.fa-box-alt:after{content:"\10f49a"}.fad.fa-box-ballot:after{content:"\10f735"}.fad.fa-box-check:after{content:"\10f467"}.fad.fa-box-fragile:after{content:"\10f49b"}.fad.fa-box-full:after{content:"\10f49c"}.fad.fa-box-heart:after{content:"\10f49d"}.fad.fa-box-open:after{content:"\10f49e"}.fad.fa-box-tissue:after{content:"\10f95b"}.fad.fa-box-up:after{content:"\10f49f"}.fad.fa-box-usd:after{content:"\10f4a0"}.fad.fa-boxes:after{content:"\10f468"}.fad.fa-boxes-alt:after{content:"\10f4a1"}.fad.fa-boxing-glove:after{content:"\10f438"}.fad.fa-brackets:after{content:"\10f7e9"}.fad.fa-brackets-curly:after{content:"\10f7ea"}.fad.fa-braille:after{content:"\10f2a1"}.fad.fa-brain:after{content:"\10f5dc"}.fad.fa-bread-loaf:after{content:"\10f7eb"}.fad.fa-bread-slice:after{content:"\10f7ec"}.fad.fa-briefcase:after{content:"\10f0b1"}.fad.fa-briefcase-medical:after{content:"\10f469"}.fad.fa-bring-forward:after{content:"\10f856"}.fad.fa-bring-front:after{content:"\10f857"}.fad.fa-broadcast-tower:after{content:"\10f519"}.fad.fa-broom:after{content:"\10f51a"}.fad.fa-browser:after{content:"\10f37e"}.fad.fa-brush:after{content:"\10f55d"}.fad.fa-bug:after{content:"\10f188"}.fad.fa-building:after{content:"\10f1ad"}.fad.fa-bullhorn:after{content:"\10f0a1"}.fad.fa-bullseye:after{content:"\10f140"}.fad.fa-bullseye-arrow:after{content:"\10f648"}.fad.fa-bullseye-pointer:after{content:"\10f649"}.fad.fa-burger-soda:after{content:"\10f858"}.fad.fa-burn:after{content:"\10f46a"}.fad.fa-burrito:after{content:"\10f7ed"}.fad.fa-bus:after{content:"\10f207"}.fad.fa-bus-alt:after{content:"\10f55e"}.fad.fa-bus-school:after{content:"\10f5dd"}.fad.fa-business-time:after{content:"\10f64a"}.fad.fa-cabinet-filing:after{content:"\10f64b"}.fad.fa-cactus:after{content:"\10f8a7"}.fad.fa-calculator:after{content:"\10f1ec"}.fad.fa-calculator-alt:after{content:"\10f64c"}.fad.fa-calendar:after{content:"\10f133"}.fad.fa-calendar-alt:after{content:"\10f073"}.fad.fa-calendar-check:after{content:"\10f274"}.fad.fa-calendar-day:after{content:"\10f783"}.fad.fa-calendar-edit:after{content:"\10f333"}.fad.fa-calendar-exclamation:after{content:"\10f334"}.fad.fa-calendar-minus:after{content:"\10f272"}.fad.fa-calendar-plus:after{content:"\10f271"}.fad.fa-calendar-star:after{content:"\10f736"}.fad.fa-calendar-times:after{content:"\10f273"}.fad.fa-calendar-week:after{content:"\10f784"}.fad.fa-camcorder:after{content:"\10f8a8"}.fad.fa-camera:after{content:"\10f030"}.fad.fa-camera-alt:after{content:"\10f332"}.fad.fa-camera-home:after{content:"\10f8fe"}.fad.fa-camera-movie:after{content:"\10f8a9"}.fad.fa-camera-polaroid:after{content:"\10f8aa"}.fad.fa-camera-retro:after{content:"\10f083"}.fad.fa-campfire:after{content:"\10f6ba"}.fad.fa-campground:after{content:"\10f6bb"}.fad.fa-candle-holder:after{content:"\10f6bc"}.fad.fa-candy-cane:after{content:"\10f786"}.fad.fa-candy-corn:after{content:"\10f6bd"}.fad.fa-cannabis:after{content:"\10f55f"}.fad.fa-capsules:after{content:"\10f46b"}.fad.fa-car:after{content:"\10f1b9"}.fad.fa-car-alt:after{content:"\10f5de"}.fad.fa-car-battery:after{content:"\10f5df"}.fad.fa-car-building:after{content:"\10f859"}.fad.fa-car-bump:after{content:"\10f5e0"}.fad.fa-car-bus:after{content:"\10f85a"}.fad.fa-car-crash:after{content:"\10f5e1"}.fad.fa-car-garage:after{content:"\10f5e2"}.fad.fa-car-mechanic:after{content:"\10f5e3"}.fad.fa-car-side:after{content:"\10f5e4"}.fad.fa-car-tilt:after{content:"\10f5e5"}.fad.fa-car-wash:after{content:"\10f5e6"}.fad.fa-caravan:after{content:"\10f8ff"}.fad.fa-caravan-alt:after{content:"\10f900"}.fad.fa-caret-circle-down:after{content:"\10f32d"}.fad.fa-caret-circle-left:after{content:"\10f32e"}.fad.fa-caret-circle-right:after{content:"\10f330"}.fad.fa-caret-circle-up:after{content:"\10f331"}.fad.fa-caret-down:after{content:"\10f0d7"}.fad.fa-caret-left:after{content:"\10f0d9"}.fad.fa-caret-right:after{content:"\10f0da"}.fad.fa-caret-square-down:after{content:"\10f150"}.fad.fa-caret-square-left:after{content:"\10f191"}.fad.fa-caret-square-right:after{content:"\10f152"}.fad.fa-caret-square-up:after{content:"\10f151"}.fad.fa-caret-up:after{content:"\10f0d8"}.fad.fa-carrot:after{content:"\10f787"}.fad.fa-cars:after{content:"\10f85b"}.fad.fa-cart-arrow-down:after{content:"\10f218"}.fad.fa-cart-plus:after{content:"\10f217"}.fad.fa-cash-register:after{content:"\10f788"}.fad.fa-cassette-tape:after{content:"\10f8ab"}.fad.fa-cat:after{content:"\10f6be"}.fad.fa-cat-space:after{content:"\10f901"}.fad.fa-cauldron:after{content:"\10f6bf"}.fad.fa-cctv:after{content:"\10f8ac"}.fad.fa-certificate:after{content:"\10f0a3"}.fad.fa-chair:after{content:"\10f6c0"}.fad.fa-chair-office:after{content:"\10f6c1"}.fad.fa-chalkboard:after{content:"\10f51b"}.fad.fa-chalkboard-teacher:after{content:"\10f51c"}.fad.fa-charging-station:after{content:"\10f5e7"}.fad.fa-chart-area:after{content:"\10f1fe"}.fad.fa-chart-bar:after{content:"\10f080"}.fad.fa-chart-line:after{content:"\10f201"}.fad.fa-chart-line-down:after{content:"\10f64d"}.fad.fa-chart-network:after{content:"\10f78a"}.fad.fa-chart-pie:after{content:"\10f200"}.fad.fa-chart-pie-alt:after{content:"\10f64e"}.fad.fa-chart-scatter:after{content:"\10f7ee"}.fad.fa-check:after{content:"\10f00c"}.fad.fa-check-circle:after{content:"\10f058"}.fad.fa-check-double:after{content:"\10f560"}.fad.fa-check-square:after{content:"\10f14a"}.fad.fa-cheese:after{content:"\10f7ef"}.fad.fa-cheese-swiss:after{content:"\10f7f0"}.fad.fa-cheeseburger:after{content:"\10f7f1"}.fad.fa-chess:after{content:"\10f439"}.fad.fa-chess-bishop:after{content:"\10f43a"}.fad.fa-chess-bishop-alt:after{content:"\10f43b"}.fad.fa-chess-board:after{content:"\10f43c"}.fad.fa-chess-clock:after{content:"\10f43d"}.fad.fa-chess-clock-alt:after{content:"\10f43e"}.fad.fa-chess-king:after{content:"\10f43f"}.fad.fa-chess-king-alt:after{content:"\10f440"}.fad.fa-chess-knight:after{content:"\10f441"}.fad.fa-chess-knight-alt:after{content:"\10f442"}.fad.fa-chess-pawn:after{content:"\10f443"}.fad.fa-chess-pawn-alt:after{content:"\10f444"}.fad.fa-chess-queen:after{content:"\10f445"}.fad.fa-chess-queen-alt:after{content:"\10f446"}.fad.fa-chess-rook:after{content:"\10f447"}.fad.fa-chess-rook-alt:after{content:"\10f448"}.fad.fa-chevron-circle-down:after{content:"\10f13a"}.fad.fa-chevron-circle-left:after{content:"\10f137"}.fad.fa-chevron-circle-right:after{content:"\10f138"}.fad.fa-chevron-circle-up:after{content:"\10f139"}.fad.fa-chevron-double-down:after{content:"\10f322"}.fad.fa-chevron-double-left:after{content:"\10f323"}.fad.fa-chevron-double-right:after{content:"\10f324"}.fad.fa-chevron-double-up:after{content:"\10f325"}.fad.fa-chevron-down:after{content:"\10f078"}.fad.fa-chevron-left:after{content:"\10f053"}.fad.fa-chevron-right:after{content:"\10f054"}.fad.fa-chevron-square-down:after{content:"\10f329"}.fad.fa-chevron-square-left:after{content:"\10f32a"}.fad.fa-chevron-square-right:after{content:"\10f32b"}.fad.fa-chevron-square-up:after{content:"\10f32c"}.fad.fa-chevron-up:after{content:"\10f077"}.fad.fa-child:after{content:"\10f1ae"}.fad.fa-chimney:after{content:"\10f78b"}.fad.fa-church:after{content:"\10f51d"}.fad.fa-circle:after{content:"\10f111"}.fad.fa-circle-notch:after{content:"\10f1ce"}.fad.fa-city:after{content:"\10f64f"}.fad.fa-clarinet:after{content:"\10f8ad"}.fad.fa-claw-marks:after{content:"\10f6c2"}.fad.fa-clinic-medical:after{content:"\10f7f2"}.fad.fa-clipboard:after{content:"\10f328"}.fad.fa-clipboard-check:after{content:"\10f46c"}.fad.fa-clipboard-list:after{content:"\10f46d"}.fad.fa-clipboard-list-check:after{content:"\10f737"}.fad.fa-clipboard-prescription:after{content:"\10f5e8"}.fad.fa-clipboard-user:after{content:"\10f7f3"}.fad.fa-clock:after{content:"\10f017"}.fad.fa-clone:after{content:"\10f24d"}.fad.fa-closed-captioning:after{content:"\10f20a"}.fad.fa-cloud:after{content:"\10f0c2"}.fad.fa-cloud-download:after{content:"\10f0ed"}.fad.fa-cloud-download-alt:after{content:"\10f381"}.fad.fa-cloud-drizzle:after{content:"\10f738"}.fad.fa-cloud-hail:after{content:"\10f739"}.fad.fa-cloud-hail-mixed:after{content:"\10f73a"}.fad.fa-cloud-meatball:after{content:"\10f73b"}.fad.fa-cloud-moon:after{content:"\10f6c3"}.fad.fa-cloud-moon-rain:after{content:"\10f73c"}.fad.fa-cloud-music:after{content:"\10f8ae"}.fad.fa-cloud-rain:after{content:"\10f73d"}.fad.fa-cloud-rainbow:after{content:"\10f73e"}.fad.fa-cloud-showers:after{content:"\10f73f"}.fad.fa-cloud-showers-heavy:after{content:"\10f740"}.fad.fa-cloud-sleet:after{content:"\10f741"}.fad.fa-cloud-snow:after{content:"\10f742"}.fad.fa-cloud-sun:after{content:"\10f6c4"}.fad.fa-cloud-sun-rain:after{content:"\10f743"}.fad.fa-cloud-upload:after{content:"\10f0ee"}.fad.fa-cloud-upload-alt:after{content:"\10f382"}.fad.fa-clouds:after{content:"\10f744"}.fad.fa-clouds-moon:after{content:"\10f745"}.fad.fa-clouds-sun:after{content:"\10f746"}.fad.fa-club:after{content:"\10f327"}.fad.fa-cocktail:after{content:"\10f561"}.fad.fa-code:after{content:"\10f121"}.fad.fa-code-branch:after{content:"\10f126"}.fad.fa-code-commit:after{content:"\10f386"}.fad.fa-code-merge:after{content:"\10f387"}.fad.fa-coffee:after{content:"\10f0f4"}.fad.fa-coffee-pot:after{content:"\10f902"}.fad.fa-coffee-togo:after{content:"\10f6c5"}.fad.fa-coffin:after{content:"\10f6c6"}.fad.fa-coffin-cross:after{content:"\10f951"}.fad.fa-cog:after{content:"\10f013"}.fad.fa-cogs:after{content:"\10f085"}.fad.fa-coin:after{content:"\10f85c"}.fad.fa-coins:after{content:"\10f51e"}.fad.fa-columns:after{content:"\10f0db"}.fad.fa-comet:after{content:"\10f903"}.fad.fa-comment:after{content:"\10f075"}.fad.fa-comment-alt:after{content:"\10f27a"}.fad.fa-comment-alt-check:after{content:"\10f4a2"}.fad.fa-comment-alt-dollar:after{content:"\10f650"}.fad.fa-comment-alt-dots:after{content:"\10f4a3"}.fad.fa-comment-alt-edit:after{content:"\10f4a4"}.fad.fa-comment-alt-exclamation:after{content:"\10f4a5"}.fad.fa-comment-alt-lines:after{content:"\10f4a6"}.fad.fa-comment-alt-medical:after{content:"\10f7f4"}.fad.fa-comment-alt-minus:after{content:"\10f4a7"}.fad.fa-comment-alt-music:after{content:"\10f8af"}.fad.fa-comment-alt-plus:after{content:"\10f4a8"}.fad.fa-comment-alt-slash:after{content:"\10f4a9"}.fad.fa-comment-alt-smile:after{content:"\10f4aa"}.fad.fa-comment-alt-times:after{content:"\10f4ab"}.fad.fa-comment-check:after{content:"\10f4ac"}.fad.fa-comment-dollar:after{content:"\10f651"}.fad.fa-comment-dots:after{content:"\10f4ad"}.fad.fa-comment-edit:after{content:"\10f4ae"}.fad.fa-comment-exclamation:after{content:"\10f4af"}.fad.fa-comment-lines:after{content:"\10f4b0"}.fad.fa-comment-medical:after{content:"\10f7f5"}.fad.fa-comment-minus:after{content:"\10f4b1"}.fad.fa-comment-music:after{content:"\10f8b0"}.fad.fa-comment-plus:after{content:"\10f4b2"}.fad.fa-comment-slash:after{content:"\10f4b3"}.fad.fa-comment-smile:after{content:"\10f4b4"}.fad.fa-comment-times:after{content:"\10f4b5"}.fad.fa-comments:after{content:"\10f086"}.fad.fa-comments-alt:after{content:"\10f4b6"}.fad.fa-comments-alt-dollar:after{content:"\10f652"}.fad.fa-comments-dollar:after{content:"\10f653"}.fad.fa-compact-disc:after{content:"\10f51f"}.fad.fa-compass:after{content:"\10f14e"}.fad.fa-compass-slash:after{content:"\10f5e9"}.fad.fa-compress:after{content:"\10f066"}.fad.fa-compress-alt:after{content:"\10f422"}.fad.fa-compress-arrows-alt:after{content:"\10f78c"}.fad.fa-compress-wide:after{content:"\10f326"}.fad.fa-computer-classic:after{content:"\10f8b1"}.fad.fa-computer-speaker:after{content:"\10f8b2"}.fad.fa-concierge-bell:after{content:"\10f562"}.fad.fa-construction:after{content:"\10f85d"}.fad.fa-container-storage:after{content:"\10f4b7"}.fad.fa-conveyor-belt:after{content:"\10f46e"}.fad.fa-conveyor-belt-alt:after{content:"\10f46f"}.fad.fa-cookie:after{content:"\10f563"}.fad.fa-cookie-bite:after{content:"\10f564"}.fad.fa-copy:after{content:"\10f0c5"}.fad.fa-copyright:after{content:"\10f1f9"}.fad.fa-corn:after{content:"\10f6c7"}.fad.fa-couch:after{content:"\10f4b8"}.fad.fa-cow:after{content:"\10f6c8"}.fad.fa-cowbell:after{content:"\10f8b3"}.fad.fa-cowbell-more:after{content:"\10f8b4"}.fad.fa-credit-card:after{content:"\10f09d"}.fad.fa-credit-card-blank:after{content:"\10f389"}.fad.fa-credit-card-front:after{content:"\10f38a"}.fad.fa-cricket:after{content:"\10f449"}.fad.fa-croissant:after{content:"\10f7f6"}.fad.fa-crop:after{content:"\10f125"}.fad.fa-crop-alt:after{content:"\10f565"}.fad.fa-cross:after{content:"\10f654"}.fad.fa-crosshairs:after{content:"\10f05b"}.fad.fa-crow:after{content:"\10f520"}.fad.fa-crown:after{content:"\10f521"}.fad.fa-crutch:after{content:"\10f7f7"}.fad.fa-crutches:after{content:"\10f7f8"}.fad.fa-cube:after{content:"\10f1b2"}.fad.fa-cubes:after{content:"\10f1b3"}.fad.fa-curling:after{content:"\10f44a"}.fad.fa-cut:after{content:"\10f0c4"}.fad.fa-dagger:after{content:"\10f6cb"}.fad.fa-database:after{content:"\10f1c0"}.fad.fa-deaf:after{content:"\10f2a4"}.fad.fa-debug:after{content:"\10f7f9"}.fad.fa-deer:after{content:"\10f78e"}.fad.fa-deer-rudolph:after{content:"\10f78f"}.fad.fa-democrat:after{content:"\10f747"}.fad.fa-desktop:after{content:"\10f108"}.fad.fa-desktop-alt:after{content:"\10f390"}.fad.fa-dewpoint:after{content:"\10f748"}.fad.fa-dharmachakra:after{content:"\10f655"}.fad.fa-diagnoses:after{content:"\10f470"}.fad.fa-diamond:after{content:"\10f219"}.fad.fa-dice:after{content:"\10f522"}.fad.fa-dice-d10:after{content:"\10f6cd"}.fad.fa-dice-d12:after{content:"\10f6ce"}.fad.fa-dice-d20:after{content:"\10f6cf"}.fad.fa-dice-d4:after{content:"\10f6d0"}.fad.fa-dice-d6:after{content:"\10f6d1"}.fad.fa-dice-d8:after{content:"\10f6d2"}.fad.fa-dice-five:after{content:"\10f523"}.fad.fa-dice-four:after{content:"\10f524"}.fad.fa-dice-one:after{content:"\10f525"}.fad.fa-dice-six:after{content:"\10f526"}.fad.fa-dice-three:after{content:"\10f527"}.fad.fa-dice-two:after{content:"\10f528"}.fad.fa-digging:after{content:"\10f85e"}.fad.fa-digital-tachograph:after{content:"\10f566"}.fad.fa-diploma:after{content:"\10f5ea"}.fad.fa-directions:after{content:"\10f5eb"}.fad.fa-disc-drive:after{content:"\10f8b5"}.fad.fa-disease:after{content:"\10f7fa"}.fad.fa-divide:after{content:"\10f529"}.fad.fa-dizzy:after{content:"\10f567"}.fad.fa-dna:after{content:"\10f471"}.fad.fa-do-not-enter:after{content:"\10f5ec"}.fad.fa-dog:after{content:"\10f6d3"}.fad.fa-dog-leashed:after{content:"\10f6d4"}.fad.fa-dollar-sign:after{content:"\10f155"}.fad.fa-dolly:after{content:"\10f472"}.fad.fa-dolly-empty:after{content:"\10f473"}.fad.fa-dolly-flatbed:after{content:"\10f474"}.fad.fa-dolly-flatbed-alt:after{content:"\10f475"}.fad.fa-dolly-flatbed-empty:after{content:"\10f476"}.fad.fa-donate:after{content:"\10f4b9"}.fad.fa-door-closed:after{content:"\10f52a"}.fad.fa-door-open:after{content:"\10f52b"}.fad.fa-dot-circle:after{content:"\10f192"}.fad.fa-dove:after{content:"\10f4ba"}.fad.fa-download:after{content:"\10f019"}.fad.fa-drafting-compass:after{content:"\10f568"}.fad.fa-dragon:after{content:"\10f6d5"}.fad.fa-draw-circle:after{content:"\10f5ed"}.fad.fa-draw-polygon:after{content:"\10f5ee"}.fad.fa-draw-square:after{content:"\10f5ef"}.fad.fa-dreidel:after{content:"\10f792"}.fad.fa-drone:after{content:"\10f85f"}.fad.fa-drone-alt:after{content:"\10f860"}.fad.fa-drum:after{content:"\10f569"}.fad.fa-drum-steelpan:after{content:"\10f56a"}.fad.fa-drumstick:after{content:"\10f6d6"}.fad.fa-drumstick-bite:after{content:"\10f6d7"}.fad.fa-dryer:after{content:"\10f861"}.fad.fa-dryer-alt:after{content:"\10f862"}.fad.fa-duck:after{content:"\10f6d8"}.fad.fa-dumbbell:after{content:"\10f44b"}.fad.fa-dumpster:after{content:"\10f793"}.fad.fa-dumpster-fire:after{content:"\10f794"}.fad.fa-dungeon:after{content:"\10f6d9"}.fad.fa-ear:after{content:"\10f5f0"}.fad.fa-ear-muffs:after{content:"\10f795"}.fad.fa-eclipse:after{content:"\10f749"}.fad.fa-eclipse-alt:after{content:"\10f74a"}.fad.fa-edit:after{content:"\10f044"}.fad.fa-egg:after{content:"\10f7fb"}.fad.fa-egg-fried:after{content:"\10f7fc"}.fad.fa-eject:after{content:"\10f052"}.fad.fa-elephant:after{content:"\10f6da"}.fad.fa-ellipsis-h:after{content:"\10f141"}.fad.fa-ellipsis-h-alt:after{content:"\10f39b"}.fad.fa-ellipsis-v:after{content:"\10f142"}.fad.fa-ellipsis-v-alt:after{content:"\10f39c"}.fad.fa-empty-set:after{content:"\10f656"}.fad.fa-engine-warning:after{content:"\10f5f2"}.fad.fa-envelope:after{content:"\10f0e0"}.fad.fa-envelope-open:after{content:"\10f2b6"}.fad.fa-envelope-open-dollar:after{content:"\10f657"}.fad.fa-envelope-open-text:after{content:"\10f658"}.fad.fa-envelope-square:after{content:"\10f199"}.fad.fa-equals:after{content:"\10f52c"}.fad.fa-eraser:after{content:"\10f12d"}.fad.fa-ethernet:after{content:"\10f796"}.fad.fa-euro-sign:after{content:"\10f153"}.fad.fa-exchange:after{content:"\10f0ec"}.fad.fa-exchange-alt:after{content:"\10f362"}.fad.fa-exclamation:after{content:"\10f12a"}.fad.fa-exclamation-circle:after{content:"\10f06a"}.fad.fa-exclamation-square:after{content:"\10f321"}.fad.fa-exclamation-triangle:after{content:"\10f071"}.fad.fa-expand:after{content:"\10f065"}.fad.fa-expand-alt:after{content:"\10f424"}.fad.fa-expand-arrows:after{content:"\10f31d"}.fad.fa-expand-arrows-alt:after{content:"\10f31e"}.fad.fa-expand-wide:after{content:"\10f320"}.fad.fa-external-link:after{content:"\10f08e"}.fad.fa-external-link-alt:after{content:"\10f35d"}.fad.fa-external-link-square:after{content:"\10f14c"}.fad.fa-external-link-square-alt:after{content:"\10f360"}.fad.fa-eye:after{content:"\10f06e"}.fad.fa-eye-dropper:after{content:"\10f1fb"}.fad.fa-eye-evil:after{content:"\10f6db"}.fad.fa-eye-slash:after{content:"\10f070"}.fad.fa-fan:after{content:"\10f863"}.fad.fa-fan-table:after{content:"\10f904"}.fad.fa-farm:after{content:"\10f864"}.fad.fa-fast-backward:after{content:"\10f049"}.fad.fa-fast-forward:after{content:"\10f050"}.fad.fa-faucet:after{content:"\10f905"}.fad.fa-faucet-drip:after{content:"\10f906"}.fad.fa-fax:after{content:"\10f1ac"}.fad.fa-feather:after{content:"\10f52d"}.fad.fa-feather-alt:after{content:"\10f56b"}.fad.fa-female:after{content:"\10f182"}.fad.fa-field-hockey:after{content:"\10f44c"}.fad.fa-fighter-jet:after{content:"\10f0fb"}.fad.fa-file:after{content:"\10f15b"}.fad.fa-file-alt:after{content:"\10f15c"}.fad.fa-file-archive:after{content:"\10f1c6"}.fad.fa-file-audio:after{content:"\10f1c7"}.fad.fa-file-certificate:after{content:"\10f5f3"}.fad.fa-file-chart-line:after{content:"\10f659"}.fad.fa-file-chart-pie:after{content:"\10f65a"}.fad.fa-file-check:after{content:"\10f316"}.fad.fa-file-code:after{content:"\10f1c9"}.fad.fa-file-contract:after{content:"\10f56c"}.fad.fa-file-csv:after{content:"\10f6dd"}.fad.fa-file-download:after{content:"\10f56d"}.fad.fa-file-edit:after{content:"\10f31c"}.fad.fa-file-excel:after{content:"\10f1c3"}.fad.fa-file-exclamation:after{content:"\10f31a"}.fad.fa-file-export:after{content:"\10f56e"}.fad.fa-file-image:after{content:"\10f1c5"}.fad.fa-file-import:after{content:"\10f56f"}.fad.fa-file-invoice:after{content:"\10f570"}.fad.fa-file-invoice-dollar:after{content:"\10f571"}.fad.fa-file-medical:after{content:"\10f477"}.fad.fa-file-medical-alt:after{content:"\10f478"}.fad.fa-file-minus:after{content:"\10f318"}.fad.fa-file-music:after{content:"\10f8b6"}.fad.fa-file-pdf:after{content:"\10f1c1"}.fad.fa-file-plus:after{content:"\10f319"}.fad.fa-file-powerpoint:after{content:"\10f1c4"}.fad.fa-file-prescription:after{content:"\10f572"}.fad.fa-file-search:after{content:"\10f865"}.fad.fa-file-signature:after{content:"\10f573"}.fad.fa-file-spreadsheet:after{content:"\10f65b"}.fad.fa-file-times:after{content:"\10f317"}.fad.fa-file-upload:after{content:"\10f574"}.fad.fa-file-user:after{content:"\10f65c"}.fad.fa-file-video:after{content:"\10f1c8"}.fad.fa-file-word:after{content:"\10f1c2"}.fad.fa-files-medical:after{content:"\10f7fd"}.fad.fa-fill:after{content:"\10f575"}.fad.fa-fill-drip:after{content:"\10f576"}.fad.fa-film:after{content:"\10f008"}.fad.fa-film-alt:after{content:"\10f3a0"}.fad.fa-film-canister:after{content:"\10f8b7"}.fad.fa-filter:after{content:"\10f0b0"}.fad.fa-fingerprint:after{content:"\10f577"}.fad.fa-fire:after{content:"\10f06d"}.fad.fa-fire-alt:after{content:"\10f7e4"}.fad.fa-fire-extinguisher:after{content:"\10f134"}.fad.fa-fire-smoke:after{content:"\10f74b"}.fad.fa-fireplace:after{content:"\10f79a"}.fad.fa-first-aid:after{content:"\10f479"}.fad.fa-fish:after{content:"\10f578"}.fad.fa-fish-cooked:after{content:"\10f7fe"}.fad.fa-fist-raised:after{content:"\10f6de"}.fad.fa-flag:after{content:"\10f024"}.fad.fa-flag-alt:after{content:"\10f74c"}.fad.fa-flag-checkered:after{content:"\10f11e"}.fad.fa-flag-usa:after{content:"\10f74d"}.fad.fa-flame:after{content:"\10f6df"}.fad.fa-flashlight:after{content:"\10f8b8"}.fad.fa-flask:after{content:"\10f0c3"}.fad.fa-flask-poison:after{content:"\10f6e0"}.fad.fa-flask-potion:after{content:"\10f6e1"}.fad.fa-flower:after{content:"\10f7ff"}.fad.fa-flower-daffodil:after{content:"\10f800"}.fad.fa-flower-tulip:after{content:"\10f801"}.fad.fa-flushed:after{content:"\10f579"}.fad.fa-flute:after{content:"\10f8b9"}.fad.fa-flux-capacitor:after{content:"\10f8ba"}.fad.fa-fog:after{content:"\10f74e"}.fad.fa-folder:after{content:"\10f07b"}.fad.fa-folder-download:after{content:"\10f953"}.fad.fa-folder-minus:after{content:"\10f65d"}.fad.fa-folder-open:after{content:"\10f07c"}.fad.fa-folder-plus:after{content:"\10f65e"}.fad.fa-folder-times:after{content:"\10f65f"}.fad.fa-folder-tree:after{content:"\10f802"}.fad.fa-folder-upload:after{content:"\10f954"}.fad.fa-folders:after{content:"\10f660"}.fad.fa-font:after{content:"\10f031"}.fad.fa-font-awesome-logo-full:after{content:"\10f4e6"}.fad.fa-font-case:after{content:"\10f866"}.fad.fa-football-ball:after{content:"\10f44e"}.fad.fa-football-helmet:after{content:"\10f44f"}.fad.fa-forklift:after{content:"\10f47a"}.fad.fa-forward:after{content:"\10f04e"}.fad.fa-fragile:after{content:"\10f4bb"}.fad.fa-french-fries:after{content:"\10f803"}.fad.fa-frog:after{content:"\10f52e"}.fad.fa-frosty-head:after{content:"\10f79b"}.fad.fa-frown:after{content:"\10f119"}.fad.fa-frown-open:after{content:"\10f57a"}.fad.fa-function:after{content:"\10f661"}.fad.fa-funnel-dollar:after{content:"\10f662"}.fad.fa-futbol:after{content:"\10f1e3"}.fad.fa-galaxy:after{content:"\10f908"}.fad.fa-game-board:after{content:"\10f867"}.fad.fa-game-board-alt:after{content:"\10f868"}.fad.fa-game-console-handheld:after{content:"\10f8bb"}.fad.fa-gamepad:after{content:"\10f11b"}.fad.fa-gamepad-alt:after{content:"\10f8bc"}.fad.fa-garage:after{content:"\10f909"}.fad.fa-garage-car:after{content:"\10f90a"}.fad.fa-garage-open:after{content:"\10f90b"}.fad.fa-gas-pump:after{content:"\10f52f"}.fad.fa-gas-pump-slash:after{content:"\10f5f4"}.fad.fa-gavel:after{content:"\10f0e3"}.fad.fa-gem:after{content:"\10f3a5"}.fad.fa-genderless:after{content:"\10f22d"}.fad.fa-ghost:after{content:"\10f6e2"}.fad.fa-gift:after{content:"\10f06b"}.fad.fa-gift-card:after{content:"\10f663"}.fad.fa-gifts:after{content:"\10f79c"}.fad.fa-gingerbread-man:after{content:"\10f79d"}.fad.fa-glass:after{content:"\10f804"}.fad.fa-glass-champagne:after{content:"\10f79e"}.fad.fa-glass-cheers:after{content:"\10f79f"}.fad.fa-glass-citrus:after{content:"\10f869"}.fad.fa-glass-martini:after{content:"\10f000"}.fad.fa-glass-martini-alt:after{content:"\10f57b"}.fad.fa-glass-whiskey:after{content:"\10f7a0"}.fad.fa-glass-whiskey-rocks:after{content:"\10f7a1"}.fad.fa-glasses:after{content:"\10f530"}.fad.fa-glasses-alt:after{content:"\10f5f5"}.fad.fa-globe:after{content:"\10f0ac"}.fad.fa-globe-africa:after{content:"\10f57c"}.fad.fa-globe-americas:after{content:"\10f57d"}.fad.fa-globe-asia:after{content:"\10f57e"}.fad.fa-globe-europe:after{content:"\10f7a2"}.fad.fa-globe-snow:after{content:"\10f7a3"}.fad.fa-globe-stand:after{content:"\10f5f6"}.fad.fa-golf-ball:after{content:"\10f450"}.fad.fa-golf-club:after{content:"\10f451"}.fad.fa-gopuram:after{content:"\10f664"}.fad.fa-graduation-cap:after{content:"\10f19d"}.fad.fa-gramophone:after{content:"\10f8bd"}.fad.fa-greater-than:after{content:"\10f531"}.fad.fa-greater-than-equal:after{content:"\10f532"}.fad.fa-grimace:after{content:"\10f57f"}.fad.fa-grin:after{content:"\10f580"}.fad.fa-grin-alt:after{content:"\10f581"}.fad.fa-grin-beam:after{content:"\10f582"}.fad.fa-grin-beam-sweat:after{content:"\10f583"}.fad.fa-grin-hearts:after{content:"\10f584"}.fad.fa-grin-squint:after{content:"\10f585"}.fad.fa-grin-squint-tears:after{content:"\10f586"}.fad.fa-grin-stars:after{content:"\10f587"}.fad.fa-grin-tears:after{content:"\10f588"}.fad.fa-grin-tongue:after{content:"\10f589"}.fad.fa-grin-tongue-squint:after{content:"\10f58a"}.fad.fa-grin-tongue-wink:after{content:"\10f58b"}.fad.fa-grin-wink:after{content:"\10f58c"}.fad.fa-grip-horizontal:after{content:"\10f58d"}.fad.fa-grip-lines:after{content:"\10f7a4"}.fad.fa-grip-lines-vertical:after{content:"\10f7a5"}.fad.fa-grip-vertical:after{content:"\10f58e"}.fad.fa-guitar:after{content:"\10f7a6"}.fad.fa-guitar-electric:after{content:"\10f8be"}.fad.fa-guitars:after{content:"\10f8bf"}.fad.fa-h-square:after{content:"\10f0fd"}.fad.fa-h1:after{content:"\10f313"}.fad.fa-h2:after{content:"\10f314"}.fad.fa-h3:after{content:"\10f315"}.fad.fa-h4:after{content:"\10f86a"}.fad.fa-hamburger:after{content:"\10f805"}.fad.fa-hammer:after{content:"\10f6e3"}.fad.fa-hammer-war:after{content:"\10f6e4"}.fad.fa-hamsa:after{content:"\10f665"}.fad.fa-hand-heart:after{content:"\10f4bc"}.fad.fa-hand-holding:after{content:"\10f4bd"}.fad.fa-hand-holding-box:after{content:"\10f47b"}.fad.fa-hand-holding-heart:after{content:"\10f4be"}.fad.fa-hand-holding-magic:after{content:"\10f6e5"}.fad.fa-hand-holding-medical:after{content:"\10f95c"}.fad.fa-hand-holding-seedling:after{content:"\10f4bf"}.fad.fa-hand-holding-usd:after{content:"\10f4c0"}.fad.fa-hand-holding-water:after{content:"\10f4c1"}.fad.fa-hand-lizard:after{content:"\10f258"}.fad.fa-hand-middle-finger:after{content:"\10f806"}.fad.fa-hand-paper:after{content:"\10f256"}.fad.fa-hand-peace:after{content:"\10f25b"}.fad.fa-hand-point-down:after{content:"\10f0a7"}.fad.fa-hand-point-left:after{content:"\10f0a5"}.fad.fa-hand-point-right:after{content:"\10f0a4"}.fad.fa-hand-point-up:after{content:"\10f0a6"}.fad.fa-hand-pointer:after{content:"\10f25a"}.fad.fa-hand-receiving:after{content:"\10f47c"}.fad.fa-hand-rock:after{content:"\10f255"}.fad.fa-hand-scissors:after{content:"\10f257"}.fad.fa-hand-sparkles:after{content:"\10f95d"}.fad.fa-hand-spock:after{content:"\10f259"}.fad.fa-hands:after{content:"\10f4c2"}.fad.fa-hands-heart:after{content:"\10f4c3"}.fad.fa-hands-helping:after{content:"\10f4c4"}.fad.fa-hands-usd:after{content:"\10f4c5"}.fad.fa-hands-wash:after{content:"\10f95e"}.fad.fa-handshake:after{content:"\10f2b5"}.fad.fa-handshake-alt:after{content:"\10f4c6"}.fad.fa-handshake-alt-slash:after{content:"\10f95f"}.fad.fa-handshake-slash:after{content:"\10f960"}.fad.fa-hanukiah:after{content:"\10f6e6"}.fad.fa-hard-hat:after{content:"\10f807"}.fad.fa-hashtag:after{content:"\10f292"}.fad.fa-hat-chef:after{content:"\10f86b"}.fad.fa-hat-cowboy:after{content:"\10f8c0"}.fad.fa-hat-cowboy-side:after{content:"\10f8c1"}.fad.fa-hat-santa:after{content:"\10f7a7"}.fad.fa-hat-winter:after{content:"\10f7a8"}.fad.fa-hat-witch:after{content:"\10f6e7"}.fad.fa-hat-wizard:after{content:"\10f6e8"}.fad.fa-hdd:after{content:"\10f0a0"}.fad.fa-head-side:after{content:"\10f6e9"}.fad.fa-head-side-brain:after{content:"\10f808"}.fad.fa-head-side-cough:after{content:"\10f961"}.fad.fa-head-side-cough-slash:after{content:"\10f962"}.fad.fa-head-side-headphones:after{content:"\10f8c2"}.fad.fa-head-side-mask:after{content:"\10f963"}.fad.fa-head-side-medical:after{content:"\10f809"}.fad.fa-head-side-virus:after{content:"\10f964"}.fad.fa-head-vr:after{content:"\10f6ea"}.fad.fa-heading:after{content:"\10f1dc"}.fad.fa-headphones:after{content:"\10f025"}.fad.fa-headphones-alt:after{content:"\10f58f"}.fad.fa-headset:after{content:"\10f590"}.fad.fa-heart:after{content:"\10f004"}.fad.fa-heart-broken:after{content:"\10f7a9"}.fad.fa-heart-circle:after{content:"\10f4c7"}.fad.fa-heart-rate:after{content:"\10f5f8"}.fad.fa-heart-square:after{content:"\10f4c8"}.fad.fa-heartbeat:after{content:"\10f21e"}.fad.fa-heat:after{content:"\10f90c"}.fad.fa-helicopter:after{content:"\10f533"}.fad.fa-helmet-battle:after{content:"\10f6eb"}.fad.fa-hexagon:after{content:"\10f312"}.fad.fa-highlighter:after{content:"\10f591"}.fad.fa-hiking:after{content:"\10f6ec"}.fad.fa-hippo:after{content:"\10f6ed"}.fad.fa-history:after{content:"\10f1da"}.fad.fa-hockey-mask:after{content:"\10f6ee"}.fad.fa-hockey-puck:after{content:"\10f453"}.fad.fa-hockey-sticks:after{content:"\10f454"}.fad.fa-holly-berry:after{content:"\10f7aa"}.fad.fa-home:after{content:"\10f015"}.fad.fa-home-alt:after{content:"\10f80a"}.fad.fa-home-heart:after{content:"\10f4c9"}.fad.fa-home-lg:after{content:"\10f80b"}.fad.fa-home-lg-alt:after{content:"\10f80c"}.fad.fa-hood-cloak:after{content:"\10f6ef"}.fad.fa-horizontal-rule:after{content:"\10f86c"}.fad.fa-horse:after{content:"\10f6f0"}.fad.fa-horse-head:after{content:"\10f7ab"}.fad.fa-horse-saddle:after{content:"\10f8c3"}.fad.fa-hospital:after{content:"\10f0f8"}.fad.fa-hospital-alt:after{content:"\10f47d"}.fad.fa-hospital-symbol:after{content:"\10f47e"}.fad.fa-hospital-user:after{content:"\10f80d"}.fad.fa-hospitals:after{content:"\10f80e"}.fad.fa-hot-tub:after{content:"\10f593"}.fad.fa-hotdog:after{content:"\10f80f"}.fad.fa-hotel:after{content:"\10f594"}.fad.fa-hourglass:after{content:"\10f254"}.fad.fa-hourglass-end:after{content:"\10f253"}.fad.fa-hourglass-half:after{content:"\10f252"}.fad.fa-hourglass-start:after{content:"\10f251"}.fad.fa-house:after{content:"\10f90d"}.fad.fa-house-damage:after{content:"\10f6f1"}.fad.fa-house-day:after{content:"\10f90e"}.fad.fa-house-flood:after{content:"\10f74f"}.fad.fa-house-leave:after{content:"\10f90f"}.fad.fa-house-night:after{content:"\10f910"}.fad.fa-house-return:after{content:"\10f911"}.fad.fa-house-signal:after{content:"\10f912"}.fad.fa-house-user:after{content:"\10f965"}.fad.fa-hryvnia:after{content:"\10f6f2"}.fad.fa-humidity:after{content:"\10f750"}.fad.fa-hurricane:after{content:"\10f751"}.fad.fa-i-cursor:after{content:"\10f246"}.fad.fa-ice-cream:after{content:"\10f810"}.fad.fa-ice-skate:after{content:"\10f7ac"}.fad.fa-icicles:after{content:"\10f7ad"}.fad.fa-icons:after{content:"\10f86d"}.fad.fa-icons-alt:after{content:"\10f86e"}.fad.fa-id-badge:after{content:"\10f2c1"}.fad.fa-id-card:after{content:"\10f2c2"}.fad.fa-id-card-alt:after{content:"\10f47f"}.fad.fa-igloo:after{content:"\10f7ae"}.fad.fa-image:after{content:"\10f03e"}.fad.fa-image-polaroid:after{content:"\10f8c4"}.fad.fa-images:after{content:"\10f302"}.fad.fa-inbox:after{content:"\10f01c"}.fad.fa-inbox-in:after{content:"\10f310"}.fad.fa-inbox-out:after{content:"\10f311"}.fad.fa-indent:after{content:"\10f03c"}.fad.fa-industry:after{content:"\10f275"}.fad.fa-industry-alt:after{content:"\10f3b3"}.fad.fa-infinity:after{content:"\10f534"}.fad.fa-info:after{content:"\10f129"}.fad.fa-info-circle:after{content:"\10f05a"}.fad.fa-info-square:after{content:"\10f30f"}.fad.fa-inhaler:after{content:"\10f5f9"}.fad.fa-integral:after{content:"\10f667"}.fad.fa-intersection:after{content:"\10f668"}.fad.fa-inventory:after{content:"\10f480"}.fad.fa-island-tropical:after{content:"\10f811"}.fad.fa-italic:after{content:"\10f033"}.fad.fa-jack-o-lantern:after{content:"\10f30e"}.fad.fa-jedi:after{content:"\10f669"}.fad.fa-joint:after{content:"\10f595"}.fad.fa-journal-whills:after{content:"\10f66a"}.fad.fa-joystick:after{content:"\10f8c5"}.fad.fa-jug:after{content:"\10f8c6"}.fad.fa-kaaba:after{content:"\10f66b"}.fad.fa-kazoo:after{content:"\10f8c7"}.fad.fa-kerning:after{content:"\10f86f"}.fad.fa-key:after{content:"\10f084"}.fad.fa-key-skeleton:after{content:"\10f6f3"}.fad.fa-keyboard:after{content:"\10f11c"}.fad.fa-keynote:after{content:"\10f66c"}.fad.fa-khanda:after{content:"\10f66d"}.fad.fa-kidneys:after{content:"\10f5fb"}.fad.fa-kiss:after{content:"\10f596"}.fad.fa-kiss-beam:after{content:"\10f597"}.fad.fa-kiss-wink-heart:after{content:"\10f598"}.fad.fa-kite:after{content:"\10f6f4"}.fad.fa-kiwi-bird:after{content:"\10f535"}.fad.fa-knife-kitchen:after{content:"\10f6f5"}.fad.fa-lambda:after{content:"\10f66e"}.fad.fa-lamp:after{content:"\10f4ca"}.fad.fa-lamp-desk:after{content:"\10f914"}.fad.fa-lamp-floor:after{content:"\10f915"}.fad.fa-landmark:after{content:"\10f66f"}.fad.fa-landmark-alt:after{content:"\10f752"}.fad.fa-language:after{content:"\10f1ab"}.fad.fa-laptop:after{content:"\10f109"}.fad.fa-laptop-code:after{content:"\10f5fc"}.fad.fa-laptop-house:after{content:"\10f966"}.fad.fa-laptop-medical:after{content:"\10f812"}.fad.fa-lasso:after{content:"\10f8c8"}.fad.fa-laugh:after{content:"\10f599"}.fad.fa-laugh-beam:after{content:"\10f59a"}.fad.fa-laugh-squint:after{content:"\10f59b"}.fad.fa-laugh-wink:after{content:"\10f59c"}.fad.fa-layer-group:after{content:"\10f5fd"}.fad.fa-layer-minus:after{content:"\10f5fe"}.fad.fa-layer-plus:after{content:"\10f5ff"}.fad.fa-leaf:after{content:"\10f06c"}.fad.fa-leaf-heart:after{content:"\10f4cb"}.fad.fa-leaf-maple:after{content:"\10f6f6"}.fad.fa-leaf-oak:after{content:"\10f6f7"}.fad.fa-lemon:after{content:"\10f094"}.fad.fa-less-than:after{content:"\10f536"}.fad.fa-less-than-equal:after{content:"\10f537"}.fad.fa-level-down:after{content:"\10f149"}.fad.fa-level-down-alt:after{content:"\10f3be"}.fad.fa-level-up:after{content:"\10f148"}.fad.fa-level-up-alt:after{content:"\10f3bf"}.fad.fa-life-ring:after{content:"\10f1cd"}.fad.fa-light-ceiling:after{content:"\10f916"}.fad.fa-light-switch:after{content:"\10f917"}.fad.fa-light-switch-off:after{content:"\10f918"}.fad.fa-light-switch-on:after{content:"\10f919"}.fad.fa-lightbulb:after{content:"\10f0eb"}.fad.fa-lightbulb-dollar:after{content:"\10f670"}.fad.fa-lightbulb-exclamation:after{content:"\10f671"}.fad.fa-lightbulb-on:after{content:"\10f672"}.fad.fa-lightbulb-slash:after{content:"\10f673"}.fad.fa-lights-holiday:after{content:"\10f7b2"}.fad.fa-line-columns:after{content:"\10f870"}.fad.fa-line-height:after{content:"\10f871"}.fad.fa-link:after{content:"\10f0c1"}.fad.fa-lips:after{content:"\10f600"}.fad.fa-lira-sign:after{content:"\10f195"}.fad.fa-list:after{content:"\10f03a"}.fad.fa-list-alt:after{content:"\10f022"}.fad.fa-list-music:after{content:"\10f8c9"}.fad.fa-list-ol:after{content:"\10f0cb"}.fad.fa-list-ul:after{content:"\10f0ca"}.fad.fa-location:after{content:"\10f601"}.fad.fa-location-arrow:after{content:"\10f124"}.fad.fa-location-circle:after{content:"\10f602"}.fad.fa-location-slash:after{content:"\10f603"}.fad.fa-lock:after{content:"\10f023"}.fad.fa-lock-alt:after{content:"\10f30d"}.fad.fa-lock-open:after{content:"\10f3c1"}.fad.fa-lock-open-alt:after{content:"\10f3c2"}.fad.fa-long-arrow-alt-down:after{content:"\10f309"}.fad.fa-long-arrow-alt-left:after{content:"\10f30a"}.fad.fa-long-arrow-alt-right:after{content:"\10f30b"}.fad.fa-long-arrow-alt-up:after{content:"\10f30c"}.fad.fa-long-arrow-down:after{content:"\10f175"}.fad.fa-long-arrow-left:after{content:"\10f177"}.fad.fa-long-arrow-right:after{content:"\10f178"}.fad.fa-long-arrow-up:after{content:"\10f176"}.fad.fa-loveseat:after{content:"\10f4cc"}.fad.fa-low-vision:after{content:"\10f2a8"}.fad.fa-luchador:after{content:"\10f455"}.fad.fa-luggage-cart:after{content:"\10f59d"}.fad.fa-lungs:after{content:"\10f604"}.fad.fa-lungs-virus:after{content:"\10f967"}.fad.fa-mace:after{content:"\10f6f8"}.fad.fa-magic:after{content:"\10f0d0"}.fad.fa-magnet:after{content:"\10f076"}.fad.fa-mail-bulk:after{content:"\10f674"}.fad.fa-mailbox:after{content:"\10f813"}.fad.fa-male:after{content:"\10f183"}.fad.fa-mandolin:after{content:"\10f6f9"}.fad.fa-map:after{content:"\10f279"}.fad.fa-map-marked:after{content:"\10f59f"}.fad.fa-map-marked-alt:after{content:"\10f5a0"}.fad.fa-map-marker:after{content:"\10f041"}.fad.fa-map-marker-alt:after{content:"\10f3c5"}.fad.fa-map-marker-alt-slash:after{content:"\10f605"}.fad.fa-map-marker-check:after{content:"\10f606"}.fad.fa-map-marker-edit:after{content:"\10f607"}.fad.fa-map-marker-exclamation:after{content:"\10f608"}.fad.fa-map-marker-minus:after{content:"\10f609"}.fad.fa-map-marker-plus:after{content:"\10f60a"}.fad.fa-map-marker-question:after{content:"\10f60b"}.fad.fa-map-marker-slash:after{content:"\10f60c"}.fad.fa-map-marker-smile:after{content:"\10f60d"}.fad.fa-map-marker-times:after{content:"\10f60e"}.fad.fa-map-pin:after{content:"\10f276"}.fad.fa-map-signs:after{content:"\10f277"}.fad.fa-marker:after{content:"\10f5a1"}.fad.fa-mars:after{content:"\10f222"}.fad.fa-mars-double:after{content:"\10f227"}.fad.fa-mars-stroke:after{content:"\10f229"}.fad.fa-mars-stroke-h:after{content:"\10f22b"}.fad.fa-mars-stroke-v:after{content:"\10f22a"}.fad.fa-mask:after{content:"\10f6fa"}.fad.fa-meat:after{content:"\10f814"}.fad.fa-medal:after{content:"\10f5a2"}.fad.fa-medkit:after{content:"\10f0fa"}.fad.fa-megaphone:after{content:"\10f675"}.fad.fa-meh:after{content:"\10f11a"}.fad.fa-meh-blank:after{content:"\10f5a4"}.fad.fa-meh-rolling-eyes:after{content:"\10f5a5"}.fad.fa-memory:after{content:"\10f538"}.fad.fa-menorah:after{content:"\10f676"}.fad.fa-mercury:after{content:"\10f223"}.fad.fa-meteor:after{content:"\10f753"}.fad.fa-microchip:after{content:"\10f2db"}.fad.fa-microphone:after{content:"\10f130"}.fad.fa-microphone-alt:after{content:"\10f3c9"}.fad.fa-microphone-alt-slash:after{content:"\10f539"}.fad.fa-microphone-slash:after{content:"\10f131"}.fad.fa-microphone-stand:after{content:"\10f8cb"}.fad.fa-microscope:after{content:"\10f610"}.fad.fa-microwave:after{content:"\10f91b"}.fad.fa-mind-share:after{content:"\10f677"}.fad.fa-minus:after{content:"\10f068"}.fad.fa-minus-circle:after{content:"\10f056"}.fad.fa-minus-hexagon:after{content:"\10f307"}.fad.fa-minus-octagon:after{content:"\10f308"}.fad.fa-minus-square:after{content:"\10f146"}.fad.fa-mistletoe:after{content:"\10f7b4"}.fad.fa-mitten:after{content:"\10f7b5"}.fad.fa-mobile:after{content:"\10f10b"}.fad.fa-mobile-alt:after{content:"\10f3cd"}.fad.fa-mobile-android:after{content:"\10f3ce"}.fad.fa-mobile-android-alt:after{content:"\10f3cf"}.fad.fa-money-bill:after{content:"\10f0d6"}.fad.fa-money-bill-alt:after{content:"\10f3d1"}.fad.fa-money-bill-wave:after{content:"\10f53a"}.fad.fa-money-bill-wave-alt:after{content:"\10f53b"}.fad.fa-money-check:after{content:"\10f53c"}.fad.fa-money-check-alt:after{content:"\10f53d"}.fad.fa-money-check-edit:after{content:"\10f872"}.fad.fa-money-check-edit-alt:after{content:"\10f873"}.fad.fa-monitor-heart-rate:after{content:"\10f611"}.fad.fa-monkey:after{content:"\10f6fb"}.fad.fa-monument:after{content:"\10f5a6"}.fad.fa-moon:after{content:"\10f186"}.fad.fa-moon-cloud:after{content:"\10f754"}.fad.fa-moon-stars:after{content:"\10f755"}.fad.fa-mortar-pestle:after{content:"\10f5a7"}.fad.fa-mosque:after{content:"\10f678"}.fad.fa-motorcycle:after{content:"\10f21c"}.fad.fa-mountain:after{content:"\10f6fc"}.fad.fa-mountains:after{content:"\10f6fd"}.fad.fa-mouse:after{content:"\10f8cc"}.fad.fa-mouse-alt:after{content:"\10f8cd"}.fad.fa-mouse-pointer:after{content:"\10f245"}.fad.fa-mp3-player:after{content:"\10f8ce"}.fad.fa-mug:after{content:"\10f874"}.fad.fa-mug-hot:after{content:"\10f7b6"}.fad.fa-mug-marshmallows:after{content:"\10f7b7"}.fad.fa-mug-tea:after{content:"\10f875"}.fad.fa-music:after{content:"\10f001"}.fad.fa-music-alt:after{content:"\10f8cf"}.fad.fa-music-alt-slash:after{content:"\10f8d0"}.fad.fa-music-slash:after{content:"\10f8d1"}.fad.fa-narwhal:after{content:"\10f6fe"}.fad.fa-network-wired:after{content:"\10f6ff"}.fad.fa-neuter:after{content:"\10f22c"}.fad.fa-newspaper:after{content:"\10f1ea"}.fad.fa-not-equal:after{content:"\10f53e"}.fad.fa-notes-medical:after{content:"\10f481"}.fad.fa-object-group:after{content:"\10f247"}.fad.fa-object-ungroup:after{content:"\10f248"}.fad.fa-octagon:after{content:"\10f306"}.fad.fa-oil-can:after{content:"\10f613"}.fad.fa-oil-temp:after{content:"\10f614"}.fad.fa-om:after{content:"\10f679"}.fad.fa-omega:after{content:"\10f67a"}.fad.fa-ornament:after{content:"\10f7b8"}.fad.fa-otter:after{content:"\10f700"}.fad.fa-outdent:after{content:"\10f03b"}.fad.fa-outlet:after{content:"\10f91c"}.fad.fa-oven:after{content:"\10f91d"}.fad.fa-overline:after{content:"\10f876"}.fad.fa-page-break:after{content:"\10f877"}.fad.fa-pager:after{content:"\10f815"}.fad.fa-paint-brush:after{content:"\10f1fc"}.fad.fa-paint-brush-alt:after{content:"\10f5a9"}.fad.fa-paint-roller:after{content:"\10f5aa"}.fad.fa-palette:after{content:"\10f53f"}.fad.fa-pallet:after{content:"\10f482"}.fad.fa-pallet-alt:after{content:"\10f483"}.fad.fa-paper-plane:after{content:"\10f1d8"}.fad.fa-paperclip:after{content:"\10f0c6"}.fad.fa-parachute-box:after{content:"\10f4cd"}.fad.fa-paragraph:after{content:"\10f1dd"}.fad.fa-paragraph-rtl:after{content:"\10f878"}.fad.fa-parking:after{content:"\10f540"}.fad.fa-parking-circle:after{content:"\10f615"}.fad.fa-parking-circle-slash:after{content:"\10f616"}.fad.fa-parking-slash:after{content:"\10f617"}.fad.fa-passport:after{content:"\10f5ab"}.fad.fa-pastafarianism:after{content:"\10f67b"}.fad.fa-paste:after{content:"\10f0ea"}.fad.fa-pause:after{content:"\10f04c"}.fad.fa-pause-circle:after{content:"\10f28b"}.fad.fa-paw:after{content:"\10f1b0"}.fad.fa-paw-alt:after{content:"\10f701"}.fad.fa-paw-claws:after{content:"\10f702"}.fad.fa-peace:after{content:"\10f67c"}.fad.fa-pegasus:after{content:"\10f703"}.fad.fa-pen:after{content:"\10f304"}.fad.fa-pen-alt:after{content:"\10f305"}.fad.fa-pen-fancy:after{content:"\10f5ac"}.fad.fa-pen-nib:after{content:"\10f5ad"}.fad.fa-pen-square:after{content:"\10f14b"}.fad.fa-pencil:after{content:"\10f040"}.fad.fa-pencil-alt:after{content:"\10f303"}.fad.fa-pencil-paintbrush:after{content:"\10f618"}.fad.fa-pencil-ruler:after{content:"\10f5ae"}.fad.fa-pennant:after{content:"\10f456"}.fad.fa-people-arrows:after{content:"\10f968"}.fad.fa-people-carry:after{content:"\10f4ce"}.fad.fa-pepper-hot:after{content:"\10f816"}.fad.fa-percent:after{content:"\10f295"}.fad.fa-percentage:after{content:"\10f541"}.fad.fa-person-booth:after{content:"\10f756"}.fad.fa-person-carry:after{content:"\10f4cf"}.fad.fa-person-dolly:after{content:"\10f4d0"}.fad.fa-person-dolly-empty:after{content:"\10f4d1"}.fad.fa-person-sign:after{content:"\10f757"}.fad.fa-phone:after{content:"\10f095"}.fad.fa-phone-alt:after{content:"\10f879"}.fad.fa-phone-laptop:after{content:"\10f87a"}.fad.fa-phone-office:after{content:"\10f67d"}.fad.fa-phone-plus:after{content:"\10f4d2"}.fad.fa-phone-rotary:after{content:"\10f8d3"}.fad.fa-phone-slash:after{content:"\10f3dd"}.fad.fa-phone-square:after{content:"\10f098"}.fad.fa-phone-square-alt:after{content:"\10f87b"}.fad.fa-phone-volume:after{content:"\10f2a0"}.fad.fa-photo-video:after{content:"\10f87c"}.fad.fa-pi:after{content:"\10f67e"}.fad.fa-piano:after{content:"\10f8d4"}.fad.fa-piano-keyboard:after{content:"\10f8d5"}.fad.fa-pie:after{content:"\10f705"}.fad.fa-pig:after{content:"\10f706"}.fad.fa-piggy-bank:after{content:"\10f4d3"}.fad.fa-pills:after{content:"\10f484"}.fad.fa-pizza:after{content:"\10f817"}.fad.fa-pizza-slice:after{content:"\10f818"}.fad.fa-place-of-worship:after{content:"\10f67f"}.fad.fa-plane:after{content:"\10f072"}.fad.fa-plane-alt:after{content:"\10f3de"}.fad.fa-plane-arrival:after{content:"\10f5af"}.fad.fa-plane-departure:after{content:"\10f5b0"}.fad.fa-plane-slash:after{content:"\10f969"}.fad.fa-planet-moon:after{content:"\10f91f"}.fad.fa-planet-ringed:after{content:"\10f920"}.fad.fa-play:after{content:"\10f04b"}.fad.fa-play-circle:after{content:"\10f144"}.fad.fa-plug:after{content:"\10f1e6"}.fad.fa-plus:after{content:"\10f067"}.fad.fa-plus-circle:after{content:"\10f055"}.fad.fa-plus-hexagon:after{content:"\10f300"}.fad.fa-plus-octagon:after{content:"\10f301"}.fad.fa-plus-square:after{content:"\10f0fe"}.fad.fa-podcast:after{content:"\10f2ce"}.fad.fa-podium:after{content:"\10f680"}.fad.fa-podium-star:after{content:"\10f758"}.fad.fa-police-box:after{content:"\10f921"}.fad.fa-poll:after{content:"\10f681"}.fad.fa-poll-h:after{content:"\10f682"}.fad.fa-poll-people:after{content:"\10f759"}.fad.fa-poo:after{content:"\10f2fe"}.fad.fa-poo-storm:after{content:"\10f75a"}.fad.fa-poop:after{content:"\10f619"}.fad.fa-popcorn:after{content:"\10f819"}.fad.fa-portal-enter:after{content:"\10f922"}.fad.fa-portal-exit:after{content:"\10f923"}.fad.fa-portrait:after{content:"\10f3e0"}.fad.fa-pound-sign:after{content:"\10f154"}.fad.fa-power-off:after{content:"\10f011"}.fad.fa-pray:after{content:"\10f683"}.fad.fa-praying-hands:after{content:"\10f684"}.fad.fa-prescription:after{content:"\10f5b1"}.fad.fa-prescription-bottle:after{content:"\10f485"}.fad.fa-prescription-bottle-alt:after{content:"\10f486"}.fad.fa-presentation:after{content:"\10f685"}.fad.fa-print:after{content:"\10f02f"}.fad.fa-print-search:after{content:"\10f81a"}.fad.fa-print-slash:after{content:"\10f686"}.fad.fa-procedures:after{content:"\10f487"}.fad.fa-project-diagram:after{content:"\10f542"}.fad.fa-projector:after{content:"\10f8d6"}.fad.fa-pump-medical:after{content:"\10f96a"}.fad.fa-pump-soap:after{content:"\10f96b"}.fad.fa-pumpkin:after{content:"\10f707"}.fad.fa-puzzle-piece:after{content:"\10f12e"}.fad.fa-qrcode:after{content:"\10f029"}.fad.fa-question:after{content:"\10f128"}.fad.fa-question-circle:after{content:"\10f059"}.fad.fa-question-square:after{content:"\10f2fd"}.fad.fa-quidditch:after{content:"\10f458"}.fad.fa-quote-left:after{content:"\10f10d"}.fad.fa-quote-right:after{content:"\10f10e"}.fad.fa-quran:after{content:"\10f687"}.fad.fa-rabbit:after{content:"\10f708"}.fad.fa-rabbit-fast:after{content:"\10f709"}.fad.fa-racquet:after{content:"\10f45a"}.fad.fa-radar:after{content:"\10f924"}.fad.fa-radiation:after{content:"\10f7b9"}.fad.fa-radiation-alt:after{content:"\10f7ba"}.fad.fa-radio:after{content:"\10f8d7"}.fad.fa-radio-alt:after{content:"\10f8d8"}.fad.fa-rainbow:after{content:"\10f75b"}.fad.fa-raindrops:after{content:"\10f75c"}.fad.fa-ram:after{content:"\10f70a"}.fad.fa-ramp-loading:after{content:"\10f4d4"}.fad.fa-random:after{content:"\10f074"}.fad.fa-raygun:after{content:"\10f925"}.fad.fa-receipt:after{content:"\10f543"}.fad.fa-record-vinyl:after{content:"\10f8d9"}.fad.fa-rectangle-landscape:after{content:"\10f2fa"}.fad.fa-rectangle-portrait:after{content:"\10f2fb"}.fad.fa-rectangle-wide:after{content:"\10f2fc"}.fad.fa-recycle:after{content:"\10f1b8"}.fad.fa-redo:after{content:"\10f01e"}.fad.fa-redo-alt:after{content:"\10f2f9"}.fad.fa-refrigerator:after{content:"\10f926"}.fad.fa-registered:after{content:"\10f25d"}.fad.fa-remove-format:after{content:"\10f87d"}.fad.fa-repeat:after{content:"\10f363"}.fad.fa-repeat-1:after{content:"\10f365"}.fad.fa-repeat-1-alt:after{content:"\10f366"}.fad.fa-repeat-alt:after{content:"\10f364"}.fad.fa-reply:after{content:"\10f3e5"}.fad.fa-reply-all:after{content:"\10f122"}.fad.fa-republican:after{content:"\10f75e"}.fad.fa-restroom:after{content:"\10f7bd"}.fad.fa-retweet:after{content:"\10f079"}.fad.fa-retweet-alt:after{content:"\10f361"}.fad.fa-ribbon:after{content:"\10f4d6"}.fad.fa-ring:after{content:"\10f70b"}.fad.fa-rings-wedding:after{content:"\10f81b"}.fad.fa-road:after{content:"\10f018"}.fad.fa-robot:after{content:"\10f544"}.fad.fa-rocket:after{content:"\10f135"}.fad.fa-rocket-launch:after{content:"\10f927"}.fad.fa-route:after{content:"\10f4d7"}.fad.fa-route-highway:after{content:"\10f61a"}.fad.fa-route-interstate:after{content:"\10f61b"}.fad.fa-router:after{content:"\10f8da"}.fad.fa-rss:after{content:"\10f09e"}.fad.fa-rss-square:after{content:"\10f143"}.fad.fa-ruble-sign:after{content:"\10f158"}.fad.fa-ruler:after{content:"\10f545"}.fad.fa-ruler-combined:after{content:"\10f546"}.fad.fa-ruler-horizontal:after{content:"\10f547"}.fad.fa-ruler-triangle:after{content:"\10f61c"}.fad.fa-ruler-vertical:after{content:"\10f548"}.fad.fa-running:after{content:"\10f70c"}.fad.fa-rupee-sign:after{content:"\10f156"}.fad.fa-rv:after{content:"\10f7be"}.fad.fa-sack:after{content:"\10f81c"}.fad.fa-sack-dollar:after{content:"\10f81d"}.fad.fa-sad-cry:after{content:"\10f5b3"}.fad.fa-sad-tear:after{content:"\10f5b4"}.fad.fa-salad:after{content:"\10f81e"}.fad.fa-sandwich:after{content:"\10f81f"}.fad.fa-satellite:after{content:"\10f7bf"}.fad.fa-satellite-dish:after{content:"\10f7c0"}.fad.fa-sausage:after{content:"\10f820"}.fad.fa-save:after{content:"\10f0c7"}.fad.fa-sax-hot:after{content:"\10f8db"}.fad.fa-saxophone:after{content:"\10f8dc"}.fad.fa-scalpel:after{content:"\10f61d"}.fad.fa-scalpel-path:after{content:"\10f61e"}.fad.fa-scanner:after{content:"\10f488"}.fad.fa-scanner-image:after{content:"\10f8f3"}.fad.fa-scanner-keyboard:after{content:"\10f489"}.fad.fa-scanner-touchscreen:after{content:"\10f48a"}.fad.fa-scarecrow:after{content:"\10f70d"}.fad.fa-scarf:after{content:"\10f7c1"}.fad.fa-school:after{content:"\10f549"}.fad.fa-screwdriver:after{content:"\10f54a"}.fad.fa-scroll:after{content:"\10f70e"}.fad.fa-scroll-old:after{content:"\10f70f"}.fad.fa-scrubber:after{content:"\10f2f8"}.fad.fa-scythe:after{content:"\10f710"}.fad.fa-sd-card:after{content:"\10f7c2"}.fad.fa-search:after{content:"\10f002"}.fad.fa-search-dollar:after{content:"\10f688"}.fad.fa-search-location:after{content:"\10f689"}.fad.fa-search-minus:after{content:"\10f010"}.fad.fa-search-plus:after{content:"\10f00e"}.fad.fa-seedling:after{content:"\10f4d8"}.fad.fa-send-back:after{content:"\10f87e"}.fad.fa-send-backward:after{content:"\10f87f"}.fad.fa-sensor:after{content:"\10f928"}.fad.fa-sensor-alert:after{content:"\10f929"}.fad.fa-sensor-fire:after{content:"\10f92a"}.fad.fa-sensor-on:after{content:"\10f92b"}.fad.fa-sensor-smoke:after{content:"\10f92c"}.fad.fa-server:after{content:"\10f233"}.fad.fa-shapes:after{content:"\10f61f"}.fad.fa-share:after{content:"\10f064"}.fad.fa-share-all:after{content:"\10f367"}.fad.fa-share-alt:after{content:"\10f1e0"}.fad.fa-share-alt-square:after{content:"\10f1e1"}.fad.fa-share-square:after{content:"\10f14d"}.fad.fa-sheep:after{content:"\10f711"}.fad.fa-shekel-sign:after{content:"\10f20b"}.fad.fa-shield:after{content:"\10f132"}.fad.fa-shield-alt:after{content:"\10f3ed"}.fad.fa-shield-check:after{content:"\10f2f7"}.fad.fa-shield-cross:after{content:"\10f712"}.fad.fa-shield-virus:after{content:"\10f96c"}.fad.fa-ship:after{content:"\10f21a"}.fad.fa-shipping-fast:after{content:"\10f48b"}.fad.fa-shipping-timed:after{content:"\10f48c"}.fad.fa-shish-kebab:after{content:"\10f821"}.fad.fa-shoe-prints:after{content:"\10f54b"}.fad.fa-shopping-bag:after{content:"\10f290"}.fad.fa-shopping-basket:after{content:"\10f291"}.fad.fa-shopping-cart:after{content:"\10f07a"}.fad.fa-shovel:after{content:"\10f713"}.fad.fa-shovel-snow:after{content:"\10f7c3"}.fad.fa-shower:after{content:"\10f2cc"}.fad.fa-shredder:after{content:"\10f68a"}.fad.fa-shuttle-van:after{content:"\10f5b6"}.fad.fa-shuttlecock:after{content:"\10f45b"}.fad.fa-sickle:after{content:"\10f822"}.fad.fa-sigma:after{content:"\10f68b"}.fad.fa-sign:after{content:"\10f4d9"}.fad.fa-sign-in:after{content:"\10f090"}.fad.fa-sign-in-alt:after{content:"\10f2f6"}.fad.fa-sign-language:after{content:"\10f2a7"}.fad.fa-sign-out:after{content:"\10f08b"}.fad.fa-sign-out-alt:after{content:"\10f2f5"}.fad.fa-signal:after{content:"\10f012"}.fad.fa-signal-1:after{content:"\10f68c"}.fad.fa-signal-2:after{content:"\10f68d"}.fad.fa-signal-3:after{content:"\10f68e"}.fad.fa-signal-4:after{content:"\10f68f"}.fad.fa-signal-alt:after{content:"\10f690"}.fad.fa-signal-alt-1:after{content:"\10f691"}.fad.fa-signal-alt-2:after{content:"\10f692"}.fad.fa-signal-alt-3:after{content:"\10f693"}.fad.fa-signal-alt-slash:after{content:"\10f694"}.fad.fa-signal-slash:after{content:"\10f695"}.fad.fa-signal-stream:after{content:"\10f8dd"}.fad.fa-signature:after{content:"\10f5b7"}.fad.fa-sim-card:after{content:"\10f7c4"}.fad.fa-sink:after{content:"\10f96d"}.fad.fa-siren:after{content:"\10f92d"}.fad.fa-siren-on:after{content:"\10f92e"}.fad.fa-sitemap:after{content:"\10f0e8"}.fad.fa-skating:after{content:"\10f7c5"}.fad.fa-skeleton:after{content:"\10f620"}.fad.fa-ski-jump:after{content:"\10f7c7"}.fad.fa-ski-lift:after{content:"\10f7c8"}.fad.fa-skiing:after{content:"\10f7c9"}.fad.fa-skiing-nordic:after{content:"\10f7ca"}.fad.fa-skull:after{content:"\10f54c"}.fad.fa-skull-cow:after{content:"\10f8de"}.fad.fa-skull-crossbones:after{content:"\10f714"}.fad.fa-slash:after{content:"\10f715"}.fad.fa-sledding:after{content:"\10f7cb"}.fad.fa-sleigh:after{content:"\10f7cc"}.fad.fa-sliders-h:after{content:"\10f1de"}.fad.fa-sliders-h-square:after{content:"\10f3f0"}.fad.fa-sliders-v:after{content:"\10f3f1"}.fad.fa-sliders-v-square:after{content:"\10f3f2"}.fad.fa-smile:after{content:"\10f118"}.fad.fa-smile-beam:after{content:"\10f5b8"}.fad.fa-smile-plus:after{content:"\10f5b9"}.fad.fa-smile-wink:after{content:"\10f4da"}.fad.fa-smog:after{content:"\10f75f"}.fad.fa-smoke:after{content:"\10f760"}.fad.fa-smoking:after{content:"\10f48d"}.fad.fa-smoking-ban:after{content:"\10f54d"}.fad.fa-sms:after{content:"\10f7cd"}.fad.fa-snake:after{content:"\10f716"}.fad.fa-snooze:after{content:"\10f880"}.fad.fa-snow-blowing:after{content:"\10f761"}.fad.fa-snowboarding:after{content:"\10f7ce"}.fad.fa-snowflake:after{content:"\10f2dc"}.fad.fa-snowflakes:after{content:"\10f7cf"}.fad.fa-snowman:after{content:"\10f7d0"}.fad.fa-snowmobile:after{content:"\10f7d1"}.fad.fa-snowplow:after{content:"\10f7d2"}.fad.fa-soap:after{content:"\10f96e"}.fad.fa-socks:after{content:"\10f696"}.fad.fa-solar-panel:after{content:"\10f5ba"}.fad.fa-solar-system:after{content:"\10f92f"}.fad.fa-sort:after{content:"\10f0dc"}.fad.fa-sort-alpha-down:after{content:"\10f15d"}.fad.fa-sort-alpha-down-alt:after{content:"\10f881"}.fad.fa-sort-alpha-up:after{content:"\10f15e"}.fad.fa-sort-alpha-up-alt:after{content:"\10f882"}.fad.fa-sort-alt:after{content:"\10f883"}.fad.fa-sort-amount-down:after{content:"\10f160"}.fad.fa-sort-amount-down-alt:after{content:"\10f884"}.fad.fa-sort-amount-up:after{content:"\10f161"}.fad.fa-sort-amount-up-alt:after{content:"\10f885"}.fad.fa-sort-circle:after{content:"\10f930"}.fad.fa-sort-circle-down:after{content:"\10f931"}.fad.fa-sort-circle-up:after{content:"\10f932"}.fad.fa-sort-down:after{content:"\10f0dd"}.fad.fa-sort-numeric-down:after{content:"\10f162"}.fad.fa-sort-numeric-down-alt:after{content:"\10f886"}.fad.fa-sort-numeric-up:after{content:"\10f163"}.fad.fa-sort-numeric-up-alt:after{content:"\10f887"}.fad.fa-sort-shapes-down:after{content:"\10f888"}.fad.fa-sort-shapes-down-alt:after{content:"\10f889"}.fad.fa-sort-shapes-up:after{content:"\10f88a"}.fad.fa-sort-shapes-up-alt:after{content:"\10f88b"}.fad.fa-sort-size-down:after{content:"\10f88c"}.fad.fa-sort-size-down-alt:after{content:"\10f88d"}.fad.fa-sort-size-up:after{content:"\10f88e"}.fad.fa-sort-size-up-alt:after{content:"\10f88f"}.fad.fa-sort-up:after{content:"\10f0de"}.fad.fa-soup:after{content:"\10f823"}.fad.fa-spa:after{content:"\10f5bb"}.fad.fa-space-shuttle:after{content:"\10f197"}.fad.fa-space-station-moon:after{content:"\10f933"}.fad.fa-space-station-moon-alt:after{content:"\10f934"}.fad.fa-spade:after{content:"\10f2f4"}.fad.fa-sparkles:after{content:"\10f890"}.fad.fa-speaker:after{content:"\10f8df"}.fad.fa-speakers:after{content:"\10f8e0"}.fad.fa-spell-check:after{content:"\10f891"}.fad.fa-spider:after{content:"\10f717"}.fad.fa-spider-black-widow:after{content:"\10f718"}.fad.fa-spider-web:after{content:"\10f719"}.fad.fa-spinner:after{content:"\10f110"}.fad.fa-spinner-third:after{content:"\10f3f4"}.fad.fa-splotch:after{content:"\10f5bc"}.fad.fa-spray-can:after{content:"\10f5bd"}.fad.fa-sprinkler:after{content:"\10f935"}.fad.fa-square:after{content:"\10f0c8"}.fad.fa-square-full:after{content:"\10f45c"}.fad.fa-square-root:after{content:"\10f697"}.fad.fa-square-root-alt:after{content:"\10f698"}.fad.fa-squirrel:after{content:"\10f71a"}.fad.fa-staff:after{content:"\10f71b"}.fad.fa-stamp:after{content:"\10f5bf"}.fad.fa-star:after{content:"\10f005"}.fad.fa-star-and-crescent:after{content:"\10f699"}.fad.fa-star-christmas:after{content:"\10f7d4"}.fad.fa-star-exclamation:after{content:"\10f2f3"}.fad.fa-star-half:after{content:"\10f089"}.fad.fa-star-half-alt:after{content:"\10f5c0"}.fad.fa-star-of-david:after{content:"\10f69a"}.fad.fa-star-of-life:after{content:"\10f621"}.fad.fa-star-shooting:after{content:"\10f936"}.fad.fa-starfighter:after{content:"\10f937"}.fad.fa-starfighter-alt:after{content:"\10f938"}.fad.fa-stars:after{content:"\10f762"}.fad.fa-starship:after{content:"\10f939"}.fad.fa-starship-freighter:after{content:"\10f93a"}.fad.fa-steak:after{content:"\10f824"}.fad.fa-steering-wheel:after{content:"\10f622"}.fad.fa-step-backward:after{content:"\10f048"}.fad.fa-step-forward:after{content:"\10f051"}.fad.fa-stethoscope:after{content:"\10f0f1"}.fad.fa-sticky-note:after{content:"\10f249"}.fad.fa-stocking:after{content:"\10f7d5"}.fad.fa-stomach:after{content:"\10f623"}.fad.fa-stop:after{content:"\10f04d"}.fad.fa-stop-circle:after{content:"\10f28d"}.fad.fa-stopwatch:after{content:"\10f2f2"}.fad.fa-stopwatch-20:after{content:"\10f96f"}.fad.fa-store:after{content:"\10f54e"}.fad.fa-store-alt:after{content:"\10f54f"}.fad.fa-store-alt-slash:after{content:"\10f970"}.fad.fa-store-slash:after{content:"\10f971"}.fad.fa-stream:after{content:"\10f550"}.fad.fa-street-view:after{content:"\10f21d"}.fad.fa-stretcher:after{content:"\10f825"}.fad.fa-strikethrough:after{content:"\10f0cc"}.fad.fa-stroopwafel:after{content:"\10f551"}.fad.fa-subscript:after{content:"\10f12c"}.fad.fa-subway:after{content:"\10f239"}.fad.fa-suitcase:after{content:"\10f0f2"}.fad.fa-suitcase-rolling:after{content:"\10f5c1"}.fad.fa-sun:after{content:"\10f185"}.fad.fa-sun-cloud:after{content:"\10f763"}.fad.fa-sun-dust:after{content:"\10f764"}.fad.fa-sun-haze:after{content:"\10f765"}.fad.fa-sunglasses:after{content:"\10f892"}.fad.fa-sunrise:after{content:"\10f766"}.fad.fa-sunset:after{content:"\10f767"}.fad.fa-superscript:after{content:"\10f12b"}.fad.fa-surprise:after{content:"\10f5c2"}.fad.fa-swatchbook:after{content:"\10f5c3"}.fad.fa-swimmer:after{content:"\10f5c4"}.fad.fa-swimming-pool:after{content:"\10f5c5"}.fad.fa-sword:after{content:"\10f71c"}.fad.fa-sword-laser:after{content:"\10f93b"}.fad.fa-sword-laser-alt:after{content:"\10f93c"}.fad.fa-swords:after{content:"\10f71d"}.fad.fa-swords-laser:after{content:"\10f93d"}.fad.fa-synagogue:after{content:"\10f69b"}.fad.fa-sync:after{content:"\10f021"}.fad.fa-sync-alt:after{content:"\10f2f1"}.fad.fa-syringe:after{content:"\10f48e"}.fad.fa-table:after{content:"\10f0ce"}.fad.fa-table-tennis:after{content:"\10f45d"}.fad.fa-tablet:after{content:"\10f10a"}.fad.fa-tablet-alt:after{content:"\10f3fa"}.fad.fa-tablet-android:after{content:"\10f3fb"}.fad.fa-tablet-android-alt:after{content:"\10f3fc"}.fad.fa-tablet-rugged:after{content:"\10f48f"}.fad.fa-tablets:after{content:"\10f490"}.fad.fa-tachometer:after{content:"\10f0e4"}.fad.fa-tachometer-alt:after{content:"\10f3fd"}.fad.fa-tachometer-alt-average:after{content:"\10f624"}.fad.fa-tachometer-alt-fast:after{content:"\10f625"}.fad.fa-tachometer-alt-fastest:after{content:"\10f626"}.fad.fa-tachometer-alt-slow:after{content:"\10f627"}.fad.fa-tachometer-alt-slowest:after{content:"\10f628"}.fad.fa-tachometer-average:after{content:"\10f629"}.fad.fa-tachometer-fast:after{content:"\10f62a"}.fad.fa-tachometer-fastest:after{content:"\10f62b"}.fad.fa-tachometer-slow:after{content:"\10f62c"}.fad.fa-tachometer-slowest:after{content:"\10f62d"}.fad.fa-taco:after{content:"\10f826"}.fad.fa-tag:after{content:"\10f02b"}.fad.fa-tags:after{content:"\10f02c"}.fad.fa-tally:after{content:"\10f69c"}.fad.fa-tanakh:after{content:"\10f827"}.fad.fa-tape:after{content:"\10f4db"}.fad.fa-tasks:after{content:"\10f0ae"}.fad.fa-tasks-alt:after{content:"\10f828"}.fad.fa-taxi:after{content:"\10f1ba"}.fad.fa-teeth:after{content:"\10f62e"}.fad.fa-teeth-open:after{content:"\10f62f"}.fad.fa-telescope:after{content:"\10f93e"}.fad.fa-temperature-down:after{content:"\10f93f"}.fad.fa-temperature-frigid:after{content:"\10f768"}.fad.fa-temperature-high:after{content:"\10f769"}.fad.fa-temperature-hot:after{content:"\10f76a"}.fad.fa-temperature-low:after{content:"\10f76b"}.fad.fa-temperature-up:after{content:"\10f940"}.fad.fa-tenge:after{content:"\10f7d7"}.fad.fa-tennis-ball:after{content:"\10f45e"}.fad.fa-terminal:after{content:"\10f120"}.fad.fa-text:after{content:"\10f893"}.fad.fa-text-height:after{content:"\10f034"}.fad.fa-text-size:after{content:"\10f894"}.fad.fa-text-width:after{content:"\10f035"}.fad.fa-th:after{content:"\10f00a"}.fad.fa-th-large:after{content:"\10f009"}.fad.fa-th-list:after{content:"\10f00b"}.fad.fa-theater-masks:after{content:"\10f630"}.fad.fa-thermometer:after{content:"\10f491"}.fad.fa-thermometer-empty:after{content:"\10f2cb"}.fad.fa-thermometer-full:after{content:"\10f2c7"}.fad.fa-thermometer-half:after{content:"\10f2c9"}.fad.fa-thermometer-quarter:after{content:"\10f2ca"}.fad.fa-thermometer-three-quarters:after{content:"\10f2c8"}.fad.fa-theta:after{content:"\10f69e"}.fad.fa-thumbs-down:after{content:"\10f165"}.fad.fa-thumbs-up:after{content:"\10f164"}.fad.fa-thumbtack:after{content:"\10f08d"}.fad.fa-thunderstorm:after{content:"\10f76c"}.fad.fa-thunderstorm-moon:after{content:"\10f76d"}.fad.fa-thunderstorm-sun:after{content:"\10f76e"}.fad.fa-ticket:after{content:"\10f145"}.fad.fa-ticket-alt:after{content:"\10f3ff"}.fad.fa-tilde:after{content:"\10f69f"}.fad.fa-times:after{content:"\10f00d"}.fad.fa-times-circle:after{content:"\10f057"}.fad.fa-times-hexagon:after{content:"\10f2ee"}.fad.fa-times-octagon:after{content:"\10f2f0"}.fad.fa-times-square:after{content:"\10f2d3"}.fad.fa-tint:after{content:"\10f043"}.fad.fa-tint-slash:after{content:"\10f5c7"}.fad.fa-tire:after{content:"\10f631"}.fad.fa-tire-flat:after{content:"\10f632"}.fad.fa-tire-pressure-warning:after{content:"\10f633"}.fad.fa-tire-rugged:after{content:"\10f634"}.fad.fa-tired:after{content:"\10f5c8"}.fad.fa-toggle-off:after{content:"\10f204"}.fad.fa-toggle-on:after{content:"\10f205"}.fad.fa-toilet:after{content:"\10f7d8"}.fad.fa-toilet-paper:after{content:"\10f71e"}.fad.fa-toilet-paper-alt:after{content:"\10f71f"}.fad.fa-toilet-paper-slash:after{content:"\10f972"}.fad.fa-tombstone:after{content:"\10f720"}.fad.fa-tombstone-alt:after{content:"\10f721"}.fad.fa-toolbox:after{content:"\10f552"}.fad.fa-tools:after{content:"\10f7d9"}.fad.fa-tooth:after{content:"\10f5c9"}.fad.fa-toothbrush:after{content:"\10f635"}.fad.fa-torah:after{content:"\10f6a0"}.fad.fa-torii-gate:after{content:"\10f6a1"}.fad.fa-tornado:after{content:"\10f76f"}.fad.fa-tractor:after{content:"\10f722"}.fad.fa-trademark:after{content:"\10f25c"}.fad.fa-traffic-cone:after{content:"\10f636"}.fad.fa-traffic-light:after{content:"\10f637"}.fad.fa-traffic-light-go:after{content:"\10f638"}.fad.fa-traffic-light-slow:after{content:"\10f639"}.fad.fa-traffic-light-stop:after{content:"\10f63a"}.fad.fa-trailer:after{content:"\10f941"}.fad.fa-train:after{content:"\10f238"}.fad.fa-tram:after{content:"\10f7da"}.fad.fa-transgender:after{content:"\10f224"}.fad.fa-transgender-alt:after{content:"\10f225"}.fad.fa-transporter:after{content:"\10f942"}.fad.fa-transporter-1:after{content:"\10f943"}.fad.fa-transporter-2:after{content:"\10f944"}.fad.fa-transporter-3:after{content:"\10f945"}.fad.fa-transporter-empty:after{content:"\10f946"}.fad.fa-trash:after{content:"\10f1f8"}.fad.fa-trash-alt:after{content:"\10f2ed"}.fad.fa-trash-restore:after{content:"\10f829"}.fad.fa-trash-restore-alt:after{content:"\10f82a"}.fad.fa-trash-undo:after{content:"\10f895"}.fad.fa-trash-undo-alt:after{content:"\10f896"}.fad.fa-treasure-chest:after{content:"\10f723"}.fad.fa-tree:after{content:"\10f1bb"}.fad.fa-tree-alt:after{content:"\10f400"}.fad.fa-tree-christmas:after{content:"\10f7db"}.fad.fa-tree-decorated:after{content:"\10f7dc"}.fad.fa-tree-large:after{content:"\10f7dd"}.fad.fa-tree-palm:after{content:"\10f82b"}.fad.fa-trees:after{content:"\10f724"}.fad.fa-triangle:after{content:"\10f2ec"}.fad.fa-triangle-music:after{content:"\10f8e2"}.fad.fa-trophy:after{content:"\10f091"}.fad.fa-trophy-alt:after{content:"\10f2eb"}.fad.fa-truck:after{content:"\10f0d1"}.fad.fa-truck-container:after{content:"\10f4dc"}.fad.fa-truck-couch:after{content:"\10f4dd"}.fad.fa-truck-loading:after{content:"\10f4de"}.fad.fa-truck-monster:after{content:"\10f63b"}.fad.fa-truck-moving:after{content:"\10f4df"}.fad.fa-truck-pickup:after{content:"\10f63c"}.fad.fa-truck-plow:after{content:"\10f7de"}.fad.fa-truck-ramp:after{content:"\10f4e0"}.fad.fa-trumpet:after{content:"\10f8e3"}.fad.fa-tshirt:after{content:"\10f553"}.fad.fa-tty:after{content:"\10f1e4"}.fad.fa-turkey:after{content:"\10f725"}.fad.fa-turntable:after{content:"\10f8e4"}.fad.fa-turtle:after{content:"\10f726"}.fad.fa-tv:after{content:"\10f26c"}.fad.fa-tv-alt:after{content:"\10f8e5"}.fad.fa-tv-music:after{content:"\10f8e6"}.fad.fa-tv-retro:after{content:"\10f401"}.fad.fa-typewriter:after{content:"\10f8e7"}.fad.fa-ufo:after{content:"\10f947"}.fad.fa-ufo-beam:after{content:"\10f948"}.fad.fa-umbrella:after{content:"\10f0e9"}.fad.fa-umbrella-beach:after{content:"\10f5ca"}.fad.fa-underline:after{content:"\10f0cd"}.fad.fa-undo:after{content:"\10f0e2"}.fad.fa-undo-alt:after{content:"\10f2ea"}.fad.fa-unicorn:after{content:"\10f727"}.fad.fa-union:after{content:"\10f6a2"}.fad.fa-universal-access:after{content:"\10f29a"}.fad.fa-university:after{content:"\10f19c"}.fad.fa-unlink:after{content:"\10f127"}.fad.fa-unlock:after{content:"\10f09c"}.fad.fa-unlock-alt:after{content:"\10f13e"}.fad.fa-upload:after{content:"\10f093"}.fad.fa-usb-drive:after{content:"\10f8e9"}.fad.fa-usd-circle:after{content:"\10f2e8"}.fad.fa-usd-square:after{content:"\10f2e9"}.fad.fa-user:after{content:"\10f007"}.fad.fa-user-alien:after{content:"\10f94a"}.fad.fa-user-alt:after{content:"\10f406"}.fad.fa-user-alt-slash:after{content:"\10f4fa"}.fad.fa-user-astronaut:after{content:"\10f4fb"}.fad.fa-user-chart:after{content:"\10f6a3"}.fad.fa-user-check:after{content:"\10f4fc"}.fad.fa-user-circle:after{content:"\10f2bd"}.fad.fa-user-clock:after{content:"\10f4fd"}.fad.fa-user-cog:after{content:"\10f4fe"}.fad.fa-user-cowboy:after{content:"\10f8ea"}.fad.fa-user-crown:after{content:"\10f6a4"}.fad.fa-user-edit:after{content:"\10f4ff"}.fad.fa-user-friends:after{content:"\10f500"}.fad.fa-user-graduate:after{content:"\10f501"}.fad.fa-user-hard-hat:after{content:"\10f82c"}.fad.fa-user-headset:after{content:"\10f82d"}.fad.fa-user-injured:after{content:"\10f728"}.fad.fa-user-lock:after{content:"\10f502"}.fad.fa-user-md:after{content:"\10f0f0"}.fad.fa-user-md-chat:after{content:"\10f82e"}.fad.fa-user-minus:after{content:"\10f503"}.fad.fa-user-music:after{content:"\10f8eb"}.fad.fa-user-ninja:after{content:"\10f504"}.fad.fa-user-nurse:after{content:"\10f82f"}.fad.fa-user-plus:after{content:"\10f234"}.fad.fa-user-robot:after{content:"\10f94b"}.fad.fa-user-secret:after{content:"\10f21b"}.fad.fa-user-shield:after{content:"\10f505"}.fad.fa-user-slash:after{content:"\10f506"}.fad.fa-user-tag:after{content:"\10f507"}.fad.fa-user-tie:after{content:"\10f508"}.fad.fa-user-times:after{content:"\10f235"}.fad.fa-user-unlock:after{content:"\10f958"}.fad.fa-user-visor:after{content:"\10f94c"}.fad.fa-users:after{content:"\10f0c0"}.fad.fa-users-class:after{content:"\10f63d"}.fad.fa-users-cog:after{content:"\10f509"}.fad.fa-users-crown:after{content:"\10f6a5"}.fad.fa-users-medical:after{content:"\10f830"}.fad.fa-users-slash:after{content:"\10f973"}.fad.fa-utensil-fork:after{content:"\10f2e3"}.fad.fa-utensil-knife:after{content:"\10f2e4"}.fad.fa-utensil-spoon:after{content:"\10f2e5"}.fad.fa-utensils:after{content:"\10f2e7"}.fad.fa-utensils-alt:after{content:"\10f2e6"}.fad.fa-vacuum:after{content:"\10f94d"}.fad.fa-vacuum-robot:after{content:"\10f94e"}.fad.fa-value-absolute:after{content:"\10f6a6"}.fad.fa-vector-square:after{content:"\10f5cb"}.fad.fa-venus:after{content:"\10f221"}.fad.fa-venus-double:after{content:"\10f226"}.fad.fa-venus-mars:after{content:"\10f228"}.fad.fa-vhs:after{content:"\10f8ec"}.fad.fa-vial:after{content:"\10f492"}.fad.fa-vials:after{content:"\10f493"}.fad.fa-video:after{content:"\10f03d"}.fad.fa-video-plus:after{content:"\10f4e1"}.fad.fa-video-slash:after{content:"\10f4e2"}.fad.fa-vihara:after{content:"\10f6a7"}.fad.fa-violin:after{content:"\10f8ed"}.fad.fa-virus:after{content:"\10f974"}.fad.fa-virus-slash:after{content:"\10f975"}.fad.fa-viruses:after{content:"\10f976"}.fad.fa-voicemail:after{content:"\10f897"}.fad.fa-volcano:after{content:"\10f770"}.fad.fa-volleyball-ball:after{content:"\10f45f"}.fad.fa-volume:after{content:"\10f6a8"}.fad.fa-volume-down:after{content:"\10f027"}.fad.fa-volume-mute:after{content:"\10f6a9"}.fad.fa-volume-off:after{content:"\10f026"}.fad.fa-volume-slash:after{content:"\10f2e2"}.fad.fa-volume-up:after{content:"\10f028"}.fad.fa-vote-nay:after{content:"\10f771"}.fad.fa-vote-yea:after{content:"\10f772"}.fad.fa-vr-cardboard:after{content:"\10f729"}.fad.fa-wagon-covered:after{content:"\10f8ee"}.fad.fa-walker:after{content:"\10f831"}.fad.fa-walkie-talkie:after{content:"\10f8ef"}.fad.fa-walking:after{content:"\10f554"}.fad.fa-wallet:after{content:"\10f555"}.fad.fa-wand:after{content:"\10f72a"}.fad.fa-wand-magic:after{content:"\10f72b"}.fad.fa-warehouse:after{content:"\10f494"}.fad.fa-warehouse-alt:after{content:"\10f495"}.fad.fa-washer:after{content:"\10f898"}.fad.fa-watch:after{content:"\10f2e1"}.fad.fa-watch-calculator:after{content:"\10f8f0"}.fad.fa-watch-fitness:after{content:"\10f63e"}.fad.fa-water:after{content:"\10f773"}.fad.fa-water-lower:after{content:"\10f774"}.fad.fa-water-rise:after{content:"\10f775"}.fad.fa-wave-sine:after{content:"\10f899"}.fad.fa-wave-square:after{content:"\10f83e"}.fad.fa-wave-triangle:after{content:"\10f89a"}.fad.fa-waveform:after{content:"\10f8f1"}.fad.fa-waveform-path:after{content:"\10f8f2"}.fad.fa-webcam:after{content:"\10f832"}.fad.fa-webcam-slash:after{content:"\10f833"}.fad.fa-weight:after{content:"\10f496"}.fad.fa-weight-hanging:after{content:"\10f5cd"}.fad.fa-whale:after{content:"\10f72c"}.fad.fa-wheat:after{content:"\10f72d"}.fad.fa-wheelchair:after{content:"\10f193"}.fad.fa-whistle:after{content:"\10f460"}.fad.fa-wifi:after{content:"\10f1eb"}.fad.fa-wifi-1:after{content:"\10f6aa"}.fad.fa-wifi-2:after{content:"\10f6ab"}.fad.fa-wifi-slash:after{content:"\10f6ac"}.fad.fa-wind:after{content:"\10f72e"}.fad.fa-wind-turbine:after{content:"\10f89b"}.fad.fa-wind-warning:after{content:"\10f776"}.fad.fa-window:after{content:"\10f40e"}.fad.fa-window-alt:after{content:"\10f40f"}.fad.fa-window-close:after{content:"\10f410"}.fad.fa-window-frame:after{content:"\10f94f"}.fad.fa-window-frame-open:after{content:"\10f950"}.fad.fa-window-maximize:after{content:"\10f2d0"}.fad.fa-window-minimize:after{content:"\10f2d1"}.fad.fa-window-restore:after{content:"\10f2d2"}.fad.fa-windsock:after{content:"\10f777"}.fad.fa-wine-bottle:after{content:"\10f72f"}.fad.fa-wine-glass:after{content:"\10f4e3"}.fad.fa-wine-glass-alt:after{content:"\10f5ce"}.fad.fa-won-sign:after{content:"\10f159"}.fad.fa-wreath:after{content:"\10f7e2"}.fad.fa-wrench:after{content:"\10f0ad"}.fad.fa-x-ray:after{content:"\10f497"}.fad.fa-yen-sign:after{content:"\10f157"}.fad.fa-yin-yang:after{content:"\10f6ad"}@font-face{font-family:"Font Awesome 5 Pro";font-style:normal;font-weight:300;font-display:block;src:url(../fonts/fa-light-300.eot);src:url(../fonts/fa-light-300.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-light-300.woff2) format("woff2"),url(../fonts/fa-light-300.woff) format("woff"),url(../fonts/fa-light-300.ttf) format("truetype"),url(../fonts/fa-light-300.svg#fontawesome) format("svg")}.fal{font-weight:300}@font-face{font-family:"Font Awesome 5 Pro";font-style:normal;font-weight:400;font-display:block;src:url(../fonts/fa-regular-400.eot);src:url(../fonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-regular-400.woff2) format("woff2"),url(../fonts/fa-regular-400.woff) format("woff"),url(../fonts/fa-regular-400.ttf) format("truetype"),url(../fonts/fa-regular-400.svg#fontawesome) format("svg")}.fal,.far{font-family:"Font Awesome 5 Pro"}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Pro";font-style:normal;font-weight:900;font-display:block;src:url(../fonts/fa-solid-900.eot);src:url(../fonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-solid-900.woff2) format("woff2"),url(../fonts/fa-solid-900.woff) format("woff"),url(../fonts/fa-solid-900.ttf) format("truetype"),url(../fonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Pro";font-weight:900} \ No newline at end of file diff --git a/app/public_html/admin/assets/css/jquery-ui.css b/app/public_html/admin/assets/css/jquery-ui.css new file mode 100644 index 0000000..93707f4 --- /dev/null +++ b/app/public_html/admin/assets/css/jquery-ui.css @@ -0,0 +1,1312 @@ +/*! jQuery UI - v1.12.1 - 2016-09-14 +* http://jqueryui.com +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6 +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter:Alpha(Opacity=0); /* support: IE8 */ +} + +.ui-front { + z-index: 100; +} + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; + pointer-events: none; +} + + +/* Icons +----------------------------------*/ +.ui-icon { + display: inline-block; + vertical-align: middle; + margin-top: -.25em; + position: relative; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + +.ui-widget-icon-block { + left: 50%; + margin-left: -8px; + display: block; +} + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-accordion .ui-accordion-header { + display: block; + cursor: pointer; + position: relative; + margin: 2px 0 0 0; + padding: .5em .5em .5em .7em; + font-size: 100%; +} +.ui-accordion .ui-accordion-content { + padding: 1em 2.2em; + border-top: 0; + overflow: auto; +} +.ui-autocomplete { + position: absolute; + top: 0; + left: 0; + cursor: default; +} +.ui-menu { + list-style: none; + padding: 0; + margin: 0; + display: block; + outline: 0; +} +.ui-menu .ui-menu { + position: absolute; +} +.ui-menu .ui-menu-item { + margin: 0; + cursor: pointer; + /* support: IE10, see #8844 */ + list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); +} +.ui-menu .ui-menu-item-wrapper { + position: relative; + padding: 3px 1em 3px .4em; +} +.ui-menu .ui-menu-divider { + margin: 5px 0; + height: 0; + font-size: 0; + line-height: 0; + border-width: 1px 0 0 0; +} +.ui-menu .ui-state-focus, +.ui-menu .ui-state-active { + margin: -1px; +} + +/* icon support */ +.ui-menu-icons { + position: relative; +} +.ui-menu-icons .ui-menu-item-wrapper { + padding-left: 2em; +} + +/* left-aligned */ +.ui-menu .ui-icon { + position: absolute; + top: 0; + bottom: 0; + left: .2em; + margin: auto 0; +} + +/* right-aligned */ +.ui-menu .ui-menu-icon { + left: auto; + right: 0; +} +.ui-button { + padding: .4em 1em; + display: inline-block; + position: relative; + line-height: normal; + margin-right: .1em; + cursor: pointer; + vertical-align: middle; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + /* Support: IE <= 11 */ + overflow: visible; +} + +.ui-button, +.ui-button:link, +.ui-button:visited, +.ui-button:hover, +.ui-button:active { + text-decoration: none; +} + +/* to make room for the icon, a width needs to be set here */ +.ui-button-icon-only { + width: 2em; + box-sizing: border-box; + text-indent: -9999px; + white-space: nowrap; +} + +/* no icon support for input elements */ +input.ui-button.ui-button-icon-only { + text-indent: 0; +} + +/* button icon element(s) */ +.ui-button-icon-only .ui-icon { + position: absolute; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; +} + +.ui-button.ui-icon-notext .ui-icon { + padding: 0; + width: 2.1em; + height: 2.1em; + text-indent: -9999px; + white-space: nowrap; + +} + +input.ui-button.ui-icon-notext .ui-icon { + width: auto; + height: auto; + text-indent: 0; + white-space: normal; + padding: .4em 1em; +} + +/* workarounds */ +/* Support: Firefox 5 - 40 */ +input.ui-button::-moz-focus-inner, +button.ui-button::-moz-focus-inner { + border: 0; + padding: 0; +} +.ui-controlgroup { + vertical-align: middle; + display: inline-block; +} +.ui-controlgroup > .ui-controlgroup-item { + float: left; + margin-left: 0; + margin-right: 0; +} +.ui-controlgroup > .ui-controlgroup-item:focus, +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { + z-index: 9999; +} +.ui-controlgroup-vertical > .ui-controlgroup-item { + display: block; + float: none; + width: 100%; + margin-top: 0; + margin-bottom: 0; + text-align: left; +} +.ui-controlgroup-vertical .ui-controlgroup-item { + box-sizing: border-box; +} +.ui-controlgroup .ui-controlgroup-label { + padding: .4em 1em; +} +.ui-controlgroup .ui-controlgroup-label span { + font-size: 80%; +} +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { + border-left: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { + border-top: none; +} +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { + border-right: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { + border-bottom: none; +} + +/* Spinner specific style fixes */ +.ui-controlgroup-vertical .ui-spinner-input { + + /* Support: IE8 only, Android < 4.4 only */ + width: 75%; + width: calc( 100% - 2.4em ); +} +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up { + border-top-style: solid; +} + +.ui-checkboxradio-label .ui-icon-background { + box-shadow: inset 1px 1px 1px #ccc; + border-radius: .12em; + border: none; +} +.ui-checkboxradio-radio-label .ui-icon-background { + width: 16px; + height: 16px; + border-radius: 1em; + overflow: visible; + border: none; +} +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { + background-image: none; + width: 8px; + height: 8px; + border-width: 4px; + border-style: solid; +} +.ui-checkboxradio-disabled { + pointer-events: none; +} +.ui-datepicker { + width: 17em; + padding: .2em .2em 0; + display: none; +} +.ui-datepicker .ui-datepicker-header { + position: relative; + padding: .2em 0; +} +.ui-datepicker .ui-datepicker-prev, +.ui-datepicker .ui-datepicker-next { + position: absolute; + top: 2px; + width: 1.8em; + height: 1.8em; +} +.ui-datepicker .ui-datepicker-prev-hover, +.ui-datepicker .ui-datepicker-next-hover { + top: 1px; +} +.ui-datepicker .ui-datepicker-prev { + left: 2px; +} +.ui-datepicker .ui-datepicker-next { + right: 2px; +} +.ui-datepicker .ui-datepicker-prev-hover { + left: 1px; +} +.ui-datepicker .ui-datepicker-next-hover { + right: 1px; +} +.ui-datepicker .ui-datepicker-prev span, +.ui-datepicker .ui-datepicker-next span { + display: block; + position: absolute; + left: 50%; + margin-left: -8px; + top: 50%; + margin-top: -8px; +} +.ui-datepicker .ui-datepicker-title { + margin: 0 2.3em; + line-height: 1.8em; + text-align: center; +} +.ui-datepicker .ui-datepicker-title select { + font-size: 1em; + margin: 1px 0; +} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { + width: 45%; +} +.ui-datepicker table { + width: 100%; + font-size: .9em; + border-collapse: collapse; + margin: 0 0 .4em; +} +.ui-datepicker th { + padding: .7em .3em; + text-align: center; + font-weight: bold; + border: 0; +} +.ui-datepicker td { + border: 0; + padding: 1px; +} +.ui-datepicker td span, +.ui-datepicker td a { + display: block; + padding: .2em; + text-align: right; + text-decoration: none; +} +.ui-datepicker .ui-datepicker-buttonpane { + background-image: none; + margin: .7em 0 0 0; + padding: 0 .2em; + border-left: 0; + border-right: 0; + border-bottom: 0; +} +.ui-datepicker .ui-datepicker-buttonpane button { + float: right; + margin: .5em .2em .4em; + cursor: pointer; + padding: .2em .6em .3em .6em; + width: auto; + overflow: visible; +} +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { + float: left; +} + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { + width: auto; +} +.ui-datepicker-multi .ui-datepicker-group { + float: left; +} +.ui-datepicker-multi .ui-datepicker-group table { + width: 95%; + margin: 0 auto .4em; +} +.ui-datepicker-multi-2 .ui-datepicker-group { + width: 50%; +} +.ui-datepicker-multi-3 .ui-datepicker-group { + width: 33.3%; +} +.ui-datepicker-multi-4 .ui-datepicker-group { + width: 25%; +} +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { + border-left-width: 0; +} +.ui-datepicker-multi .ui-datepicker-buttonpane { + clear: left; +} +.ui-datepicker-row-break { + clear: both; + width: 100%; + font-size: 0; +} + +/* RTL support */ +.ui-datepicker-rtl { + direction: rtl; +} +.ui-datepicker-rtl .ui-datepicker-prev { + right: 2px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next { + left: 2px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-prev:hover { + right: 1px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next:hover { + left: 1px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane { + clear: right; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button { + float: left; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, +.ui-datepicker-rtl .ui-datepicker-group { + float: right; +} +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { + border-right-width: 0; + border-left-width: 1px; +} + +/* Icons */ +.ui-datepicker .ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; + left: .5em; + top: .3em; +} +.ui-dialog { + position: absolute; + top: 0; + left: 0; + padding: .2em; + outline: 0; +} +.ui-dialog .ui-dialog-titlebar { + padding: .4em 1em; + position: relative; +} +.ui-dialog .ui-dialog-title { + float: left; + margin: .1em 0; + white-space: nowrap; + width: 90%; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-dialog .ui-dialog-titlebar-close { + position: absolute; + right: .3em; + top: 50%; + width: 20px; + margin: -10px 0 0 0; + padding: 1px; + height: 20px; +} +.ui-dialog .ui-dialog-content { + position: relative; + border: 0; + padding: .5em 1em; + background: none; + overflow: auto; +} +.ui-dialog .ui-dialog-buttonpane { + text-align: left; + border-width: 1px 0 0 0; + background-image: none; + margin-top: .5em; + padding: .3em 1em .5em .4em; +} +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { + float: right; +} +.ui-dialog .ui-dialog-buttonpane button { + margin: .5em .4em .5em 0; + cursor: pointer; +} +.ui-dialog .ui-resizable-n { + height: 2px; + top: 0; +} +.ui-dialog .ui-resizable-e { + width: 2px; + right: 0; +} +.ui-dialog .ui-resizable-s { + height: 2px; + bottom: 0; +} +.ui-dialog .ui-resizable-w { + width: 2px; + left: 0; +} +.ui-dialog .ui-resizable-se, +.ui-dialog .ui-resizable-sw, +.ui-dialog .ui-resizable-ne, +.ui-dialog .ui-resizable-nw { + width: 7px; + height: 7px; +} +.ui-dialog .ui-resizable-se { + right: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-sw { + left: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-ne { + right: 0; + top: 0; +} +.ui-dialog .ui-resizable-nw { + left: 0; + top: 0; +} +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} +.ui-draggable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; + -ms-touch-action: none; + touch-action: none; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.ui-progressbar { + height: 2em; + text-align: left; + overflow: hidden; +} +.ui-progressbar .ui-progressbar-value { + margin: -1px; + height: 100%; +} +.ui-progressbar .ui-progressbar-overlay { + background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); + height: 100%; + filter: alpha(opacity=25); /* support: IE8 */ + opacity: 0.25; +} +.ui-progressbar-indeterminate .ui-progressbar-value { + background-image: none; +} +.ui-selectable { + -ms-touch-action: none; + touch-action: none; +} +.ui-selectable-helper { + position: absolute; + z-index: 100; + border: 1px dotted black; +} +.ui-selectmenu-menu { + padding: 0; + margin: 0; + position: absolute; + top: 0; + left: 0; + display: none; +} +.ui-selectmenu-menu .ui-menu { + overflow: auto; + overflow-x: hidden; + padding-bottom: 1px; +} +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { + font-size: 1em; + font-weight: bold; + line-height: 1.5; + padding: 2px 0.4em; + margin: 0.5em 0 0 0; + height: auto; + border: 0; +} +.ui-selectmenu-open { + display: block; +} +.ui-selectmenu-text { + display: block; + margin-right: 20px; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-selectmenu-button.ui-button { + text-align: left; + white-space: nowrap; + width: 14em; +} +.ui-selectmenu-icon.ui-icon { + float: right; + margin-top: 0; +} +.ui-slider { + position: relative; + text-align: left; +} +.ui-slider .ui-slider-handle { + position: absolute; + z-index: 2; + width: 1.2em; + height: 1.2em; + cursor: default; + -ms-touch-action: none; + touch-action: none; +} +.ui-slider .ui-slider-range { + position: absolute; + z-index: 1; + font-size: .7em; + display: block; + border: 0; + background-position: 0 0; +} + +/* support: IE8 - See #6727 */ +.ui-slider.ui-state-disabled .ui-slider-handle, +.ui-slider.ui-state-disabled .ui-slider-range { + filter: inherit; +} + +.ui-slider-horizontal { + height: .8em; +} +.ui-slider-horizontal .ui-slider-handle { + top: -.3em; + margin-left: -.6em; +} +.ui-slider-horizontal .ui-slider-range { + top: 0; + height: 100%; +} +.ui-slider-horizontal .ui-slider-range-min { + left: 0; +} +.ui-slider-horizontal .ui-slider-range-max { + right: 0; +} + +.ui-slider-vertical { + width: .8em; + height: 100px; +} +.ui-slider-vertical .ui-slider-handle { + left: -.3em; + margin-left: 0; + margin-bottom: -.6em; +} +.ui-slider-vertical .ui-slider-range { + left: 0; + width: 100%; +} +.ui-slider-vertical .ui-slider-range-min { + bottom: 0; +} +.ui-slider-vertical .ui-slider-range-max { + top: 0; +} +.ui-sortable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-spinner { + position: relative; + display: inline-block; + overflow: hidden; + padding: 0; + vertical-align: middle; +} +.ui-spinner-input { + border: none; + background: none; + color: inherit; + padding: .222em 0; + margin: .2em 0; + vertical-align: middle; + margin-left: .4em; + margin-right: 2em; +} +.ui-spinner-button { + width: 1.6em; + height: 50%; + font-size: .5em; + padding: 0; + margin: 0; + text-align: center; + position: absolute; + cursor: default; + display: block; + overflow: hidden; + right: 0; +} +/* more specificity required here to override default borders */ +.ui-spinner a.ui-spinner-button { + border-top-style: none; + border-bottom-style: none; + border-right-style: none; +} +.ui-spinner-up { + top: 0; +} +.ui-spinner-down { + bottom: 0; +} +.ui-tabs { + position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ + padding: .2em; +} +.ui-tabs .ui-tabs-nav { + margin: 0; + padding: .2em .2em 0; +} +.ui-tabs .ui-tabs-nav li { + list-style: none; + float: left; + position: relative; + top: 0; + margin: 1px .2em 0 0; + border-bottom-width: 0; + padding: 0; + white-space: nowrap; +} +.ui-tabs .ui-tabs-nav .ui-tabs-anchor { + float: left; + padding: .5em 1em; + text-decoration: none; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active { + margin-bottom: -1px; + padding-bottom: 1px; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { + cursor: text; +} +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { + cursor: pointer; +} +.ui-tabs .ui-tabs-panel { + display: block; + border-width: 0; + padding: 1em 1.4em; + background: none; +} +.ui-tooltip { + padding: 8px; + position: absolute; + z-index: 9999; + max-width: 300px; +} +body .ui-tooltip { + border-width: 2px; +} + +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Arial,Helvetica,sans-serif; + font-size: 1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Arial,Helvetica,sans-serif; + font-size: 1em; +} +.ui-widget.ui-widget-content { + border: 1px solid #c5c5c5; +} +.ui-widget-content { + border: 1px solid #dddddd; + background: #ffffff; + color: #333333; +} +.ui-widget-content a { + color: #333333; +} +.ui-widget-header { + border: 1px solid #dddddd; + background: #e9e9e9; + color: #333333; + font-weight: bold; +} +.ui-widget-header a { + color: #333333; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, + +/* We use html here because we need a greater specificity to make sure disabled +works properly when clicked or hovered */ +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: 1px solid #c5c5c5; + background: #f6f6f6; + font-weight: normal; + color: #454545; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #454545; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus, +.ui-button:hover, +.ui-button:focus { + border: 1px solid #cccccc; + background: #ededed; + font-weight: normal; + color: #2b2b2b; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited, +a.ui-button:hover, +a.ui-button:focus { + color: #2b2b2b; + text-decoration: none; +} + +.ui-visual-focus { + box-shadow: 0 0 3px 1px rgb(94, 158, 214); +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + border: 1px solid #003eff; + background: #007fff; + font-weight: normal; + color: #ffffff; +} +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #003eff; + background-color: #ffffff; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #ffffff; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #dad55e; + background: #fffa90; + color: #777620; +} +.ui-state-checked { + border: 1px solid #dad55e; + background: #fffa90; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #777620; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #f1a899; + background: #fddfdf; + color: #5f3f3f; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #5f3f3f; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #5f3f3f; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + filter:Alpha(Opacity=70); /* support: IE8 */ + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + filter:Alpha(Opacity=35); /* support: IE8 */ + background-image: none; +} +.ui-state-disabled .ui-icon { + filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url("images/ui-icons_444444_256x240.png"); +} +.ui-widget-header .ui-icon { + background-image: url("images/ui-icons_444444_256x240.png"); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon, +.ui-button:hover .ui-icon, +.ui-button:focus .ui-icon { + background-image: url("images/ui-icons_555555_256x240.png"); +} +.ui-state-active .ui-icon, +.ui-button:active .ui-icon { + background-image: url("images/ui-icons_ffffff_256x240.png"); +} +.ui-state-highlight .ui-icon, +.ui-button .ui-state-highlight.ui-icon { + background-image: url("images/ui-icons_777620_256x240.png"); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url("images/ui-icons_cc0000_256x240.png"); +} +.ui-button .ui-icon { + background-image: url("images/ui-icons_777777_256x240.png"); +} + +/* positioning */ +.ui-icon-blank { background-position: 16px 16px; } +.ui-icon-caret-1-n { background-position: 0 0; } +.ui-icon-caret-1-ne { background-position: -16px 0; } +.ui-icon-caret-1-e { background-position: -32px 0; } +.ui-icon-caret-1-se { background-position: -48px 0; } +.ui-icon-caret-1-s { background-position: -65px 0; } +.ui-icon-caret-1-sw { background-position: -80px 0; } +.ui-icon-caret-1-w { background-position: -96px 0; } +.ui-icon-caret-1-nw { background-position: -112px 0; } +.ui-icon-caret-2-n-s { background-position: -128px 0; } +.ui-icon-caret-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -65px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -65px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 1px -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 3px; +} + +/* Overlays */ +.ui-widget-overlay { + background: #aaaaaa; + opacity: .003; + filter: Alpha(Opacity=.3); /* support: IE8 */ +} +.ui-widget-shadow { + -webkit-box-shadow: 0px 0px 5px #666666; + box-shadow: 0px 0px 5px #666666; +} diff --git a/app/public_html/admin/assets/css/jquery-ui.structure.min.css b/app/public_html/admin/assets/css/jquery-ui.structure.min.css new file mode 100644 index 0000000..1e80c4d --- /dev/null +++ b/app/public_html/admin/assets/css/jquery-ui.structure.min.css @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.12.1 - 2016-09-14 +* http://jqueryui.com +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px} \ No newline at end of file diff --git a/app/public_html/admin/assets/css/jquery-ui.theme.min.css b/app/public_html/admin/assets/css/jquery-ui.theme.min.css new file mode 100644 index 0000000..d2d4f6a --- /dev/null +++ b/app/public_html/admin/assets/css/jquery-ui.theme.min.css @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.12.1 - 2016-09-14 +* http://jqueryui.com +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.003;filter:Alpha(Opacity=.3)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666} \ No newline at end of file diff --git a/app/public_html/admin/assets/css/jquery.autocomplete.css b/app/public_html/admin/assets/css/jquery.autocomplete.css new file mode 100644 index 0000000..3df53e1 --- /dev/null +++ b/app/public_html/admin/assets/css/jquery.autocomplete.css @@ -0,0 +1,48 @@ +.ac_results { + padding: 0px; + border: 1px solid black; + background-color: white; + overflow: hidden; + z-index: 99999; +} + +.ac_results ul { + width: 100%; + list-style-position: outside; + list-style: none; + padding: 0; + margin: 0; +} + +.ac_results li { + margin: 0px; + padding: 2px 5px; + cursor: default; + display: block; + /* + if width will be 100% horizontal scrollbar will apear + when scroll mode will be used + */ + /*width: 100%;*/ + font: menu; + font-size: .9em; + /* + it is very important, if line-height not setted or setted + in relative units scroll will be broken in firefox + */ + line-height: 1.6em; + overflow: hidden; +} + +.ac_loading { + background: white url('../img/ajax-loader.gif') right center no-repeat; +} + +.ac_odd { + background-color: #eee; +} + +.ac_over { + background-color: #0A246A; + color: white; +} diff --git a/app/public_html/admin/assets/css/jquery.fancybox.min.css b/app/public_html/admin/assets/css/jquery.fancybox.min.css new file mode 100644 index 0000000..7cc60b2 --- /dev/null +++ b/app/public_html/admin/assets/css/jquery.fancybox.min.css @@ -0,0 +1 @@ +body.compensate-for-scrollbar{overflow:hidden}.fancybox-active{height:auto}.fancybox-is-hidden{left:-9999px;margin:0;position:absolute!important;top:-9999px;visibility:hidden}.fancybox-container{-webkit-backface-visibility:hidden;height:100%;left:0;outline:none;position:fixed;-webkit-tap-highlight-color:transparent;top:0;-ms-touch-action:manipulation;touch-action:manipulation;transform:translateZ(0);width:100%;z-index:99992}.fancybox-container *{box-sizing:border-box}.fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-stage{bottom:0;left:0;position:absolute;right:0;top:0}.fancybox-outer{-webkit-overflow-scrolling:touch;overflow-y:auto}.fancybox-bg{background:#1e1e1e;opacity:0;transition-duration:inherit;transition-property:opacity;transition-timing-function:cubic-bezier(.47,0,.74,.71)}.fancybox-is-open .fancybox-bg{opacity:.9;transition-timing-function:cubic-bezier(.22,.61,.36,1)}.fancybox-caption,.fancybox-infobar,.fancybox-navigation .fancybox-button,.fancybox-toolbar{direction:ltr;opacity:0;position:absolute;transition:opacity .25s ease,visibility 0s ease .25s;visibility:hidden;z-index:99997}.fancybox-show-caption .fancybox-caption,.fancybox-show-infobar .fancybox-infobar,.fancybox-show-nav .fancybox-navigation .fancybox-button,.fancybox-show-toolbar .fancybox-toolbar{opacity:1;transition:opacity .25s ease 0s,visibility 0s ease 0s;visibility:visible}.fancybox-infobar{color:#ccc;font-size:13px;-webkit-font-smoothing:subpixel-antialiased;height:44px;left:0;line-height:44px;min-width:44px;mix-blend-mode:difference;padding:0 10px;pointer-events:none;top:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fancybox-toolbar{right:0;top:0}.fancybox-stage{direction:ltr;overflow:visible;transform:translateZ(0);z-index:99994}.fancybox-is-open .fancybox-stage{overflow:hidden}.fancybox-slide{-webkit-backface-visibility:hidden;display:none;height:100%;left:0;outline:none;overflow:auto;-webkit-overflow-scrolling:touch;padding:44px;position:absolute;text-align:center;top:0;transition-property:transform,opacity;white-space:normal;width:100%;z-index:99994}.fancybox-slide:before{content:"";display:inline-block;font-size:0;height:100%;vertical-align:middle;width:0}.fancybox-is-sliding .fancybox-slide,.fancybox-slide--current,.fancybox-slide--next,.fancybox-slide--previous{display:block}.fancybox-slide--image{overflow:hidden;padding:44px 0}.fancybox-slide--image:before{display:none}.fancybox-slide--html{padding:6px}.fancybox-content{background:#fff;display:inline-block;margin:0;max-width:100%;overflow:auto;-webkit-overflow-scrolling:touch;padding:44px;position:relative;text-align:left;vertical-align:middle}.fancybox-slide--image .fancybox-content{animation-timing-function:cubic-bezier(.5,0,.14,1);-webkit-backface-visibility:hidden;background:transparent;background-repeat:no-repeat;background-size:100% 100%;left:0;max-width:none;overflow:visible;padding:0;position:absolute;top:0;transform-origin:top left;transition-property:transform,opacity;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:99995}.fancybox-can-zoomOut .fancybox-content{cursor:zoom-out}.fancybox-can-zoomIn .fancybox-content{cursor:zoom-in}.fancybox-can-pan .fancybox-content,.fancybox-can-swipe .fancybox-content{cursor:grab}.fancybox-is-grabbing .fancybox-content{cursor:grabbing}.fancybox-container [data-selectable=true]{cursor:text}.fancybox-image,.fancybox-spaceball{background:transparent;border:0;height:100%;left:0;margin:0;max-height:none;max-width:none;padding:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.fancybox-spaceball{z-index:1}.fancybox-slide--iframe .fancybox-content,.fancybox-slide--map .fancybox-content,.fancybox-slide--pdf .fancybox-content,.fancybox-slide--video .fancybox-content{height:100%;overflow:visible;padding:0;width:100%}.fancybox-slide--video .fancybox-content{background:#000}.fancybox-slide--map .fancybox-content{background:#e5e3df}.fancybox-slide--iframe .fancybox-content{background:#fff}.fancybox-iframe,.fancybox-video{background:transparent;border:0;display:block;height:100%;margin:0;overflow:hidden;padding:0;width:100%}.fancybox-iframe{left:0;position:absolute;top:0}.fancybox-error{background:#fff;cursor:default;max-width:400px;padding:40px;width:100%}.fancybox-error p{color:#444;font-size:16px;line-height:20px;margin:0;padding:0}.fancybox-button{background:rgba(30,30,30,.6);border:0;border-radius:0;box-shadow:none;cursor:pointer;display:inline-block;height:44px;margin:0;padding:10px;position:relative;transition:color .2s;vertical-align:top;visibility:inherit;width:44px}.fancybox-button,.fancybox-button:link,.fancybox-button:visited{color:#ccc}.fancybox-button:hover{color:#fff}.fancybox-button:focus{outline:none}.fancybox-button.fancybox-focus{outline:1px dotted}.fancybox-button[disabled],.fancybox-button[disabled]:hover{color:#888;cursor:default;outline:none}.fancybox-button div{height:100%}.fancybox-button svg{display:block;height:100%;overflow:visible;position:relative;width:100%}.fancybox-button svg path{fill:currentColor;stroke-width:0}.fancybox-button--fsenter svg:nth-child(2),.fancybox-button--fsexit svg:first-child,.fancybox-button--pause svg:first-child,.fancybox-button--play svg:nth-child(2){display:none}.fancybox-progress{background:#ff5268;height:2px;left:0;position:absolute;right:0;top:0;transform:scaleX(0);transform-origin:0;transition-property:transform;transition-timing-function:linear;z-index:99998}.fancybox-close-small{background:transparent;border:0;border-radius:0;color:#ccc;cursor:pointer;opacity:.8;padding:8px;position:absolute;right:-12px;top:-44px;z-index:401}.fancybox-close-small:hover{color:#fff;opacity:1}.fancybox-slide--html .fancybox-close-small{color:currentColor;padding:10px;right:0;top:0}.fancybox-slide--image.fancybox-is-scaling .fancybox-content{overflow:hidden}.fancybox-is-scaling .fancybox-close-small,.fancybox-is-zoomable.fancybox-can-pan .fancybox-close-small{display:none}.fancybox-navigation .fancybox-button{background-clip:content-box;height:100px;opacity:0;position:absolute;top:calc(50% - 50px);width:70px}.fancybox-navigation .fancybox-button div{padding:7px}.fancybox-navigation .fancybox-button--arrow_left{left:0;left:env(safe-area-inset-left);padding:31px 26px 31px 6px}.fancybox-navigation .fancybox-button--arrow_right{padding:31px 6px 31px 26px;right:0;right:env(safe-area-inset-right)}.fancybox-caption{background:linear-gradient(0deg,rgba(0,0,0,.85) 0,rgba(0,0,0,.3) 50%,rgba(0,0,0,.15) 65%,rgba(0,0,0,.075) 75.5%,rgba(0,0,0,.037) 82.85%,rgba(0,0,0,.019) 88%,transparent);bottom:0;color:#eee;font-size:14px;font-weight:400;left:0;line-height:1.5;padding:75px 44px 25px;pointer-events:none;right:0;text-align:center;z-index:99996}@supports (padding:max(0px)){.fancybox-caption{padding:75px max(44px,env(safe-area-inset-right)) max(25px,env(safe-area-inset-bottom)) max(44px,env(safe-area-inset-left))}}.fancybox-caption--separate{margin-top:-50px}.fancybox-caption__body{max-height:50vh;overflow:auto;pointer-events:all}.fancybox-caption a,.fancybox-caption a:link,.fancybox-caption a:visited{color:#ccc;text-decoration:none}.fancybox-caption a:hover{color:#fff;text-decoration:underline}.fancybox-loading{animation:a 1s linear infinite;background:transparent;border:4px solid #888;border-bottom-color:#fff;border-radius:50%;height:50px;left:50%;margin:-25px 0 0 -25px;opacity:.7;padding:0;position:absolute;top:50%;width:50px;z-index:99999}@keyframes a{to{transform:rotate(1turn)}}.fancybox-animated{transition-timing-function:cubic-bezier(0,0,.25,1)}.fancybox-fx-slide.fancybox-slide--previous{opacity:0;transform:translate3d(-100%,0,0)}.fancybox-fx-slide.fancybox-slide--next{opacity:0;transform:translate3d(100%,0,0)}.fancybox-fx-slide.fancybox-slide--current{opacity:1;transform:translateZ(0)}.fancybox-fx-fade.fancybox-slide--next,.fancybox-fx-fade.fancybox-slide--previous{opacity:0;transition-timing-function:cubic-bezier(.19,1,.22,1)}.fancybox-fx-fade.fancybox-slide--current{opacity:1}.fancybox-fx-zoom-in-out.fancybox-slide--previous{opacity:0;transform:scale3d(1.5,1.5,1.5)}.fancybox-fx-zoom-in-out.fancybox-slide--next{opacity:0;transform:scale3d(.5,.5,.5)}.fancybox-fx-zoom-in-out.fancybox-slide--current{opacity:1;transform:scaleX(1)}.fancybox-fx-rotate.fancybox-slide--previous{opacity:0;transform:rotate(-1turn)}.fancybox-fx-rotate.fancybox-slide--next{opacity:0;transform:rotate(1turn)}.fancybox-fx-rotate.fancybox-slide--current{opacity:1;transform:rotate(0deg)}.fancybox-fx-circular.fancybox-slide--previous{opacity:0;transform:scale3d(0,0,0) translate3d(-100%,0,0)}.fancybox-fx-circular.fancybox-slide--next{opacity:0;transform:scale3d(0,0,0) translate3d(100%,0,0)}.fancybox-fx-circular.fancybox-slide--current{opacity:1;transform:scaleX(1) translateZ(0)}.fancybox-fx-tube.fancybox-slide--previous{transform:translate3d(-100%,0,0) scale(.1) skew(-10deg)}.fancybox-fx-tube.fancybox-slide--next{transform:translate3d(100%,0,0) scale(.1) skew(10deg)}.fancybox-fx-tube.fancybox-slide--current{transform:translateZ(0) scale(1)}@media (max-height:576px){.fancybox-slide{padding-left:6px;padding-right:6px}.fancybox-slide--image{padding:6px 0}.fancybox-close-small{right:-6px}.fancybox-slide--image .fancybox-close-small{background:#4e4e4e;color:#f2f4f6;height:36px;opacity:1;padding:6px;right:0;top:0;width:36px}.fancybox-caption{padding-left:12px;padding-right:12px}@supports (padding:max(0px)){.fancybox-caption{padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right))}}}.fancybox-share{background:#f4f4f4;border-radius:3px;max-width:90%;padding:30px;text-align:center}.fancybox-share h1{color:#222;font-size:35px;font-weight:700;margin:0 0 20px}.fancybox-share p{margin:0;padding:0}.fancybox-share__button{border:0;border-radius:3px;display:inline-block;font-size:14px;font-weight:700;line-height:40px;margin:0 5px 10px;min-width:130px;padding:0 15px;text-decoration:none;transition:all .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.fancybox-share__button:link,.fancybox-share__button:visited{color:#fff}.fancybox-share__button:hover{text-decoration:none}.fancybox-share__button--fb{background:#3b5998}.fancybox-share__button--fb:hover{background:#344e86}.fancybox-share__button--pt{background:#bd081d}.fancybox-share__button--pt:hover{background:#aa0719}.fancybox-share__button--tw{background:#1da1f2}.fancybox-share__button--tw:hover{background:#0d95e8}.fancybox-share__button svg{height:25px;margin-right:7px;position:relative;top:-1px;vertical-align:middle;width:25px}.fancybox-share__button svg path{fill:#fff}.fancybox-share__input{background:transparent;border:0;border-bottom:1px solid #d7d7d7;border-radius:0;color:#5d5b5b;font-size:14px;margin:10px 0 0;outline:none;padding:10px 15px;width:100%}.fancybox-thumbs{background:#ddd;bottom:0;display:none;margin:0;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;padding:2px 2px 4px;position:absolute;right:0;-webkit-tap-highlight-color:rgba(0,0,0,0);top:0;width:212px;z-index:99995}.fancybox-thumbs-x{overflow-x:auto;overflow-y:hidden}.fancybox-show-thumbs .fancybox-thumbs{display:block}.fancybox-show-thumbs .fancybox-inner{right:212px}.fancybox-thumbs__list{font-size:0;height:100%;list-style:none;margin:0;overflow-x:hidden;overflow-y:auto;padding:0;position:absolute;position:relative;white-space:nowrap;width:100%}.fancybox-thumbs-x .fancybox-thumbs__list{overflow:hidden}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar{width:7px}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-track{background:#fff;border-radius:10px;box-shadow:inset 0 0 6px rgba(0,0,0,.3)}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-thumb{background:#2a2a2a;border-radius:10px}.fancybox-thumbs__list a{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:rgba(0,0,0,.1);background-position:50%;background-repeat:no-repeat;background-size:cover;cursor:pointer;float:left;height:75px;margin:2px;max-height:calc(100% - 8px);max-width:calc(50% - 4px);outline:none;overflow:hidden;padding:0;position:relative;-webkit-tap-highlight-color:transparent;width:100px}.fancybox-thumbs__list a:before{border:6px solid #ff5268;bottom:0;content:"";left:0;opacity:0;position:absolute;right:0;top:0;transition:all .2s cubic-bezier(.25,.46,.45,.94);z-index:99991}.fancybox-thumbs__list a:focus:before{opacity:.5}.fancybox-thumbs__list a.fancybox-thumbs-active:before{opacity:1}@media (max-width:576px){.fancybox-thumbs{width:110px}.fancybox-show-thumbs .fancybox-inner{right:110px}.fancybox-thumbs__list a{max-width:calc(100% - 10px)}} \ No newline at end of file diff --git a/app/public_html/admin/assets/css/jquery.periodpicker.min.css b/app/public_html/admin/assets/css/jquery.periodpicker.min.css new file mode 100644 index 0000000..30079a1 --- /dev/null +++ b/app/public_html/admin/assets/css/jquery.periodpicker.min.css @@ -0,0 +1 @@ +.xdsoft_noselect,.xdsoft_noselect :not(input){-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.period_picker_input{border:0;line-height:33px;font-size:13px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;font-family:Arial,sans-serif;color:#000;cursor:pointer;position:relative;display:inline-block;margin:0;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;white-space:nowrap;outline:0}.period_picker_input:before{position:absolute;top:1px;right:1px;bottom:1px;left:1px;padding:0;content:'';-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#fff;-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.2);-moz-box-shadow:0 0 0 1px rgba(0,0,0,.2);box-shadow:0 0 0 1px rgba(0,0,0,.2)}.period_picker_input:focus:before{background:#f6f6f6;-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.4);-moz-box-shadow:0 0 0 1px rgba(0,0,0,.4);box-shadow:0 0 0 1px rgba(0,0,0,.4)}.period_picker_input[disabled]{color:#999}.period_picker_input[disabled]:before{background-color:#eee}.period_picker_input:active:before{background-color:#f6f5f3;-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.3);-moz-box-shadow:0 0 0 1px rgba(0,0,0,.3);box-shadow:0 0 0 1px rgba(0,0,0,.3)}.period_picker_input .period_button_text{padding:0 13px;position:relative}.period_picker_input .icon_calendar,.period_picker_input .icon_clear{width:16px;height:16px;background:50% no-repeat;-moz-background-size:100% 100%;-o-background-size:100% 100%;background-size:100% 100%;background-position:center center;background-repeat:no-repeat;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20fill%3D%22%23010202%22%20d%3D%22M0%206h3v3H0V6zm4%203h3V6H4v3zm4%200h3V6H8v3zm4%200h3V6h-3v3zm0-7v3h3V2h-3zM8%205h3V2H8v3zM4%205h3V2H4v3zm-4%208h3v-3H0v3zm4%200h3v-3H4v3zm4%200h3v-3H8v3z%22%2F%3E%3C%2Fsvg%3E);margin-right:9px;margin-bottom:2px;position:relative;vertical-align:middle;display:inline-block}.period_picker_input .icon_calendar:after,.period_picker_input .icon_clear:after{visibility:hidden;content:'\00A0'}.period_picker_input[disabled] .icon_calendar,.period_picker_input[disabled] .icon_clear{opacity:.5}.period_picker_input .icon_clear{background-image:url(data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%0A%3Cpath%20fill%3D%22%23444444%22%20d%3D%22M8%200c-4.418%200-8%203.582-8%208s3.582%208%208%208%208-3.582%208-8-3.582-8-8-8zM8%2014.5c-3.59%200-6.5-2.91-6.5-6.5s2.91-6.5%206.5-6.5%206.5%202.91%206.5%206.5-2.91%206.5-6.5%206.5z%22%3E%3C%2Fpath%3E%0A%3Cpath%20fill%3D%22%23666666%22%20d%3D%22M10.5%204l-2.5%202.5-2.5-2.5-1.5%201.5%202.5%202.5-2.5%202.5%201.5%201.5%202.5-2.5%202.5%202.5%201.5-1.5-2.5-2.5%202.5-2.5z%22%3E%3C%2Fpath%3E%0A%3C%2Fsvg%3E%0A);margin-right:0;margin-left:9px;-webkit-transition:opacity .2s linear,background .2s linear;-moz-transition:opacity .2s linear,background .2s linear;-o-transition:opacity .2s linear,background .2s linear;transition:opacity .2s linear,background .2s linear;position:relative;-webkit-border-radius:8px;-moz-border-radius:8px;border-radius:8px}.period_picker_input .icon_clear:hover{opacity:.8}.period_picker_input .icon_clear:active{background-color:#ccc}.period_picker_input .period_button_dash{margin-left:3px;margin-right:2px}.period_picker_box{position:absolute;left:0;top:0;padding:0 20px 20px;background:#fff;font-family:Arial,sans-serif;font-size:13px;cursor:default;overflow:hidden;z-index:33001;border:1px solid rgba(0,0,0,.1);-webkit-box-shadow:0 10px 20px -5px rgba(0,0,0,.4);-moz-box-shadow:0 10px 20px -5px rgba(0,0,0,.4);box-shadow:0 10px 20px -5px rgba(0,0,0,.4);min-width:236px;max-width:100%;min-height:365px;padding-bottom:80px;visibility:hidden;display:none}.period_picker_box,.period_picker_box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important;color:#606060}.period_picker_box.with_first_timepicker{min-width:-webkit-calc(236px + 87px);min-width:-moz-calc(236px + 87px);min-width:calc(236px + 87px)}.period_picker_box.with_first_timepicker.with_second_timepicker{min-width:-webkit-calc(236px + 87px + 87px);min-width:-moz-calc(236px + 87px + 87px);min-width:calc(236px + 87px + 87px)}.period_picker_box.period_picker_maximize{border:0;position:fixed;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;left:0;top:0;min-width:667px;min-height:395px;margin-top:0;width:100%!important;height:100%!important;max-width:100%;left:0!important;top:0!important}@media (max-width:667px){.period_picker_box.period_picker_maximize{min-width:200px}}.period_picker_box.visible{visibility:visible;display:block}.period_picker_box.animation{opacity:0;margin-top:-200px;-webkit-transition:.15s linear;-moz-transition:.15s linear;-o-transition:.15s linear;transition:.15s linear;-webkit-transition-property:opacity,margin-top;-moz-transition-property:opacity,margin-top;-o-transition-property:opacity,margin-top;transition-property:opacity,margin-top}.period_picker_box.active.animation{opacity:1;margin-top:0}.period_picker_box.animation.xdsoft_inline,.period_picker_box.xdsoft_inline{position:relative;top:auto;bottom:auto;left:auto;right:auto;visibility:visible;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:1;margin:0;z-index:0;display:inline-block}.period_picker_box .period_picker_error{-webkit-box-shadow:1px 1px 10px red!important;-moz-box-shadow:1px 1px 10px red!important;box-shadow:1px 1px 10px red!important}.period_picker_box .period_picker_head{color:#333;position:relative;height:40px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.period_picker_box .period_picker_head_title{display:inline-block;margin-top:12px;color:rgba(0,0,0,.5)}.period_picker_box .period_picker_close,.period_picker_box .period_picker_max_min,.period_picker_box .period_picker_resizer{background-image:url(data:image/svg+xml,%3Csvg%20width%3D%2256%22%20height%3D%2214%22%20viewBox%3D%220%200%2056%2014%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Cg%20fill%3D%22%23000%22%3E%3Cpath%20d%3D%22M16%202h11v10H16V2zm1%201h9v8h-9V3z%22%2F%3E%3Cpath%20d%3D%22M38%209h2V3h-7v2h-2v6h7V9h1V4h-6v1h5v4zm-6-3h5v4h-5V6z%22%2F%3E%3Cpath%20d%3D%22M12%202.714L11.287%202%207%206.286%202.714%202%202%202.714%206.286%207%202%2011.285l.714.715L7%207.714%2011.287%2012l.713-.715L7.714%207%2012%202.714%22%2F%3E%3Cpath%20d%3D%22M44.964%2010.328l.708.708%206.364-6.364-.708-.708-6.364%206.364zm3.415.586l.706.707%203.535-3.534-.706-.707-3.535%203.534z%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E);background-repeat:no-repeat;opacity:.5;right:0}.period_picker_box .period_picker_close:hover,.period_picker_box .period_picker_max_min:hover,.period_picker_box .period_picker_resizer:hover{opacity:.9}.period_picker_box .period_picker_close:active,.period_picker_box .period_picker_max_min:active,.period_picker_box .period_picker_resizer:active{-webkit-transform:scale(1.2,1.2);-moz-transform:scale(1.2,1.2);-ms-transform:scale(1.2,1.2);-o-transform:scale(1.2,1.2);transform:scale(1.2,1.2)}.period_picker_box .period_picker_resizer{position:absolute;bottom:0;right:0;font-size:0;line-height:0;width:14px;height:14px;cursor:se-resize;z-index:7;display:block;background-position:-42px 0}.period_picker_box.period_picker_maximize .period_picker_resizer{display:none}.period_picker_box .period_picker_close,.period_picker_box .period_picker_max_min{position:absolute;width:14px;height:14px;top:10px;cursor:pointer;background-position:0 0}.period_picker_box .period_picker_max_min{background-position:-14px 0;right:20px}.period_picker_box .period_picker_maximize div span.period_picker_max_min{background-position:-28px 0}.period_picker_box .period_picker_years{position:relative;left:0;height:30px;margin-bottom:15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.period_picker_box .period_picker_years_selector{position:absolute;width:100%;height:30px;overflow:hidden;font-size:14px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background:#f4f4f3}.period_picker_box .period_picker_years_selector .period_picker_year{position:absolute;top:5px;width:3em;margin-left:-1.5em;font-size:12px;text-align:center;cursor:pointer;z-index:11;color:rgba(0,0,0,.5);font-weight:700}.period_picker_box .period_picker_years_selector .period_picker_year:hover{color:#000}.period_picker_box .period_picker_years_selector .period_picker_year:after{content:'';display:block;width:1px;height:9px;margin:2px auto;background:rgba(0,0,0,.2)}.period_picker_box .period_picker_years_selector_container{position:absolute;left:0;top:0;height:30px}.period_picker_box .period_picker_years_dragger{position:absolute;top:0;right:20px;width:70px;height:30px;margin-left:-1px;font-size:0;line-height:0;z-index:12;cursor:pointer}.period_picker_box .period_picker_years_dragger:after{content:'';display:block;border:2px solid rgba(0,0,0,.7);background:rgba(255,255,255,.4);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;position:absolute;top:0;bottom:0;left:1px;right:-1px}.period_picker_box .period_picker_years_dragger:hover:after{border-color:#000;background:rgba(255,255,255,.6)}.period_picker_box .period_picker_years_period{background:#ffcf00;position:absolute;right:100px;width:1px;height:32px;font-size:0;line-height:0;z-index:9;display:none}.period_picker_box .period_picker_first_letters_td,.period_picker_box .period_picker_first_letters_tr{padding:0 6px}.period_picker_box table{border-spacing:0;border-collapse:separate}.period_picker_box table td,.period_picker_box table th{font-family:Arial,sans-serif;font-size:13px;font-weight:400;white-space:nowrap;padding:0;text-align:left;vertical-align:top;border-collapse:collapse}.period_picker_box table td.period_picker_first_letters_td,.period_picker_box table td.period_picker_first_letters_tr,.period_picker_box table th.period_picker_first_letters_td,.period_picker_box table th.period_picker_first_letters_tr{padding:0}.period_picker_box table td.period_picker_selector_week{width:16px;padding:2px 5px 0;text-align:center}.period_picker_box .period_picker_days table td{vertical-align:top}.period_picker_box .period_picker_days table table{width:184px;table-layout:fixed;border-spacing:0}.period_picker_box .period_picker_days table table.period_picker_first_letters_table th{text-align:right;font-size:9px;height:10px;line-height:10px;padding:0;color:rgba(0,0,0,.5);font-family:Verdana,Arial,sans-serif}.period_picker_box .period_picker_days table table th{width:23px;padding:0 5px;height:25px;white-space:nowrap}.period_picker_box .period_picker_days table table td{width:23px;padding:0 5px;height:25px;cursor:pointer;empty-cells:hide;vertical-align:middle}.period_picker_box .period_picker_days table table td:hover{background:#EBEBEB;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.period_picker_box .period_picker_days table table td.period_picker_holiday{color:#c11924}.period_picker_box .period_picker_days table table th.period_picker_month{border:0;font-weight:700;padding:14px 0 10px 12px;text-transform:uppercase}.period_picker_box .period_picker_days table table th.period_picker_month:hover{color:rgba(0,0,0,.7);cursor:pointer}.period_picker_box .period_picker_days table table td.period_picker_empty,.period_picker_box .period_picker_days table table td.period_picker_empty:hover{cursor:default!important;background:0 0!important;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.period_picker_box .period_picker_days table table td.period_picker_gray_period,.period_picker_box .period_picker_days table table td.period_picker_gray_period:hover{color:#aaa}.period_picker_box .period_picker_days table td.period_picker_month12:not(:last-child){position:relative}.period_picker_box .period_picker_days table td.period_picker_month12:not(:last-child):after{content:'';display:block;border-right:2px solid rgba(0,0,0,.1);position:absolute;top:-16px;bottom:0;right:-5px}.period_picker_box .period_picker_days table td.period_picker_cell_today{background:#c8ffca;color:#0e5632}.period_picker_box .period_picker_days table td.period_picker_selected{background:#ffeba0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.period_picker_box .period_picker_days table td.period_picker_selected :hover{background-color:#fff5d0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.period_picker_box .period_picker_days table td.period_picker_selected_start,.period_picker_box .period_picker_days table td.period_picker_selected_start:hover{-webkit-border-radius:5px 0 0 0;-moz-border-radius:5px 0 0 0;border-radius:5px 0 0 0}.period_picker_box .period_picker_days table td.period_picker_selected_end,.period_picker_box .period_picker_days table td.period_picker_selected_end:hover{-webkit-border-radius:0 0 5px 0;-moz-border-radius:0 0 5px 0;border-radius:0 0 5px 0}.period_picker_box span.period_picker_selector_week_cap{visibility:hidden}.period_picker_box span.period_picker_selector_week,.period_picker_box span.period_picker_selector_week_cap{padding:0;background-color:#ccc;display:inline-block;width:2px;height:16px}.period_picker_box .period_picker_empty,.period_picker_box .period_picker_gray_period,.period_picker_box .period_picker_holiday,.period_picker_box .period_picker_weekday{text-align:right}.period_picker_box .period_picker_month b{display:none}.period_picker_box .period_picker_submit_dates{position:absolute;bottom:0;right:0;left:0;font-size:13px;text-align:center;margin:0 20px 15px;background-color:#fff}.period_picker_box .period_picker_submit_dates:before{content:'';border-top:1px solid rgba(0,0,0,.1);margin:0;margin-bottom:20px;display:block}.period_picker_box .period_picker_submit_dates .input_box{padding-right:7px;background:#fff;-webkit-box-shadow:inset 0 0 0 1px #cbcbcb;-moz-box-shadow:inset 0 0 0 1px #cbcbcb;box-shadow:inset 0 0 0 1px #cbcbcb;position:relative;display:block;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;cursor:text}.period_picker_box .period_picker_submit_dates .input_focused_yes .input_box{-webkit-box-shadow:inset 0 0 0 1px #d0ba65,0 0 10px #fc0;-moz-box-shadow:inset 0 0 0 1px #d0ba65,0 0 10px #fc0;box-shadow:inset 0 0 0 1px #d0ba65,0 0 10px #fc0}.period_picker_box .period_picker_submit_dates input{width:6.1em}.period_picker_box .period_picker_submit_dates input.input_control{position:relative;z-index:3;width:100%;margin:0;font-size:100%;-webkit-tap-highlight-color:transparent;-webkit-appearance:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:.4em 0;border:0;outline:0;background:0 0;font-family:Arial,sans-serif;color:#000;padding-left:7px}.period_picker_box.without_bottom_panel{min-height:311px;padding-bottom:0}.period_picker_box.without_bottom_panel .period_picker_submit_dates{display:none}.period_picker_box.without_yearsline{min-height:335px}.period_picker_box.without_header{min-height:325px}.period_picker_box.without_header .period_picker_head{height:10px}.period_picker_box.without_header.without_yearsline{min-height:325px}.period_picker_box.without_header.without_bottom_panel{min-height:271px}.period_picker_box.without_yearsline.without_bottom_panel{min-height:281px}.period_picker_box.without_yearsline.without_header.without_bottom_panel{min-height:241px}.period_picker_box .period_picker_from_block,.period_picker_box .period_picker_from_time_block,.period_picker_box .period_picker_to_block,.period_picker_box .period_picker_to_time_block{margin-right:5px;width:81px;font-size:13px;line-height:28px;font-family:Arial,sans-serif;color:#000;position:relative;display:inline-block;margin-bottom:5px}.period_picker_box .period_picker_from_time_block,.period_picker_box .period_picker_to_time_block{width:60px}.period_picker_box.xdsoft_norange .period_picker_from_block~span{display:none}.period_picker_box .period_picker_to_block,.period_picker_box .period_picker_to_time_block{margin-right:0;margin-left:5px}.period_picker_box .period_picker_show{display:inline-block;margin:0;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;white-space:nowrap;outline:0;position:absolute;right:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;font-family:Arial,sans-serif;color:#000;line-height:28px;font-size:13px;cursor:pointer;border:0;background:0 0;z-index:3}.period_picker_box .period_picker_show+.period_picker_show{right:50px}.period_picker_box .period_picker_show:before{position:absolute;top:1px;right:1px;bottom:1px;left:1px;padding:0;content:'';-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#ffdb4d;-webkit-box-shadow:0 0 0 1px rgba(191,153,0,.8);-moz-box-shadow:0 0 0 1px rgba(191,153,0,.8);box-shadow:0 0 0 1px rgba(191,153,0,.8)}.period_picker_box .period_picker_show span{position:relative;padding:0 13px}.period_picker_box .period_picker_show:focus{-webkit-box-shadow:0 0 6px #fc0;-moz-box-shadow:0 0 6px #fc0;box-shadow:0 0 6px #fc0}.period_picker_box .period_picker_show:active:before{background-color:#fc0;-webkit-box-shadow:0 0 0 1px rgba(159,127,0,.8);-moz-box-shadow:0 0 0 1px rgba(159,127,0,.8);box-shadow:0 0 0 1px rgba(159,127,0,.8)}.period_picker_box .period_picker_work{vertical-align:top;height:100%;position:relative}.period_picker_box .period_picker_timepicker_box{width:87px;display:block;top:0;bottom:100px;left:0;position:absolute}.period_picker_box .period_picker_timepicker_box+.period_picker_days+.period_picker_timepicker_box{left:auto;right:0}.period_picker_box.with_first_timepicker .period_picker_days{width:-webkit-calc(100% - 87px);width:-moz-calc(100% - 87px);width:calc(100% - 87px);margin-left:87px}.period_picker_box.with_first_timepicker.with_second_timepicker .period_picker_days{width:-webkit-calc(100% - 174px);width:-moz-calc(100% - 174px);width:calc(100% - 174px);margin-left:87px}.period_picker_box.xdsoft_norange_timepickerinright.with_first_timepicker .period_picker_days{margin-right:87px;margin-left:0}.period_picker_box .xdsoft_navigate{background:url("data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20%3F%3E%0D%0A%3Csvg%20height%3D%2212px%22%20version%3D%221.1%22%20viewBox%3D%220%200%209%2012%22%20width%3D%229px%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Asketch%3D%22http%3A%2F%2Fwww.bohemiancoding.com%2Fsketch%2Fns%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0D%0A%09%3Ctitle%2F%3E%0D%0A%09%3Cdesc%2F%3E%0D%0A%09%3Cdefs%2F%3E%0D%0A%09%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%20id%3D%22Page-1%22%20stroke%3D%22none%22%20stroke-width%3D%221%22%3E%0D%0A%09%09%3Cg%20fill%3D%22%23444444%22%20id%3D%22Core%22%20transform%3D%22translate(-218.000000%2C%20-90.000000)%22%3E%0D%0A%09%09%09%3Cg%20id%3D%22chevron-left%22%20transform%3D%22translate(218.500000%2C%2090.000000)%22%3E%0D%0A%09%09%09%09%3Cpath%20d%3D%22M7.4%2C1.4%20L6%2C0%20L-8.8817842e-16%2C6%20L6%2C12%20L7.4%2C10.6%20L2.8%2C6%20L7.4%2C1.4%20Z%22%20id%3D%22Shape%22%2F%3E%0D%0A%09%09%09%3C%2Fg%3E%0D%0A%09%09%3C%2Fg%3E%0D%0A%09%3C%2Fg%3E%0D%0A%3C%2Fsvg%3E") no-repeat center center;position:absolute;top:0;left:-13px;bottom:100px;width:15px;opacity:.7;-webkit-transition:opacity .3s linear;-moz-transition:opacity .3s linear;-o-transition:opacity .3s linear;transition:opacity .3s linear}.period_picker_box .xdsoft_navigate:hover{opacity:1}.period_picker_box .xdsoft_navigate:active{margin-top:2px}.period_picker_box .xdsoft_navigate.xdsoft_navigate_next{background-image:url("data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20%3F%3E%0D%0A%3Csvg%20height%3D%2212px%22%20version%3D%221.1%22%20viewBox%3D%220%200%209%2012%22%20width%3D%229px%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Asketch%3D%22http%3A%2F%2Fwww.bohemiancoding.com%2Fsketch%2Fns%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0D%0A%09%3Ctitle%2F%3E%0D%0A%09%3Cdesc%2F%3E%0D%0A%09%3Cdefs%2F%3E%0D%0A%09%3Cg%20transform%3D%22rotate(180%204.1999969482421875%2C6)%20%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%20id%3D%22Page-1%22%20stroke%3D%22none%22%20stroke-width%3D%221%22%3E%0D%0A%09%09%3Cg%20fill%3D%22%23444444%22%20id%3D%22Core%22%20transform%3D%22translate(-218.000000%2C%20-90.000000)%22%3E%0D%0A%09%09%09%3Cg%20id%3D%22chevron-left%22%20transform%3D%22translate(218.500000%2C%2090.000000)%22%3E%0D%0A%09%09%09%09%3Cpath%20d%3D%22M7.4%2C1.4%20L6%2C0%20L-8.8817842e-16%2C6%20L6%2C12%20L7.4%2C10.6%20L2.8%2C6%20L7.4%2C1.4%20Z%22%20id%3D%22Shape%22%2F%3E%0D%0A%09%09%09%3C%2Fg%3E%0D%0A%09%09%3C%2Fg%3E%0D%0A%09%3C%2Fg%3E%0D%0A%3C%2Fsvg%3E");left:auto;right:-15px}.period_picker_box.without_bottom_panel .xdsoft_navigate{bottom:0}.xdsoft_noselect{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.periodpicker_timepicker{position:absolute;top:0;bottom:0;left:0;right:0;font-family:'Century Gothic',CenturyGothic,AppleGothic,Muli,sans-serif;font-size:1em;overflow:hidden;font-size:16px;padding:0}.periodpicker_timepicker,.periodpicker_timepicker *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.periodpicker_timepicker input.periodpicker_key_hooker{border:0!important;background:0 0!important;outline:0!important;width:0!important;height:0!important;padding:0!important;margin:0!important;font-size:0!important;-webkit-box-shadow:none!important;-moz-box-shadow:none!important;box-shadow:none!important;position:absolute!important;top:0!important;left:0!important}.periodpicker_timepicker .periodpicker_timepicker_sliders>div{position:absolute;top:0;bottom:0;width:50%;text-align:center;cursor:default}.periodpicker_timepicker .periodpicker_timepicker_sliders>div.periodpicker_col4{width:25%}.periodpicker_timepicker .periodpicker_timepicker_sliders>div.periodpicker_col4+div.periodpicker_col4{left:25%}.periodpicker_timepicker .periodpicker_timepicker_sliders>div.periodpicker_col4+div.periodpicker_col4+div.periodpicker_col4{left:50%}.periodpicker_timepicker .periodpicker_timepicker_sliders>div.periodpicker_col4+div.periodpicker_col4+div.periodpicker_col4+div.periodpicker_col4{left:75%}.periodpicker_timepicker .periodpicker_timepicker_sliders>div.periodpicker_col3{width:33.3333333333%}.periodpicker_timepicker .periodpicker_timepicker_sliders>div.periodpicker_col3+div.periodpicker_col3{left:33.3333333333%}.periodpicker_timepicker .periodpicker_timepicker_sliders>div.periodpicker_col3+div.periodpicker_col3+div.periodpicker_col3{left:66.6666666666%}.periodpicker_timepicker .periodpicker_timepicker_sliders>div.periodpicker_col2{width:50%}.periodpicker_timepicker .periodpicker_timepicker_sliders>div.periodpicker_col2+div.periodpicker_col2{left:50%}.periodpicker_timepicker .periodpicker_timepicker_sliders>div:not(.draggable)>div{-webkit-transition:margin-top .1s linear;-moz-transition:margin-top .1s linear;-o-transition:margin-top .1s linear;transition:margin-top .1s linear}.periodpicker_timepicker .periodpicker_timepicker_sliders>div>div>div{height:22px;line-height:23px;-webkit-transition:font .1s linear;-moz-transition:font .1s linear;-o-transition:font .1s linear;transition:font .1s linear;position:relative;color:#727272}.periodpicker_timepicker .periodpicker_timepicker_sliders>div>div>div.active{-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;color:#4B4B4B;font-size:1.1em;font-weight:700}.periodpicker_timepicker .periodpicker_timepicker_sliders>div.periodpicker_col2+div.periodpicker_col2:not(.periodpicker_ampmpicker_box):not(.draggable) div.active:before,.periodpicker_timepicker .periodpicker_timepicker_sliders>div.periodpicker_col3+div.periodpicker_col3:not(.periodpicker_ampmpicker_box):not(.draggable) div.active:before,.periodpicker_timepicker .periodpicker_timepicker_sliders>div.periodpicker_col4+div.periodpicker_col4:not(.periodpicker_ampmpicker_box):not(.draggable) div.active:before{content:":";position:absolute;font-size:16px;margin-left:-1px;left:0;font-weight:700;color:#797575;margin-top:-1px;z-index:1}.periodpicker_timepicker .periodpicker_timepicker_sliders>div.periodpicker_col2+div.periodpicker_col2 div.active:before{margin-left:-9px}.periodpicker_timepicker:before{content:"";position:absolute;left:0;right:0;height:20px;-webkit-box-shadow:inset 1px 32px 20px 0 rgba(255,255,255,.55);-moz-box-shadow:inset 1px 32px 20px 0 rgba(255,255,255,.55);box-shadow:inset 1px 32px 20px 0 rgba(255,255,255,.55);z-index:2}.periodpicker_timepicker:after{content:"";position:absolute;left:0;right:0;bottom:0;height:20px;-webkit-box-shadow:inset 0 -32px 20px 0 rgba(255,255,255,.55);-moz-box-shadow:inset 0 -32px 20px 0 rgba(255,255,255,.55);box-shadow:inset 0 -32px 20px 0 rgba(255,255,255,.55);z-index:2}.periodpicker_timepicker .periodpicker_timepicker_center{position:absolute;top:50%;left:0;height:0;right:0}.periodpicker_timepicker .periodpicker_timepicker_center:after,.periodpicker_timepicker .periodpicker_timepicker_center:before{content:"";position:absolute;width:100%;border-top:1px solid #ccc}.periodpicker_timepicker .periodpicker_timepicker_center:before{margin-top:-11px}.periodpicker_timepicker .periodpicker_timepicker_center:after{margin-top:13px}.periodpicker_timepicker_dialog{position:absolute;height:300px;width:99px;background:#fff;z-index:33001;border:1px solid rgba(0,0,0,.1);-webkit-box-shadow:0 10px 20px -5px rgba(0,0,0,.4);-moz-box-shadow:0 10px 20px -5px rgba(0,0,0,.4);box-shadow:0 10px 20px -5px rgba(0,0,0,.4);display:none}.periodpicker_timepicker_dialog.periodpicker_timepicker_inline{display:inline-block;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;position:relative}.periodpicker_timepicker_dialog.visible{display:block} \ No newline at end of file diff --git a/app/public_html/admin/assets/css/redactor.css b/app/public_html/admin/assets/css/redactor.css new file mode 100644 index 0000000..a3c1471 --- /dev/null +++ b/app/public_html/admin/assets/css/redactor.css @@ -0,0 +1,705 @@ +.redactor_box { + position: relative; + border: 1px solid #ddd; + overflow: visible; +} +.redactor_box, .redactor_box textarea { + background-color: #fff; +} + +body .redactor_air { + position: absolute; + border: 1px solid #ddd; + border-bottom: none; + z-index: 2; +} + +/* + Fullscreen +*/ +body .redactor_box_fullscreen { + left: 0; + position: fixed; + overflow: hidden; + top: 0; + width: 100%; + z-index: 2000; +} + +.redactor_box textarea { + font-family: Menlo, Monaco, monospace, sans-serif; + font-size: 13px; + overflow: auto; + resize: none; + margin: 0; + padding: 0; + display: block; + position: relative; + z-index: 1004; + outline: none; + border: none; + width: 100%; +} + +.redactor_editor, +.redactor_editor:focus, +.redactor_editor div, +.redactor_editor p, +.redactor_editor ul, +.redactor_editor ol, +.redactor_editor table, +.redactor_editor dl, +.redactor_editor blockquote, +.redactor_editor pre, +.redactor_editor h1, +.redactor_editor h2, +.redactor_editor h3, +.redactor_editor h4, +.redactor_editor h5 { + font-family: Arial, Helvetica, Verdana, Tahoma, sans-serif !important; +} + +.redactor_editor code, +.redactor_editor pre { + font-family: Menlo, Monaco, monospace, sans-serif !important; +} + +.redactor_editor, +.redactor_editor:focus, +.redactor_editor div, +.redactor_editor p, +.redactor_editor ul, +.redactor_editor ol, +.redactor_editor table, +.redactor_editor dl, +.redactor_editor blockquote, +.redactor_editor pre { + font-size: 15px !important; + line-height: 1.45em !important; +} + +.redactor_editor, .redactor_editor:focus { + position: relative; + outline: none; + box-shadow: none !important; + padding: 15px !important; + margin: 0 !important; + background: none; + background: #fff !important; + overflow: auto; + white-space: normal; +} +.redactor_editor a { + color: #15c !important; + text-decoration: underline !important; +} + +.redactor_editor object, +.redactor_editor embed, +.redactor_editor video, +.redactor_editor img { + width: auto; + max-width: 100%; +} +.redactor_editor video, +.redactor_editor img { + height: auto; +} + +.redactor_editor div, +.redactor_editor p, +.redactor_editor ul, +.redactor_editor ol, +.redactor_editor table, +.redactor_editor dl, +.redactor_editor blockquote, +.redactor_editor pre { + box-shadow: none !important; + background: none !important; + margin: 0 !important; + margin-bottom: 15px !important; + border: none; +} +.redactor_editor iframe, +.redactor_editor object, +.redactor_editor hr { + margin-bottom: 15px !important; +} +.redactor_editor blockquote { + margin-left: 3em !important; + font-style: italic !important; + color: #777; +} +.redactor_editor ul, +.redactor_editor ol { + padding-left: 2em !important; +} +.redactor_editor ul ul, +.redactor_editor ol ol, +.redactor_editor ul ol, +.redactor_editor ol ul { + border: none; + margin: 2px !important; + padding: 0 !important; + padding-left: 2em !important; +} +.redactor_editor dl dt { font-weight: bold; } +.redactor_editor dd { margin-left: 1em;} + +.redactor_editor table { + border-collapse: collapse; + font-size: 1em !important; +} +.redactor_editor table td { + border: 1px solid #ddd; + padding: 5px !important; + vertical-align: top; +} +.redactor_editor table thead td { + border-bottom: 2px solid #000 !important; + font-weight: bold !important; +} +.redactor_editor code { + background-color: #d8d7d7 !important; +} +.redactor_editor pre { + font-size: 90% !important; + background: #f8f8f8 !important; + border: 1px solid #ddd !important; + border-radius: 3px !important; + padding: 1em !important; + white-space: pre; + overflow: auto; +} +.redactor_editor hr { + display: block; + height: 1px; + border: 0; + border-top: 1px solid #ccc; +} + +.redactor_editor h1, +.redactor_editor h2, +.redactor_editor h3, +.redactor_editor h4, +.redactor_editor h5 { + color: #000; + background: none; + margin: 0 !important; + padding: 0 !important; + font-weight: bold; +} + +.redactor_editor h1 { + font-size: 36px !important; + line-height: 40px !important; + margin-bottom: 10px !important; +} +.redactor_editor h2 { + font-size: 30px !important; + line-height: 38px !important; + margin-bottom: 15px !important; +} +.redactor_editor h3 { + font-size: 24px !important; + line-height: 30px !important; + margin-bottom: 10px !important; +} +.redactor_editor h4 { + font-size: 18px !important; + line-height: 24px !important; + margin-bottom: 10px !important; +} +.redactor_editor h5 { + font-size: 1em !important; + margin-bottom: 10px !important; +} + +.redactor_editor.redactor_editor_wym { + background: #f6f6f6 !important; + padding: 5px 15px !important; +} +.redactor_editor_wym div, +.redactor_editor_wym p, +.redactor_editor_wym ul, +.redactor_editor_wym ol, +.redactor_editor_wym table, +.redactor_editor_wym dl, +.redactor_editor_wym pre, +.redactor_editor_wym h1, +.redactor_editor_wym h2, +.redactor_editor_wym h3, +.redactor_editor_wym h4, +.redactor_editor_wym h5, +.redactor_editor_wym blockquote { + background-color: #fff !important; + border: 1px solid #e4e4e4 !important; + padding: 10px !important; + margin: 10px 0 !important; +} +.redactor_editor_wym ul, +.redactor_editor_wym ol { + padding-left: 2em !important; +} + + +/* + TOOLBAR +*/ +.redactor_toolbar { + font-family: Helvetica, Arial, Verdana, Tahoma, sans-serif !important; + position: relative; + left: 0; + top: 0; + margin: 0 !important; + padding: 0 !important; + padding-left: 2px !important; + line-height: 0 !important; + list-style: none !important; + font-size: 0; + background: #f1f1f1; + background: -moz-linear-gradient(top, #f1f1f1 0%, #e2e2e2 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f1f1f1), color-stop(100%,#e2e2e2)); + background: -webkit-linear-gradient(top, #f1f1f1 0%,#e2e2e2 100%); + background: -o-linear-gradient(top, #f1f1f1 0%,#e2e2e2 100%); + background: -ms-linear-gradient(top, #f1f1f1 0%,#e2e2e2 100%); + background: linear-gradient(to bottom, #f1f1f1 0%,#e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f1f1f1', endColorstr='#e2e2e2',GradientType=0 ); + overflow: hidden !important; + height: 32px !important; + border-bottom: 1px solid #bbb; +} +body .redactor_air .redactor_toolbar { + padding-right: 2px !important; +} +.redactor_toolbar li { + float: left !important; + margin: 0 !important; + padding: 3px 1px; + padding-right: 0; + list-style: none !important; + outline: none; +} +.redactor_toolbar li.redactor_separator { + float: left; + height: 34px; + border-left: 1px solid #d3d3d3; + border-right: 1px solid #f1f1f1; + padding: 0; + margin: 0 2px 0 3px !important; +} +.redactor_toolbar li a { + width: 25px; + height: 25px; + border: 1px solid transparent; + * border: 1px solid #eee; + display: block; + line-height: 0; + font-size: 0; + cursor: pointer; + zoom: 1; + outline: none; + text-decoration: none; +} +.redactor_toolbar li.redactor_btn_right { + float: none; + float: right !important; +} +.redactor_toolbar li a { + display: block; + text-indent: -9999px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAooAAAAZCAYAAAC2GQ9IAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAF4BJREFUeNrsXQlYFFe2LpoGgQZtVEARjYrigijuW9xIHNQxLsm4PWNERxhw17glE2OIz2U0xnFl1JeYoFGzqdHEMUHFLcaFuCBk3CKIyoAoNFtAoOn5T3sbO/0a6Oqqbsnk/t93v1q66p6qW/ec859zb1U76HQ6gYODg4ODg4ODg8MUDpwocnBwcHBwcHBwcKLIwcHBwcHBwcHBiSIHBwcHBwcHBwcnihwcHBwcHBwcHJwocnBwcHBwcHD8ZuEaERGxWaPRhIk5Sa1Wf7h169bpWC2y9wUr+TPj4OCoLJCMjo72ycnJaVNWVubl5OSU1qZNm0QYuV9403BwcPxOodiyZUubo0ePJn322Wee2NaIPL+hWJJIwDmTsViGcvv3ThSV06ZNG+js7OxIGyUlJdpNmzbFYbWM902OGgCXqKiolY8ePZplbQX16tVbFxMTswirxVUdl5ycrIyNje1QWFg4oKio6HkQNX/ogx+Rt/Lycnd2WLlCoSDSVlqrVq2fQeRuu7i4JKhUqrjhw4f/1LNnT62Ee3VctWpVjxs3bnwJeWqlUlkE+W4FBQVHGjduHDZ48OCHOEZXE9rqGcJ55syZczIyMlairbvMmTPnEj0TaytDe1s1vLNgwQIHrpocv3OoR48enWO600oiV6WMsLCwPiCJp2gHbVshw8fo+i5bcC7JDTY69zdDFJURERGhW7du/VYmEucaHh6+CU5otFarVZmyb5QMifV7TJgw4YfHjx8HmvvRy8vrbyCkS7D6WMa2rTN27Ng0ONnahh2enp7/QCQyV3gGqWMOWdBACvEhsPP/jpJalX4dOHBgUEpKygEQwXKQwGIET1q1Wl2KbRqCSAdxVKA4/vLLL846nU4B3QksLi4Oys/PH/3gwQPFsWPHhoG8HLZSP5XLli0bnJSUtMfPzy9zypQpR7y9vfMuXrzYCDo/NDExcTyI4maK5WpAWz1L1IW9eo1F+1OxoOstkFtIaGio8Nxzzwloe66BHLL6JFPAvuTt2bOnCVZzrZThNG/evMlpaWn/MOyA/UresWPHH+CDvzP44FGjRvmjpFQTbIrSxZUrV767aNGit032N0W5LJMMqkv46KOPThnvtIIs1jJa/5jsG+rYZ+5A1DuSyQ02c26NJorOiJxfd3Bw6Ij1H1CyJV6DIwxgaG5u7iSTBtqPxhuBVT85iCI66vJt27bNjIuL696mTZu06Ojo/bt37+68b9++3llZWQuXLFmSgX2bKDsjl1JC4d6AcqyFcjiDCH86cOBA6gwuVhDFimgJ7dIM6ymWnmhhB641ffr0v6IdFn366afehs4vs4xKoz6ZZdhSTgORkWBlUWGDashPbRhaGmJwwDnJIHy369SpU+Tm5kbErAzkUMB6KdNfyr47Qn9qgay4nTt3rtkXX3zRLj09PRr7z1ihn0rowZhr165tDQgIuAdCeBmGPgFBzu1evXoFw0iGgqg2x3Fu1RHFStrKJTY2tulrr71G919sZltsWz0rKEDmO7m6uuqdLsj5IHJWtiCKrVq1ElxcXPRk8c6dOzbJvNhABy2SJSHjY+v7sGc72QsNmzRpkgqCltS1a9f0DRs2DDp16lQ79K1S6OBG0uf58+cPYskZa4mi83vvvXfl7Nmz295///1w+NpU2JNVVCd88MqlS5fOX7x4MUU8CrJvMhJFBzMkUf8cZWw/s3WtXr16HdN9a5452cZU9JlJBiJqhFT2+zPXj6qIosO6desaJiYm/gVO4ige/vfYR0NZ9fPy8v4cEhKyg8hQVFTUMEQonlu2bNlUjeOoDO4pKSkRZvYbLtRdhgecj5LOOiZFTeRcb44bN67o8OHDPYqKihyhLD2wL1YG4mtA4d69e/2JJNarV68EJJGGpe4K1g2jGXeg/lacW11E5RYaGloARXbC+nOGdpJZhmBGEWwhw5ZyXEwiQTrODcZ1ETMYK7GobP5esFFU6FLNNfiADLaglQEDBpwk/cMqDfVSxtt16tSpH48ZM+ZtkLgk9qyUIJJuKPVBIF8goojzA7DfW2R/dnrrrbcm//zzz2u7det23c/Pr3Djxo1/xPqZwMDAtC+//HKFu7t74ciRIxMt6CPm2kpP/DIyMsIoMGcBoOm22LZSrFmzJiApKWkD7nkAAthSnU5H+l3u5eW1Gk5qOZyW68GDB1dkZ2eH4/cyFC2OcfDw8PgK97UIgW+qFQ6LSPmwyMjIeMgf8+jRI1/Ykk6DBg26J0gYfjZFhw4dnnbMpk3lIIr20kFLZVmb8bH1fdizneyFslWrVr3PSBr198F6Rw8IT4YzM2DD6LqljBISB3io1WofM19LHCML5d8o9UpLS4uYH8yWkSQSKbr1LBoUZPuYj4/PWQnE2pCV3F4JaWtWE/TcHFF0fOONN/rA8EVpNJrRcFJXnn/+ecocOlO2DQ0zAs6obPz48Vfo4KCgIA8Y4oUgXdF169bdjLITUcNPIoylOyLmAjgn0/13ZHyeRBRvFxcX68lnWVkZkbULa9eubU8kEUTucVhY2HmWnZEL5SDZrWmlXbt2KSy7c9NaJUSH+bvJerCF0Yol0L700kv3QRQNUVOuDWSIvXarZdhJDh17HqTts4cPH/ahHVjP27x58+gqyKKlqFNSUmIgSNRvjrI6SafaghA13blz56YzZ85Mg67tYX2K+q7KGcAyEn2dMn51xGQCFixYMC8tLW0JyOlFBE4OBw4c6Ari802fPn0y33nnnc9r166tnDdv3nZvb+9kMfeINmkKXXiOHBKIpjvshwbk+sUCwHQbBE7Xvn17MYGK+61bt7bQPM7WrVvfadKkySMEsm737t1TFxYW/gm6vRX1+yCYHQSilQ7yq3F1dS2GvfG5ffv2aJzrgTrGMBshBrXxjOq0aNHiLEp/2MvGP/7445/QXkfkzCo2aNBAACEV+vXrp88snjhxQnKd9tJBC2Rdrsn3Yc92shOIrH3LAs76sBH6BI3uyadP6LopmeEm0X7RSEcmVPnfzNeSrDSWqHGHTpIPviZjQkbvs/CsokG2lhh2xMTEpEdFRfnaukFnzJgRAtlRWM2R2JcryyjWCP0wJYpuERER22F0+3bs2PH8kCFD1sP4/os9ZHJS6uTk5L/07t37NHv4uXCOV1BWw2n5I2rvCcM7DRH6cpCwNRZmGEsHDx58/tixYy+j4zraQ1uuX7/uj05FUYDQqFGjgokTJ55s2LAhNVChjGLq3r17txetBAQEXGRtaG2kpsH1zmYPf0Bl0YcZ9Mfx6yzJfhKJxbFTWGRUIU9GGYaOT9mlEzQng5TDwnsRI6Oivdj8Dg2LOPfJLMeNkcQ/GnbQOu1jZFGYNGkSZcmE7du3h4l83k4gNnqyBHL2kD0fQ+BVV680paUe6Mex06dPf37jxo00N46Cn3zwriw989dqFSy4swS15s6d+7/379+fC6JzFrKVcXFxwdCLw506dfoRJG4tzVEcOXJkPEhqAo6/IYgYPUCbUOBI5JIy1uply5aFRUdH7zE8G5NtcjSBx48ft7T6htnZ2X38/f2zUUc86RmcUZ34+PgOGRkZ+StWrPizo6Ojc/fu3a+BRCpDQkIuY5uyGk3gSF5BMBwiPJkgLoYoOuKZ9rtz585Y9Kuxhp0gn0MoayIXUVSr1TT3keyVnijSNpFF2pYAMbotGOmQxkLHJWbIqz/KbCNZYoZsDbbkKxH6LUbHRbWTBFtlTxQa+TjPan6v6TB+85iybpcN09Ww/BrbV7F8JMg7BUBjQr7yUE4yvy5pFMEGGUVZ9dyUKHq2bNnSEdG/J5xGRzyEPDicm4GBgZQq1h44cKAbyJwvTUrF9j3WUDdg1P0uXbo0AI6yo0qlKu/SpQs5KJWFziTPx8fnfGxs7IfffvvtS7t27fIBUbXpW3zBwcHZb7755uE1a9b0RbTut3z58iEwwJeXLl36vVydmBxtfn6+2tXVtWzgwIFxEiMotYSUsiVzNDzQqc7RSnh4eHdcr6cNZAiGTghZlyS2gUXHMjLqKbLNLJXja0wSjckiosy9eqtbWBjKiJIbyONmMf3HsALSpgWxMR6icTTJOPkxo08RvA4RvN5gKRQKnXE9leHGjRuu27Zte4dI4rBhw05169YtBYRr3Ouvv/45dPlnLOeAhKUhcMxElD6ybdu2Py1cuJAyDmKGjchg32XX06CkpIRIbQYrptt0/Q1E1F2PEWrqW/tRbu3YsWMCAs++7PeKZ+Tg4KDLyckhZ0L2qz3OGZyXl6dmdYgZulKlpKS8sGnTplVeXl6UgWmMZzwEz95z9+7dIePGjaMpLFqpRsRACoks0pAzzVFE4C6VKIqds5UqyD/cXNW5l0XYEsOxwTZoA7Ud2tjqeWRWkOtKZcGnO+G3U1bWKwY6Z2fnfEHakLO5N49TDIQKSxrppJLI5GRbK6MS0mYIToz7oeTsqA0yirLquSlR1M6fP5+MbeYnn3zS5uTJk/1Onz49HM7hlcWLFycgSp/es2fPYyybSA2pmDt37uR79+4ta9as2dXx48ef6t+/P6WVz4lg2JSavkoPIDQ0NOuDDz5409ahCJsncRFO8AGuPxzXr7p79y6l4cmZ35dBhNv58+eJoQstWrTIYg8hX2JHsuXQc73IyMj3r127FgSi/gmI4hQbDT2bKqDaQjmXrVUS9kbaABvI8a7sh8zMzFBT8shIjMVQKpU69FOH7OzsWgik/j+z9/DQTZkyJQn6aGy0BDpezyZ/TS4rJaRXrlzpmJ6ePhUk8QT0958nTpzwBjmlQMc/OTl5aKdOna56e3uXov36NW/e/PrLL798UxA5RQMcuQ+Cz+eNhp4F2JkpRkPPFdtWDD070XxD3DdlK2n+Stqrr756HAFaL+xr7uvrm492VOCZqPz8/K6iP1xg+ugOAkZvjDuIyLzq22znzp0dUV8XkMR3maNoHgTAPjaHvZwHoviVHM6D5idSJtEYRBbpxRY4d6m2RPZpJVbUL1mWLe/JDvehroQgiHHuakuJooksz61bt448cuRIY+hf+UcAC+bE1muWENatW9esv8vPz28gUS3012/mzWMDWbxslBmzFpW9Qa0WbDS1wAYZRVl1wpQo5rBUahqcRnMUXziOOkVFRaqvv/6694MHD/qtXbt2CutQNESk7t27dw6i3JWBgYGGrEEK62iWprB1TO4FQd43lCoFm6NIk33qqdXq0UQUnZycyMF6yUQUPdFW3WmFnCsWDwRpE4RtPfRc0L1790sHDx4cuX37dnJ+ZTYaejadS0L3tVZmGabKEs0UcbbMcpxFXoq3iGPL6Q3n3Nxcl7y8PFcQRYVRhkqLbc3s2bOv+Pv7f4btU8LT+TEKOl4fqTx5Q7q6YM0JutARpFIBXafhmuNdunRpDGPeMiEhoTUIz3cIoHwPHTrUq0+fPokTJkzYCwJ2RxD5ZQAbDz1rQZ4e4Dr9pk2b9n8gfrdAotVarbYZiuucOXP2gNS5o/7/gU4GXLhwYWFhYSE5sfY5OTm1AwICxE4J8UR7fIN2U02aNOlv0Jceq1ev7ol66U1wISsrqy0C0PVr1qwJFyR8BouyiTQ3EURev03kMCIiQr8kAkm/SbUlVeiM2OFmU/Ji8ZCwRFnWyKxJQ8+GrKi19y2GEJnKavj48eMX9A5YpyM7QaM8SVbUazYX07Vr19sNGzbUpKam+u3YsaMTbEfqwoULZ8Lf0lQaKSOGVb15THZS6jcGFdBvXxBRW79BbeuMoqx6rjST3aNsIQ0B0VBMI0S0NLSSu3Tp0jlwIscYGcwyGOlXXnmFhmv/xSJoIlm5VpKiEsG+8yPKYMy73bx5sz5t9OjR46bEDlzR0b755pvg7OzsxrQRHBz8gyBxoqtg+6Hnx7NmzXoTBKFZVFTUwpiYmLk2kFFhrIw+faS2gQxjRdgvJRtZ3b2IjNjETBAv8fb21oAoNti/f//Q0tLSWyCA6SCIOSA+j5YvX/42yFCm8ORFl8wVK1YoiouLvRwcHJqCIL5EFdSvXz9XqH7qh7Jly5alCAKd9uzZ4zZ27NhbKpUqZ+jQoTtCQ0ObIygckZiY2Hn48OFnRowY8TWCqZMsayf26wbGQ8/euHbStXQWQJluix16zp48efIBOKOXb9261RPbPR8+fEhD0QU05QNk8Z8gt66wXa3i4+N7wzm2MMrYPcA9fyVSPz127dq1EEt6q5zmHnvOnz+fyPp7KG2EJ1NyDgnWfQarghQicKP+W7GPMog0/EwEkogiEUgrs4qW9O9UCZkTsUPCUmRZK7OmDD1rBPu9/GIqy1+j0ZQyomh4meW0TLKo3vvTp0/fu2HDhpEHDx6MpdK6deuD77777geC9Jf9fgW53jw2BIKm2Up7wAYZRVn1vLr/enZkmRN6e7Kt8GTe4RVGJo1/L2edQ+pnIfqjweINmSDKPFEGjTIdEuv1CAsLS2CfDPl1r/D0LOrbt2/G+PHjN2DzC+Fp+t0a1JoxY8bSzMzM+cY7IyMjg0JCQpIF6+dmkPGbyNap/TuIICgfW9AZ6LtZL1ImR3gyDYAce6jMMow7cH9GeDUW3otYGcFMRirrO01Z+0mVU9E/JUaP1fXp1t9//330+vXrR4P8lTs6OhZiWYSSr1QqH9MHuKG3RSA97lgqy8vLPbB0wdIVRUUf4J46deo+BHl/ZUFcpZwEdfRFYPB2QkJCBy8vr/WdO3f+0NnZucnp06dX5uTkBEFvvkPfPQzZp1i0XiRWl23cVjSXirL3dJyfIYBlffgH5vyc2O9dUWozu0W6SKMfdI0JFjoZi+eU4bpF/1GA4Z9ZZs6cqSeLhNjYWCEjI0M/BE3k0RjoH3qyKPKfWYKr0QWxulZTZMktM9hCm2GPe5IbHpMmTfqxsLCwpfHOoKCgPyxevPiYIMP8WqaXFLj1RnFl+njbKKtpbbbdrF2BvrViyS2pHIRGBugly7cMOwxvUMvERUx5zgDWHv0rySjq/ZfJ8cftrXvVEcUKAiQ8/dRGriDvP5hURYgMNyRV6XzZg+jLSFEBy144s6wqOVNSkOsS743aiD5ETm9SBrEMJWV99kvsxGqjTqRh25ZEDIaUcnXDCO7MyRrmpVD71JdZhun9qM2syyVDbXQvGqP2kyqnx7Zt27bHxcW1traDDBw48Fp4eDgNM5yt4jB6ueLFlJSUMVevXm12/fp196ysLBWIm3tJSQkNFztSAaGjf2rRqVSqYnd39yJE1fmtWrUqROR+r2nTpp+CVNKnMB5WIYcyfM1LS0sHHj58OOTQoUOd4DxcYBNq4VzHWbNmHQwODj7C+nCayEyivdpKwcgf6Xhdps+kZ/mMqD1ix9C0Eh8W7Dqwe6Hf/s36uyW6GWzpi1gw6B3F2i07/YVfdbpgjT7XBFlyy7TUZtjjnuSGL/NR/ZndL2Q6dpj5wBIZZCiYP2zESKP+szlMJ6X8M5kpATK8ebxPkOev7QyJjIk06sWylTQtjkZRj8oUAFgdRIsgirLqnqVE0V4wJUSCIH2+hD6CYgpRX/j1RPxypiQPWJFKgIlQN2DF1YhY07yuHEG+D4xyPBtQ36Qh836CdUNT1I9PsMAhtYrjlIzUtBOeDHH6MGPrzrJjDsLTaRJa4em0jRxmjGl4OImRoOqmgbgKT/8iqhHTD0PfpTrOMeNeWkPbyp6wNMv0W8gqcfx+Yc4fUmB1lwVPkjOKIEK6agiPtdO8zBEgucm5gSx2Fp7Mrb7I7Gi2TDJ6xMTExMbHx7cUc1JISMiNyMjIidUEzjZBTSOKHBw1GS5GgYCLFecbfwamuglmCiaDjDplzNxYIKI0Mu46ZtTLWJDzCzP4Bax+Sw2+EyOilHVTMdmFjGjmWOk47NlW9g5k5c6Ac3Bw1CyQjtMIRS6zgeUy1t3MKIi29E8Rco0C5xR7N8Zviih+/vnnFRc7atQoB96XOTj++2AvPef2hIOD4xklHGgKnI+IIJqC5UwWvNsscK7MJv7mMop0I9yoc3D895NFe+g5tyccHBwcVdtEPvTMwcHBwcHBwcFhFpwocnBwcHBwcHBwmMV/BBgAHTxEUMWGlxEAAAAASUVORK5CYII=); + background-repeat: no-repeat; + background-position: 0; +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and (min--moz-device-pixel-ratio: 2), + only screen and (-o-min-device-pixel-ratio: 2/1), + only screen and (min-device-pixel-ratio: 2), + only screen and (min-resolution: 192dpi), + only screen and (min-resolution: 2dppx) { + + .redactor_toolbar li a { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABRQAAAAyCAYAAAAtK1dkAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAKodJREFUeNrsnQtcVNX2xzfDG+QtiG9QTE0rS4pMSVHDSjHN0Ewty/shzWumluY/zbTuVSz1qper9dcempl6y3c+/4Wamc98hyGCPARF3jA8Bpj/Wsw+eBgHGGBmzjnD+n4+mzmcOTOz93nsvfZvr72XjVarZQRBEARBEARBEARBEARBEMagolNAEARBEARBEARBEARBEISxkKBIEARBEARBEARBEARBEITRkKBIEARBEARBEARBEARBEITRkKBIEARBEARBEARBEARBEITRkKBIEARBEARBEARBEARBEITRkKBIEARBEARBEARBEARBEITRkKBIEARBEARBEARBEARBEITRkKBIEARBEARBEARBEARBEITRkKBIEARBEARBEARBEARBEITRkKBIEARBEARBEARBEARBEITR2NEpIAiCIIjmwejRoy36e1u3bqWTThAEQRAEQRBWCAmKBEEQBEEQBEEQBEEQRJ00dXB669atnvAdOXzbC15y6awqFxIUCYIgCIJoKC0g/R1Sb0gOkM5D+jekTDo1BEEQBEEQhqlLkBOLbfWhRDFOv3y4bYFyuEyaNOn7goKCCHP9gJub247169ePg011c7ufSVAkCIIgCKIh9IG0CVIgpOuQiiENhzQFEhpTh8z8+45vv/32rIyMjH9IeRL8/f3fX7Vq1QrYLKNbgiAIgiAIExDQwGPPy60A+h6IsJ2rv1+MBUTFtuYUExH4/hHw0obbxc0KEhQJgiAIc2Btoo/tBx98MDA1NfXj0tLSHpWVlS3MmW+VSlXo6Oh4pU2bNh8tXrz4MOwql8l17QdpH9N5Ij4F6QTf3xXSNkjfQ+rGzOup6Cf1fYVAHpbAy3eQUuhxtz6WLl2qteTvzZ4924bOOkEQBLF169Z/wUsv/i+KcL1qOdRTpkUI0Ns+b4TnZdVxZsqPr4XK7cdIUCSEjvCUKVMWFBUVjSgpKele593p6xsdExOzADZL6bQRBEHca1StSPSxf//99ycnJib+S6vVqiyRbxQsi4uLQxISEvbBb7+9ZMmStbBbI/HpFIuJoZDSRO9dgxQJ6Qqk9yHNMmM+WsvoPm/NSFBskr311ltvfZSdnf3WyJEje40ZMyYJ9mnptBAEQRDNFGwHv4G0k+nExO0KLINY6PSsT0yE9782c34c9H4PhUtTeEPqi70OzfGGJUGxJjYbN27scPjw4f3QketWyw3/ZVRU1Jjc3FxX/D8mJuY3eHFi8hIU3ceNG3dFo9G0M/oD7u4H7ezszqxdu3YRk6c4avvxxx8PvHTp0sG6DlKpVPnff/99B9jMo9uZICTFakSfnJwc/5SUlH9YSkzUB387MTFxV2Bg4E0Jz6FYTBzAdGLiJEhn2b0RZRQVr7J7o+rmwqUBhqHDwYMHW4eHh6ez+r1U7Y8fP+7bt29fLKPGSOPRhR71JuGnVqv/VllZ6R4fHz8V/p/PdFPoCYIgiKYJHTlN+QLoG36/bt06bOfVcs1/586dxyxevPhH7CdOnTp1YWZm5hz9Y5S2PAmfHny+IWspKvlehHLuYDrxNMmCefqGmcYbspcFbF7ZQ4JiTdyOHj36Y21iIqdcpVLZiv7HKSolMiuH+6ZNm97FG3zOnDmvQ0e0lfAGdEhvR0dHb8RKddeuXcHQeeoF7/vl5+eHw77w1157bVSPHj3Gzp49+wL8XymjMtnOnz8/A16nbd68+eXt27f31Wsscl599dUDwcHB++FfD2ZZQdFgRcnXgmDmagzMsdYEXyQYgywcgu/3NqVhYsFySNIAUznuoyGijzmeSVOJPnb79+8frNFo3HhdUzFt2rTELl26oEBVYab8q27duuW3ZMmSLhkZGbb427///vsgqL83MGmmPgtiYjbTiYnJkBYznSfiXD2jzFmC/NVlGHqlpKQ8C6/YNtT3PLknJSWF9u3b9xhs55PxaH4b9PPPPx+lVqtb4j+3b9/G9Y2WMxIUqQ2xYPmUll+yTQgjCRA2hgwZcmbSpEm4dAo6jLhFRUW9KTjG6L2viY+Pb7du3brnse8IoGOKD5NIUIRr/kZWVtbjCxcufBlsIS/hDScnJ82HH364OSgo6CT8Gw/JHpJDTEzMT2inrF+/PvLAgQPBvFxbYN9xSI5MQesdW5GYyOrysORiItpwsRZ+vs9DvmKbcH2oPRcbcyYSIIzJkKMwciBME4bPlkpwQWo9FytXrnwlLy/vsXqOu1FZWSnuROYx+Xn0YUcIp53Zd+/ePVMsKKpUKrzmcZDShw8fjikzOjp6+NmzZ6s6y8XFxV2vX7++HjYHyqzhxnN+G8sVHh7+h76gOGbMmLjg4OCjvNyW9k4MaOB+U/6uqdeaiIKEU0S9LFgWU5cjQKJ7lMrReNHH1JhS9HEA2gj/ODs7F3Xp0gWnH18yo3Fq16ZNmx7wW+gx7s4z0ZobxJYWFFFMRM9wYZqzWEzEqeSf6h0bBGmLhfNYq2EINoZfamoq5uk4HHOnHjvFOykpCcWtX+HYbHMbkcbaT2Y0FKVu1z3i4uLGCf/cvn37gY0bNw6aMGHCd8x8Yr1ZCQkJqUpffPEFKymRfKzZ2toQc5VPafkl24QwSoDAPyNHjkwbO3YstuGneP+ou55jDNMC8PIHpGywb9pBv9Bm5syZkU5OTtg3dJYo/9gHveDj42MH/buwPXv2VPdL2rdvrw4KCkLHl3PYn2W6GQXoBIOzOJwmTZrUCgVFeMV+IR6XyhS0NJkR04OT4P0Apd+gEoqJDTrfBo6XYnBD1vWunYUulM2xY8e65ebmToNOUcl77713iVdQcnq4W6jV6gFW0oigoHgZkrqoqKhGB6q8vBzP+Rmmm5aGD0TcSy+9ZHv27NmXq2vw3NxHv/rqq+def/31rTIy6jEfWJbSTZs2TRC/gQ1L3759v4XN3bxhsXSePRu439y/2+R+Lrs/Squngsoh1QLFVI66Oc+NBpMJKhYSROzs7e2dhH80Gg3WoTjafRryX2Gm/OPU6nz+W1XwPNha+F4QxET0Dsf2UV9MfFVU37ZlusjPKDyulFmb2BBve0naPLSTVq5c6Xft2rU3wRZ5trKyssZzaGNjU+Lo6HjZzc1t67Jly/bDvVdu4DvsZs2a9WxBQcGo0tLSntBHdK1xU6lUuc7Ozj8/8MADa2bMmHGLSbtWoWrXrl0haWlpweKdly9fnsjbckV6Ij3yyCPoPcO6du3KLly4IAtBwYp/17OZ5pdsE8Kods/Dw6Ng7NixXzFdwLRrvN9drOcYg84kKKb8znTCGw5iZjz99NO+f/zxh5+E+cc2AEXOgsLCwleYLtib0JdFL/ZfeX9WaN+xTbzJ7RXUGGZCOsqTNYmJKMIlQXpHyTenXMRETkAjjrf04Ias6107E90UNpMnT/Zeu3ZtNjwEhgxU58OHD78NnSOX/v37XwsICMCRf423tze6UWczeSzA7QqGtpuVNSbl0GjU5s2Cozko0J3u3LmzP5Q9EhqU6s7qrVu3hsHLXlb7tC+pcE5JSanhRcrXFTvPG5EKRjSFLyB1otNAENXYIKL/tdw4rbeuEQxDHM3ka+IY3RHgdbRWnAmmW2LDUvRnumnOxoqJOE0Yl0nA5TMyZXYNtQ04rtLSNgncH/azZs36G7S7n1ZUVLjWdhy00Y/m5uZOeOONN45FRkaOhnQbbS60wTZv3uw3adKk7woKCgbW9VtqtbrPqVOn3pkxY8YHK1asWMOkmwLmcu7cuZeGDh16JTY29sGioqKqezstLe2pkydPdgkJCTnDFBacpWPHjszTU2d7d+vWTQ6CIkEQzRc19LfRKzGW3RMTjbE9qoS8ESNGfA112BsS18NV9ha0izXaKejbVvLyGBosxP3CTDU5ziKs12as431BhEMUKyjKTEwU8iSOql0X5CVtgKYKig6+vr5vT5w4cZRWq8WH+jlmWIBqmZycPAI3Bg8ejGs04HoHdmAc74LPqlxdXX+IiYlZxaRd28AWaI5rShagDc+vX7Wg6OLigusQtmDyExR9MjIyaqxx2bp1a5zCjdOhyyXKU66Biqh6vbgGVFINwZLr0dVWRrmWw1x5pXIQDSUA/zRSVJSShoqJaBT6chsAOzDoGbCXd2LMTnR09Kt+fn59oR3TqFSqct4WYJtWNm/ePGc3NzeHBQsWjGrTpk0BHIP5rrSxsdFCquAdEy18jsExTnCsHbyGt2vXrmq+KhxvozuE2cAxqm+++aaniY1Yh7lz505PSUlZauxnCgsLQ/fs2fMbtNOh8PlbsbGxOL3rV7Va3dmYz6NomZaW9q/33nvP+9NPP/2nRB0un8TExGHTpk3bnZub2+r48eNV6yiWlZU5QXnGh4SE4CwLRa2l2KvXvaoaxUV/f3+MMi9llqy9DTFF+ZSWX7JNCGPJ/OCDD3DZlJuNqOPR2ecCtIWfMGnWT2zWNmMttoJYhFP0Os5gC6MmNEJUNqnXR01i96Jq11v/McsGj1FEvdsYAU0FFUyP27dvT83Ly3sFDNMqr75WrVr9BS/oGp2vbyx/8sknbxcVFXmDgZjctWvXX7j408rd3b0lrpkDRvCTY8eO/dDDw+M7+J6YhQsXXmGWDwhSFhYWdvrYsWPhza32AuO9dUlJib14X3BwcLwMs2oL99NTpaWljsIOZ2fnilGjRu2TQ0Wk0Wh2VT0g0DG1tbXNESocyO9G2LfLlD8IHdw8R0dHS1ZoSQoqh6HrUT3CCvtN7uVlznJgAwf1rCBq4NRXrcLKUevzHBQU9ERWVtYrxcXFA+H+6gK/HY9TMn18fL775z//eaqpU4plgKfIgFKKqCgWE3HNRIzmXJ+Y6M90YuIJSDi9agLvkFhEUJwzZ85ppos2XWkgOa9cuXIIHINCZyHTeTyIExO9Oq1evbrfu+++e5HdC7Zmo/fquHfvXpPkG+4H1VdffdUnMTFxsXj/gw8+WB4YGKhu2bIl5kELz7rdtWvX3CA5FBYWVh0Dz0zgoUOH/jN06NC/7dy5c7VYTHRxccEpt2WQCuGZqhpoy87OdkpKSnK+dOlSdVufnJw875tvvvnltddeO2phm8s+Ojp6XLt27a7Bs37y4Ycf9j1+/HiE8OaNGzdehJel/N5TxoPu6Vk1zVkMTn+WWFA0a1sotEWW6mxB3akSnld4drT65WtsmwfPVPKGDRtqLCdx4sQJ/I1Kc1yP2jqtSrNNrMDGsnbu8D55YxZzxRkSOP35LpNf4FGrBuqdr6Gum6i3r1pMRBsS/hfEJcasQ2gPYBJ7/sF5/aMB18iL2vOaNERQdJg6derbYLS+VFRUFCLsBIOw6LHHHssIDw/fVsvnfBMSEqoejOHDhx9gurX7ivD/+fPnbzt48ODL586d809NTXUDg/dNTK+//vpJMIj/a2GvxcKePXueAwMw88KFC77NqO5y27Fjx3TxjkGDBiWHhoYe550vOeEK91KN6VxBQUE4te4Gk9iT0lBFJFQ4EyZMOGumRseiFZqCyoEV4HmoHMWVq4cg6OD+2gIuyO164H2F3wuNRh4kJhY/oBxeSimHobZr7ty5o+/evft+Xl5etcdXSUnJg5ig8zAA3l8CedkKZdRYS2WrAFFRiObcEDERX3EgTiwmYmCnry2Y70yeV62B5FGii46B5zyP3S8iio2oFmVlZaW87TPU/mGdUmDCfLe4evXq+3C/Vz/cUVFRKYMHD8bp4zd5fvF8Y5RyDMqDwYFa8Dzf5NfKa8WKFZv5sQE8j2hj4RqJ6Xwbvx8HfzvGxsaGrl27tiMOUGi1WtXFixfnwf4XLdyGeiUmJo555plncK3eS2FhYeV79uwZlJKSUhWNPScnp9233347aPz48ZuYQpYxQTHxyJEjVQFZcA1F8T4pg7M0pJPUyLZCkujIFgpoZOry5Yo7zUIZzB3N1Vy2iQRCixcjGkIxa5qXd1M/TzRONNrJ64QR/L6vISaKxSXRthwx1qNODlOIAxpxvMXzLef23BhB0X7mzJmvp6enfyZ4I3p5eRX37t0767nnnktu3749ijk4mo8C1B29zKF34oyioiIf9E7s0qULGo9pcEIq4b07fn5+P4HBmAfpYTAkO+3bt6/D2bNnfcCYDEHREr0WW7du/e7y5cuxk2LuTiW6dF+bPHnyliVLlkTdvHnTwcorrSqBGDpPY4XI1q6urtoXX3wxOSIi4n+ZLoJpkczy7JGbm9tDvMPf3x87VbctcH80piIKsMDvnjdxhYIvN9j9a7UFKKkcekKB2FhXUjkCxCKUgYq+o8Kuh4Dtp59+OjA7O3se1D3dDB2AIqNKpZoHx92Fsh+2Ak9FsUEgV1FRHIClKWIiRn2ea+G834XzmVZLnVZZUlKCnaI8OOZuPfWfFo5FQbGgtusDx5hSUPSF56B6gLZPnz5ZgwcPxnVsf+HXAfOCU6LnJicnj9FoNPrrPL9Rq+Fmb1/Url27/0ZHRy/i34Oe/f4DBgy4euXKlXeOHDlStdh+VlbWE8zA7BIzgsFYgjHozKhRo9AzMgF39uzZMx7swEeEgy5dujQRXnYxhXhfoDfihg0bqjwVcRuRQXAWxdkgEpXD2stnFtvECq6HWYVcc3XcCeuFex/G8vtEuEfQo1ksJgrHyX0tvyRm3DRiqaYQ6z+Xcl9DUdbthDGCopu3t3coehDiPyNHjkwZO3bsSdj8k+kiCSdywzeL3T+S0RIMxDG48fTTT6PhiN6Jwqh/Ac94Cj4o7du3D4yKikJPle6bN28O2b59e3sUMPG3Yd9/mW76lDnBqQ3JPj4+O6ATa7t79+5hkPeWsbGxztZUWd28ebMNVET33TAPPvhgab9+/a5DZwYffvQkTWby8wzwuHXr1gN6+caF2/Mkzpe1RXm29G+Z9bv1DEZFRquuRVT0VOh91eLOnTtTc3JyutV1EL6PxzFd5EGpn3FTG405MutUmFJMnE3dAqPxUqvVHsI/nTp1Ogcv+yFdhHukDKdEgz0UmpCQ8LeGfrFGo3FNTEx87csvv9zyxhtvHERRHr4P7a2Sjh074vV+Ho8rLi5Gj0dvC5bZ9fjx46/26tULvTBvcdvOcejQobv27dtXLSimpaX1UUpwFhQNwbaq8kSMi4urFhQR3JZQULQWG4SiVcvUNlH49QiQqBxN6rg3wu69v+Hx8qrRX8flviDdrEdwISHUhIg9k8WDzCJRMYkfmqSg9bfFdm5uXfc5d2CRC3iu5b6GoqzbCWMERScwcivi4+MrMAowCn0HDx50bdu2bTakvVOmTPkDbppyAzeK3X/+859ROHWlc+fOWY8//jgayVXeifxGQwNRDcehZ2D6mjVrVGBADoI0ENdbxGNwfTz8bcyDhS4Wip1ovBZGRESgh96Db7311iOQ11BrqcD69u2bOX36dJyeng/XJnD//v39Dhw40Prq1auOkHpA52NBhw4dipYsWfKnzLKO6yf20V8/Ecrzm7WJDRJW/vjyOaQovgvFhGiZVfomNaoUdn1yrMCgw3ZhaEZGxjPGHIzH4fF86nM5b1tsoqOjAxITE/8+fvz4F3BfixYtdgYGBv57zpw5SUwBkWGhDAt54y2Hayme5jyA6cTET1j9YqL+monWIiZa8v5xsrOzq6yoqKhaGy49PR07eekoJgrt3qBBgxzB5ioBu6jBdhC0kZohQ4bgdGdMFbh8ANx7GWBnVc/Btbe3R5vM0ULltTlx4sQDqampEfD8usTGxo6r7UAMzrJv374pISEhf2cyDwqAwVh+//33qm0UFnHdRAzIguCrDIKzEARhuC2WIsiBuQmot0Nla2vfyO9VSoTbSldXVxysqpRp/mr0T/RnrtQnxsm5P6WwAITiPpbc11CUd+fOiGNKXnnllV2Q7Hbv3h0KRpNHfHy8919//RWFCf6P8/Hx2d6tW7d/T58+PZ0LhVU335UrV6bgRnh4OHY6UKAqEF0Mm5UrV7aeMmXK39Vq9cji4uJqb5UuXbrkPfnkk3kRERE4go1TXiy1AA3mHcUpvKkSeccJO1hWIyiWlpYW8E7gLS9g7Nixf0FHPGL58uVVDWp5ebnrjRs3YubPn2/38ccfr2HSTiUW0wLup+HiHUFBQXd451fqqdnWEuW5N6RIpvNW6cR04jpOv8thyoryXF/jZ46yWCQCoZ6oqMRyuGZlZT0P9ZCTkfWVEx7PdBGDhYED1/T09I+zs7OrxQjYnunk5NQKNicz+a39qm+I7GDyiViJ011RTMxk96I5o8D4AaQtrG4x8VdI65j1eSbaWPC3Kjp06JANNlXV9ONTp0493bt3b1+M3MxtqUo/P7/sVatWbTh9+nQ42ElGz5hwdHQsCQkJOeTm5pYpdKrQ7rpw4YLXmTNn+gvH+fv75zHLzUZw+vnnn1/p3r17wrx58zBIDrbhZfyc+0L5wz777LNqWzAjIwM9YH2YjAVFnOIM57pKSBS4du1ataCISBicxZxRISk6cvO9TtZyPZKY8V5JJjt3zALeTfVcHxdoX54Q74iMjMyG9Fcd/W2lCIkCGt6nl7IPW8MDUXT/GuyfyHyN7YAGHqu0+yWgEcdbuoyybieMERRRgMKh1+yIiIgzkHokJyc/sH///sBff/3VH4VASHMvXrw4GI7BlI/eiatXrx6dmZnZHb0Tw8LCsLJO1lsHyw0+s6OgoODxKivTyUnTr1+/jGeffTYRDGys1K7wAv7FTLsIujGUcUMXUytmRUAHHTvbaMhjFGfsnFxG8bZ9+/ZdU1JSqjsrsD0f60Cm81qRA9537tzpLd4BBjt2frOY9FOzDRklYqPBHAaLOYwSDLoiTH27YSHDy1zGVYCFjUhLusALDZkSy+Gen5/foMaQH+8OKQ+ngP7www/B6enpY/WPg32vLF68+MTcuXO/kGv9ayBSn6R1Kr93UFAawHRiIiJ4j05jNcVEHOATojkLYuJESMuZxGLi0qVLx/v6+j5pY2OjgYR5Lucdicp58+Y5urm5OXz44Ycvtm7dGm2JSjxGq9XicVqMkgdUCW4fffSRU4sWLRzg9Zm2bdsKU8KqBEb4jAqjrW/YsOEhE2Y9/4knnrgQHx9fdc4LCws9165d+8OPP/74P6Ghofu47ZMA+d/YrVu3hJ07dw7LycnxgbzYYKZ9fHwy33zzzSPr1q3rB+2jv7Afjs8dMWLEXnj9lbf1FfB97vBsPAN22T/gmfIRMtC7d28c7LWECG8TGxsb9Ndff42fPXv2l7y9Ea9p6QTnIh1skbmCLZKdnd122bJlE2fNmrWEyWdwswaGpjTj//37V2u2UgZnMadgYsk2z2qFH4VeJ2u5HnLzArPU9cE2rIaguG3bNu/IyMi1TBfsS+rnoamoDh061NbBwUEtcf8wwIDdXp+nX4Bc70k9MQvLUZst76nEh0YBayjKup0wRlBEI+4WN/ziILXp0KFD56ioqEcg9QAD9+GTJ0968mnKwsLennFxcThNRfBONKR8+oHh7t2qVavskJCQ3BdeeAEDu6CIiJZZAru3tk4ZI8xB1ZRzfq5PwnVIx8A4wptqtbrl/v37n3z22WfRQ1Rql3Gby5cvB2ZlZbUW7xw+fPhPTOc9Jzl1RXk2V1QmM7tc47TnaPH5VVo54Hu/hjxPNPZ6yfx6VJdJ4eVAQbFtQz6Qmpra7c0339weGBi4csGCBerCwsJpGJ32vgpNq7WB99CL+XuZGiuGIvVJCU5pRoEQg4Iki/YLg0g4gINLlXRgOs/E2sTEWVIXZPbs2ehNfYa3VZW8fRO2nVesWBE+Z84cDHRSxAxHghbaRKfVq1f3e/fdd3HQTaz+2IheXfbs2WOqrGeC7fMj2FB9rl+/jmsZsoKCgk6Qvk9ISMB1rWpvFG1stBMmTEDD8nD79u0ZdKDm4zMgvA+ffaq+H4dnSv3SSy/hGtWZZr5EtgsXLgxLTk5eW1FR4Q7PKXZaD+vZhWiP5j7xxBNDwRapDlRz7ty5uZ988knSvHnzMJJ1uZyeaQy6goIivg4ZMqTe4+A6y8I2aUybYKjOsuCASG3Cj0mWNZF6KZHapjeaKvozRXludtQnlFbiGoo5OTn6Hu/Yxz8pw/JoXVxcanip5+bm4iCzqpbj7fPy8nzc3NzuStxmeOpt1/k869v3MkMsZmE5tlvZMyMunzHPV5JctIbGtuembr/tGnBsGe9ooNcejnjj6HIgGMMPQeqYkZGRyTOqAmP7SfROxAorLCxsN9MtKHrfQz137twv/f39fZluRATXLEzkhm0Rk++6B9YGXpcsjUajH1CHQWXsze8RqUVdhyNHjtRYc61t27aFrVq1QhFaDoJiQAP3m/J3zTFSEsXFhNEWKos5yoGV/U5ukI+w0HUx1/UQC1I7RQ2ZEsvhUlhY6NaQD1RUVNiC4dsb0oZ6W/nc3J5MhqOjMhQTEQyYhoLhKb39KDDhGo+omqF42Ie3AUIAFlmJiRzsOOAgpCGh0L0MYLrBzlxWU0BketstSktLcRC1kN3vtSeIdaacMYHt15np06dvXb58+fjExEQHYz6EXpVwH50aNmwYXo+kIUOGnITn5NimTZtCoS03asp2UFBQ6TvvvLPN3t6+agaKOdvvWbNmvZeSkvKJsGPZsmW4nMoakZBjB/bgiwkJCVv0Pwzlcb548eKGyZMnD1+7du1rTEbTn9HzEKc3Hzhw4L73OnbsyMaMGVPjWAkExQATfo8cvWaofNKUL0DC82GNHoWWRqPX/rGhQ4dekXF+S9GTH+rZalu+pKQE28ra1oF0vnz5cgj0EXGmVbFMylCfmKhv38sNQaS2qrXpxShgDUVZt3d2jfhMJTeoMaUynVdhS39/f6ygUGxsceTIkXfwwIEDB6Lgc5kZHvm7A5/5gVcIdxl5I0qJCjoy7cU7vL29S/r27SuX6c5u2dnZj4l3dOrUKZnff3JoLKwpyvMhppvuPNqCZTHHd2OdE8srfqYnKiouOrJYkBLVp0qM8uxgzgciPz8fB6jc5WSEwbWbwY1EOYmJ6JmAnodfG3gPB/XQQwyjPAcx3fqVcyFdZ/IUE5G7cG5v1fLsVKrVarRP8uCYrHqeM4x6XCUo1nat4BiTCYo8SEo8dHy2Llq0qHLXrl3Df/75Z9+srKxaRcHg4OAS6Pxd7NGjBwbMucrtrj+ff/75LYGBgXZ79+599MyZM86VlYbHZL28vLTw+fThw4fv5B0YnPJcasZr47hs2bKjTCdS92A6YTad6daqFgIT2S9evBgHqtF2xOl4bfg9quW25jVe9+E+WQiK6HUYEhJSq5eeoeAsggApA9tETm0ClU955bP2qNvWTiUujSHeAe0e9sHlKhQVPfTQQ3/06dPn1okTJ7BtwOW7HFavXj182rRp2I6Il8OwjYmJCUtNTR0wf/58bHPy5VCAujz6ZDrgbPD5s1YxkSljDUVZt3d2Tfx8GdxcGfAw3OZGIvvtt996lZWVBfTs2fPWmDFjcOrZTUPeidxILGQ1PQkIy+MIle470BGv0QmPiIg4zTuWUk8xsjl58mQgGOFPi3e2adPmGm/86N4xHRiQZTDfFiI9d2b3r6eoFOoSFRVDLWKiYnF3dy/JyspyNVd9wUUHuZAECa9frswMxfrWFcLZAi+LjXQmXzGx3ntCpVLZMOOCreAxKmbZwCzY4Tnp6OhYGBkZeR3So3l5eR2uX7/um5GR0YLnvyIwMDDf19f3jo+PDy4LcxwSttGpGBEa6ggcXPupe/fumZD65ubmPpyenu6fnJzsUV5ejtdO6+fnp+7cuXOmt7c3XlucHo7ep3EW6HCV8ufgJ6E+FtXPwjOBHcJ0Xq4LtXwHCqey8DZBcTA8PLxKVKwLXEtRHJwFp0XjOoriAC4EQRBSA22OUM/KEaz342bMmPFVTk7OjLi4OBfceezYsQ9u3LiBS5r8D8+747Rp0xaVlZUNmTp16ucdO3b8k8lXJL3PvleymAjlwJmoAUp+BhSwhqKssTPBBcAXQRRUPfXUUwWQlvFOHY5KZ9YygktCogWuL1S2XcQ7wJAN2L17d5eIiIgbCxYs6A4dj5nQ8ZgovO/q6qodP3583KBBg76Ff1OYtFPPbb777ruOR48eXQcNRA3LPSUlxZFZLvp3fVhFlGfI57Y6OtJKi/Is7rTG8vIdMeM1MVckxWrvNgPfr8Qozzlr1qzBPOOC4PZN+SIcYLexqXG7okh2jukGq3xMmWl7e/vqEfCCggIXMGTbhIaGXqivfuQGYmPOpwp/o6ioyNlQHkwAzgZIZHoLs9eBICauZMoSE4V7RdWQc2/JvPFozvgs4zIy6Hn/i4eHh2/v3r1bwrYHu7fsCN5HKKqlMd307nwh0B33dMT2GnuFVzw9PdtC8uvevTuORDvyZwPfuyv6jrsW6kCWcVsipY5jcOAyg8knCFyt4FqI4vUSo6J0Y29Lly6t3qc/3VkABUjcj0KjoWnSFrJNGtUmSBxAyuzlk6gDq9TyWXvUbavuF65fvz4U+n41BnUx2OoPP/zQddSoUVL3+wxRyduPnxYtWuT8yy+/jDh16lSrs2fPuqalpc2E9m8mHuTu7n42ICDgz3nz5n3G21KMEVAs1wthRWLiDt5PeUfBz0USk/8airJuz+1M/H1oGKO34kFeAdxhNI1ZCtzHjRt3RaPRtNN/Az0RN27cuAdSjf39+/cvbNmypRqMXfRawGmvuIB9lhzLgPz222/PQ0r19/d/f9WqVSskvs8MVURKjPJsqspWbuUQREVPkUGqhOjI+H07WE1PHnNfE3NfD/SkwuAK2Ju2bcoX6YmJQvuTww1JUwqK5SEhIdc3b95cXlxcbJeXl9di9erVeyCZQkwy6jhnZ+eqPDDTeozjWonvMd16qWfrOO4rdk9MlKXBCOfxl/rOMbwuM/Z61HVdjL1mjRAUSninCZ8RFNvRCwPFQBQ4K/j7mKrXv9L7fAW///EZxunDKEY78ecM7bFS3rkqY5YbzDX5FCmpA2igGKgf1Vkf9EAUC4wK6STJrfNE5ZNv+cxlDyr1OikBx6lTpy7MzMycY+hN2N9qy5YtByCxPn36BM+YMeMPJi9hEZe6wGXUSsLCwq5BegS2WzGdh/1tfn/gtO1Mfp8k8fdk6bhkZWLiN/xfxQqKtQXGaoD91uzbO3MIivlMJmsWNGPcN23a9C7TqdgBkFrya13Jb6Y0fo2ceIWMr0KwHayw43ilrJG4DNjZfRRSRy4Q2Ik6Xjg9CtePOs47XVIKivVVRNbgHp2r8HLoi3LnFZhnRV+TukQfmVPm5eWVNGHChN+/+OKLflJkYNy4cacgDzdNXM8tYTqhEI0TjN58Se99XO8SPRMnMBmLiVaIll/nsiZ8XsOT1LZYgJm+k6YcNY92m8onz/Ll0jOoOJxiYmJ+4n07nLmGzhqCl6IwGIWe7xgXAQOjqpj8PBULuZ2Swvt+Huzeutw42IqzU+4yy3nfN8UexiWYqpdhEiLvyjCrtbbhessx9VLaA9HUPokpB5etod61Y0S9F1DkYooXMhk6legRh1PFrjJ5uuDn80YhnRk3fauUfyaLNyqlMinDZd7A1VYGNS9jKd2mBEGYCTRUEwcPHrzB09PTZefOnQ/dvHnTHtdCM6v17+SEUyc1L7zwwqXg4GA02m4w03oo4mj+MEg/Mt2ael8zXRTnTN7eTWK6wC0LIC2S2TUpHjZs2OU9e/b0lDITeG2YjKdUyQBPhXwnQRCENYMGy03eXzpbT98LBblKmZZDw22UTCu7PgFMpmLR1q1bvx49evREvX01PCzhf0ErQWhpgmYICYr1k8TuuZgKLtXYiTjEK94kGeZZEOOUjDWUgSCaM9Yi+mi58fp/wcHBxZCeYjqhDaekmit4B/4mDpjg9G0U+Y7zPJh6+s4pSN0g4fxM9ESMEr2Hy1+8zI+RGxmvvvrqF5DCYNtLojzg4NvPTDeoRRjG1Gut0TpqBEEQDQeFxJs8KQq+znCTgbbIxsJZN7b9O8/zJ8fTnwRpJ+TNUwhsWct07SR2b+pzkkxvpbLHH388+fTp0x3M9QMhISFJrJk6OdnoRY4nCIIgCFOASxUMhyQH0WcX04lzTQEH4NA7CpeJwKk2uM6dOQVFHInHQBrC+kAm8U6sZ5pGEC8bGrgVpvg9MxnJuMyFP09SRfVGkTqdXx/ykjcMPi8BzHRehcL6PyQqEgRBNAMULCga2/7JvV3D/A+A9AL/Hx2sYhXYDneGNApSKKQWZvh+nHJ/jOlm/SQ0t+eUBEWCIAjCHJDoI0/j3KK/J9NRd4IgCIIgCKJ+BHEUSWLKHNTDWUWtmc4pwMEM3499DIxHcYs1w6VwSFAkCIIgCIIgCIIgCIIgCMJoVHQKCIIgCIIgCIIgCIIgCIIwFgrKYiG2bdtm0BU0MjLShs4OQRAEQVB7TuUgCIIgCIIglGInkoeihTBkoJPRThAEQRDUnlM5CIIgCIIgCKXZiSQoSnRRyGgnCIIgCGrPqRwEQRAEQRCEEu1ECspCEARBEARBEARBEARBEITRkIciQRAEQRAEQRAEQRAEQRBGQ4IiQRAEQRAEQRAEQRAEQRBGQ4IiQRAEQRAEQRAEQRAEQRBG8/8CDACn2Bhs7uzfIwAAAABJRU5ErkJggg==); + background-size: auto 25px; + } + +} + +.redactor_toolbar li a:hover { + border-color: #98a6ba; + background-color: #dde4ef; + outline: none; +} +.redactor_toolbar li a:active, .redactor_toolbar li a.redactor_act { + border-color: #b5b5b5; + background-color: #ddd; + outline: none; +} + + +/* + BUTTONS + step 25px +*/ +body .redactor_toolbar li a.redactor_btn_html { background-position: 0px; } +body .redactor_toolbar li a.redactor_btn_formatting { background-position: -25px; } +body .redactor_toolbar li a.redactor_btn_bold { background-position: -50px; } +body .redactor_toolbar li a.redactor_btn_italic { background-position: -75px; } +body .redactor_toolbar li a.redactor_btn_deleted { background-position: -500px; } +body .redactor_toolbar li a.redactor_btn_unorderedlist { background-position: -100px; } +body .redactor_toolbar li a.redactor_btn_orderedlist { background-position: -125px; } +body .redactor_toolbar li a.redactor_btn_outdent { background-position: -150px; } +body .redactor_toolbar li a.redactor_btn_indent { background-position: -175px; } +body .redactor_toolbar li a.redactor_btn_image { background-position: -200px; } +body .redactor_toolbar li a.redactor_btn_video { background-position: -225px; } +body .redactor_toolbar li a.redactor_btn_file { background-position: -250px; } +body .redactor_toolbar li a.redactor_btn_table { background-position: -275px; } +body .redactor_toolbar li a.redactor_btn_link { background-position: -300px; } +body .redactor_toolbar li a.redactor_btn_fontcolor { background-position: -325px; } +body .redactor_toolbar li a.redactor_btn_backcolor { background-position: -350px; } +body .redactor_toolbar li a.redactor_btn_alignleft { background-position: -375px; } +body .redactor_toolbar li a.redactor_btn_aligncenter { background-position: -400px; } +body .redactor_toolbar li a.redactor_btn_alignright { background-position: -425px; } +body .redactor_toolbar li a.redactor_btn_justify { background-position: -450px; } +body .redactor_toolbar li a.redactor_btn_horizontalrule { background-position: -475px; } +body .redactor_toolbar li a.redactor_btn_underline { background-position: -525px; } + +body .redactor_toolbar li a.redactor_btn_fullscreen { background-position: -550px; } +body .redactor_toolbar li a.redactor_btn_normalscreen { background-position: -575px; } +body .redactor_toolbar li a.redactor_btn_clips { background-position: -600px; } + +body .redactor_toolbar li a.redactor_btn_alignment { background-position: -625px; } + +/* + Toolbar classes +*/ +.redactor_format_blockquote { + font-style: italic; + color: #666 !important; + padding-left: 10px; +} +.redactor_format_pre { + font-family: monospace, sans-serif; +} +.redactor_format_h1, .redactor_format_h2, .redactor_format_h3, .redactor_format_h4 { + font-weight: bold; +} +.redactor_format_h1 { + font-size: 30px; + line-height: 36px; +} +.redactor_format_h2 { + font-size: 24px; + line-height: 36px; +} +.redactor_format_h3 { + font-size: 20px; + line-height: 30px; +} +.redactor_format_h4 { + font-size: 16px; + line-height: 26px; +} + +/* + DROPDOWN +*/ +.redactor_dropdown { + font-family: Helvetica, Arial, Verdana, Tahoma, sans-serif; + top: 28px; + left: 0; + z-index: 2004; + position: absolute; + width: 200px; + background-color: #fff; + border: 1px solid #ccc; + font-size: 13px; + -webkit-box-shadow: 0 2px 4px #ccc; + -moz-box-shadow: 0 2px 4px #ccc; + box-shadow: 0 2px 4px #ccc; + line-height: 21px; + padding: 10px; +} +.redactor_separator_drop { + border-top: 1px solid #ddd; + padding: 0 !important; + line-height: 0; + font-size: 0; +} +.redactor_dropdown a { + display: block; + color: #000; + padding: 3px 5px; + text-decoration: none; +} +.redactor_dropdown a:hover { + color: #444 !important; + text-decoration: none; + background-color: #dde4ef; +} + +/* ColorPicker */ +.redactor_color_link { + padding: 0 !important; + width: 15px !important; + height: 15px !important; + box-shadow: 0 1px 2px rgba(0, 0, 0, .2) inset !important; + border-radius: 4px !important; + float: left !important; + border: 2px solid #fff !important; + font-size: 0; +} +.redactor_color_none { + font-size: 11px; +} + + + +/* MODAL */ +#redactor_modal_overlay { + position: fixed; + margin: auto; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 50000; + + -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; + filter:alpha(opacity=50); + opacity: 0.50; + + background-color: #333 !important; +} + +#redactor_modal { + background: #f7f7f7; + background: -moz-linear-gradient(top, #f7f7f7 0%, #e2e2e2 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f7f7f7), color-stop(100%,#e2e2e2)); + background: -webkit-linear-gradient(top, #f7f7f7 0%,#e2e2e2 100%); + background: -o-linear-gradient(top, #f7f7f7 0%,#e2e2e2 100%); + background: -ms-linear-gradient(top, #f7f7f7 0%,#e2e2e2 100%); + background: linear-gradient(to bottom, #f7f7f7 0%,#e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f7f7f7', endColorstr='#e2e2e2',GradientType=0 ); + text-shadow: 0 1px 0 #fff; + padding: 0; + position: fixed; + top: 50%; + left: 50%; + box-shadow: 0px 5px 60px #000; + border-radius: 3px; + z-index: 50001; + font-family: Helvetica, Arial, Verdana, Tahoma, sans-serif; + font-size: 12px !important; + color: #000; +} +#redactor_modal_header { + padding: 11px 30px 0 15px; + font-size: 12px; + border-radius: 3px 3px 0 0; + font-weight: bold; +} +#redactor_modal_content { + padding: 20px 30px; + +} +#redactor_modal_close { + position: absolute; + right: 5px; + top: 5px; + font-size: 20px; + width: 20px; + height: 20px; + color: #777; + cursor: pointer; +} +#redactor_modal_close:hover { + color: #000; +} +#redactor_modal label { + margin: 10px 0 3px 0 !important; + padding: 0 !important; + float: none !important; + display: block !important; +} +#redactor_modal textarea { + margin-top: 4px; + display: block; +} +.redactor_input { + width: 99%; + font-size: 14px; +} +.redactor_modal_box { + height: 350px; + overflow: auto; + margin-bottom: 10px; +} +#redactor_image_box { + height: 270px; + overflow: auto; + margin-bottom: 10px; +} +#redactor_image_box_select { + display: block; + width: 200px; + margin-bottom: 15px; +} +#redactor_image_box img { + margin-right: 10px; + margin-bottom: 10px; + cursor: pointer; + max-width: 100px; +} +#redactor_tabs { + margin-bottom: 18px; +} +#redactor_tabs a { + display: inline-block; + border: 1px solid #d2d2d2; + padding: 4px 14px; + font-size: 12px; + background-color: #fff; + text-decoration: none; + color: #000; + line-height: 1; + border-radius: 10px; + margin-right: 5px; +} +#redactor_tabs a:hover, #redactor_tabs a.redactor_tabs_act { + background-color: #ddd; + padding: 5px 15px; + box-shadow: 0 1px 2px rgba(0, 0, 0, .4) inset; + border: none; + text-shadow: 0 1px 0 #eee; + color: #777 !important; + text-decoration: none !important; +} +#redactor_modal_footer { + padding: 9px 30px 20px 30px; + border-radius: 0 0 3px 3px; + text-align: right; +} + +#redactor_modal input[type="radio"], +#redactor_modal input[type="checkbox"] { + position: relative; + top: -1px; +} +#redactor_modal input[type="text"], +#redactor_modal input[type="password"], +#redactor_modal input[type="email"], +#redactor_modal textarea { + position: relative; + z-index: 2; + font-family: Helvetica, Arial, Tahoma, sans-serif; + height: 23px; + border: 1px solid #ccc; + margin: 0; + padding: 1px 2px; + background-color: white; + color: #333; + font-size: 13px; + line-height: 1; + border-radius: 1px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset; + -webkit-transition: border 0.3s ease-in; + -moz-transition: border 0.3s ease-in; + -ms-transition: border 0.3s ease-in; + -o-transition: border 0.3s ease-in; + transition: border 0.3s ease-in; +} +#redactor_modal textarea { + line-height: 1.4em; +} +#redactor_modal input:focus, +#redactor_modal textarea:focus { + outline: none; + border-color: #5ca9e4; + box-shadow: 0 0 0 2px rgba(70, 161, 231, 0.3), 0 1px 2px rgba(0, 0, 0, 0.2) inset; +} + +.redactor_modal_btn { + margin-left: 8px; + position: relative; + cursor: pointer; + outline: none; + display: inline-block; + text-align: center; + text-decoration: none; + font-family: Helvetica, Arial, Verdana, Tahoma, sans-serif; + line-height: 1; + font-size: 12px; + font-weight: normal; + padding: 6px 16px 5px 16px; + border-radius: 4px; + background-color: #f3f3f3; + background-image: -moz-linear-gradient(top, #ffffff, #e1e1e1); + background-image: -ms-linear-gradient(top, #ffffff, #e1e1e1); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e1e1e1)); + background-image: -webkit-linear-gradient(top, #ffffff, #e1e1e1); + background-image: -o-linear-gradient(top, #ffffff, #e1e1e1); + background-image: linear-gradient(top, #ffffff, #e1e1e1); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e1e1e1', GradientType=0); + border: 1px solid #ccc; + border-bottom-color: #aaa; + box-shadow: 0 1px 1px rgba(0, 0, 0, .1); + text-shadow: 0 1px 0px #ffffff; + color: #000; +} +.redactor_modal_btn:hover { + color: #555; +} +.redactor_modal_btn:hover { + filter: none; + background: none; + background: #f3f3f3; + text-shadow: 0 1px 0px rgba(255, 255, 255, 0.8); + text-decoration: none; +} + + +/* Drag and Drop Area */ +.redactor_droparea { + position: relative; + width: 100%; + margin: auto; + margin-bottom: 5px; +} +.redactor_droparea .redactor_dropareabox { + z-index: 1; + position: relative; + text-align: center; + width: 99%; + background-color: #fff; + padding: 60px 0; + border: 2px dashed #bbb; +} +.redactor_droparea .redactor_dropareabox, .redactor_dropalternative { + color: #555; + font-size: 12px; +} +.redactor_dropalternative { + margin: 4px 0 2px 0; +} +.redactor_dropareabox.hover { + background: #efe3b8; + border-color: #aaa; +} +.redactor_dropareabox.error { + background: #f7e5e5; + border-color: #dcc3c3; +} +.redactor_dropareabox.drop { + background: #f4f4ee; + border-color: #e0e5d6; +} + +.redactor_editor table { + width: 100%; +} + +.redactor_textarea { + height: 400px; +} \ No newline at end of file diff --git a/app/public_html/admin/assets/fonts/fa-brands-400.eot b/app/public_html/admin/assets/fonts/fa-brands-400.eot new file mode 100644 index 0000000..a157bbe Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-brands-400.eot differ diff --git a/app/public_html/admin/assets/fonts/fa-brands-400.svg b/app/public_html/admin/assets/fonts/fa-brands-400.svg new file mode 100644 index 0000000..604731b --- /dev/null +++ b/app/public_html/admin/assets/fonts/fa-brands-400.svg @@ -0,0 +1,3570 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:11 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/public_html/admin/assets/fonts/fa-brands-400.ttf b/app/public_html/admin/assets/fonts/fa-brands-400.ttf new file mode 100644 index 0000000..1b9e561 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-brands-400.ttf differ diff --git a/app/public_html/admin/assets/fonts/fa-brands-400.woff b/app/public_html/admin/assets/fonts/fa-brands-400.woff new file mode 100644 index 0000000..710daa0 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-brands-400.woff differ diff --git a/app/public_html/admin/assets/fonts/fa-brands-400.woff2 b/app/public_html/admin/assets/fonts/fa-brands-400.woff2 new file mode 100644 index 0000000..6159608 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-brands-400.woff2 differ diff --git a/app/public_html/admin/assets/fonts/fa-duotone-900.eot b/app/public_html/admin/assets/fonts/fa-duotone-900.eot new file mode 100644 index 0000000..d4643e9 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-duotone-900.eot differ diff --git a/app/public_html/admin/assets/fonts/fa-duotone-900.svg b/app/public_html/admin/assets/fonts/fa-duotone-900.svg new file mode 100644 index 0000000..be2d862 --- /dev/null +++ b/app/public_html/admin/assets/fonts/fa-duotone-900.svg @@ -0,0 +1,15055 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:12 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/public_html/admin/assets/fonts/fa-duotone-900.ttf b/app/public_html/admin/assets/fonts/fa-duotone-900.ttf new file mode 100644 index 0000000..de0cba0 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-duotone-900.ttf differ diff --git a/app/public_html/admin/assets/fonts/fa-duotone-900.woff b/app/public_html/admin/assets/fonts/fa-duotone-900.woff new file mode 100644 index 0000000..80fab10 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-duotone-900.woff differ diff --git a/app/public_html/admin/assets/fonts/fa-duotone-900.woff2 b/app/public_html/admin/assets/fonts/fa-duotone-900.woff2 new file mode 100644 index 0000000..9f1bfab Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-duotone-900.woff2 differ diff --git a/app/public_html/admin/assets/fonts/fa-light-300.eot b/app/public_html/admin/assets/fonts/fa-light-300.eot new file mode 100644 index 0000000..3022a93 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-light-300.eot differ diff --git a/app/public_html/admin/assets/fonts/fa-light-300.svg b/app/public_html/admin/assets/fonts/fa-light-300.svg new file mode 100644 index 0000000..e4b8df6 --- /dev/null +++ b/app/public_html/admin/assets/fonts/fa-light-300.svg @@ -0,0 +1,12330 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:12 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/public_html/admin/assets/fonts/fa-light-300.ttf b/app/public_html/admin/assets/fonts/fa-light-300.ttf new file mode 100644 index 0000000..6cbc5bb Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-light-300.ttf differ diff --git a/app/public_html/admin/assets/fonts/fa-light-300.woff b/app/public_html/admin/assets/fonts/fa-light-300.woff new file mode 100644 index 0000000..bc7f599 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-light-300.woff differ diff --git a/app/public_html/admin/assets/fonts/fa-light-300.woff2 b/app/public_html/admin/assets/fonts/fa-light-300.woff2 new file mode 100644 index 0000000..905f3e6 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-light-300.woff2 differ diff --git a/app/public_html/admin/assets/fonts/fa-regular-400.eot b/app/public_html/admin/assets/fonts/fa-regular-400.eot new file mode 100644 index 0000000..e159e88 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-regular-400.eot differ diff --git a/app/public_html/admin/assets/fonts/fa-regular-400.svg b/app/public_html/admin/assets/fonts/fa-regular-400.svg new file mode 100644 index 0000000..9e76280 --- /dev/null +++ b/app/public_html/admin/assets/fonts/fa-regular-400.svg @@ -0,0 +1,11256 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:13 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/public_html/admin/assets/fonts/fa-regular-400.ttf b/app/public_html/admin/assets/fonts/fa-regular-400.ttf new file mode 100644 index 0000000..3e59ba4 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-regular-400.ttf differ diff --git a/app/public_html/admin/assets/fonts/fa-regular-400.woff b/app/public_html/admin/assets/fonts/fa-regular-400.woff new file mode 100644 index 0000000..299ace5 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-regular-400.woff differ diff --git a/app/public_html/admin/assets/fonts/fa-regular-400.woff2 b/app/public_html/admin/assets/fonts/fa-regular-400.woff2 new file mode 100644 index 0000000..8d941d2 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-regular-400.woff2 differ diff --git a/app/public_html/admin/assets/fonts/fa-solid-900.eot b/app/public_html/admin/assets/fonts/fa-solid-900.eot new file mode 100644 index 0000000..32d630e Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-solid-900.eot differ diff --git a/app/public_html/admin/assets/fonts/fa-solid-900.svg b/app/public_html/admin/assets/fonts/fa-solid-900.svg new file mode 100644 index 0000000..6736ffa --- /dev/null +++ b/app/public_html/admin/assets/fonts/fa-solid-900.svg @@ -0,0 +1,9588 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:12 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/public_html/admin/assets/fonts/fa-solid-900.ttf b/app/public_html/admin/assets/fonts/fa-solid-900.ttf new file mode 100644 index 0000000..57f4d60 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-solid-900.ttf differ diff --git a/app/public_html/admin/assets/fonts/fa-solid-900.woff b/app/public_html/admin/assets/fonts/fa-solid-900.woff new file mode 100644 index 0000000..7066a56 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-solid-900.woff differ diff --git a/app/public_html/admin/assets/fonts/fa-solid-900.woff2 b/app/public_html/admin/assets/fonts/fa-solid-900.woff2 new file mode 100644 index 0000000..af2dd82 Binary files /dev/null and b/app/public_html/admin/assets/fonts/fa-solid-900.woff2 differ diff --git a/app/public_html/admin/assets/fonts/slick.eot b/app/public_html/admin/assets/fonts/slick.eot new file mode 100644 index 0000000..2cbab9c Binary files /dev/null and b/app/public_html/admin/assets/fonts/slick.eot differ diff --git a/app/public_html/admin/assets/fonts/slick.svg b/app/public_html/admin/assets/fonts/slick.svg new file mode 100644 index 0000000..b36a66a --- /dev/null +++ b/app/public_html/admin/assets/fonts/slick.svg @@ -0,0 +1,14 @@ + + + +Generated by Fontastic.me + + + + + + + + + + diff --git a/app/public_html/admin/assets/fonts/slick.ttf b/app/public_html/admin/assets/fonts/slick.ttf new file mode 100644 index 0000000..9d03461 Binary files /dev/null and b/app/public_html/admin/assets/fonts/slick.ttf differ diff --git a/app/public_html/admin/assets/fonts/slick.woff b/app/public_html/admin/assets/fonts/slick.woff new file mode 100644 index 0000000..8ee9972 Binary files /dev/null and b/app/public_html/admin/assets/fonts/slick.woff differ diff --git a/app/public_html/admin/assets/img/admin_logo.png b/app/public_html/admin/assets/img/admin_logo.png new file mode 100644 index 0000000..1752d03 Binary files /dev/null and b/app/public_html/admin/assets/img/admin_logo.png differ diff --git a/app/public_html/admin/assets/img/gears.gif b/app/public_html/admin/assets/img/gears.gif new file mode 100644 index 0000000..d4ef0ea Binary files /dev/null and b/app/public_html/admin/assets/img/gears.gif differ diff --git a/app/public_html/admin/assets/js/bootstrap4.min.js b/app/public_html/admin/assets/js/bootstrap4.min.js new file mode 100644 index 0000000..9551646 --- /dev/null +++ b/app/public_html/admin/assets/js/bootstrap4.min.js @@ -0,0 +1,6 @@ +/*! + * Bootstrap v4.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],t):t((e=e||self).bootstrap={},e.jQuery)}(this,function(e,p){"use strict";function i(e,t){for(var n=0;nthis._items.length-1||e<0))if(this._isSliding)p(this._element).one(V.SLID,function(){return t.to(e)});else{if(n===e)return this.pause(),void this.cycle();var i=n=i.clientWidth&&n>=i.clientHeight}),u=0l[e]&&!i.escapeWithReference&&(n=Math.min(h[t],l[e]-("right"===e?h.width:h.height))),Ye({},t,n)}};return c.forEach(function(e){var t=-1!==["left","top"].indexOf(e)?"primary":"secondary";h=ze({},h,u[t](e))}),e.offsets.popper=h,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,i=t.reference,o=e.placement.split("-")[0],r=Math.floor,s=-1!==["top","bottom"].indexOf(o),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]r(i[a])&&(e.offsets.popper[l]=r(i[a])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var n;if(!gt(e.instance.modifiers,"arrow","keepTogether"))return e;var i=t.element;if("string"==typeof i){if(!(i=e.instance.popper.querySelector(i)))return e}else if(!e.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var o=e.placement.split("-")[0],r=e.offsets,s=r.popper,a=r.reference,l=-1!==["left","right"].indexOf(o),c=l?"height":"width",h=l?"Top":"Left",u=h.toLowerCase(),f=l?"left":"top",d=l?"bottom":"right",p=nt(i)[c];a[d]-ps[d]&&(e.offsets.popper[u]+=a[u]+p-s[d]),e.offsets.popper=Xe(e.offsets.popper);var m=a[u]+a[c]/2-p/2,g=ke(e.instance.popper),_=parseFloat(g["margin"+h],10),v=parseFloat(g["border"+h+"Width"],10),y=m-e.offsets.popper[u]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),e.arrowElement=i,e.offsets.arrow=(Ye(n={},u,Math.round(y)),Ye(n,f,""),n),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(m,g){if(at(m.instance.modifiers,"inner"))return m;if(m.flipped&&m.placement===m.originalPlacement)return m;var _=Ze(m.instance.popper,m.instance.reference,g.padding,g.boundariesElement,m.positionFixed),v=m.placement.split("-")[0],y=it(v),E=m.placement.split("-")[1]||"",b=[];switch(g.behavior){case Et:b=[v,y];break;case bt:b=yt(v);break;case wt:b=yt(v,!0);break;default:b=g.behavior}return b.forEach(function(e,t){if(v!==e||b.length===t+1)return m;v=m.placement.split("-")[0],y=it(v);var n=m.offsets.popper,i=m.offsets.reference,o=Math.floor,r="left"===v&&o(n.right)>o(i.left)||"right"===v&&o(n.left)o(i.top)||"bottom"===v&&o(n.top)o(_.right),l=o(n.top)o(_.bottom),h="left"===v&&s||"right"===v&&a||"top"===v&&l||"bottom"===v&&c,u=-1!==["top","bottom"].indexOf(v),f=!!g.flipVariations&&(u&&"start"===E&&s||u&&"end"===E&&a||!u&&"start"===E&&l||!u&&"end"===E&&c),d=!!g.flipVariationsByContent&&(u&&"start"===E&&a||u&&"end"===E&&s||!u&&"start"===E&&c||!u&&"end"===E&&l),p=f||d;(r||h||p)&&(m.flipped=!0,(r||h)&&(v=b[t+1]),p&&(E=function(e){return"end"===e?"start":"start"===e?"end":e}(E)),m.placement=v+(E?"-"+E:""),m.offsets.popper=ze({},m.offsets.popper,ot(m.instance.popper,m.offsets.reference,m.placement)),m=st(m.instance.modifiers,m,"flip"))}),m},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],i=e.offsets,o=i.popper,r=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return o[s?"left":"top"]=r[n]-(a?o[s?"width":"height"]:0),e.placement=it(t),e.offsets.popper=Xe(o),e}},hide:{order:800,enabled:!0,fn:function(e){if(!gt(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=rt(e.instance.modifiers,function(e){return"preventOverflow"===e.name}).boundaries;if(t.bottomn.right||t.top>n.bottom||t.rightdocument.documentElement.clientHeight;!this._isBodyOverflowing&&e&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!e&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var e=document.body.getBoundingClientRect();this._isBodyOverflowing=e.left+e.right
    ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Cn,popperConfig:null},Fn="show",Mn="out",Wn={HIDE:"hide"+Nn,HIDDEN:"hidden"+Nn,SHOW:"show"+Nn,SHOWN:"shown"+Nn,INSERTED:"inserted"+Nn,CLICK:"click"+Nn,FOCUSIN:"focusin"+Nn,FOCUSOUT:"focusout"+Nn,MOUSEENTER:"mouseenter"+Nn,MOUSELEAVE:"mouseleave"+Nn},Un="fade",Bn="show",qn=".tooltip-inner",Kn=".arrow",Qn="hover",Vn="focus",Yn="click",zn="manual",Xn=function(){function i(e,t){if("undefined"==typeof St)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=e,this.config=this._getConfig(t),this.tip=null,this._setListeners()}var e=i.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(e){if(this._isEnabled)if(e){var t=this.constructor.DATA_KEY,n=p(e.currentTarget).data(t);n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(t,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(Bn))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var e=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(e);var n=m.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&p(o).addClass(Un);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(o).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(o).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new St(this.element,o,this._getPopperConfig(a)),p(o).addClass(Bn),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var c=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,p(t.element).trigger(t.constructor.Event.SHOWN),e===Mn&&t._leave(null,t)};if(p(this.tip).hasClass(Un)){var h=m.getTransitionDurationFromElement(this.tip);p(this.tip).one(m.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},e.hide=function(e){function t(){n._hoverState!==Fn&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),p(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()}var n=this,i=this.getTipElement(),o=p.Event(this.constructor.Event.HIDE);if(p(this.element).trigger(o),!o.isDefaultPrevented()){if(p(i).removeClass(Bn),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger[Yn]=!1,this._activeTrigger[Vn]=!1,this._activeTrigger[Qn]=!1,p(this.tip).hasClass(Un)){var r=m.getTransitionDurationFromElement(i);p(i).one(m.TRANSITION_END,t).emulateTransitionEnd(r)}else t();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(e){p(this.getTipElement()).addClass(Ln+"-"+e)},e.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},e.setContent=function(){var e=this.getTipElement();this.setElementContent(p(e.querySelectorAll(qn)),this.getTitle()),p(e).removeClass(Un+" "+Bn)},e.setElementContent=function(e,t){"object"!=typeof t||!t.nodeType&&!t.jquery?this.config.html?(this.config.sanitize&&(t=In(t,this.config.whiteList,this.config.sanitizeFn)),e.html(t)):e.text(t):this.config.html?p(t).parent().is(e)||e.empty().append(t):e.text(p(t).text())},e.getTitle=function(){var e=this.element.getAttribute("data-original-title");return e=e||("function"==typeof this.config.title?this.config.title.call(this.element):this.config.title)},e._getPopperConfig=function(e){var t=this;return l({},{placement:e,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:Kn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){return t._handlePopperPlacementChange(e)}},{},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,{},t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},e._getAttachment=function(e){return Hn[e.toUpperCase()]},e._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(e){if("click"===e)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(e){return i.toggle(e)});else if(e!==zn){var t=e===Qn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=e===Qn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(t,i.config.selector,function(e){return i._enter(e)}).on(n,i.config.selector,function(e){return i._leave(e)})}}),this._hideModalHandler=function(){i.element&&i.hide()},p(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var e=typeof this.element.getAttribute("data-original-title");!this.element.getAttribute("title")&&"string"==e||(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusin"===e.type?Vn:Qn]=!0),p(t.getTipElement()).hasClass(Bn)||t._hoverState===Fn?t._hoverState=Fn:(clearTimeout(t._timeout),t._hoverState=Fn,t.config.delay&&t.config.delay.show?t._timeout=setTimeout(function(){t._hoverState===Fn&&t.show()},t.config.delay.show):t.show())},e._leave=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusout"===e.type?Vn:Qn]=!1),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState=Mn,t.config.delay&&t.config.delay.hide?t._timeout=setTimeout(function(){t._hoverState===Mn&&t.hide()},t.config.delay.hide):t.hide())},e._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},e._getConfig=function(e){var t=p(this.element).data();return Object.keys(t).forEach(function(e){-1!==xn.indexOf(e)&&delete t[e]}),"number"==typeof(e=l({},this.constructor.Default,{},t,{},"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),m.typeCheckConfig(An,e,this.constructor.DefaultType),e.sanitize&&(e.template=In(e.template,e.whiteList,e.sanitizeFn)),e},e._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},e._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(Pn);null!==t&&t.length&&e.removeClass(t.join(""))},e._handlePopperPlacementChange=function(e){var t=e.instance;this.tip=t.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(e.placement))},e._fixTransition=function(){var e=this.getTipElement(),t=this.config.animation;null===e.getAttribute("x-placement")&&(p(e).removeClass(Un),this.config.animation=!1,this.hide(),this.show(),this.config.animation=t)},i._jQueryInterface=function(n){return this.each(function(){var e=p(this).data(On),t="object"==typeof n&&n;if((e||!/dispose|hide/.test(n))&&(e||(e=new i(this,t),p(this).data(On,e)),"string"==typeof n)){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return Rn}},{key:"NAME",get:function(){return An}},{key:"DATA_KEY",get:function(){return On}},{key:"Event",get:function(){return Wn}},{key:"EVENT_KEY",get:function(){return Nn}},{key:"DefaultType",get:function(){return jn}}]),i}();p.fn[An]=Xn._jQueryInterface,p.fn[An].Constructor=Xn,p.fn[An].noConflict=function(){return p.fn[An]=kn,Xn._jQueryInterface};var Gn="popover",$n="bs.popover",Jn="."+$n,Zn=p.fn[Gn],ei="bs-popover",ti=new RegExp("(^|\\s)"+ei+"\\S+","g"),ni=l({},Xn.Default,{placement:"right",trigger:"click",content:"",template:''}),ii=l({},Xn.DefaultType,{content:"(string|element|function)"}),oi="fade",ri="show",si=".popover-header",ai=".popover-body",li={HIDE:"hide"+Jn,HIDDEN:"hidden"+Jn,SHOW:"show"+Jn,SHOWN:"shown"+Jn,INSERTED:"inserted"+Jn,CLICK:"click"+Jn,FOCUSIN:"focusin"+Jn,FOCUSOUT:"focusout"+Jn,MOUSEENTER:"mouseenter"+Jn,MOUSELEAVE:"mouseleave"+Jn},ci=function(e){function i(){return e.apply(this,arguments)||this}!function(e,t){e.prototype=Object.create(t.prototype),(e.prototype.constructor=e).__proto__=t}(i,e);var t=i.prototype;return t.isWithContent=function(){return this.getTitle()||this._getContent()},t.addAttachmentClass=function(e){p(this.getTipElement()).addClass(ei+"-"+e)},t.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},t.setContent=function(){var e=p(this.getTipElement());this.setElementContent(e.find(si),this.getTitle());var t=this._getContent();"function"==typeof t&&(t=t.call(this.element)),this.setElementContent(e.find(ai),t),e.removeClass(oi+" "+ri)},t._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},t._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(ti);null!==t&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||e'); + + var fancyContent = $(el).closest('.fancybox-content'); + fancyContent.html('
    '); + + + e.preventDefault(); + el.ajaxSubmit( function( data ) { + // Если ответ в формате json + try { + var result = JSON.parse(data); + $.fancybox.close(); + if ( result.html ) { + $.fancybox.open( result.html ); + if ( result.reload ) { + setTimeout("location.reload();", 2000); + } + if ( result.redirect ) { + setTimeout("location.href='" + result.redirect + "'" , 2000); + } + } else { + if ( result.reload ) { + location.reload(); + } + } + } catch(e) { + $.fancybox.close(); + $.fancybox.open( data ); + } + } ); + return false; + }); + + $('body').on('submit', '.fancybox-content form[data-autoajaxsubmit=false]', function(e) { + if ( $(this).data('blocked') == true) { + return false; + } + + $.fancybox.close(); + return true; + }); + + $('body').on('change', '[type=file]', function(e) { + + + var label; + if ($(this).parent().prop('nodeName') == 'LABEL') { + label = $(this).parent(); + } else { + var id = $(this).attr('id'); + if (id != undefined) { + var label = $('label[for='+id+']'); + } + } + + if ( label != undefined ) { + if ( $(this).get(0).files[0] != undefined ) { + label.addClass('upload-file-filled'); + } else { + label.removeClass('upload-file-filled'); + } + } + + }); + + + // +/- assistent + $('.input-group .btn-minus').on('click', function() { + var el = $(this).closest('.input-group').find('input'); + + var min = 0; + if (el.attr('min')) min = el.attr('min'); + + var value = el.val(); + + if (value > min) { + value--; + el.val(value); + el.change(); + } + + return true; + }); + + $('.input-group .btn-plus').on('click', function() { + var el = $(this).closest('.input-group').find('input'); + + var value = el.val(); + + if (el.attr('max') != undefined && value >= el.attr('max') ) return false; + + value++; + el.val(value); + el.change(); + + return true; + }); + +}); + + + +var blackOutMessages = [ + 'Придумаваю новую отмазку, лишь бы не работать...', + 'Майню биткойны...', 'Обучаю нейросеть убивать человеков...', + 'Гоняюсь за вирусами по жесткому диску...', + 'Рассчитываю фазы луны...', + 'Гоняю человеков в Quake II...', + 'Жду подходящего момента, чтобы показать ошибку...', + 'Бегу на склад сверить наличие...', + 'Компилирую...','Декомпилирую...','Загружаю...','Выгружаю...','Перезагружаю сервер...', + 'Подбираю коды запука ракет...']; +var blackOutMessagesIndex = 0; + +function showBlackoutScreen() { + $('#blackout_sbmt').css('display', 'flex'); + + function random(n) { + return Math.floor(Math.random() * Math.floor(n)); + } + + function shuffle (arr) { + for (var i = 0; i < arr.length; i++) { + var j = random(arr.length); + var k = random(arr.length); + var t = arr[j]; + arr[j] = arr[k]; + arr[k] = t; + } + return arr; + } + + shuffle(blackOutMessages); + + setInterval(changeBlackoutText, 3000); +} + +function changeBlackoutText() { + $('#blackoutText').fadeOut('slow', function(){ + if ( blackOutMessagesIndex >= blackOutMessages.length ) { + blackOutMessagesIndex = 0; + } else { + blackOutMessagesIndex++; + } + $('#blackoutText').html(blackOutMessages[blackOutMessagesIndex]); + $('#blackoutText').fadeIn('slow'); + }); +} + +function submenuResize() { + if ( window.innerWidth > 991 ) { + $('.autosize-menu').each( function( i, el ) { + var cnt = $(el).find('a').length; + var width = $(el).width() / cnt; + $(el).find('a').css('max-width', width + 'px'); + }); + } +} + + diff --git a/app/public_html/admin/assets/js/chosen.jquery.min.js b/app/public_html/admin/assets/js/chosen.jquery.min.js new file mode 100644 index 0000000..bcde6bc --- /dev/null +++ b/app/public_html/admin/assets/js/chosen.jquery.min.js @@ -0,0 +1,1280 @@ +// Chosen, a Select Box Enhancer for jQuery and Prototype +// by Patrick Filler for Harvest, http://getharvest.com +// +// Version 0.11.1 +// Full source at https://github.com/harvesthq/chosen +// Copyright (c) 2011 Harvest http://getharvest.com + +// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md +// This file is generated by `grunt build`, do not edit it by hand. +(function() { + var SelectParser; + + SelectParser = (function() { + function SelectParser() { + this.options_index = 0; + this.parsed = []; + } + + SelectParser.prototype.add_node = function(child) { + if (child.nodeName.toUpperCase() === "OPTGROUP") { + return this.add_group(child); + } else { + return this.add_option(child); + } + }; + + SelectParser.prototype.add_group = function(group) { + var group_position, option, _i, _len, _ref, _results; + + group_position = this.parsed.length; + this.parsed.push({ + array_index: group_position, + group: true, + label: group.label, + children: 0, + disabled: group.disabled + }); + _ref = group.childNodes; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + option = _ref[_i]; + _results.push(this.add_option(option, group_position, group.disabled)); + } + return _results; + }; + + SelectParser.prototype.add_option = function(option, group_position, group_disabled) { + if (option.nodeName.toUpperCase() === "OPTION") { + if (option.text !== "") { + if (group_position != null) { + this.parsed[group_position].children += 1; + } + this.parsed.push({ + array_index: this.parsed.length, + options_index: this.options_index, + value: option.value, + text: option.text, + html: option.innerHTML, + selected: option.selected, + disabled: group_disabled === true ? group_disabled : option.disabled, + group_array_index: group_position, + classes: option.className, + style: option.style.cssText + }); + } else { + this.parsed.push({ + array_index: this.parsed.length, + options_index: this.options_index, + empty: true + }); + } + return this.options_index += 1; + } + }; + + return SelectParser; + + })(); + + SelectParser.select_to_array = function(select) { + var child, parser, _i, _len, _ref; + + parser = new SelectParser(); + _ref = select.childNodes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + parser.add_node(child); + } + return parser.parsed; + }; + + this.SelectParser = SelectParser; + +}).call(this); + +(function() { + var AbstractChosen, root; + + root = this; + + AbstractChosen = (function() { + function AbstractChosen(form_field, options) { + this.form_field = form_field; + this.options = options != null ? options : {}; + if (!AbstractChosen.browser_is_supported()) { + return; + } + this.is_multiple = this.form_field.multiple; + this.addlink = $(this.form_field).data('addlink'); + this.set_default_text(); + this.set_default_values(); + this.setup(); + this.set_up_html(); + this.register_observers(); + this.finish_setup(); + } + + AbstractChosen.prototype.set_default_values = function() { + var _this = this; + + this.click_test_action = function(evt) { + return _this.test_active_click(evt); + }; + this.activate_action = function(evt) { + return _this.activate_field(evt); + }; + this.active_field = false; + this.mouse_on_container = false; + this.results_showing = false; + this.result_highlighted = null; + this.result_single_selected = null; + this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false; + this.disable_search_threshold = this.options.disable_search_threshold || 0; + this.disable_search = this.options.disable_search || false; + this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true; + this.search_contains = this.options.search_contains || false; + this.single_backstroke_delete = this.options.single_backstroke_delete || false; + this.max_selected_options = this.options.max_selected_options || Infinity; + return this.inherit_select_classes = this.options.inherit_select_classes || false; + }; + + AbstractChosen.prototype.set_default_text = function() { + if (this.form_field.getAttribute("data-placeholder")) { + this.default_text = this.form_field.getAttribute("data-placeholder"); + } else if (this.is_multiple) { + this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text; + } else { + this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text; + } + return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text; + }; + + AbstractChosen.prototype.mouse_enter = function() { + return this.mouse_on_container = true; + }; + + AbstractChosen.prototype.mouse_leave = function() { + return this.mouse_on_container = false; + }; + + AbstractChosen.prototype.input_focus = function(evt) { + var _this = this; + + if (this.is_multiple) { + if (!this.active_field) { + return setTimeout((function() { + return _this.container_mousedown(); + }), 50); + } + } else { + if (!this.active_field) { + return this.activate_field(); + } + } + }; + + AbstractChosen.prototype.input_blur = function(evt) { + var _this = this; + + if (!this.mouse_on_container) { + this.active_field = false; + return setTimeout((function() { + return _this.blur_test(); + }), 100); + } + }; + + AbstractChosen.prototype.result_add_option = function(option) { + var classes, style; + + option.dom_id = this.container_id + "_o_" + option.array_index; + classes = []; + if (!option.disabled && !(option.selected && this.is_multiple)) { + classes.push("active-result"); + } + if (option.disabled && !(option.selected && this.is_multiple)) { + classes.push("disabled-result"); + } + if (option.selected) { + classes.push("result-selected"); + } + if (option.group_array_index != null) { + classes.push("group-option"); + } + if (option.classes !== "") { + classes.push(option.classes); + } + style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : ""; + return '
  • ' + option.html + '
  • '; + }; + + AbstractChosen.prototype.results_update_field = function() { + this.set_default_text(); + if (!this.is_multiple) { + this.results_reset_cleanup(); + } + this.result_clear_highlight(); + this.result_single_selected = null; + return this.results_build(); + }; + + AbstractChosen.prototype.results_toggle = function() { + if (this.results_showing) { + return this.results_hide(); + } else { + return this.results_show(); + } + }; + + AbstractChosen.prototype.results_search = function(evt) { + if (this.results_showing) { + return this.winnow_results(); + } else { + return this.results_show(); + } + }; + + AbstractChosen.prototype.choices_count = function() { + var option, _i, _len, _ref; + + if (this.selected_option_count != null) { + return this.selected_option_count; + } + this.selected_option_count = 0; + _ref = this.form_field.options; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + option = _ref[_i]; + if (option.selected) { + this.selected_option_count += 1; + } + } + return this.selected_option_count; + }; + + AbstractChosen.prototype.choices_click = function(evt) { + evt.preventDefault(); + if (!(this.results_showing || this.is_disabled)) { + return this.results_show(); + } + }; + + AbstractChosen.prototype.keyup_checker = function(evt) { + var stroke, _ref; + + stroke = (_ref = evt.which) != null ? _ref : evt.keyCode; + this.search_field_scale(); + switch (stroke) { + case 8: + if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) { + return this.keydown_backstroke(); + } else if (!this.pending_backstroke) { + this.result_clear_highlight(); + return this.results_search(); + } + break; + case 13: + evt.preventDefault(); + if (this.results_showing) { + return this.result_select(evt); + } + break; + case 27: + if (this.results_showing) { + this.results_hide(); + } + return true; + case 9: + case 38: + case 40: + case 16: + case 91: + case 17: + break; + default: + return this.results_search(); + } + }; + + AbstractChosen.prototype.generate_field_id = function() { + var new_id; + + new_id = this.generate_random_id(); + this.form_field.id = new_id; + return new_id; + }; + + AbstractChosen.prototype.generate_random_char = function() { + var chars, newchar, rand; + + chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + rand = Math.floor(Math.random() * chars.length); + return newchar = chars.substring(rand, rand + 1); + }; + + AbstractChosen.prototype.container_width = function() { + if (this.options.width != null) { + return this.options.width; + } else { + return "" + this.form_field.offsetWidth + "px"; + } + }; + + AbstractChosen.browser_is_supported = function() { + var _ref; + + if (window.navigator.appName === "Microsoft Internet Explorer") { + return (null !== (_ref = document.documentMode) && _ref >= 8); + } + return true; + }; + + AbstractChosen.default_multiple_text = "Выберите одну или несколько опций"; + + AbstractChosen.default_single_text = "Select an Option"; + + AbstractChosen.default_no_result_text = "Нет совпадений"; + + return AbstractChosen; + + })(); + + root.AbstractChosen = AbstractChosen; + +}).call(this); + +(function() { + var $, Chosen, root, _ref, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + root = this; + + $ = jQuery; + + $.fn.extend({ + chosen: function(options) { + if (!AbstractChosen.browser_is_supported()) { + return this; + } + return this.each(function(input_field) { + var $this; + + $this = $(this); + if (!$this.hasClass("chzn-done")) { + return $this.data('chosen', new Chosen(this, options)); + } + }); + } + }); + + Chosen = (function(_super) { + __extends(Chosen, _super); + + function Chosen() { + _ref = Chosen.__super__.constructor.apply(this, arguments); + return _ref; + } + + Chosen.prototype.setup = function() { + this.form_field_jq = $(this.form_field); + this.current_selectedIndex = this.form_field.selectedIndex; + return this.is_rtl = this.form_field_jq.hasClass("chzn-rtl"); + }; + + Chosen.prototype.finish_setup = function() { + return this.form_field_jq.addClass("chzn-done"); + }; + + Chosen.prototype.set_up_html = function() { + var container_classes, container_props; + + this.container_id = this.form_field.id.length ? this.form_field.id.replace(/[^\w]/g, '_') : this.generate_field_id(); + this.container_id += "_chzn"; + container_classes = ["chzn-container"]; + container_classes.push("chzn-container-" + (this.is_multiple ? "multi" : "single")); + if (this.inherit_select_classes && this.form_field.className) { + container_classes.push(this.form_field.className); + } + if (this.is_rtl) { + container_classes.push("chzn-rtl"); + } + container_props = { + 'id': this.container_id, + 'class': container_classes.join(' '), + 'style': "width: " + (this.container_width()) + ";", + 'title': this.form_field.title + }; + this.container = $("
    ", container_props); + if (this.is_multiple) { + this.container.html('
      '); + } else { + this.container.html('' + this.default_text + '
        '); + } + this.form_field_jq.hide().after(this.container); + this.dropdown = this.container.find('div.chzn-drop').first(); + this.search_field = this.container.find('input').first(); + this.search_results = this.container.find('ul.chzn-results').first(); + this.search_field_scale(); + this.search_no_results = this.container.find('li.no-results').first(); + if (this.is_multiple) { + this.search_choices = this.container.find('ul.chzn-choices').first(); + this.search_container = this.container.find('li.search-field').first(); + } else { + this.search_container = this.container.find('div.chzn-search').first(); + this.selected_item = this.container.find('.chzn-single').first(); + } + this.results_build(); + this.set_tab_index(); + this.set_label_behavior(); + return this.form_field_jq.trigger("liszt:ready", { + chosen: this + }); + }; + + Chosen.prototype.register_observers = function() { + var _this = this; + + this.container.mousedown(function(evt) { + _this.container_mousedown(evt); + }); + this.container.mouseup(function(evt) { + _this.container_mouseup(evt); + }); + this.container.mouseenter(function(evt) { + _this.mouse_enter(evt); + }); + this.container.mouseleave(function(evt) { + _this.mouse_leave(evt); + }); + this.search_results.mouseup(function(evt) { + _this.search_results_mouseup(evt); + }); + this.search_results.mouseover(function(evt) { + _this.search_results_mouseover(evt); + }); + this.search_results.mouseout(function(evt) { + _this.search_results_mouseout(evt); + }); + this.search_results.bind('mousewheel DOMMouseScroll', function(evt) { + _this.search_results_mousewheel(evt); + }); + this.form_field_jq.bind("liszt:updated", function(evt) { + _this.results_update_field(evt); + }); + this.form_field_jq.bind("liszt:activate", function(evt) { + _this.activate_field(evt); + }); + this.form_field_jq.bind("liszt:open", function(evt) { + _this.container_mousedown(evt); + }); + this.search_field.blur(function(evt) { + _this.input_blur(evt); + }); + this.search_field.keyup(function(evt) { + _this.keyup_checker(evt); + }); + this.search_field.keydown(function(evt) { + _this.keydown_checker(evt); + }); + this.search_field.focus(function(evt) { + _this.input_focus(evt); + }); + + if (this.is_multiple) { + return this.search_choices.click(function(evt) { + _this.choices_click(evt); + }); + } else { + return this.container.click(function(evt) { + evt.preventDefault(); + }); + } + }; + + Chosen.prototype.search_field_disabled = function() { + this.is_disabled = this.form_field_jq[0].disabled; + if (this.is_disabled) { + this.container.addClass('chzn-disabled'); + this.search_field[0].disabled = true; + if (!this.is_multiple) { + this.selected_item.unbind("focus", this.activate_action); + } + return this.close_field(); + } else { + this.container.removeClass('chzn-disabled'); + this.search_field[0].disabled = false; + if (!this.is_multiple) { + return this.selected_item.bind("focus", this.activate_action); + } + } + }; + + Chosen.prototype.container_mousedown = function(evt) { + if (!this.is_disabled) { + if (evt && evt.type === "mousedown" && !this.results_showing) { + evt.preventDefault(); + } + if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) { + if (!this.active_field) { + if (this.is_multiple) { + this.search_field.val(""); + } + $(document).click(this.click_test_action); + this.results_show(); + } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chzn-single").length)) { + evt.preventDefault(); + this.results_toggle(); + } + return this.activate_field(); + } + if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) { + + } + + } + }; + + Chosen.prototype.container_mouseup = function(evt) { + if (evt.target.nodeName === "ABBR" && !this.is_disabled) { + return this.results_reset(evt); + } + }; + + Chosen.prototype.search_results_mousewheel = function(evt) { + var delta, _ref1, _ref2; + + delta = -((_ref1 = evt.originalEvent) != null ? _ref1.wheelDelta : void 0) || ((_ref2 = evt.originialEvent) != null ? _ref2.detail : void 0); + if (delta != null) { + evt.preventDefault(); + if (evt.type === 'DOMMouseScroll') { + delta = delta * 40; + } + return this.search_results.scrollTop(delta + this.search_results.scrollTop()); + } + }; + + Chosen.prototype.blur_test = function(evt) { + if (!this.active_field && this.container.hasClass("chzn-container-active")) { + return this.close_field(); + } + }; + + Chosen.prototype.close_field = function() { + $(document).unbind("click", this.click_test_action); + this.active_field = false; + this.results_hide(); + this.container.removeClass("chzn-container-active"); + this.clear_backstroke(); + this.show_search_field_default(); + return this.search_field_scale(); + }; + + Chosen.prototype.activate_field = function() { + this.container.addClass("chzn-container-active"); + this.active_field = true; + this.search_field.val(this.search_field.val()); + return this.search_field.focus(); + }; + + Chosen.prototype.test_active_click = function(evt) { + if ($(evt.target).parents('#' + this.container_id).length) { + return this.active_field = true; + } else { + return this.close_field(); + } + }; + + Chosen.prototype.results_build = function() { + var content, data, _i, _len, _ref1; + + this.parsing = true; + this.selected_option_count = null; + this.results_data = root.SelectParser.select_to_array(this.form_field); + if (this.is_multiple) { + this.search_choices.find("li.search-choice").remove(); + } else if (!this.is_multiple) { + this.selected_item.addClass("chzn-default").find("span").text(this.default_text); + if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) { + this.search_field[0].readOnly = true; + this.container.addClass("chzn-container-single-nosearch"); + } else { + this.search_field[0].readOnly = false; + this.container.removeClass("chzn-container-single-nosearch"); + } + } + content = ''; + _ref1 = this.results_data; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + data = _ref1[_i]; + if (data.group) { + content += this.result_add_group(data); + } else if (!data.empty) { + content += this.result_add_option(data); + if (data.selected && this.is_multiple) { + this.choice_build(data); + } else if (data.selected && !this.is_multiple) { + this.selected_item.removeClass("chzn-default").find("span").text(data.text); + if (this.allow_single_deselect) { + this.single_deselect_control_build(); + } + } + } + } + this.search_field_disabled(); + this.show_search_field_default(); + this.search_field_scale(); + this.search_results.html(content); + return this.parsing = false; + }; + + Chosen.prototype.result_add_group = function(group) { + group.dom_id = this.container_id + "_g_" + group.array_index; + return '
      • ' + $("
        ").text(group.label).html() + '
      • '; + }; + + Chosen.prototype.result_do_highlight = function(el) { + var high_bottom, high_top, maxHeight, visible_bottom, visible_top; + + if (el.length) { + this.result_clear_highlight(); + this.result_highlight = el; + this.result_highlight.addClass("highlighted"); + maxHeight = parseInt(this.search_results.css("maxHeight"), 10); + visible_top = this.search_results.scrollTop(); + visible_bottom = maxHeight + visible_top; + high_top = this.result_highlight.position().top + this.search_results.scrollTop(); + high_bottom = high_top + this.result_highlight.outerHeight(); + if (high_bottom >= visible_bottom) { + return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0); + } else if (high_top < visible_top) { + return this.search_results.scrollTop(high_top); + } + } + }; + + Chosen.prototype.result_clear_highlight = function() { + if (this.result_highlight) { + this.result_highlight.removeClass("highlighted"); + } + return this.result_highlight = null; + }; + + Chosen.prototype.results_show = function() { + if (this.is_multiple && this.max_selected_options <= this.choices_count()) { + this.form_field_jq.trigger("liszt:maxselected", { + chosen: this + }); + return false; + } + this.container.addClass("chzn-with-drop"); + this.form_field_jq.trigger("liszt:showing_dropdown", { + chosen: this + }); + this.results_showing = true; + this.search_field.focus(); + this.search_field.val(this.search_field.val()); + return this.winnow_results(); + }; + + Chosen.prototype.results_hide = function() { + if (this.results_showing) { + this.result_clear_highlight(); + this.container.removeClass("chzn-with-drop"); + this.form_field_jq.trigger("liszt:hiding_dropdown", { + chosen: this + }); + } + return this.results_showing = false; + }; + + Chosen.prototype.set_tab_index = function(el) { + var ti; + + if (this.form_field_jq.attr("tabindex")) { + ti = this.form_field_jq.attr("tabindex"); + this.form_field_jq.attr("tabindex", -1); + return this.search_field.attr("tabindex", ti); + } + }; + + Chosen.prototype.set_label_behavior = function() { + var _this = this; + + this.form_field_label = this.form_field_jq.parents("label"); + if (!this.form_field_label.length && this.form_field.id.length) { + this.form_field_label = $("label[for='" + this.form_field.id + "']"); + } + if (this.form_field_label.length > 0) { + return this.form_field_label.click(function(evt) { + if (_this.is_multiple) { + return _this.container_mousedown(evt); + } else { + return _this.activate_field(); + } + }); + } + }; + + Chosen.prototype.show_search_field_default = function() { + if (this.is_multiple && this.choices_count() < 1 && !this.active_field) { + this.search_field.val(this.default_text); + return this.search_field.addClass("default"); + } else { + this.search_field.val(""); + return this.search_field.removeClass("default"); + } + }; + + Chosen.prototype.search_results_mouseup = function(evt) { + var target; + + target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); + if (target.length) { + this.result_highlight = target; + this.result_select(evt); + return this.search_field.focus(); + } + }; + + Chosen.prototype.search_results_mouseover = function(evt) { + var target; + + target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); + if (target) { + return this.result_do_highlight(target); + } + }; + + Chosen.prototype.search_results_mouseout = function(evt) { + if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) { + return this.result_clear_highlight(); + } + }; + + Chosen.prototype.choice_build = function(item) { + var choice, close_link, + _this = this; + + choice = $('
      • ', { + "class": "search-choice" + }).html("" + item.html + ""); + if (item.disabled) { + choice.addClass('search-choice-disabled'); + } else { + close_link = $('', { + href: '#', + "class": 'search-choice-close', + rel: item.array_index + }); + close_link.click(function(evt) { + return _this.choice_destroy_link_click(evt); + }); + choice.append(close_link); + } + return this.search_container.before(choice); + }; + + Chosen.prototype.choice_destroy_link_click = function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + if (!this.is_disabled) { + return this.choice_destroy($(evt.target)); + } + }; + + Chosen.prototype.choice_destroy = function(link) { + if (this.result_deselect(link.attr("rel"))) { + this.show_search_field_default(); + if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) { + this.results_hide(); + } + link.parents('li').first().remove(); + return this.search_field_scale(); + } + }; + + Chosen.prototype.results_reset = function() { + this.form_field.options[0].selected = true; + this.selected_option_count = null; + this.selected_item.find("span").text(this.default_text); + if (!this.is_multiple) { + this.selected_item.addClass("chzn-default"); + } + this.show_search_field_default(); + this.results_reset_cleanup(); + this.form_field_jq.trigger("change"); + if (this.active_field) { + return this.results_hide(); + } + }; + + Chosen.prototype.results_reset_cleanup = function() { + this.current_selectedIndex = this.form_field.selectedIndex; + return this.selected_item.find("abbr").remove(); + }; + + Chosen.prototype.result_select = function(evt) { + var high, high_id, item, position; + + if (this.result_highlight) { + high = this.result_highlight; + high_id = high.attr("id"); + this.result_clear_highlight(); + if (this.is_multiple && this.max_selected_options <= this.choices_count()) { + this.form_field_jq.trigger("liszt:maxselected", { + chosen: this + }); + return false; + } + if (this.is_multiple) { + high.removeClass("active-result"); + } else { + this.search_results.find(".result-selected").removeClass("result-selected"); + this.result_single_selected = high; + this.selected_item.removeClass("chzn-default"); + } + high.addClass("result-selected"); + position = high_id.substr(high_id.lastIndexOf("_") + 1); + item = this.results_data[position]; + item.selected = true; + this.form_field.options[item.options_index].selected = true; + this.selected_option_count = null; + if (this.is_multiple) { + this.choice_build(item); + } else { + this.selected_item.find("span").first().text(item.text); + if (this.allow_single_deselect) { + this.single_deselect_control_build(); + } + } + if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) { + this.results_hide(); + } + this.search_field.val(""); + if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) { + this.form_field_jq.trigger("change", { + 'selected': this.form_field.options[item.options_index].value + }); + } + this.current_selectedIndex = this.form_field.selectedIndex; + return this.search_field_scale(); + } + }; + + Chosen.prototype.result_activate = function(el, option) { + if (option.disabled) { + return el.addClass("disabled-result"); + } else if (this.is_multiple && option.selected) { + return el.addClass("result-selected"); + } else { + return el.addClass("active-result"); + } + }; + + Chosen.prototype.result_deactivate = function(el) { + return el.removeClass("active-result result-selected disabled-result"); + }; + + Chosen.prototype.result_deselect = function(pos) { + var result, result_data; + + result_data = this.results_data[pos]; + if (!this.form_field.options[result_data.options_index].disabled) { + result_data.selected = false; + this.form_field.options[result_data.options_index].selected = false; + this.selected_option_count = null; + result = $("#" + this.container_id + "_o_" + pos); + result.removeClass("result-selected").addClass("active-result").show(); + this.result_clear_highlight(); + this.winnow_results(); + this.form_field_jq.trigger("change", { + deselected: this.form_field.options[result_data.options_index].value + }); + this.search_field_scale(); + return true; + } else { + return false; + } + }; + + Chosen.prototype.single_deselect_control_build = function() { + if (!this.allow_single_deselect) { + return; + } + if (!this.selected_item.find("abbr").length) { + this.selected_item.find("span").first().after(""); + } + return this.selected_item.addClass("chzn-single-with-deselect"); + }; + + Chosen.prototype.winnow_results = function() { + var found, option, part, parts, regex, regexAnchor, result, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len1, _ref1; + + this.no_results_clear(); + results = 0; + searchText = this.search_field.val() === this.default_text ? "" : $('
        ').text($.trim(this.search_field.val())).html(); + regexAnchor = this.search_contains ? "" : "^"; + regex = new RegExp(regexAnchor + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i'); + zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i'); + _ref1 = this.results_data; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + option = _ref1[_i]; + if (!option.empty) { + if (option.group) { + $('#' + option.dom_id).css('display', 'none'); + } else { + found = false; + result_id = option.dom_id; + result = $("#" + result_id); + if (regex.test(option.html)) { + found = true; + results += 1; + } else if (this.enable_split_word_search && (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0)) { + parts = option.html.replace(/\[|\]/g, "").split(" "); + if (parts.length) { + for (_j = 0, _len1 = parts.length; _j < _len1; _j++) { + part = parts[_j]; + if (regex.test(part)) { + found = true; + results += 1; + } + } + } + } + if (found) { + if (searchText.length) { + startpos = option.html.search(zregex); + text = option.html.substr(0, startpos + searchText.length) + '' + option.html.substr(startpos + searchText.length); + text = text.substr(0, startpos) + '' + text.substr(startpos); + } else { + text = option.html; + } + result.html(text); + this.result_activate(result, option); + if (option.group_array_index != null) { + $("#" + this.results_data[option.group_array_index].dom_id).css('display', 'list-item'); + } + } else { + if (this.result_highlight && result_id === this.result_highlight.attr('id')) { + this.result_clear_highlight(); + } + this.result_deactivate(result); + } + } + } + } + if (results < 1 && searchText.length) { + return this.no_results(searchText); + } else { + return this.winnow_results_set_highlight(); + } + }; + + Chosen.prototype.winnow_results_set_highlight = function() { + var do_high, selected_results; + + if (!this.result_highlight) { + selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : []; + do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first(); + if (do_high != null) { + return this.result_do_highlight(do_high); + } + } + }; + + + + Chosen.prototype.no_results = function(terms) { + var no_results_html; + + if (this.addlink) { + no_results_html = $('
      • ' + this.results_none_found + ' "" Добавить?
      • '); + } else { + no_results_html = $('
      • ' + this.results_none_found + ' ""
      • '); + } + no_results_html.find("span").first().html(terms); + this.search_results.append(no_results_html); + return this.form_field_jq.trigger("chosen:no_results", { + chosen: this + }); + + + }; + + Chosen.prototype.no_results_clear = function() { + return this.search_results.find(".no-results").remove(); + }; + + Chosen.prototype.keydown_arrow = function() { + var next_sib; + + if (this.results_showing && this.result_highlight) { + next_sib = this.result_highlight.nextAll("li.active-result").first(); + if (next_sib) { + return this.result_do_highlight(next_sib); + } + } else { + return this.results_show(); + } + }; + + Chosen.prototype.keyup_arrow = function() { + var prev_sibs; + + if (!this.results_showing && !this.is_multiple) { + return this.results_show(); + } else if (this.result_highlight) { + prev_sibs = this.result_highlight.prevAll("li.active-result"); + if (prev_sibs.length) { + return this.result_do_highlight(prev_sibs.first()); + } else { + if (this.choices_count() > 0) { + this.results_hide(); + } + return this.result_clear_highlight(); + } + } + }; + + Chosen.prototype.keydown_backstroke = function() { + var next_available_destroy; + + if (this.pending_backstroke) { + this.choice_destroy(this.pending_backstroke.find("a").first()); + return this.clear_backstroke(); + } else { + next_available_destroy = this.search_container.siblings("li.search-choice").last(); + if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) { + this.pending_backstroke = next_available_destroy; + if (this.single_backstroke_delete) { + return this.keydown_backstroke(); + } else { + return this.pending_backstroke.addClass("search-choice-focus"); + } + } + } + }; + + Chosen.prototype.clear_backstroke = function() { + if (this.pending_backstroke) { + this.pending_backstroke.removeClass("search-choice-focus"); + } + return this.pending_backstroke = null; + }; + + Chosen.prototype.keydown_checker = function(evt) { + var stroke, _ref1; + + stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode; + this.search_field_scale(); + if (stroke !== 8 && this.pending_backstroke) { + this.clear_backstroke(); + } + switch (stroke) { + case 8: + this.backstroke_length = this.search_field.val().length; + break; + case 9: + if (this.results_showing && !this.is_multiple) { + this.result_select(evt); + } + this.mouse_on_container = false; + break; + case 13: + evt.preventDefault(); + break; + case 38: + evt.preventDefault(); + this.keyup_arrow(); + break; + case 40: + evt.preventDefault(); + this.keydown_arrow(); + break; + } + }; + + Chosen.prototype.search_field_scale = function() { + var div, h, style, style_block, styles, w, _i, _len; + + if (this.is_multiple) { + h = 0; + w = 0; + style_block = "position:absolute; left: -1000px; top: -1000px; display:none;"; + styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing']; + for (_i = 0, _len = styles.length; _i < _len; _i++) { + style = styles[_i]; + style_block += style + ":" + this.search_field.css(style) + ";"; + } + div = $('
        ', { + 'style': style_block + }); + div.text(this.search_field.val()); + $('body').append(div); + w = div.width() + 25; + div.remove(); + if (!this.f_width) { + this.f_width = this.container.outerWidth(); + } + if (w > this.f_width - 10) { + w = this.f_width - 10; + } + return this.search_field.css({ + 'width': w + 'px' + }); + } + }; + + Chosen.prototype.generate_random_id = function() { + var string; + + string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char(); + while ($("#" + string).length > 0) { + string += this.generate_random_char(); + } + return string; + }; + + return Chosen; + + })(AbstractChosen); + + root.Chosen = Chosen; + +}).call(this); + + +function addOptLink(el, cid) { + if ( !confirm('Вы уверены?') ) return; + var url = $('#'+cid).data('addlink') + encodeURIComponent($(el).data('terms')); + $.get( url, function( data ) { + $('#'+cid).append( data ); + $('#'+cid).trigger("liszt:updated"); + }); +} + + + +// Generated by CoffeeScript 1.4.0 + +(function($) { + return $.fn.ajaxChosen = function(settings, callback, chosenOptions) { + var chosenXhr, defaultOptions, options, select; + if (settings == null) { + settings = {}; + } + if (chosenOptions == null) { + chosenOptions = {}; + } + defaultOptions = { + minTermLength: 3, + afterTypeDelay: 500, + jsonTermKey: "str", + keepTypingMsg: "Продолжайте вводить...", + lookingForMsg: "Ищу" + }; + select = this; + chosenXhr = null; + options = $.extend({}, defaultOptions, $(select).data(), settings); + this.chosen(chosenOptions ? chosenOptions : {}); + return this.each(function() { + return $(this).next('.chzn-container').find(".search-field > input, .chzn-search > input").bind('keyup', function() { + var field, msg, success, untrimmed_val, val; + untrimmed_val = $(this).val(); + val = $.trim($(this).val()); + msg = val.length < options.minTermLength ? options.keepTypingMsg : options.lookingForMsg + (" '" + val + "'"); + select.next('.chzn-container').find('.no-results').text(msg); + if (val === $(this).data('prevVal')) { + return false; + } + $(this).data('prevVal', val); + if (this.timer) { + clearTimeout(this.timer); + } + if (val.length < options.minTermLength) { + return false; + } + field = $(this); + if (options.data == null) { + options.data = {}; + } + options.data[options.jsonTermKey] = val; + if (options.dataCallback != null) { + options.data = options.dataCallback(options.data); + } + success = options.success; + options.success = function(data) { + var items, nbItems, selected_values; + if (data == null) { + return; + } + selected_values = []; + select.find('option').each(function() { + if (!$(this).is(":selected")) { + return $(this).remove(); + } else { + return selected_values.push($(this).val() + "-" + $(this).text()); + } + }); + select.find('optgroup:empty').each(function() { + return $(this).remove(); + }); + items = callback != null ? callback(data, field) : data; + nbItems = 0; + $.each(items, function(i, element) { + var group, text, value; + nbItems++; + if (element.group) { + group = select.find("optgroup[label='" + element.text + "']"); + if (!group.size()) { + group = $(""); + } + group.attr('label', element.text).appendTo(select); + return $.each(element.items, function(i, element) { + var text, value; + if (typeof element === "string") { + value = i; + text = element; + } else { + value = element.value; + text = element.text; + } + if ($.inArray(value + "-" + text, selected_values) === -1) { + return $("
        "),i=e.children()[0];return P("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(C(s),C(o))?n.important="horizontal":n.important="vertical",p.using.call(this,t,n)}),r.offset(P.extend(l,{using:t}))})},P.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,o=i.width,n=t.left-e.collisionPosition.marginLeft,r=s-n,h=n+e.collisionWidth-o-s;e.collisionWidth>o?0o?0?@[\]^`{|}~])/g,function(t){return t.replace(e,"\\$1")}),P.fn.labels=function(){var t,e,i;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(e=this.eq(0).parents("label"),(t=this.attr("id"))&&(i=(i=this.eq(0).parents().last()).add((i.length?i:this).siblings()),t="label[for='"+P.ui.escapeSelector(t)+"']",e=e.add(i.find(t).addBack(t))),this.pushStack(e))},P.fn.scrollParent=function(t){var e=this.css("position"),i="absolute"===e,s=t?/(auto|scroll|hidden)/:/(auto|scroll)/,t=this.parents().filter(function(){var t=P(this);return(!i||"static"!==t.css("position"))&&s.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==e&&t.length?t:P(this[0].ownerDocument||document)},P.extend(P.expr[":"],{tabbable:function(t){var e=P.attr(t,"tabindex"),i=null!=e;return(!i||0<=e)&&P.ui.focusable(t,i)}}),P.fn.extend({uniqueId:(p=0,function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++p)})}),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&P(this).removeAttr("id")})}}),P.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var e,p,u=!1;P(document).on("mouseup",function(){u=!1});P.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(t){if(!0===P.data(t.target,e.widgetName+".preventClickEvent"))return P.removeData(t.target,e.widgetName+".preventClickEvent"),t.stopImmediatePropagation(),!1}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!u){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var e=this,i=1===t.which,s=!("string"!=typeof this.options.cancel||!t.target.nodeName)&&P(t.target).closest(this.options.cancel).length;return i&&!s&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(t),!this._mouseStarted)?(t.preventDefault(),!0):(!0===P.data(t.target,this.widgetName+".preventClickEvent")&&P.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return e._mouseMove(t)},this._mouseUpDelegate=function(t){return e._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),u=!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(P.ui.ie&&(!document.documentMode||document.documentMode<9)&&!t.button)return this._mouseUp(t);if(!t.which)if(t.originalEvent.altKey||t.originalEvent.ctrlKey||t.originalEvent.metaKey||t.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=!1!==this._mouseStart(this._mouseDownEvent,t),this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&P.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,u=!1,t.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),P.ui.plugin={add:function(t,e,i){var s,o=P.ui[t].prototype;for(s in i)o.plugins[s]=o.plugins[s]||[],o.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var o,n=t.plugins[e];if(n&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(o=0;o").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var e=P.ui.safeActiveElement(this.document[0]);P(t.target).closest(e).length||P.ui.safeBlur(e)},_mouseStart:function(t){var e=this.options;return this.helper=this._createHelper(t),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),P.ui.ddmanager&&(P.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=0i[2]&&(n=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(r=i[3]+this.offset.click.top)),s.grid&&(t=s.grid[1]?this.originalPageY+Math.round((r-this.originalPageY)/s.grid[1])*s.grid[1]:this.originalPageY,r=!i||t-this.offset.click.top>=i[1]||t-this.offset.click.top>i[3]?t:t-this.offset.click.top>=i[1]?t-s.grid[1]:t+s.grid[1],t=s.grid[0]?this.originalPageX+Math.round((n-this.originalPageX)/s.grid[0])*s.grid[0]:this.originalPageX,n=!i||t-this.offset.click.left>=i[0]||t-this.offset.click.left>i[2]?t:t-this.offset.click.left>=i[0]?t-s.grid[0]:t+s.grid[0]),"y"===s.axis&&(n=this.originalPageX),"x"===s.axis&&(r=this.originalPageY)),{top:r-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:o?0:this.offset.scroll.top),left:n-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:o?0:this.offset.scroll.left)}},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(t,e,i){return i=i||this._uiHash(),P.ui.plugin.call(this,t,[e,i,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),i.offset=this.positionAbs),P.Widget.prototype._trigger.call(this,t,e,i)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),P.ui.plugin.add("draggable","connectToSortable",{start:function(e,t,i){var s=P.extend({},t,{item:i.element});i.sortables=[],P(i.options.connectToSortable).each(function(){var t=P(this).sortable("instance");t&&!t.options.disabled&&(i.sortables.push(t),t.refreshPositions(),t._trigger("activate",e,s))})},stop:function(e,t,i){var s=P.extend({},t,{item:i.element});i.cancelHelperRemoval=!1,P.each(i.sortables,function(){var t=this;t.isOver?(t.isOver=0,i.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,s))})},drag:function(i,s,o){P.each(o.sortables,function(){var t=!1,e=this;e.positionAbs=o.positionAbs,e.helperProportions=o.helperProportions,e.offset.click=o.offset.click,e._intersectsWith(e.containerCache)&&(t=!0,P.each(o.sortables,function(){return this.positionAbs=o.positionAbs,this.helperProportions=o.helperProportions,this.offset.click=o.offset.click,this!==e&&this._intersectsWith(this.containerCache)&&P.contains(e.element[0],this.element[0])&&(t=!1),t})),t?(e.isOver||(e.isOver=1,o._parent=s.helper.parent(),e.currentItem=s.helper.appendTo(e.element).data("ui-sortable-item",!0),e.options._helper=e.options.helper,e.options.helper=function(){return s.helper[0]},i.target=e.currentItem[0],e._mouseCapture(i,!0),e._mouseStart(i,!0,!0),e.offset.click.top=o.offset.click.top,e.offset.click.left=o.offset.click.left,e.offset.parent.left-=o.offset.parent.left-e.offset.parent.left,e.offset.parent.top-=o.offset.parent.top-e.offset.parent.top,o._trigger("toSortable",i),o.dropped=e.element,P.each(o.sortables,function(){this.refreshPositions()}),o.currentItem=o.element,e.fromOutside=o),e.currentItem&&(e._mouseDrag(i),s.position=e.position)):e.isOver&&(e.isOver=0,e.cancelHelperRemoval=!0,e.options._revert=e.options.revert,e.options.revert=!1,e._trigger("out",i,e._uiHash(e)),e._mouseStop(i,!0),e.options.revert=e.options._revert,e.options.helper=e.options._helper,e.placeholder&&e.placeholder.remove(),s.helper.appendTo(o._parent),o._refreshOffsets(i),s.position=o._generatePosition(i,!0),o._trigger("fromSortable",i),o.dropped=!1,P.each(o.sortables,function(){this.refreshPositions()}))})}}),P.ui.plugin.add("draggable","cursor",{start:function(t,e,i){var s=P("body"),i=i.options;s.css("cursor")&&(i._cursor=s.css("cursor")),s.css("cursor",i.cursor)},stop:function(t,e,i){i=i.options;i._cursor&&P("body").css("cursor",i._cursor)}}),P.ui.plugin.add("draggable","opacity",{start:function(t,e,i){e=P(e.helper),i=i.options;e.css("opacity")&&(i._opacity=e.css("opacity")),e.css("opacity",i.opacity)},stop:function(t,e,i){i=i.options;i._opacity&&P(e.helper).css("opacity",i._opacity)}}),P.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,e,i){var s=i.options,o=!1,n=i.scrollParentNotHidden[0],r=i.document[0];n!==r&&"HTML"!==n.tagName?(s.axis&&"x"===s.axis||(i.overflowOffset.top+n.offsetHeight-t.pageY
        ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&P(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();function t(t){P(t).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){this._super(t,e),"handles"===t&&(this._removeHandles(),this._setupHandles())},_setupHandles:function(){var t,e,i,s,o,n=this.options,r=this;if(this.handles=n.handles||(P(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=P(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(o,"ui-resizable-handle "+s),o.css({zIndex:n.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.append(o);this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=P(this.handles[e]),this._on(this.handles[e],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=P(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),n.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=P(this.handles[e])[0])!==t.target&&!P.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=P(s.containment).scrollLeft()||0,i+=P(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=P(".ui-resizable-"+this.axis).css("cursor"),P("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),P.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,o=this.options,n=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:n.sizeDiff.height,i=e?0:n.sizeDiff.width,e={width:n.helper.width()-i,height:n.helper.height()-s},i=parseFloat(n.element.css("left"))+(n.position.left-n.originalPosition.left)||null,s=parseFloat(n.element.css("top"))+(n.position.top-n.originalPosition.top)||null,o.animate||this.element.css(P.extend(e,{top:s,left:i})),n.helper.height(n.size.height),n.helper.width(n.size.width),this._helper&&!o.animate&&this._proportionallyResize()),P("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,o={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,i=o.minWidth/this.aspectRatio,s=o.maxHeight*this.aspectRatio,t=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),i>o.minHeight&&(o.minHeight=i),st.width,r=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,h=this.originalPosition.left+this.originalSize.width,a=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return n&&(t.width=e.minWidth),r&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),o&&(t.height=e.maxHeight),n&&l&&(t.left=h-e.minWidth),s&&l&&(t.left=h-e.maxWidth),r&&i&&(t.top=a-e.minHeight),o&&i&&(t.top=a-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],o=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(o[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e
        "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return P.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return P.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return P.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return P.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){P.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),P.ui.plugin.add("resizable","animate",{stop:function(e){var i=P(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,o=s.length&&/textarea/i.test(s[0].nodeName),n=o&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,o={width:i.size.width-r,height:i.size.height-n},r=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,n=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(P.extend(o,n&&r?{top:n,left:r}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&P(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),P.ui.plugin.add("resizable","containment",{start:function(){var i,s,o=P(this).resizable("instance"),t=o.options,e=o.element,n=t.containment,r=n instanceof P?n.get(0):/parent/.test(n)?e.parent().get(0):n;r&&(o.containerElement=P(r),/document/.test(n)||n===document?(o.containerOffset={left:0,top:0},o.containerPosition={left:0,top:0},o.parentData={element:P(document),left:0,top:0,width:P(document).width(),height:P(document).height()||document.body.parentNode.scrollHeight}):(i=P(r),s=[],P(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=o._num(i.css("padding"+e))}),o.containerOffset=i.offset(),o.containerPosition=i.position(),o.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=o.containerOffset,e=o.containerSize.height,n=o.containerSize.width,n=o._hasScroll(r,"left")?r.scrollWidth:n,e=o._hasScroll(r)?r.scrollHeight:e,o.parentData={element:r,left:t.left,top:t.top,width:n,height:e}))},resize:function(t){var e=P(this).resizable("instance"),i=e.options,s=e.containerOffset,o=e.position,n=e._aspectRatio||t.shiftKey,r={top:0,left:0},h=e.containerElement,t=!0;h[0]!==document&&/static/.test(h.css("position"))&&(r=s),o.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-r.left),n&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),o.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),n&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),o=/relative|absolute/.test(e.containerElement.css("position")),i&&o?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),o=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-r.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-r.top:e.offset.top-s.top)),o+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-o,n&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,n&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=P(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,o=t.containerElement,n=P(t.helper),r=n.offset(),h=n.outerWidth()-t.sizeDiff.width,n=n.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(o.css("position"))&&P(this).css({left:r.left-s.left-i.left,width:h,height:n}),t._helper&&!e.animate&&/static/.test(o.css("position"))&&P(this).css({left:r.left-s.left-i.left,width:h,height:n})}}),P.ui.plugin.add("resizable","alsoResize",{start:function(){var t=P(this).resizable("instance").options;P(t.alsoResize).each(function(){var t=P(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=P(this).resizable("instance"),s=e.options,o=e.originalSize,n=e.originalPosition,r={height:e.size.height-o.height||0,width:e.size.width-o.width||0,top:e.position.top-n.top||0,left:e.position.left-n.left||0};P(s.alsoResize).each(function(){var t=P(this),s=P(this).data("ui-resizable-alsoresize"),o={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];P.each(e,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&0<=i&&(o[e]=i||null)}),t.css(o)})},stop:function(){P(this).removeData("ui-resizable-alsoresize")}}),P.ui.plugin.add("resizable","ghost",{start:function(){var t=P(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==P.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=P(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=P(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),P.ui.plugin.add("resizable","grid",{resize:function(){var t,e=P(this).resizable("instance"),i=e.options,s=e.size,o=e.originalSize,n=e.originalPosition,r=e.axis,h="number"==typeof i.grid?[i.grid,i.grid]:i.grid,a=h[0]||1,l=h[1]||1,c=Math.round((s.width-o.width)/a)*a,p=Math.round((s.height-o.height)/l)*l,u=o.width+c,d=o.height+p,f=i.maxWidth&&i.maxWidthu,s=i.minHeight&&i.minHeight>d;i.grid=h,m&&(u+=a),s&&(d+=l),f&&(u-=a),g&&(d-=l),/^(se|s|e)$/.test(r)?(e.size.width=u,e.size.height=d):/^(ne)$/.test(r)?(e.size.width=u,e.size.height=d,e.position.top=n.top-p):/^(sw)$/.test(r)?(e.size.width=u,e.size.height=d,e.position.left=n.left-c):((d-l<=0||u-a<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0"),this._addClass(this.helper,"ui-selectable-helper")},_destroy:function(){this.selectees.removeData("selectable-item"),this._mouseDestroy()},_mouseStart:function(i){var s=this,t=this.options;this.opos=[i.pageX,i.pageY],this.elementPos=P(this.element[0]).offset(),this.options.disabled||(this.selectees=P(t.filter,this.element[0]),this._trigger("start",i),P(t.appendTo).append(this.helper),this.helper.css({left:i.pageX,top:i.pageY,width:0,height:0}),t.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var t=P.data(this,"selectable-item");t.startselected=!0,i.metaKey||i.ctrlKey||(s._removeClass(t.$element,"ui-selected"),t.selected=!1,s._addClass(t.$element,"ui-unselecting"),t.unselecting=!0,s._trigger("unselecting",i,{unselecting:t.element}))}),P(i.target).parents().addBack().each(function(){var t,e=P.data(this,"selectable-item");if(e)return t=!i.metaKey&&!i.ctrlKey||!e.$element.hasClass("ui-selected"),s._removeClass(e.$element,t?"ui-unselecting":"ui-selected")._addClass(e.$element,t?"ui-selecting":"ui-unselecting"),e.unselecting=!t,e.selecting=t,(e.selected=t)?s._trigger("selecting",i,{selecting:e.element}):s._trigger("unselecting",i,{unselecting:e.element}),!1}))},_mouseDrag:function(s){if(this.dragged=!0,!this.options.disabled){var t,o=this,n=this.options,r=this.opos[0],h=this.opos[1],a=s.pageX,l=s.pageY;return aa||i.rightl||i.bottomr&&i.righth&&i.bottom *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return e<=t&&t*{ cursor: "+n.cursor+" !important; }").appendTo(o)),n.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",n.opacity)),n.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",n.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!i)for(s=this.containers.length-1;0<=s;s--)this.containers[s]._trigger("activate",t,this._uiHash(this));return P.ui.ddmanager&&(P.ui.ddmanager.current=this),P.ui.ddmanager&&!n.dropBehaviour&&P.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var e,i,s,o,n=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageYt[this.floating?"width":"height"]?c:n",i.document[0]);return i._addClass(e,"ui-sortable-placeholder",s||i.currentItem[0].className)._removeClass(e,"ui-sortable-helper"),"tbody"===t?i._createTrPlaceholder(i.currentItem.find("tr").eq(0),P("",i.document[0]).appendTo(e)):"tr"===t?i._createTrPlaceholder(i.currentItem,e):"img"===t&&e.attr("src",i.currentItem.attr("src")),s||e.css("visibility","hidden"),e},update:function(t,e){s&&!o.forcePlaceholderSize||(e.height()||e.height(i.currentItem.innerHeight()-parseInt(i.currentItem.css("paddingTop")||0,10)-parseInt(i.currentItem.css("paddingBottom")||0,10)),e.width()||e.width(i.currentItem.innerWidth()-parseInt(i.currentItem.css("paddingLeft")||0,10)-parseInt(i.currentItem.css("paddingRight")||0,10)))}}),i.placeholder=P(o.placeholder.element.call(i.element,i.currentItem)),i.currentItem.after(i.placeholder),o.placeholder.update(i,i.placeholder)},_createTrPlaceholder:function(t,e){var i=this;t.children().each(function(){P(" ",i.document[0]).attr("colspan",P(this).attr("colspan")||1).appendTo(e)})},_contactContainers:function(t){for(var e,i,s,o,n,r,h,a,l,c=null,p=null,u=this.containers.length-1;0<=u;u--)P.contains(this.currentItem[0],this.containers[u].element[0])||(this._intersectsWith(this.containers[u].containerCache)?c&&P.contains(this.containers[u].element[0],c.element[0])||(c=this.containers[u],p=u):this.containers[u].containerCache.over&&(this.containers[u]._trigger("out",t,this._uiHash(this)),this.containers[u].containerCache.over=0));if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(i=1e4,s=null,o=(a=c.floating||this._isFloating(this.currentItem))?"left":"top",n=a?"width":"height",l=a?"pageX":"pageY",e=this.items.length-1;0<=e;e--)P.contains(this.containers[p].element[0],this.items[e].item[0])&&this.items[e].item[0]!==this.currentItem[0]&&(r=this.items[e].item.offset()[o],h=!1,t[l]-r>this.items[e][n]/2&&(h=!0),Math.abs(t[l]-r)this.containment[2]&&(i=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(s=this.containment[3]+this.offset.click.top)),e.grid&&(t=this.originalPageY+Math.round((s-this.originalPageY)/e.grid[1])*e.grid[1],s=!this.containment||t-this.offset.click.top>=this.containment[1]&&t-this.offset.click.top<=this.containment[3]?t:t-this.offset.click.top>=this.containment[1]?t-e.grid[1]:t+e.grid[1],t=this.originalPageX+Math.round((i-this.originalPageX)/e.grid[0])*e.grid[0],i=!this.containment||t-this.offset.click.left>=this.containment[0]&&t-this.offset.click.left<=this.containment[2]?t:t-this.offset.click.left>=this.containment[0]?t-e.grid[0]:t+e.grid[0])),{top:s-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():n?0:o.scrollTop()),left:i-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():n?0:o.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var o=this.counter;this._delay(function(){o===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){this.reverting=!1;var i,s=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(i in this._storedCSS)"auto"!==this._storedCSS[i]&&"static"!==this._storedCSS[i]||(this._storedCSS[i]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();function o(e,i,s){return function(t){s._trigger(e,t,i._uiHash(i))}}for(this.fromOutside&&!e&&s.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||s.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(s.push(function(t){this._trigger("remove",t,this._uiHash())}),s.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),s.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),i=this.containers.length-1;0<=i;i--)e||s.push(o("deactivate",this,this.containers[i])),this.containers[i].containerCache.over&&(s.push(o("out",this,this.containers[i])),this.containers[i].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(i=0;io&&(i.slice(o).remove(),i=i.slice(0,o)),t=i.length;t");this.handles=i.add(P(s.join("")).appendTo(this.element)),this._addClass(this.handles,"ui-slider-handle","ui-state-default"),this.handle=this.handles.eq(0),this.handles.each(function(t){P(this).data("ui-slider-handle-index",t).attr("tabIndex",0)})},_createRange:function(){var t=this.options;t.range?(!0===t.range&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:P.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?(this._removeClass(this.range,"ui-slider-range-min ui-slider-range-max"),this.range.css({left:"",bottom:""})):(this.range=P("
        ").appendTo(this.element),this._addClass(this.range,"ui-slider-range")),"min"!==t.range&&"max"!==t.range||this._addClass(this.range,"ui-slider-range-"+t.range)):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this._mouseDestroy()},_mouseCapture:function(t){var i,s,o,n,e,r,h=this,a=this.options;return!a.disabled&&(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),r={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(r),s=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var e=Math.abs(i-h.values(t));(e=this._valueMax())return this._valueMax();var e=0=e&&(t+=0this.options.max&&(t-=i),this.max=parseFloat(t.toFixed(this._precision()))},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=t.toString(),t=e.indexOf(".");return-1===t?0:e.length-t-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshRange:function(t){"vertical"===t&&this.range.css({width:"",left:""}),"horizontal"===t&&this.range.css({height:"",bottom:""})},_refreshValue:function(){var e,i,t,s,o,n=this.options.range,r=this.options,h=this,a=!this._animateOff&&r.animate,l={};this._hasMultipleValues()?this.handles.each(function(t){i=(h.values(t)-h._valueMin())/(h._valueMax()-h._valueMin())*100,l["horizontal"===h.orientation?"left":"bottom"]=i+"%",P(this).stop(1,1)[a?"animate":"css"](l,r.animate),!0===h.options.range&&("horizontal"===h.orientation?(0===t&&h.range.stop(1,1)[a?"animate":"css"]({left:i+"%"},r.animate),1===t&&h.range[a?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:r.animate})):(0===t&&h.range.stop(1,1)[a?"animate":"css"]({bottom:i+"%"},r.animate),1===t&&h.range[a?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:r.animate}))),e=i}):(t=this.value(),s=this._valueMin(),o=this._valueMax(),i=o!==s?(t-s)/(o-s)*100:0,l["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[a?"animate":"css"](l,r.animate),"min"===n&&"horizontal"===this.orientation&&this.range.stop(1,1)[a?"animate":"css"]({width:i+"%"},r.animate),"max"===n&&"horizontal"===this.orientation&&this.range.stop(1,1)[a?"animate":"css"]({width:100-i+"%"},r.animate),"min"===n&&"vertical"===this.orientation&&this.range.stop(1,1)[a?"animate":"css"]({height:i+"%"},r.animate),"max"===n&&"vertical"===this.orientation&&this.range.stop(1,1)[a?"animate":"css"]({height:100-i+"%"},r.animate))},_handleEvents:{keydown:function(t){var e,i,s,o=P(t.target).data("ui-slider-handle-index");switch(t.keyCode){case P.ui.keyCode.HOME:case P.ui.keyCode.END:case P.ui.keyCode.PAGE_UP:case P.ui.keyCode.PAGE_DOWN:case P.ui.keyCode.UP:case P.ui.keyCode.RIGHT:case P.ui.keyCode.DOWN:case P.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,this._addClass(P(t.target),null,"ui-state-active"),!1===this._start(t,o)))return}switch(s=this.options.step,e=i=this._hasMultipleValues()?this.values(o):this.value(),t.keyCode){case P.ui.keyCode.HOME:i=this._valueMin();break;case P.ui.keyCode.END:i=this._valueMax();break;case P.ui.keyCode.PAGE_UP:i=this._trimAlignValue(e+(this._valueMax()-this._valueMin())/this.numPages);break;case P.ui.keyCode.PAGE_DOWN:i=this._trimAlignValue(e-(this._valueMax()-this._valueMin())/this.numPages);break;case P.ui.keyCode.UP:case P.ui.keyCode.RIGHT:if(e===this._valueMax())return;i=this._trimAlignValue(e+s);break;case P.ui.keyCode.DOWN:case P.ui.keyCode.LEFT:if(e===this._valueMin())return;i=this._trimAlignValue(e-s)}this._slide(t,o,i)},keyup:function(t){var e=P(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,e),this._change(t,e),this._removeClass(P(t.target),null,"ui-state-active"))}}})}); \ No newline at end of file diff --git a/app/public_html/admin/assets/js/jquery.ajaxform.js b/app/public_html/admin/assets/js/jquery.ajaxform.js new file mode 100644 index 0000000..c67fc33 --- /dev/null +++ b/app/public_html/admin/assets/js/jquery.ajaxform.js @@ -0,0 +1,1277 @@ +/*! + * jQuery Form Plugin + * version: 3.51.0-2014.06.20 + * Requires jQuery v1.5 or later + * Copyright (c) 2014 M. Alsup + * Examples and documentation at: http://malsup.com/jquery/form/ + * Project repository: https://github.com/malsup/form + * Dual licensed under the MIT and GPL licenses. + * https://github.com/malsup/form#copyright-and-license + */ +/*global ActiveXObject */ + +// AMD support +(function (factory) { + "use strict"; + if (typeof define === 'function' && define.amd) { + // using AMD; register as anon module + define(['jquery'], factory); + } else { + // no AMD; invoke directly + factory( (typeof(jQuery) != 'undefined') ? jQuery : window.Zepto ); + } +} + +(function($) { +"use strict"; + +/* + Usage Note: + ----------- + Do not use both ajaxSubmit and ajaxForm on the same form. These + functions are mutually exclusive. Use ajaxSubmit if you want + to bind your own submit handler to the form. For example, + + $(document).ready(function() { + $('#myForm').on('submit', function(e) { + e.preventDefault(); // <-- important + $(this).ajaxSubmit({ + target: '#output' + }); + }); + }); + + Use ajaxForm when you want the plugin to manage all the event binding + for you. For example, + + $(document).ready(function() { + $('#myForm').ajaxForm({ + target: '#output' + }); + }); + + You can also use ajaxForm with delegation (requires jQuery v1.7+), so the + form does not have to exist when you invoke ajaxForm: + + $('#myForm').ajaxForm({ + delegation: true, + target: '#output' + }); + + When using ajaxForm, the ajaxSubmit function will be invoked for you + at the appropriate time. +*/ + +/** + * Feature detection + */ +var feature = {}; +feature.fileapi = $("").get(0).files !== undefined; +feature.formdata = window.FormData !== undefined; + +var hasProp = !!$.fn.prop; + +// attr2 uses prop when it can but checks the return type for +// an expected string. this accounts for the case where a form +// contains inputs with names like "action" or "method"; in those +// cases "prop" returns the element +$.fn.attr2 = function() { + if ( ! hasProp ) { + return this.attr.apply(this, arguments); + } + var val = this.prop.apply(this, arguments); + if ( ( val && val.jquery ) || typeof val === 'string' ) { + return val; + } + return this.attr.apply(this, arguments); +}; + +/** + * ajaxSubmit() provides a mechanism for immediately submitting + * an HTML form using AJAX. + */ +$.fn.ajaxSubmit = function(options) { + /*jshint scripturl:true */ + + // fast fail if nothing selected (http://dev.jquery.com/ticket/2752) + if (!this.length) { + log('ajaxSubmit: skipping submit process - no element selected'); + return this; + } + + var method, action, url, $form = this; + + if (typeof options == 'function') { + options = { success: options }; + } + else if ( options === undefined ) { + options = {}; + } + + method = options.type || this.attr2('method'); + action = options.url || this.attr2('action'); + + url = (typeof action === 'string') ? $.trim(action) : ''; + url = url || window.location.href || ''; + if (url) { + // clean url (don't include hash vaue) + url = (url.match(/^([^#]+)/)||[])[1]; + } + + options = $.extend(true, { + url: url, + success: $.ajaxSettings.success, + type: method || $.ajaxSettings.type, + iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank' + }, options); + + // hook for manipulating the form data before it is extracted; + // convenient for use with rich editors like tinyMCE or FCKEditor + var veto = {}; + this.trigger('form-pre-serialize', [this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-pre-serialize trigger'); + return this; + } + + // provide opportunity to alter form data before it is serialized + if (options.beforeSerialize && options.beforeSerialize(this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSerialize callback'); + return this; + } + + var traditional = options.traditional; + if ( traditional === undefined ) { + traditional = $.ajaxSettings.traditional; + } + + var elements = []; + var qx, a = this.formToArray(options.semantic, elements); + if (options.data) { + options.extraData = options.data; + qx = $.param(options.data, traditional); + } + + // give pre-submit callback an opportunity to abort the submit + if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSubmit callback'); + return this; + } + + // fire vetoable 'validate' event + this.trigger('form-submit-validate', [a, this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-submit-validate trigger'); + return this; + } + + var q = $.param(a, traditional); + if (qx) { + q = ( q ? (q + '&' + qx) : qx ); + } + if (options.type.toUpperCase() == 'GET') { + options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; + options.data = null; // data is null for 'get' + } + else { + options.data = q; // data is the query string for 'post' + } + + var callbacks = []; + if (options.resetForm) { + callbacks.push(function() { $form.resetForm(); }); + } + if (options.clearForm) { + callbacks.push(function() { $form.clearForm(options.includeHidden); }); + } + + // perform a load on the target only if dataType is not provided + if (!options.dataType && options.target) { + var oldSuccess = options.success || function(){}; + callbacks.push(function(data) { + var fn = options.replaceTarget ? 'replaceWith' : 'html'; + $(options.target)[fn](data).each(oldSuccess, arguments); + }); + } + else if (options.success) { + callbacks.push(options.success); + } + + options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg + var context = options.context || this ; // jQuery 1.4+ supports scope context + for (var i=0, max=callbacks.length; i < max; i++) { + callbacks[i].apply(context, [data, status, xhr || $form, $form]); + } + }; + + if (options.error) { + var oldError = options.error; + options.error = function(xhr, status, error) { + var context = options.context || this; + oldError.apply(context, [xhr, status, error, $form]); + }; + } + + if (options.complete) { + var oldComplete = options.complete; + options.complete = function(xhr, status) { + var context = options.context || this; + oldComplete.apply(context, [xhr, status, $form]); + }; + } + + // are there files to upload? + + // [value] (issue #113), also see comment: + // https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219 + var fileInputs = $('input[type=file]:enabled', this).filter(function() { return $(this).val() !== ''; }); + + var hasFileInputs = fileInputs.length > 0; + var mp = 'multipart/form-data'; + var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); + + var fileAPI = feature.fileapi && feature.formdata; + log("fileAPI :" + fileAPI); + var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI; + + var jqxhr; + + // options.iframe allows user to force iframe mode + // 06-NOV-09: now defaulting to iframe mode if file input is detected + if (options.iframe !== false && (options.iframe || shouldUseFrame)) { + // hack to fix Safari hang (thanks to Tim Molendijk for this) + // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d + if (options.closeKeepAlive) { + $.get(options.closeKeepAlive, function() { + jqxhr = fileUploadIframe(a); + }); + } + else { + jqxhr = fileUploadIframe(a); + } + } + else if ((hasFileInputs || multipart) && fileAPI) { + jqxhr = fileUploadXhr(a); + } + else { + jqxhr = $.ajax(options); + } + + $form.removeData('jqxhr').data('jqxhr', jqxhr); + + // clear element array + for (var k=0; k < elements.length; k++) { + elements[k] = null; + } + + // fire 'notify' event + this.trigger('form-submit-notify', [this, options]); + return this; + + // utility fn for deep serialization + function deepSerialize(extraData){ + var serialized = $.param(extraData, options.traditional).split('&'); + var len = serialized.length; + var result = []; + var i, part; + for (i=0; i < len; i++) { + // #252; undo param space replacement + serialized[i] = serialized[i].replace(/\+/g,' '); + part = serialized[i].split('='); + // #278; use array instead of object storage, favoring array serializations + result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]); + } + return result; + } + + // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz) + function fileUploadXhr(a) { + var formdata = new FormData(); + + for (var i=0; i < a.length; i++) { + formdata.append(a[i].name, a[i].value); + } + + if (options.extraData) { + var serializedData = deepSerialize(options.extraData); + for (i=0; i < serializedData.length; i++) { + if (serializedData[i]) { + formdata.append(serializedData[i][0], serializedData[i][1]); + } + } + } + + options.data = null; + + var s = $.extend(true, {}, $.ajaxSettings, options, { + contentType: false, + processData: false, + cache: false, + type: method || 'POST' + }); + + if (options.uploadProgress) { + // workaround because jqXHR does not expose upload property + s.xhr = function() { + var xhr = $.ajaxSettings.xhr(); + if (xhr.upload) { + xhr.upload.addEventListener('progress', function(event) { + var percent = 0; + var position = event.loaded || event.position; /*event.position is deprecated*/ + var total = event.total; + if (event.lengthComputable) { + percent = Math.ceil(position / total * 100); + } + options.uploadProgress(event, position, total, percent); + }, false); + } + return xhr; + }; + } + + s.data = null; + var beforeSend = s.beforeSend; + s.beforeSend = function(xhr, o) { + //Send FormData() provided by user + if (options.formData) { + o.data = options.formData; + } + else { + o.data = formdata; + } + if(beforeSend) { + beforeSend.call(this, xhr, o); + } + }; + return $.ajax(s); + } + + // private function for handling file uploads (hat tip to YAHOO!) + function fileUploadIframe(a) { + var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle; + var deferred = $.Deferred(); + + // #341 + deferred.abort = function(status) { + xhr.abort(status); + }; + + if (a) { + // ensure that every serialized input is still enabled + for (i=0; i < elements.length; i++) { + el = $(elements[i]); + if ( hasProp ) { + el.prop('disabled', false); + } + else { + el.removeAttr('disabled'); + } + } + } + + s = $.extend(true, {}, $.ajaxSettings, options); + s.context = s.context || s; + id = 'jqFormIO' + (new Date().getTime()); + if (s.iframeTarget) { + $io = $(s.iframeTarget); + n = $io.attr2('name'); + if (!n) { + $io.attr2('name', id); + } + else { + id = n; + } + } + else { + $io = $('',preload:!0,css:{},attr:{scrolling:"auto"}},video:{tpl:'',format:"",autoStart:!0},defaultType:"image",animationEffect:"zoom",animationDuration:366,zoomOpacity:"auto",transitionEffect:"fade",transitionDuration:366,slideClass:"",baseClass:"",baseTpl:'',spinnerTpl:'
        ',errorTpl:'

        {{ERROR}}

        ',btnTpl:{download:'',zoom:'',close:'',arrowLeft:'',arrowRight:'',smallBtn:''},parentEl:"body",hideScrollbar:!0,autoFocus:!0,backFocus:!0,trapFocus:!0,fullScreen:{autoStart:!1},touch:{vertical:!0,momentum:!0},hash:null,media:{},slideShow:{autoStart:!1,speed:3e3},thumbs:{autoStart:!1,hideOnClose:!0,parentEl:".fancybox-container",axis:"y"},wheel:"auto",onInit:n.noop,beforeLoad:n.noop,afterLoad:n.noop,beforeShow:n.noop,afterShow:n.noop,beforeClose:n.noop,afterClose:n.noop,onActivate:n.noop,onDeactivate:n.noop,clickContent:function(t,e){return"image"===t.type&&"zoom"},clickSlide:"close",clickOutside:"close",dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1,mobile:{preventCaptionOverlap:!1,idleTime:!1,clickContent:function(t,e){return"image"===t.type&&"toggleControls"},clickSlide:function(t,e){return"image"===t.type?"toggleControls":"close"},dblclickContent:function(t,e){return"image"===t.type&&"zoom"},dblclickSlide:function(t,e){return"image"===t.type&&"zoom"}},lang:"en",i18n:{en:{CLOSE:"Close",NEXT:"Next",PREV:"Previous",ERROR:"The requested content cannot be loaded.
        Please try again later.",PLAY_START:"Start slideshow",PLAY_STOP:"Pause slideshow",FULL_SCREEN:"Full screen",THUMBS:"Thumbnails",DOWNLOAD:"Download",SHARE:"Share",ZOOM:"Zoom"},de:{CLOSE:"Schließen",NEXT:"Weiter",PREV:"Zurück",ERROR:"Die angeforderten Daten konnten nicht geladen werden.
        Bitte versuchen Sie es später nochmal.",PLAY_START:"Diaschau starten",PLAY_STOP:"Diaschau beenden",FULL_SCREEN:"Vollbild",THUMBS:"Vorschaubilder",DOWNLOAD:"Herunterladen",SHARE:"Teilen",ZOOM:"Vergrößern"}}},s=n(t),r=n(e),c=0,l=function(t){return t&&t.hasOwnProperty&&t instanceof n},d=function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||function(e){return t.setTimeout(e,1e3/60)}}(),u=function(){return t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.mozCancelAnimationFrame||t.oCancelAnimationFrame||function(e){t.clearTimeout(e)}}(),f=function(){var t,n=e.createElement("fakeelement"),o={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(t in o)if(void 0!==n.style[t])return o[t];return"transitionend"}(),p=function(t){return t&&t.length&&t[0].offsetHeight},h=function(t,e){var o=n.extend(!0,{},t,e);return n.each(e,function(t,e){n.isArray(e)&&(o[t]=e)}),o},g=function(t){var o,i;return!(!t||t.ownerDocument!==e)&&(n(".fancybox-container").css("pointer-events","none"),o={x:t.getBoundingClientRect().left+t.offsetWidth/2,y:t.getBoundingClientRect().top+t.offsetHeight/2},i=e.elementFromPoint(o.x,o.y)===t,n(".fancybox-container").css("pointer-events",""),i)},b=function(t,e,o){var i=this;i.opts=h({index:o},n.fancybox.defaults),n.isPlainObject(e)&&(i.opts=h(i.opts,e)),n.fancybox.isMobile&&(i.opts=h(i.opts,i.opts.mobile)),i.id=i.opts.id||++c,i.currIndex=parseInt(i.opts.index,10)||0,i.prevIndex=null,i.prevPos=null,i.currPos=0,i.firstRun=!0,i.group=[],i.slides={},i.addContent(t),i.group.length&&i.init()};n.extend(b.prototype,{init:function(){var o,i,a=this,s=a.group[a.currIndex],r=s.opts;r.closeExisting&&n.fancybox.close(!0),n("body").addClass("fancybox-active"),!n.fancybox.getInstance()&&!1!==r.hideScrollbar&&!n.fancybox.isMobile&&e.body.scrollHeight>t.innerHeight&&(n("head").append('"),n("body").addClass("compensate-for-scrollbar")),i="",n.each(r.buttons,function(t,e){i+=r.btnTpl[e]||""}),o=n(a.translate(a,r.baseTpl.replace("{{buttons}}",i).replace("{{arrows}}",r.btnTpl.arrowLeft+r.btnTpl.arrowRight))).attr("id","fancybox-container-"+a.id).addClass(r.baseClass).data("FancyBox",a).appendTo(r.parentEl),a.$refs={container:o},["bg","inner","infobar","toolbar","stage","caption","navigation"].forEach(function(t){a.$refs[t]=o.find(".fancybox-"+t)}),a.trigger("onInit"),a.activate(),a.jumpTo(a.currIndex)},translate:function(t,e){var n=t.opts.i18n[t.opts.lang]||t.opts.i18n.en;return e.replace(/\{\{(\w+)\}\}/g,function(t,e){return void 0===n[e]?t:n[e]})},addContent:function(t){var e,o=this,i=n.makeArray(t);n.each(i,function(t,e){var i,a,s,r,c,l={},d={};n.isPlainObject(e)?(l=e,d=e.opts||e):"object"===n.type(e)&&n(e).length?(i=n(e),d=i.data()||{},d=n.extend(!0,{},d,d.options),d.$orig=i,l.src=o.opts.src||d.src||i.attr("href"),l.type||l.src||(l.type="inline",l.src=e)):l={type:"html",src:e+""},l.opts=n.extend(!0,{},o.opts,d),n.isArray(d.buttons)&&(l.opts.buttons=d.buttons),n.fancybox.isMobile&&l.opts.mobile&&(l.opts=h(l.opts,l.opts.mobile)),a=l.type||l.opts.type,r=l.src||"",!a&&r&&((s=r.match(/\.(mp4|mov|ogv|webm)((\?|#).*)?$/i))?(a="video",l.opts.video.format||(l.opts.video.format="video/"+("ogv"===s[1]?"ogg":s[1]))):r.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i)?a="image":r.match(/\.(pdf)((\?|#).*)?$/i)?(a="iframe",l=n.extend(!0,l,{contentType:"pdf",opts:{iframe:{preload:!1}}})):"#"===r.charAt(0)&&(a="inline")),a?l.type=a:o.trigger("objectNeedsType",l),l.contentType||(l.contentType=n.inArray(l.type,["html","inline","ajax"])>-1?"html":l.type),l.index=o.group.length,"auto"==l.opts.smallBtn&&(l.opts.smallBtn=n.inArray(l.type,["html","inline","ajax"])>-1),"auto"===l.opts.toolbar&&(l.opts.toolbar=!l.opts.smallBtn),l.$thumb=l.opts.$thumb||null,l.opts.$trigger&&l.index===o.opts.index&&(l.$thumb=l.opts.$trigger.find("img:first"),l.$thumb.length&&(l.opts.$orig=l.opts.$trigger)),l.$thumb&&l.$thumb.length||!l.opts.$orig||(l.$thumb=l.opts.$orig.find("img:first")),l.$thumb&&!l.$thumb.length&&(l.$thumb=null),l.thumb=l.opts.thumb||(l.$thumb?l.$thumb[0].src:null),"function"===n.type(l.opts.caption)&&(l.opts.caption=l.opts.caption.apply(e,[o,l])),"function"===n.type(o.opts.caption)&&(l.opts.caption=o.opts.caption.apply(e,[o,l])),l.opts.caption instanceof n||(l.opts.caption=void 0===l.opts.caption?"":l.opts.caption+""),"ajax"===l.type&&(c=r.split(/\s+/,2),c.length>1&&(l.src=c.shift(),l.opts.filter=c.shift())),l.opts.modal&&(l.opts=n.extend(!0,l.opts,{trapFocus:!0,infobar:0,toolbar:0,smallBtn:0,keyboard:0,slideShow:0,fullScreen:0,thumbs:0,touch:0,clickContent:!1,clickSlide:!1,clickOutside:!1,dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1})),o.group.push(l)}),Object.keys(o.slides).length&&(o.updateControls(),(e=o.Thumbs)&&e.isActive&&(e.create(),e.focus()))},addEvents:function(){var e=this;e.removeEvents(),e.$refs.container.on("click.fb-close","[data-fancybox-close]",function(t){t.stopPropagation(),t.preventDefault(),e.close(t)}).on("touchstart.fb-prev click.fb-prev","[data-fancybox-prev]",function(t){t.stopPropagation(),t.preventDefault(),e.previous()}).on("touchstart.fb-next click.fb-next","[data-fancybox-next]",function(t){t.stopPropagation(),t.preventDefault(),e.next()}).on("click.fb","[data-fancybox-zoom]",function(t){e[e.isScaledDown()?"scaleToActual":"scaleToFit"]()}),s.on("orientationchange.fb resize.fb",function(t){t&&t.originalEvent&&"resize"===t.originalEvent.type?(e.requestId&&u(e.requestId),e.requestId=d(function(){e.update(t)})):(e.current&&"iframe"===e.current.type&&e.$refs.stage.hide(),setTimeout(function(){e.$refs.stage.show(),e.update(t)},n.fancybox.isMobile?600:250))}),r.on("keydown.fb",function(t){var o=n.fancybox?n.fancybox.getInstance():null,i=o.current,a=t.keyCode||t.which;if(9==a)return void(i.opts.trapFocus&&e.focus(t));if(!(!i.opts.keyboard||t.ctrlKey||t.altKey||t.shiftKey||n(t.target).is("input,textarea,video,audio,select")))return 8===a||27===a?(t.preventDefault(),void e.close(t)):37===a||38===a?(t.preventDefault(),void e.previous()):39===a||40===a?(t.preventDefault(),void e.next()):void e.trigger("afterKeydown",t,a)}),e.group[e.currIndex].opts.idleTime&&(e.idleSecondsCounter=0,r.on("mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle",function(t){e.idleSecondsCounter=0,e.isIdle&&e.showControls(),e.isIdle=!1}),e.idleInterval=t.setInterval(function(){++e.idleSecondsCounter>=e.group[e.currIndex].opts.idleTime&&!e.isDragging&&(e.isIdle=!0,e.idleSecondsCounter=0,e.hideControls())},1e3))},removeEvents:function(){var e=this;s.off("orientationchange.fb resize.fb"),r.off("keydown.fb .fb-idle"),this.$refs.container.off(".fb-close .fb-prev .fb-next"),e.idleInterval&&(t.clearInterval(e.idleInterval),e.idleInterval=null)},previous:function(t){return this.jumpTo(this.currPos-1,t)},next:function(t){return this.jumpTo(this.currPos+1,t)},jumpTo:function(t,e){var o,i,a,s,r,c,l,d,u,f=this,h=f.group.length;if(!(f.isDragging||f.isClosing||f.isAnimating&&f.firstRun)){if(t=parseInt(t,10),!(a=f.current?f.current.opts.loop:f.opts.loop)&&(t<0||t>=h))return!1;if(o=f.firstRun=!Object.keys(f.slides).length,r=f.current,f.prevIndex=f.currIndex,f.prevPos=f.currPos,s=f.createSlide(t),h>1&&((a||s.index0)&&f.createSlide(t-1)),f.current=s,f.currIndex=s.index,f.currPos=s.pos,f.trigger("beforeShow",o),f.updateControls(),s.forcedDuration=void 0,n.isNumeric(e)?s.forcedDuration=e:e=s.opts[o?"animationDuration":"transitionDuration"],e=parseInt(e,10),i=f.isMoved(s),s.$slide.addClass("fancybox-slide--current"),o)return s.opts.animationEffect&&e&&f.$refs.container.css("transition-duration",e+"ms"),f.$refs.container.addClass("fancybox-is-open").trigger("focus"),f.loadSlide(s),void f.preload("image");c=n.fancybox.getTranslate(r.$slide),l=n.fancybox.getTranslate(f.$refs.stage),n.each(f.slides,function(t,e){n.fancybox.stop(e.$slide,!0)}),r.pos!==s.pos&&(r.isComplete=!1),r.$slide.removeClass("fancybox-slide--complete fancybox-slide--current"),i?(u=c.left-(r.pos*c.width+r.pos*r.opts.gutter),n.each(f.slides,function(t,o){o.$slide.removeClass("fancybox-animated").removeClass(function(t,e){return(e.match(/(^|\s)fancybox-fx-\S+/g)||[]).join(" ")});var i=o.pos*c.width+o.pos*o.opts.gutter;n.fancybox.setTranslate(o.$slide,{top:0,left:i-l.left+u}),o.pos!==s.pos&&o.$slide.addClass("fancybox-slide--"+(o.pos>s.pos?"next":"previous")),p(o.$slide),n.fancybox.animate(o.$slide,{top:0,left:(o.pos-s.pos)*c.width+(o.pos-s.pos)*o.opts.gutter},e,function(){o.$slide.css({transform:"",opacity:""}).removeClass("fancybox-slide--next fancybox-slide--previous"),o.pos===f.currPos&&f.complete()})})):e&&s.opts.transitionEffect&&(d="fancybox-animated fancybox-fx-"+s.opts.transitionEffect,r.$slide.addClass("fancybox-slide--"+(r.pos>s.pos?"next":"previous")),n.fancybox.animate(r.$slide,d,e,function(){r.$slide.removeClass(d).removeClass("fancybox-slide--next fancybox-slide--previous")},!1)),s.isLoaded?f.revealContent(s):f.loadSlide(s),f.preload("image")}},createSlide:function(t){var e,o,i=this;return o=t%i.group.length,o=o<0?i.group.length+o:o,!i.slides[t]&&i.group[o]&&(e=n('
        ').appendTo(i.$refs.stage),i.slides[t]=n.extend(!0,{},i.group[o],{pos:t,$slide:e,isLoaded:!1}),i.updateSlide(i.slides[t])),i.slides[t]},scaleToActual:function(t,e,o){var i,a,s,r,c,l=this,d=l.current,u=d.$content,f=n.fancybox.getTranslate(d.$slide).width,p=n.fancybox.getTranslate(d.$slide).height,h=d.width,g=d.height;l.isAnimating||l.isMoved()||!u||"image"!=d.type||!d.isLoaded||d.hasError||(l.isAnimating=!0,n.fancybox.stop(u),t=void 0===t?.5*f:t,e=void 0===e?.5*p:e,i=n.fancybox.getTranslate(u),i.top-=n.fancybox.getTranslate(d.$slide).top,i.left-=n.fancybox.getTranslate(d.$slide).left,r=h/i.width,c=g/i.height,a=.5*f-.5*h,s=.5*p-.5*g,h>f&&(a=i.left*r-(t*r-t),a>0&&(a=0),ap&&(s=i.top*c-(e*c-e),s>0&&(s=0),se-.5&&(l=e),d>o-.5&&(d=o),"image"===t.type?(u.top=Math.floor(.5*(o-d))+parseFloat(c.css("paddingTop")),u.left=Math.floor(.5*(e-l))+parseFloat(c.css("paddingLeft"))):"video"===t.contentType&&(a=t.opts.width&&t.opts.height?l/d:t.opts.ratio||16/9,d>l/a?d=l/a:l>d*a&&(l=d*a)),u.width=l,u.height=d,u)},update:function(t){var e=this;n.each(e.slides,function(n,o){e.updateSlide(o,t)})},updateSlide:function(t,e){var o=this,i=t&&t.$content,a=t.width||t.opts.width,s=t.height||t.opts.height,r=t.$slide;o.adjustCaption(t),i&&(a||s||"video"===t.contentType)&&!t.hasError&&(n.fancybox.stop(i),n.fancybox.setTranslate(i,o.getFitPos(t)),t.pos===o.currPos&&(o.isAnimating=!1,o.updateCursor())),o.adjustLayout(t),r.length&&(r.trigger("refresh"),t.pos===o.currPos&&o.$refs.toolbar.add(o.$refs.navigation.find(".fancybox-button--arrow_right")).toggleClass("compensate-for-scrollbar",r.get(0).scrollHeight>r.get(0).clientHeight)),o.trigger("onUpdate",t,e)},centerSlide:function(t){var e=this,o=e.current,i=o.$slide;!e.isClosing&&o&&(i.siblings().css({transform:"",opacity:""}),i.parent().children().removeClass("fancybox-slide--previous fancybox-slide--next"),n.fancybox.animate(i,{top:0,left:0,opacity:1},void 0===t?0:t,function(){i.css({transform:"",opacity:""}),o.isComplete||e.complete()},!1))},isMoved:function(t){var e,o,i=t||this.current;return!!i&&(o=n.fancybox.getTranslate(this.$refs.stage),e=n.fancybox.getTranslate(i.$slide),!i.$slide.hasClass("fancybox-animated")&&(Math.abs(e.top-o.top)>.5||Math.abs(e.left-o.left)>.5))},updateCursor:function(t,e){var o,i,a=this,s=a.current,r=a.$refs.container;s&&!a.isClosing&&a.Guestures&&(r.removeClass("fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-zoomOut fancybox-can-swipe fancybox-can-pan"),o=a.canPan(t,e),i=!!o||a.isZoomable(),r.toggleClass("fancybox-is-zoomable",i),n("[data-fancybox-zoom]").prop("disabled",!i),o?r.addClass("fancybox-can-pan"):i&&("zoom"===s.opts.clickContent||n.isFunction(s.opts.clickContent)&&"zoom"==s.opts.clickContent(s))?r.addClass("fancybox-can-zoomIn"):s.opts.touch&&(s.opts.touch.vertical||a.group.length>1)&&"video"!==s.contentType&&r.addClass("fancybox-can-swipe"))},isZoomable:function(){var t,e=this,n=e.current;if(n&&!e.isClosing&&"image"===n.type&&!n.hasError){if(!n.isLoaded)return!0;if((t=e.getFitPos(n))&&(n.width>t.width||n.height>t.height))return!0}return!1},isScaledDown:function(t,e){var o=this,i=!1,a=o.current,s=a.$content;return void 0!==t&&void 0!==e?i=t1.5||Math.abs(a.height-s.height)>1.5)),s},loadSlide:function(t){var e,o,i,a=this;if(!t.isLoading&&!t.isLoaded){if(t.isLoading=!0,!1===a.trigger("beforeLoad",t))return t.isLoading=!1,!1;switch(e=t.type,o=t.$slide,o.off("refresh").trigger("onReset").addClass(t.opts.slideClass),e){case"image":a.setImage(t);break;case"iframe":a.setIframe(t);break;case"html":a.setContent(t,t.src||t.content);break;case"video":a.setContent(t,t.opts.video.tpl.replace(/\{\{src\}\}/gi,t.src).replace("{{format}}",t.opts.videoFormat||t.opts.video.format||"").replace("{{poster}}",t.thumb||""));break;case"inline":n(t.src).length?a.setContent(t,n(t.src)):a.setError(t);break;case"ajax":a.showLoading(t),i=n.ajax(n.extend({},t.opts.ajax.settings,{url:t.src,success:function(e,n){"success"===n&&a.setContent(t,e)},error:function(e,n){e&&"abort"!==n&&a.setError(t)}})),o.one("onReset",function(){i.abort()});break;default:a.setError(t)}return!0}},setImage:function(t){var o,i=this;setTimeout(function(){var e=t.$image;i.isClosing||!t.isLoading||e&&e.length&&e[0].complete||t.hasError||i.showLoading(t)},50),i.checkSrcset(t),t.$content=n('
        ').addClass("fancybox-is-hidden").appendTo(t.$slide.addClass("fancybox-slide--image")),!1!==t.opts.preload&&t.opts.width&&t.opts.height&&t.thumb&&(t.width=t.opts.width,t.height=t.opts.height,o=e.createElement("img"),o.onerror=function(){n(this).remove(),t.$ghost=null},o.onload=function(){i.afterLoad(t)},t.$ghost=n(o).addClass("fancybox-image").appendTo(t.$content).attr("src",t.thumb)),i.setBigImage(t)},checkSrcset:function(e){var n,o,i,a,s=e.opts.srcset||e.opts.image.srcset;if(s){i=t.devicePixelRatio||1,a=t.innerWidth*i,o=s.split(",").map(function(t){var e={};return t.trim().split(/\s+/).forEach(function(t,n){var o=parseInt(t.substring(0,t.length-1),10);if(0===n)return e.url=t;o&&(e.value=o,e.postfix=t[t.length-1])}),e}),o.sort(function(t,e){return t.value-e.value});for(var r=0;r=a||"x"===c.postfix&&c.value>=i){n=c;break}}!n&&o.length&&(n=o[o.length-1]),n&&(e.src=n.url,e.width&&e.height&&"w"==n.postfix&&(e.height=e.width/e.height*n.value,e.width=n.value),e.opts.srcset=s)}},setBigImage:function(t){var o=this,i=e.createElement("img"),a=n(i);t.$image=a.one("error",function(){o.setError(t)}).one("load",function(){var e;t.$ghost||(o.resolveImageSlideSize(t,this.naturalWidth,this.naturalHeight),o.afterLoad(t)),o.isClosing||(t.opts.srcset&&(e=t.opts.sizes,e&&"auto"!==e||(e=(t.width/t.height>1&&s.width()/s.height()>1?"100":Math.round(t.width/t.height*100))+"vw"),a.attr("sizes",e).attr("srcset",t.opts.srcset)),t.$ghost&&setTimeout(function(){t.$ghost&&!o.isClosing&&t.$ghost.hide()},Math.min(300,Math.max(1e3,t.height/1600))),o.hideLoading(t))}).addClass("fancybox-image").attr("src",t.src).appendTo(t.$content),(i.complete||"complete"==i.readyState)&&a.naturalWidth&&a.naturalHeight?a.trigger("load"):i.error&&a.trigger("error")},resolveImageSlideSize:function(t,e,n){var o=parseInt(t.opts.width,10),i=parseInt(t.opts.height,10);t.width=e,t.height=n,o>0&&(t.width=o,t.height=Math.floor(o*n/e)),i>0&&(t.width=Math.floor(i*e/n),t.height=i)},setIframe:function(t){var e,o=this,i=t.opts.iframe,a=t.$slide;t.$content=n('
        ').css(i.css).appendTo(a),a.addClass("fancybox-slide--"+t.contentType),t.$iframe=e=n(i.tpl.replace(/\{rnd\}/g,(new Date).getTime())).attr(i.attr).appendTo(t.$content),i.preload?(o.showLoading(t),e.on("load.fb error.fb",function(e){this.isReady=1,t.$slide.trigger("refresh"),o.afterLoad(t)}),a.on("refresh.fb",function(){var n,o,s=t.$content,r=i.css.width,c=i.css.height;if(1===e[0].isReady){try{n=e.contents(),o=n.find("body")}catch(t){}o&&o.length&&o.children().length&&(a.css("overflow","visible"),s.css({width:"100%","max-width":"100%",height:"9999px"}),void 0===r&&(r=Math.ceil(Math.max(o[0].clientWidth,o.outerWidth(!0)))),s.css("width",r||"").css("max-width",""),void 0===c&&(c=Math.ceil(Math.max(o[0].clientHeight,o.outerHeight(!0)))),s.css("height",c||""),a.css("overflow","auto")),s.removeClass("fancybox-is-hidden")}})):o.afterLoad(t),e.attr("src",t.src),a.one("onReset",function(){try{n(this).find("iframe").hide().unbind().attr("src","//about:blank")}catch(t){}n(this).off("refresh.fb").empty(),t.isLoaded=!1,t.isRevealed=!1})},setContent:function(t,e){var o=this;o.isClosing||(o.hideLoading(t),t.$content&&n.fancybox.stop(t.$content),t.$slide.empty(),l(e)&&e.parent().length?((e.hasClass("fancybox-content")||e.parent().hasClass("fancybox-content"))&&e.parents(".fancybox-slide").trigger("onReset"),t.$placeholder=n("
        ").hide().insertAfter(e),e.css("display","inline-block")):t.hasError||("string"===n.type(e)&&(e=n("
        ").append(n.trim(e)).contents()),t.opts.filter&&(e=n("
        ").html(e).find(t.opts.filter))),t.$slide.one("onReset",function(){n(this).find("video,audio").trigger("pause"),t.$placeholder&&(t.$placeholder.after(e.removeClass("fancybox-content").hide()).remove(),t.$placeholder=null),t.$smallBtn&&(t.$smallBtn.remove(),t.$smallBtn=null),t.hasError||(n(this).empty(),t.isLoaded=!1,t.isRevealed=!1)}),n(e).appendTo(t.$slide),n(e).is("video,audio")&&(n(e).addClass("fancybox-video"),n(e).wrap("
        "),t.contentType="video",t.opts.width=t.opts.width||n(e).attr("width"),t.opts.height=t.opts.height||n(e).attr("height")),t.$content=t.$slide.children().filter("div,form,main,video,audio,article,.fancybox-content").first(),t.$content.siblings().hide(),t.$content.length||(t.$content=t.$slide.wrapInner("
        ").children().first()),t.$content.addClass("fancybox-content"),t.$slide.addClass("fancybox-slide--"+t.contentType),o.afterLoad(t))},setError:function(t){t.hasError=!0,t.$slide.trigger("onReset").removeClass("fancybox-slide--"+t.contentType).addClass("fancybox-slide--error"),t.contentType="html",this.setContent(t,this.translate(t,t.opts.errorTpl)),t.pos===this.currPos&&(this.isAnimating=!1)},showLoading:function(t){var e=this;(t=t||e.current)&&!t.$spinner&&(t.$spinner=n(e.translate(e,e.opts.spinnerTpl)).appendTo(t.$slide).hide().fadeIn("fast"))},hideLoading:function(t){var e=this;(t=t||e.current)&&t.$spinner&&(t.$spinner.stop().remove(),delete t.$spinner)},afterLoad:function(t){var e=this;e.isClosing||(t.isLoading=!1,t.isLoaded=!0,e.trigger("afterLoad",t),e.hideLoading(t),!t.opts.smallBtn||t.$smallBtn&&t.$smallBtn.length||(t.$smallBtn=n(e.translate(t,t.opts.btnTpl.smallBtn)).appendTo(t.$content)),t.opts.protect&&t.$content&&!t.hasError&&(t.$content.on("contextmenu.fb",function(t){return 2==t.button&&t.preventDefault(),!0}),"image"===t.type&&n('
        ').appendTo(t.$content)),e.adjustCaption(t),e.adjustLayout(t),t.pos===e.currPos&&e.updateCursor(),e.revealContent(t))},adjustCaption:function(t){var e,n=this,o=t||n.current,i=o.opts.caption,a=o.opts.preventCaptionOverlap,s=n.$refs.caption,r=!1;s.toggleClass("fancybox-caption--separate",a),a&&i&&i.length&&(o.pos!==n.currPos?(e=s.clone().appendTo(s.parent()),e.children().eq(0).empty().html(i),r=e.outerHeight(!0),e.empty().remove()):n.$caption&&(r=n.$caption.outerHeight(!0)),o.$slide.css("padding-bottom",r||""))},adjustLayout:function(t){var e,n,o,i,a=this,s=t||a.current;s.isLoaded&&!0!==s.opts.disableLayoutFix&&(s.$content.css("margin-bottom",""),s.$content.outerHeight()>s.$slide.height()+.5&&(o=s.$slide[0].style["padding-bottom"],i=s.$slide.css("padding-bottom"),parseFloat(i)>0&&(e=s.$slide[0].scrollHeight,s.$slide.css("padding-bottom",0),Math.abs(e-s.$slide[0].scrollHeight)<1&&(n=i),s.$slide.css("padding-bottom",o))),s.$content.css("margin-bottom",n))},revealContent:function(t){var e,o,i,a,s=this,r=t.$slide,c=!1,l=!1,d=s.isMoved(t),u=t.isRevealed;return t.isRevealed=!0,e=t.opts[s.firstRun?"animationEffect":"transitionEffect"],i=t.opts[s.firstRun?"animationDuration":"transitionDuration"],i=parseInt(void 0===t.forcedDuration?i:t.forcedDuration,10),!d&&t.pos===s.currPos&&i||(e=!1),"zoom"===e&&(t.pos===s.currPos&&i&&"image"===t.type&&!t.hasError&&(l=s.getThumbPos(t))?c=s.getFitPos(t):e="fade"),"zoom"===e?(s.isAnimating=!0,c.scaleX=c.width/l.width,c.scaleY=c.height/l.height,a=t.opts.zoomOpacity,"auto"==a&&(a=Math.abs(t.width/t.height-l.width/l.height)>.1),a&&(l.opacity=.1,c.opacity=1),n.fancybox.setTranslate(t.$content.removeClass("fancybox-is-hidden"),l),p(t.$content),void n.fancybox.animate(t.$content,c,i,function(){s.isAnimating=!1,s.complete()})):(s.updateSlide(t),e?(n.fancybox.stop(r),o="fancybox-slide--"+(t.pos>=s.prevPos?"next":"previous")+" fancybox-animated fancybox-fx-"+e,r.addClass(o).removeClass("fancybox-slide--current"),t.$content.removeClass("fancybox-is-hidden"),p(r),"image"!==t.type&&t.$content.hide().show(0),void n.fancybox.animate(r,"fancybox-slide--current",i,function(){r.removeClass(o).css({transform:"",opacity:""}),t.pos===s.currPos&&s.complete()},!0)):(t.$content.removeClass("fancybox-is-hidden"),u||!d||"image"!==t.type||t.hasError||t.$content.hide().fadeIn("fast"),void(t.pos===s.currPos&&s.complete())))},getThumbPos:function(t){var e,o,i,a,s,r=!1,c=t.$thumb;return!(!c||!g(c[0]))&&(e=n.fancybox.getTranslate(c),o=parseFloat(c.css("border-top-width")||0),i=parseFloat(c.css("border-right-width")||0),a=parseFloat(c.css("border-bottom-width")||0),s=parseFloat(c.css("border-left-width")||0),r={top:e.top+o,left:e.left+s,width:e.width-i-s,height:e.height-o-a,scaleX:1,scaleY:1},e.width>0&&e.height>0&&r)},complete:function(){var t,e=this,o=e.current,i={};!e.isMoved()&&o.isLoaded&&(o.isComplete||(o.isComplete=!0,o.$slide.siblings().trigger("onReset"),e.preload("inline"),p(o.$slide),o.$slide.addClass("fancybox-slide--complete"),n.each(e.slides,function(t,o){o.pos>=e.currPos-1&&o.pos<=e.currPos+1?i[o.pos]=o:o&&(n.fancybox.stop(o.$slide),o.$slide.off().remove())}),e.slides=i),e.isAnimating=!1,e.updateCursor(),e.trigger("afterShow"),o.opts.video.autoStart&&o.$slide.find("video,audio").filter(":visible:first").trigger("play").one("ended",function(){Document.exitFullscreen?Document.exitFullscreen():this.webkitExitFullscreen&&this.webkitExitFullscreen(),e.next()}),o.opts.autoFocus&&"html"===o.contentType&&(t=o.$content.find("input[autofocus]:enabled:visible:first"),t.length?t.trigger("focus"):e.focus(null,!0)),o.$slide.scrollTop(0).scrollLeft(0))},preload:function(t){var e,n,o=this;o.group.length<2||(n=o.slides[o.currPos+1],e=o.slides[o.currPos-1],e&&e.type===t&&o.loadSlide(e),n&&n.type===t&&o.loadSlide(n))},focus:function(t,o){var i,a,s=this,r=["a[href]","area[href]",'input:not([disabled]):not([type="hidden"]):not([aria-hidden])',"select:not([disabled]):not([aria-hidden])","textarea:not([disabled]):not([aria-hidden])","button:not([disabled]):not([aria-hidden])","iframe","object","embed","video","audio","[contenteditable]",'[tabindex]:not([tabindex^="-"])'].join(",");s.isClosing||(i=!t&&s.current&&s.current.isComplete?s.current.$slide.find("*:visible"+(o?":not(.fancybox-close-small)":"")):s.$refs.container.find("*:visible"),i=i.filter(r).filter(function(){return"hidden"!==n(this).css("visibility")&&!n(this).hasClass("disabled")}),i.length?(a=i.index(e.activeElement),t&&t.shiftKey?(a<0||0==a)&&(t.preventDefault(),i.eq(i.length-1).trigger("focus")):(a<0||a==i.length-1)&&(t&&t.preventDefault(),i.eq(0).trigger("focus"))):s.$refs.container.trigger("focus"))},activate:function(){var t=this;n(".fancybox-container").each(function(){var e=n(this).data("FancyBox");e&&e.id!==t.id&&!e.isClosing&&(e.trigger("onDeactivate"),e.removeEvents(),e.isVisible=!1)}),t.isVisible=!0,(t.current||t.isIdle)&&(t.update(),t.updateControls()),t.trigger("onActivate"),t.addEvents()},close:function(t,e){var o,i,a,s,r,c,l,u=this,f=u.current,h=function(){u.cleanUp(t)};return!u.isClosing&&(u.isClosing=!0,!1===u.trigger("beforeClose",t)?(u.isClosing=!1,d(function(){u.update()}),!1):(u.removeEvents(),a=f.$content,o=f.opts.animationEffect,i=n.isNumeric(e)?e:o?f.opts.animationDuration:0,f.$slide.removeClass("fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated"),!0!==t?n.fancybox.stop(f.$slide):o=!1,f.$slide.siblings().trigger("onReset").remove(),i&&u.$refs.container.removeClass("fancybox-is-open").addClass("fancybox-is-closing").css("transition-duration",i+"ms"),u.hideLoading(f),u.hideControls(!0),u.updateCursor(),"zoom"!==o||a&&i&&"image"===f.type&&!u.isMoved()&&!f.hasError&&(l=u.getThumbPos(f))||(o="fade"),"zoom"===o?(n.fancybox.stop(a),s=n.fancybox.getTranslate(a),c={top:s.top,left:s.left,scaleX:s.width/l.width,scaleY:s.height/l.height,width:l.width,height:l.height},r=f.opts.zoomOpacity, +"auto"==r&&(r=Math.abs(f.width/f.height-l.width/l.height)>.1),r&&(l.opacity=0),n.fancybox.setTranslate(a,c),p(a),n.fancybox.animate(a,l,i,h),!0):(o&&i?n.fancybox.animate(f.$slide.addClass("fancybox-slide--previous").removeClass("fancybox-slide--current"),"fancybox-animated fancybox-fx-"+o,i,h):!0===t?setTimeout(h,i):h(),!0)))},cleanUp:function(e){var o,i,a,s=this,r=s.current.opts.$orig;s.current.$slide.trigger("onReset"),s.$refs.container.empty().remove(),s.trigger("afterClose",e),s.current.opts.backFocus&&(r&&r.length&&r.is(":visible")||(r=s.$trigger),r&&r.length&&(i=t.scrollX,a=t.scrollY,r.trigger("focus"),n("html, body").scrollTop(a).scrollLeft(i))),s.current=null,o=n.fancybox.getInstance(),o?o.activate():(n("body").removeClass("fancybox-active compensate-for-scrollbar"),n("#fancybox-style-noscroll").remove())},trigger:function(t,e){var o,i=Array.prototype.slice.call(arguments,1),a=this,s=e&&e.opts?e:a.current;if(s?i.unshift(s):s=a,i.unshift(a),n.isFunction(s.opts[t])&&(o=s.opts[t].apply(s,i)),!1===o)return o;"afterClose"!==t&&a.$refs?a.$refs.container.trigger(t+".fb",i):r.trigger(t+".fb",i)},updateControls:function(){var t=this,o=t.current,i=o.index,a=t.$refs.container,s=t.$refs.caption,r=o.opts.caption;o.$slide.trigger("refresh"),r&&r.length?(t.$caption=s,s.children().eq(0).html(r)):t.$caption=null,t.hasHiddenControls||t.isIdle||t.showControls(),a.find("[data-fancybox-count]").html(t.group.length),a.find("[data-fancybox-index]").html(i+1),a.find("[data-fancybox-prev]").prop("disabled",!o.opts.loop&&i<=0),a.find("[data-fancybox-next]").prop("disabled",!o.opts.loop&&i>=t.group.length-1),"image"===o.type?a.find("[data-fancybox-zoom]").show().end().find("[data-fancybox-download]").attr("href",o.opts.image.src||o.src).show():o.opts.toolbar&&a.find("[data-fancybox-download],[data-fancybox-zoom]").hide(),n(e.activeElement).is(":hidden,[disabled]")&&t.$refs.container.trigger("focus")},hideControls:function(t){var e=this,n=["infobar","toolbar","nav"];!t&&e.current.opts.preventCaptionOverlap||n.push("caption"),this.$refs.container.removeClass(n.map(function(t){return"fancybox-show-"+t}).join(" ")),this.hasHiddenControls=!0},showControls:function(){var t=this,e=t.current?t.current.opts:t.opts,n=t.$refs.container;t.hasHiddenControls=!1,t.idleSecondsCounter=0,n.toggleClass("fancybox-show-toolbar",!(!e.toolbar||!e.buttons)).toggleClass("fancybox-show-infobar",!!(e.infobar&&t.group.length>1)).toggleClass("fancybox-show-caption",!!t.$caption).toggleClass("fancybox-show-nav",!!(e.arrows&&t.group.length>1)).toggleClass("fancybox-is-modal",!!e.modal)},toggleControls:function(){this.hasHiddenControls?this.showControls():this.hideControls()}}),n.fancybox={version:"3.5.7",defaults:a,getInstance:function(t){var e=n('.fancybox-container:not(".fancybox-is-closing"):last').data("FancyBox"),o=Array.prototype.slice.call(arguments,1);return e instanceof b&&("string"===n.type(t)?e[t].apply(e,o):"function"===n.type(t)&&t.apply(e,o),e)},open:function(t,e,n){return new b(t,e,n)},close:function(t){var e=this.getInstance();e&&(e.close(),!0===t&&this.close(t))},destroy:function(){this.close(!0),r.add("body").off("click.fb-start","**")},isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),use3d:function(){var n=e.createElement("div");return t.getComputedStyle&&t.getComputedStyle(n)&&t.getComputedStyle(n).getPropertyValue("transform")&&!(e.documentMode&&e.documentMode<11)}(),getTranslate:function(t){var e;return!(!t||!t.length)&&(e=t[0].getBoundingClientRect(),{top:e.top||0,left:e.left||0,width:e.width,height:e.height,opacity:parseFloat(t.css("opacity"))})},setTranslate:function(t,e){var n="",o={};if(t&&e)return void 0===e.left&&void 0===e.top||(n=(void 0===e.left?t.position().left:e.left)+"px, "+(void 0===e.top?t.position().top:e.top)+"px",n=this.use3d?"translate3d("+n+", 0px)":"translate("+n+")"),void 0!==e.scaleX&&void 0!==e.scaleY?n+=" scale("+e.scaleX+", "+e.scaleY+")":void 0!==e.scaleX&&(n+=" scaleX("+e.scaleX+")"),n.length&&(o.transform=n),void 0!==e.opacity&&(o.opacity=e.opacity),void 0!==e.width&&(o.width=e.width),void 0!==e.height&&(o.height=e.height),t.css(o)},animate:function(t,e,o,i,a){var s,r=this;n.isFunction(o)&&(i=o,o=null),r.stop(t),s=r.getTranslate(t),t.on(f,function(c){(!c||!c.originalEvent||t.is(c.originalEvent.target)&&"z-index"!=c.originalEvent.propertyName)&&(r.stop(t),n.isNumeric(o)&&t.css("transition-duration",""),n.isPlainObject(e)?void 0!==e.scaleX&&void 0!==e.scaleY&&r.setTranslate(t,{top:e.top,left:e.left,width:s.width*e.scaleX,height:s.height*e.scaleY,scaleX:1,scaleY:1}):!0!==a&&t.removeClass(e),n.isFunction(i)&&i(c))}),n.isNumeric(o)&&t.css("transition-duration",o+"ms"),n.isPlainObject(e)?(void 0!==e.scaleX&&void 0!==e.scaleY&&(delete e.width,delete e.height,t.parent().hasClass("fancybox-slide--image")&&t.parent().addClass("fancybox-is-scaling")),n.fancybox.setTranslate(t,e)):t.addClass(e),t.data("timer",setTimeout(function(){t.trigger(f)},o+33))},stop:function(t,e){t&&t.length&&(clearTimeout(t.data("timer")),e&&t.trigger(f),t.off(f).css("transition-duration",""),t.parent().removeClass("fancybox-is-scaling"))}},n.fn.fancybox=function(t){var e;return t=t||{},e=t.selector||!1,e?n("body").off("click.fb-start",e).on("click.fb-start",e,{options:t},i):this.off("click.fb-start").on("click.fb-start",{items:this,options:t},i),this},r.on("click.fb-start","[data-fancybox]",i),r.on("click.fb-start","[data-fancybox-trigger]",function(t){n('[data-fancybox="'+n(this).attr("data-fancybox-trigger")+'"]').eq(n(this).attr("data-fancybox-index")||0).trigger("click.fb-start",{$trigger:n(this)})}),function(){var t=null;r.on("mousedown mouseup focus blur",".fancybox-button",function(e){switch(e.type){case"mousedown":t=n(this);break;case"mouseup":t=null;break;case"focusin":n(".fancybox-button").removeClass("fancybox-focus"),n(this).is(t)||n(this).is("[disabled]")||n(this).addClass("fancybox-focus");break;case"focusout":n(".fancybox-button").removeClass("fancybox-focus")}})}()}}(window,document,jQuery),function(t){"use strict";var e={youtube:{matcher:/(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i,params:{autoplay:1,autohide:1,fs:1,rel:0,hd:1,wmode:"transparent",enablejsapi:1,html5:1},paramPlace:8,type:"iframe",url:"https://www.youtube-nocookie.com/embed/$4",thumb:"https://img.youtube.com/vi/$4/hqdefault.jpg"},vimeo:{matcher:/^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/,params:{autoplay:1,hd:1,show_title:1,show_byline:1,show_portrait:0,fullscreen:1},paramPlace:3,type:"iframe",url:"//player.vimeo.com/video/$2"},instagram:{matcher:/(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,type:"image",url:"//$1/p/$2/media/?size=l"},gmap_place:{matcher:/(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i,type:"iframe",url:function(t){return"//maps.google."+t[2]+"/?ll="+(t[9]?t[9]+"&z="+Math.floor(t[10])+(t[12]?t[12].replace(/^\//,"&"):""):t[12]+"").replace(/\?/,"&")+"&output="+(t[12]&&t[12].indexOf("layer=c")>0?"svembed":"embed")}},gmap_search:{matcher:/(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i,type:"iframe",url:function(t){return"//maps.google."+t[2]+"/maps?q="+t[5].replace("query=","q=").replace("api=1","")+"&output=embed"}}},n=function(e,n,o){if(e)return o=o||"","object"===t.type(o)&&(o=t.param(o,!0)),t.each(n,function(t,n){e=e.replace("$"+t,n||"")}),o.length&&(e+=(e.indexOf("?")>0?"&":"?")+o),e};t(document).on("objectNeedsType.fb",function(o,i,a){var s,r,c,l,d,u,f,p=a.src||"",h=!1;s=t.extend(!0,{},e,a.opts.media),t.each(s,function(e,o){if(c=p.match(o.matcher)){if(h=o.type,f=e,u={},o.paramPlace&&c[o.paramPlace]){d=c[o.paramPlace],"?"==d[0]&&(d=d.substring(1)),d=d.split("&");for(var i=0;i1&&("youtube"===n.contentSource||"vimeo"===n.contentSource)&&o.load(n.contentSource)}})}(jQuery),function(t,e,n){"use strict";var o=function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||function(e){return t.setTimeout(e,1e3/60)}}(),i=function(){return t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.mozCancelAnimationFrame||t.oCancelAnimationFrame||function(e){t.clearTimeout(e)}}(),a=function(e){var n=[];e=e.originalEvent||e||t.e,e=e.touches&&e.touches.length?e.touches:e.changedTouches&&e.changedTouches.length?e.changedTouches:[e];for(var o in e)e[o].pageX?n.push({x:e[o].pageX,y:e[o].pageY}):e[o].clientX&&n.push({x:e[o].clientX,y:e[o].clientY});return n},s=function(t,e,n){return e&&t?"x"===n?t.x-e.x:"y"===n?t.y-e.y:Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2)):0},r=function(t){if(t.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio,iframe')||n.isFunction(t.get(0).onclick)||t.data("selectable"))return!0;for(var e=0,o=t[0].attributes,i=o.length;ee.clientHeight,a=("scroll"===o||"auto"===o)&&e.scrollWidth>e.clientWidth;return i||a},l=function(t){for(var e=!1;;){if(e=c(t.get(0)))break;if(t=t.parent(),!t.length||t.hasClass("fancybox-stage")||t.is("body"))break}return e},d=function(t){var e=this;e.instance=t,e.$bg=t.$refs.bg,e.$stage=t.$refs.stage,e.$container=t.$refs.container,e.destroy(),e.$container.on("touchstart.fb.touch mousedown.fb.touch",n.proxy(e,"ontouchstart"))};d.prototype.destroy=function(){var t=this;t.$container.off(".fb.touch"),n(e).off(".fb.touch"),t.requestId&&(i(t.requestId),t.requestId=null),t.tapped&&(clearTimeout(t.tapped),t.tapped=null)},d.prototype.ontouchstart=function(o){var i=this,c=n(o.target),d=i.instance,u=d.current,f=u.$slide,p=u.$content,h="touchstart"==o.type;if(h&&i.$container.off("mousedown.fb.touch"),(!o.originalEvent||2!=o.originalEvent.button)&&f.length&&c.length&&!r(c)&&!r(c.parent())&&(c.is("img")||!(o.originalEvent.clientX>c[0].clientWidth+c.offset().left))){if(!u||d.isAnimating||u.$slide.hasClass("fancybox-animated"))return o.stopPropagation(),void o.preventDefault();i.realPoints=i.startPoints=a(o),i.startPoints.length&&(u.touch&&o.stopPropagation(),i.startEvent=o,i.canTap=!0,i.$target=c,i.$content=p,i.opts=u.opts.touch,i.isPanning=!1,i.isSwiping=!1,i.isZooming=!1,i.isScrolling=!1,i.canPan=d.canPan(),i.startTime=(new Date).getTime(),i.distanceX=i.distanceY=i.distance=0,i.canvasWidth=Math.round(f[0].clientWidth),i.canvasHeight=Math.round(f[0].clientHeight),i.contentLastPos=null,i.contentStartPos=n.fancybox.getTranslate(i.$content)||{top:0,left:0},i.sliderStartPos=n.fancybox.getTranslate(f),i.stagePos=n.fancybox.getTranslate(d.$refs.stage),i.sliderStartPos.top-=i.stagePos.top,i.sliderStartPos.left-=i.stagePos.left,i.contentStartPos.top-=i.stagePos.top,i.contentStartPos.left-=i.stagePos.left,n(e).off(".fb.touch").on(h?"touchend.fb.touch touchcancel.fb.touch":"mouseup.fb.touch mouseleave.fb.touch",n.proxy(i,"ontouchend")).on(h?"touchmove.fb.touch":"mousemove.fb.touch",n.proxy(i,"ontouchmove")),n.fancybox.isMobile&&e.addEventListener("scroll",i.onscroll,!0),((i.opts||i.canPan)&&(c.is(i.$stage)||i.$stage.find(c).length)||(c.is(".fancybox-image")&&o.preventDefault(),n.fancybox.isMobile&&c.parents(".fancybox-caption").length))&&(i.isScrollable=l(c)||l(c.parent()),n.fancybox.isMobile&&i.isScrollable||o.preventDefault(),(1===i.startPoints.length||u.hasError)&&(i.canPan?(n.fancybox.stop(i.$content),i.isPanning=!0):i.isSwiping=!0,i.$container.addClass("fancybox-is-grabbing")),2===i.startPoints.length&&"image"===u.type&&(u.isLoaded||u.$ghost)&&(i.canTap=!1,i.isSwiping=!1,i.isPanning=!1,i.isZooming=!0,n.fancybox.stop(i.$content),i.centerPointStartX=.5*(i.startPoints[0].x+i.startPoints[1].x)-n(t).scrollLeft(),i.centerPointStartY=.5*(i.startPoints[0].y+i.startPoints[1].y)-n(t).scrollTop(),i.percentageOfImageAtPinchPointX=(i.centerPointStartX-i.contentStartPos.left)/i.contentStartPos.width,i.percentageOfImageAtPinchPointY=(i.centerPointStartY-i.contentStartPos.top)/i.contentStartPos.height,i.startDistanceBetweenFingers=s(i.startPoints[0],i.startPoints[1]))))}},d.prototype.onscroll=function(t){var n=this;n.isScrolling=!0,e.removeEventListener("scroll",n.onscroll,!0)},d.prototype.ontouchmove=function(t){var e=this;return void 0!==t.originalEvent.buttons&&0===t.originalEvent.buttons?void e.ontouchend(t):e.isScrolling?void(e.canTap=!1):(e.newPoints=a(t),void((e.opts||e.canPan)&&e.newPoints.length&&e.newPoints.length&&(e.isSwiping&&!0===e.isSwiping||t.preventDefault(),e.distanceX=s(e.newPoints[0],e.startPoints[0],"x"),e.distanceY=s(e.newPoints[0],e.startPoints[0],"y"),e.distance=s(e.newPoints[0],e.startPoints[0]),e.distance>0&&(e.isSwiping?e.onSwipe(t):e.isPanning?e.onPan():e.isZooming&&e.onZoom()))))},d.prototype.onSwipe=function(e){var a,s=this,r=s.instance,c=s.isSwiping,l=s.sliderStartPos.left||0;if(!0!==c)"x"==c&&(s.distanceX>0&&(s.instance.group.length<2||0===s.instance.current.index&&!s.instance.current.opts.loop)?l+=Math.pow(s.distanceX,.8):s.distanceX<0&&(s.instance.group.length<2||s.instance.current.index===s.instance.group.length-1&&!s.instance.current.opts.loop)?l-=Math.pow(-s.distanceX,.8):l+=s.distanceX),s.sliderLastPos={top:"x"==c?0:s.sliderStartPos.top+s.distanceY,left:l},s.requestId&&(i(s.requestId),s.requestId=null),s.requestId=o(function(){s.sliderLastPos&&(n.each(s.instance.slides,function(t,e){var o=e.pos-s.instance.currPos;n.fancybox.setTranslate(e.$slide,{top:s.sliderLastPos.top,left:s.sliderLastPos.left+o*s.canvasWidth+o*e.opts.gutter})}),s.$container.addClass("fancybox-is-sliding"))});else if(Math.abs(s.distance)>10){if(s.canTap=!1,r.group.length<2&&s.opts.vertical?s.isSwiping="y":r.isDragging||!1===s.opts.vertical||"auto"===s.opts.vertical&&n(t).width()>800?s.isSwiping="x":(a=Math.abs(180*Math.atan2(s.distanceY,s.distanceX)/Math.PI),s.isSwiping=a>45&&a<135?"y":"x"),"y"===s.isSwiping&&n.fancybox.isMobile&&s.isScrollable)return void(s.isScrolling=!0);r.isDragging=s.isSwiping,s.startPoints=s.newPoints,n.each(r.slides,function(t,e){var o,i;n.fancybox.stop(e.$slide),o=n.fancybox.getTranslate(e.$slide),i=n.fancybox.getTranslate(r.$refs.stage),e.$slide.css({transform:"",opacity:"","transition-duration":""}).removeClass("fancybox-animated").removeClass(function(t,e){return(e.match(/(^|\s)fancybox-fx-\S+/g)||[]).join(" ")}),e.pos===r.current.pos&&(s.sliderStartPos.top=o.top-i.top,s.sliderStartPos.left=o.left-i.left),n.fancybox.setTranslate(e.$slide,{top:o.top-i.top,left:o.left-i.left})}),r.SlideShow&&r.SlideShow.isActive&&r.SlideShow.stop()}},d.prototype.onPan=function(){var t=this;if(s(t.newPoints[0],t.realPoints[0])<(n.fancybox.isMobile?10:5))return void(t.startPoints=t.newPoints);t.canTap=!1,t.contentLastPos=t.limitMovement(),t.requestId&&i(t.requestId),t.requestId=o(function(){n.fancybox.setTranslate(t.$content,t.contentLastPos)})},d.prototype.limitMovement=function(){var t,e,n,o,i,a,s=this,r=s.canvasWidth,c=s.canvasHeight,l=s.distanceX,d=s.distanceY,u=s.contentStartPos,f=u.left,p=u.top,h=u.width,g=u.height;return i=h>r?f+l:f,a=p+d,t=Math.max(0,.5*r-.5*h),e=Math.max(0,.5*c-.5*g),n=Math.min(r-h,.5*r-.5*h),o=Math.min(c-g,.5*c-.5*g),l>0&&i>t&&(i=t-1+Math.pow(-t+f+l,.8)||0),l<0&&i0&&a>e&&(a=e-1+Math.pow(-e+p+d,.8)||0),d<0&&aa?(t=t>0?0:t,t=ts?(e=e>0?0:e,e=e1&&(o.dMs>130&&s>10||s>50);o.sliderLastPos=null,"y"==t&&!e&&Math.abs(o.distanceY)>50?(n.fancybox.animate(o.instance.current.$slide,{top:o.sliderStartPos.top+o.distanceY+150*o.velocityY,opacity:0},200),i=o.instance.close(!0,250)):r&&o.distanceX>0?i=o.instance.previous(300):r&&o.distanceX<0&&(i=o.instance.next(300)),!1!==i||"x"!=t&&"y"!=t||o.instance.centerSlide(200),o.$container.removeClass("fancybox-is-sliding")},d.prototype.endPanning=function(){var t,e,o,i=this;i.contentLastPos&&(!1===i.opts.momentum||i.dMs>350?(t=i.contentLastPos.left,e=i.contentLastPos.top):(t=i.contentLastPos.left+500*i.velocityX,e=i.contentLastPos.top+500*i.velocityY),o=i.limitPosition(t,e,i.contentStartPos.width,i.contentStartPos.height),o.width=i.contentStartPos.width,o.height=i.contentStartPos.height,n.fancybox.animate(i.$content,o,366))},d.prototype.endZooming=function(){var t,e,o,i,a=this,s=a.instance.current,r=a.newWidth,c=a.newHeight;a.contentLastPos&&(t=a.contentLastPos.left,e=a.contentLastPos.top,i={top:e,left:t,width:r,height:c,scaleX:1,scaleY:1},n.fancybox.setTranslate(a.$content,i),rs.width||c>s.height?a.instance.scaleToActual(a.centerPointStartX,a.centerPointStartY,150):(o=a.limitPosition(t,e,r,c),n.fancybox.animate(a.$content,o,150)))},d.prototype.onTap=function(e){var o,i=this,s=n(e.target),r=i.instance,c=r.current,l=e&&a(e)||i.startPoints,d=l[0]?l[0].x-n(t).scrollLeft()-i.stagePos.left:0,u=l[0]?l[0].y-n(t).scrollTop()-i.stagePos.top:0,f=function(t){var o=c.opts[t];if(n.isFunction(o)&&(o=o.apply(r,[c,e])),o)switch(o){case"close":r.close(i.startEvent);break;case"toggleControls":r.toggleControls();break;case"next":r.next();break;case"nextOrClose":r.group.length>1?r.next():r.close(i.startEvent);break;case"zoom":"image"==c.type&&(c.isLoaded||c.$ghost)&&(r.canPan()?r.scaleToFit():r.isScaledDown()?r.scaleToActual(d,u):r.group.length<2&&r.close(i.startEvent))}};if((!e.originalEvent||2!=e.originalEvent.button)&&(s.is("img")||!(d>s[0].clientWidth+s.offset().left))){if(s.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container"))o="Outside";else if(s.is(".fancybox-slide"))o="Slide";else{if(!r.current.$content||!r.current.$content.find(s).addBack().filter(s).length)return;o="Content"}if(i.tapped){if(clearTimeout(i.tapped),i.tapped=null,Math.abs(d-i.tapX)>50||Math.abs(u-i.tapY)>50)return this;f("dblclick"+o)}else i.tapX=d,i.tapY=u,c.opts["dblclick"+o]&&c.opts["dblclick"+o]!==c.opts["click"+o]?i.tapped=setTimeout(function(){i.tapped=null,r.isAnimating||f("click"+o)},500):f("click"+o);return this}},n(e).on("onActivate.fb",function(t,e){e&&!e.Guestures&&(e.Guestures=new d(e))}).on("beforeClose.fb",function(t,e){e&&e.Guestures&&e.Guestures.destroy()})}(window,document,jQuery),function(t,e){"use strict";e.extend(!0,e.fancybox.defaults,{btnTpl:{slideShow:''},slideShow:{autoStart:!1,speed:3e3,progress:!0}});var n=function(t){this.instance=t,this.init()};e.extend(n.prototype,{timer:null,isActive:!1,$button:null,init:function(){var t=this,n=t.instance,o=n.group[n.currIndex].opts.slideShow;t.$button=n.$refs.toolbar.find("[data-fancybox-play]").on("click",function(){t.toggle()}),n.group.length<2||!o?t.$button.hide():o.progress&&(t.$progress=e('
        ').appendTo(n.$refs.inner))},set:function(t){var n=this,o=n.instance,i=o.current;i&&(!0===t||i.opts.loop||o.currIndex'},fullScreen:{autoStart:!1}}),e(t).on(n.fullscreenchange,function(){var t=o.isFullscreen(),n=e.fancybox.getInstance();n&&(n.current&&"image"===n.current.type&&n.isAnimating&&(n.isAnimating=!1,n.update(!0,!0,0),n.isComplete||n.complete()),n.trigger("onFullscreenChange",t),n.$refs.container.toggleClass("fancybox-is-fullscreen",t),n.$refs.toolbar.find("[data-fancybox-fullscreen]").toggleClass("fancybox-button--fsenter",!t).toggleClass("fancybox-button--fsexit",t))})}e(t).on({"onInit.fb":function(t,e){var i;if(!n)return void e.$refs.toolbar.find("[data-fancybox-fullscreen]").remove();e&&e.group[e.currIndex].opts.fullScreen?(i=e.$refs.container,i.on("click.fb-fullscreen","[data-fancybox-fullscreen]",function(t){t.stopPropagation(),t.preventDefault(),o.toggle()}),e.opts.fullScreen&&!0===e.opts.fullScreen.autoStart&&o.request(),e.FullScreen=o):e&&e.$refs.toolbar.find("[data-fancybox-fullscreen]").hide()},"afterKeydown.fb":function(t,e,n,o,i){e&&e.FullScreen&&70===i&&(o.preventDefault(),e.FullScreen.toggle())},"beforeClose.fb":function(t,e){e&&e.FullScreen&&e.$refs.container.hasClass("fancybox-is-fullscreen")&&o.exit()}})}(document,jQuery),function(t,e){"use strict";var n="fancybox-thumbs";e.fancybox.defaults=e.extend(!0,{btnTpl:{thumbs:''},thumbs:{autoStart:!1,hideOnClose:!0,parentEl:".fancybox-container",axis:"y"}},e.fancybox.defaults);var o=function(t){this.init(t)};e.extend(o.prototype,{$button:null,$grid:null,$list:null,isVisible:!1,isActive:!1,init:function(t){var e=this,n=t.group,o=0;e.instance=t,e.opts=n[t.currIndex].opts.thumbs,t.Thumbs=e,e.$button=t.$refs.toolbar.find("[data-fancybox-thumbs]");for(var i=0,a=n.length;i1));i++);o>1&&e.opts?(e.$button.removeAttr("style").on("click",function(){e.toggle()}),e.isActive=!0):e.$button.hide()},create:function(){var t,o=this,i=o.instance,a=o.opts.parentEl,s=[];o.$grid||(o.$grid=e('
        ').appendTo(i.$refs.container.find(a).addBack().filter(a)),o.$grid.on("click","a",function(){i.jumpTo(e(this).attr("data-index"))})),o.$list||(o.$list=e('
        ').appendTo(o.$grid)),e.each(i.group,function(e,n){t=n.thumb,t||"image"!==n.type||(t=n.src),s.push('")}),o.$list[0].innerHTML=s.join(""),"x"===o.opts.axis&&o.$list.width(parseInt(o.$grid.css("padding-right"),10)+i.group.length*o.$list.children().eq(0).outerWidth(!0))},focus:function(t){var e,n,o=this,i=o.$list,a=o.$grid;o.instance.current&&(e=i.children().removeClass("fancybox-thumbs-active").filter('[data-index="'+o.instance.current.index+'"]').addClass("fancybox-thumbs-active"),n=e.position(),"y"===o.opts.axis&&(n.top<0||n.top>i.height()-e.outerHeight())?i.stop().animate({scrollTop:i.scrollTop()+n.top},t):"x"===o.opts.axis&&(n.lefta.scrollLeft()+(a.width()-e.outerWidth()))&&i.parent().stop().animate({scrollLeft:n.left},t))},update:function(){var t=this;t.instance.$refs.container.toggleClass("fancybox-show-thumbs",this.isVisible),t.isVisible?(t.$grid||t.create(),t.instance.trigger("onThumbsShow"),t.focus(0)):t.$grid&&t.instance.trigger("onThumbsHide"),t.instance.update()},hide:function(){this.isVisible=!1,this.update()},show:function(){this.isVisible=!0,this.update()},toggle:function(){this.isVisible=!this.isVisible,this.update()}}),e(t).on({"onInit.fb":function(t,e){var n;e&&!e.Thumbs&&(n=new o(e),n.isActive&&!0===n.opts.autoStart&&n.show())},"beforeShow.fb":function(t,e,n,o){var i=e&&e.Thumbs;i&&i.isVisible&&i.focus(o?0:250)},"afterKeydown.fb":function(t,e,n,o,i){var a=e&&e.Thumbs;a&&a.isActive&&71===i&&(o.preventDefault(),a.toggle())},"beforeClose.fb":function(t,e){var n=e&&e.Thumbs;n&&n.isVisible&&!1!==n.opts.hideOnClose&&n.$grid.hide()}})}(document,jQuery),function(t,e){"use strict";function n(t){var e={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(t).replace(/[&<>"'`=\/]/g,function(t){return e[t]})}e.extend(!0,e.fancybox.defaults,{btnTpl:{share:''},share:{url:function(t,e){return!t.currentHash&&"inline"!==e.type&&"html"!==e.type&&(e.origSrc||e.src)||window.location}, +tpl:''}}),e(t).on("click","[data-fancybox-share]",function(){var t,o,i=e.fancybox.getInstance(),a=i.current||null;a&&("function"===e.type(a.opts.share.url)&&(t=a.opts.share.url.apply(a,[i,a])),o=a.opts.share.tpl.replace(/\{\{media\}\}/g,"image"===a.type?encodeURIComponent(a.src):"").replace(/\{\{url\}\}/g,encodeURIComponent(t)).replace(/\{\{url_raw\}\}/g,n(t)).replace(/\{\{descr\}\}/g,i.$caption?encodeURIComponent(i.$caption.text()):""),e.fancybox.open({src:i.translate(i,o),type:"html",opts:{touch:!1,animationEffect:!1,afterLoad:function(t,e){i.$refs.container.one("beforeClose.fb",function(){t.close(null,0)}),e.$content.find(".fancybox-share__button").click(function(){return window.open(this.href,"Share","width=550, height=450"),!1})},mobile:{autoFocus:!1}}}))})}(document,jQuery),function(t,e,n){"use strict";function o(){var e=t.location.hash.substr(1),n=e.split("-"),o=n.length>1&&/^\+?\d+$/.test(n[n.length-1])?parseInt(n.pop(-1),10)||1:1,i=n.join("-");return{hash:e,index:o<1?1:o,gallery:i}}function i(t){""!==t.gallery&&n("[data-fancybox='"+n.escapeSelector(t.gallery)+"']").eq(t.index-1).focus().trigger("click.fb-start")}function a(t){var e,n;return!!t&&(e=t.current?t.current.opts:t.opts,""!==(n=e.hash||(e.$orig?e.$orig.data("fancybox")||e.$orig.data("fancybox-trigger"):""))&&n)}n.escapeSelector||(n.escapeSelector=function(t){return(t+"").replace(/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t})}),n(function(){!1!==n.fancybox.defaults.hash&&(n(e).on({"onInit.fb":function(t,e){var n,i;!1!==e.group[e.currIndex].opts.hash&&(n=o(),(i=a(e))&&n.gallery&&i==n.gallery&&(e.currIndex=n.index-1))},"beforeShow.fb":function(n,o,i,s){var r;i&&!1!==i.opts.hash&&(r=a(o))&&(o.currentHash=r+(o.group.length>1?"-"+(i.index+1):""),t.location.hash!=="#"+o.currentHash&&(s&&!o.origHash&&(o.origHash=t.location.hash),o.hashTimer&&clearTimeout(o.hashTimer),o.hashTimer=setTimeout(function(){"replaceState"in t.history?(t.history[s?"pushState":"replaceState"]({},e.title,t.location.pathname+t.location.search+"#"+o.currentHash),s&&(o.hasCreatedHistory=!0)):t.location.hash=o.currentHash,o.hashTimer=null},300)))},"beforeClose.fb":function(n,o,i){i&&!1!==i.opts.hash&&(clearTimeout(o.hashTimer),o.currentHash&&o.hasCreatedHistory?t.history.back():o.currentHash&&("replaceState"in t.history?t.history.replaceState({},e.title,t.location.pathname+t.location.search+(o.origHash||"")):t.location.hash=o.origHash),o.currentHash=null)}}),n(t).on("hashchange.fb",function(){var t=o(),e=null;n.each(n(".fancybox-container").get().reverse(),function(t,o){var i=n(o).data("FancyBox");if(i&&i.currentHash)return e=i,!1}),e?e.currentHash===t.gallery+"-"+t.index||1===t.index&&e.currentHash==t.gallery||(e.currentHash=null,e.close()):""!==t.gallery&&i(t)}),setTimeout(function(){n.fancybox.getInstance()||i(o())},50))})}(window,document,jQuery),function(t,e){"use strict";var n=(new Date).getTime();e(t).on({"onInit.fb":function(t,e,o){e.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll",function(t){var o=e.current,i=(new Date).getTime();e.group.length<2||!1===o.opts.wheel||"auto"===o.opts.wheel&&"image"!==o.type||(t.preventDefault(),t.stopPropagation(),o.$slide.hasClass("fancybox-animated")||(t=t.originalEvent||t,i-n<250||(n=i,e[(-t.deltaY||-t.deltaX||t.wheelDelta||-t.detail)<0?"next":"previous"]())))})}})}(document,jQuery); \ No newline at end of file diff --git a/app/public_html/admin/assets/js/jquery.form.js b/app/public_html/admin/assets/js/jquery.form.js new file mode 100644 index 0000000..b2c0641 --- /dev/null +++ b/app/public_html/admin/assets/js/jquery.form.js @@ -0,0 +1,1540 @@ +/*! + * jQuery Form Plugin + * version: 4.3.0 + * Requires jQuery v1.7.2 or later + * Project repository: https://github.com/jquery-form/form + + * Copyright 2017 Kevin Morris + * Copyright 2006 M. Alsup + + * Dual licensed under the LGPL-2.1+ or MIT licenses + * https://github.com/jquery-form/form#license + + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ +/* global ActiveXObject */ + +/* eslint-disable */ +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + // Node/CommonJS + module.exports = function( root, jQuery ) { + if (typeof jQuery === 'undefined') { + // require('jQuery') returns a factory that requires window to build a jQuery instance, we normalize how we use modules + // that require this pattern but the window provided is a noop if it's defined (how jquery works) + if (typeof window !== 'undefined') { + jQuery = require('jquery'); + } + else { + jQuery = require('jquery')(root); + } + } + factory(jQuery); + return jQuery; + }; + } else { + // Browser globals + factory(jQuery); + } + +}(function ($) { +/* eslint-enable */ + 'use strict'; + + /* + Usage Note: + ----------- + Do not use both ajaxSubmit and ajaxForm on the same form. These + functions are mutually exclusive. Use ajaxSubmit if you want + to bind your own submit handler to the form. For example, + + $(document).ready(function() { + $('#myForm').on('submit', function(e) { + e.preventDefault(); // <-- important + $(this).ajaxSubmit({ + target: '#output' + }); + }); + }); + + Use ajaxForm when you want the plugin to manage all the event binding + for you. For example, + + $(document).ready(function() { + $('#myForm').ajaxForm({ + target: '#output' + }); + }); + + You can also use ajaxForm with delegation (requires jQuery v1.7+), so the + form does not have to exist when you invoke ajaxForm: + + $('#myForm').ajaxForm({ + delegation: true, + target: '#output' + }); + + When using ajaxForm, the ajaxSubmit function will be invoked for you + at the appropriate time. + */ + + var rCRLF = /\r?\n/g; + + /** + * Feature detection + */ + var feature = {}; + + feature.fileapi = $('').get(0).files !== undefined; + feature.formdata = (typeof window.FormData !== 'undefined'); + + var hasProp = !!$.fn.prop; + + // attr2 uses prop when it can but checks the return type for + // an expected string. This accounts for the case where a form + // contains inputs with names like "action" or "method"; in those + // cases "prop" returns the element + $.fn.attr2 = function() { + if (!hasProp) { + return this.attr.apply(this, arguments); + } + + var val = this.prop.apply(this, arguments); + + if ((val && val.jquery) || typeof val === 'string') { + return val; + } + + return this.attr.apply(this, arguments); + }; + + /** + * ajaxSubmit() provides a mechanism for immediately submitting + * an HTML form using AJAX. + * + * @param {object|string} options jquery.form.js parameters or custom url for submission + * @param {object} data extraData + * @param {string} dataType ajax dataType + * @param {function} onSuccess ajax success callback function + */ + $.fn.ajaxSubmit = function(options, data, dataType, onSuccess) { + // fast fail if nothing selected (http://dev.jquery.com/ticket/2752) + if (!this.length) { + log('ajaxSubmit: skipping submit process - no element selected'); + + return this; + } + + /* eslint consistent-this: ["error", "$form"] */ + var method, action, url, isMsie, iframeSrc, $form = this; + + if (typeof options === 'function') { + options = {success: options}; + + } else if (typeof options === 'string' || (options === false && arguments.length > 0)) { + options = { + 'url' : options, + 'data' : data, + 'dataType' : dataType + }; + + if (typeof onSuccess === 'function') { + options.success = onSuccess; + } + + } else if (typeof options === 'undefined') { + options = {}; + } + + method = options.method || options.type || this.attr2('method'); + action = options.url || this.attr2('action'); + + url = (typeof action === 'string') ? $.trim(action) : ''; + url = url || window.location.href || ''; + if (url) { + // clean url (don't include hash vaue) + url = (url.match(/^([^#]+)/) || [])[1]; + } + // IE requires javascript:false in https, but this breaks chrome >83 and goes against spec. + // Instead of using javascript:false always, let's only apply it for IE. + isMsie = /(MSIE|Trident)/.test(navigator.userAgent || ''); + iframeSrc = (isMsie && /^https/i.test(window.location.href || '')) ? 'javascript:false' : 'about:blank'; // eslint-disable-line no-script-url + + options = $.extend(true, { + url : url, + success : $.ajaxSettings.success, + type : method || $.ajaxSettings.type, + iframeSrc : iframeSrc + }, options); + + // hook for manipulating the form data before it is extracted; + // convenient for use with rich editors like tinyMCE or FCKEditor + var veto = {}; + + this.trigger('form-pre-serialize', [this, options, veto]); + + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-pre-serialize trigger'); + + return this; + } + + // provide opportunity to alter form data before it is serialized + if (options.beforeSerialize && options.beforeSerialize(this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSerialize callback'); + + return this; + } + + var traditional = options.traditional; + + if (typeof traditional === 'undefined') { + traditional = $.ajaxSettings.traditional; + } + + var elements = []; + var qx, a = this.formToArray(options.semantic, elements, options.filtering); + + if (options.data) { + var optionsData = $.isFunction(options.data) ? options.data(a) : options.data; + + options.extraData = optionsData; + qx = $.param(optionsData, traditional); + } + + // give pre-submit callback an opportunity to abort the submit + if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSubmit callback'); + + return this; + } + + // fire vetoable 'validate' event + this.trigger('form-submit-validate', [a, this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-submit-validate trigger'); + + return this; + } + + var q = $.param(a, traditional); + + if (qx) { + q = (q ? (q + '&' + qx) : qx); + } + + if (options.type.toUpperCase() === 'GET') { + options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; + options.data = null; // data is null for 'get' + } else { + options.data = q; // data is the query string for 'post' + } + + var callbacks = []; + + if (options.resetForm) { + callbacks.push(function() { + $form.resetForm(); + }); + } + + if (options.clearForm) { + callbacks.push(function() { + $form.clearForm(options.includeHidden); + }); + } + + // perform a load on the target only if dataType is not provided + if (!options.dataType && options.target) { + var oldSuccess = options.success || function(){}; + + callbacks.push(function(data, textStatus, jqXHR) { + var successArguments = arguments, + fn = options.replaceTarget ? 'replaceWith' : 'html'; + + $(options.target)[fn](data).each(function(){ + oldSuccess.apply(this, successArguments); + }); + }); + + } else if (options.success) { + if ($.isArray(options.success)) { + $.merge(callbacks, options.success); + } else { + callbacks.push(options.success); + } + } + + options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg + var context = options.context || this; // jQuery 1.4+ supports scope context + + for (var i = 0, max = callbacks.length; i < max; i++) { + callbacks[i].apply(context, [data, status, xhr || $form, $form]); + } + }; + + if (options.error) { + var oldError = options.error; + + options.error = function(xhr, status, error) { + var context = options.context || this; + + oldError.apply(context, [xhr, status, error, $form]); + }; + } + + if (options.complete) { + var oldComplete = options.complete; + + options.complete = function(xhr, status) { + var context = options.context || this; + + oldComplete.apply(context, [xhr, status, $form]); + }; + } + + // are there files to upload? + + // [value] (issue #113), also see comment: + // https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219 + var fileInputs = $('input[type=file]:enabled', this).filter(function() { + return $(this).val() !== ''; + }); + var hasFileInputs = fileInputs.length > 0; + var mp = 'multipart/form-data'; + var multipart = ($form.attr('enctype') === mp || $form.attr('encoding') === mp); + var fileAPI = feature.fileapi && feature.formdata; + + log('fileAPI :' + fileAPI); + + var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI; + var jqxhr; + + // options.iframe allows user to force iframe mode + // 06-NOV-09: now defaulting to iframe mode if file input is detected + if (options.iframe !== false && (options.iframe || shouldUseFrame)) { + // hack to fix Safari hang (thanks to Tim Molendijk for this) + // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d + if (options.closeKeepAlive) { + $.get(options.closeKeepAlive, function() { + jqxhr = fileUploadIframe(a); + }); + + } else { + jqxhr = fileUploadIframe(a); + } + + } else if ((hasFileInputs || multipart) && fileAPI) { + jqxhr = fileUploadXhr(a); + + } else { + jqxhr = $.ajax(options); + } + + $form.removeData('jqxhr').data('jqxhr', jqxhr); + + // clear element array + for (var k = 0; k < elements.length; k++) { + elements[k] = null; + } + + // fire 'notify' event + this.trigger('form-submit-notify', [this, options]); + + return this; + + // utility fn for deep serialization + function deepSerialize(extraData) { + var serialized = $.param(extraData, options.traditional).split('&'); + var len = serialized.length; + var result = []; + var i, part; + + for (i = 0; i < len; i++) { + // #252; undo param space replacement + serialized[i] = serialized[i].replace(/\+/g, ' '); + part = serialized[i].split('='); + // #278; use array instead of object storage, favoring array serializations + result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]); + } + + return result; + } + + // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz) + function fileUploadXhr(a) { + var formdata = new FormData(); + + for (var i = 0; i < a.length; i++) { + formdata.append(a[i].name, a[i].value); + } + + if (options.extraData) { + var serializedData = deepSerialize(options.extraData); + + for (i = 0; i < serializedData.length; i++) { + if (serializedData[i]) { + formdata.append(serializedData[i][0], serializedData[i][1]); + } + } + } + + options.data = null; + + var s = $.extend(true, {}, $.ajaxSettings, options, { + contentType : false, + processData : false, + cache : false, + type : method || 'POST' + }); + + if (options.uploadProgress) { + // workaround because jqXHR does not expose upload property + s.xhr = function() { + var xhr = $.ajaxSettings.xhr(); + + if (xhr.upload) { + xhr.upload.addEventListener('progress', function(event) { + var percent = 0; + var position = event.loaded || event.position; /* event.position is deprecated */ + var total = event.total; + + if (event.lengthComputable) { + percent = Math.ceil(position / total * 100); + } + + options.uploadProgress(event, position, total, percent); + }, false); + } + + return xhr; + }; + } + + s.data = null; + + var beforeSend = s.beforeSend; + + s.beforeSend = function(xhr, o) { + // Send FormData() provided by user + if (options.formData) { + o.data = options.formData; + } else { + o.data = formdata; + } + + if (beforeSend) { + beforeSend.call(this, xhr, o); + } + }; + + return $.ajax(s); + } + + // private function for handling file uploads (hat tip to YAHOO!) + function fileUploadIframe(a) { + var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle; + var deferred = $.Deferred(); + + // #341 + deferred.abort = function(status) { + xhr.abort(status); + }; + + if (a) { + // ensure that every serialized input is still enabled + for (i = 0; i < elements.length; i++) { + el = $(elements[i]); + if (hasProp) { + el.prop('disabled', false); + } else { + el.removeAttr('disabled'); + } + } + } + + s = $.extend(true, {}, $.ajaxSettings, options); + s.context = s.context || s; + id = 'jqFormIO' + new Date().getTime(); + var ownerDocument = form.ownerDocument; + var $body = $form.closest('body'); + + if (s.iframeTarget) { + $io = $(s.iframeTarget, ownerDocument); + n = $io.attr2('name'); + if (!n) { + $io.attr2('name', id); + } else { + id = n; + } + + } else { + $io = $('').load(function() + { + initFrame.call(me); + }); + } + else + { + this.$content = this.$editor = $('
        '); + } + + var classlist = this.$el.get(0).className.split(/\s+/); + $.each(classlist, $.proxy(function(i,s) + { + this.$content.addClass('redactor_' + s); + }, this)); + } + else + { + this.textareamode = false; + this.$content = this.$editor = this.$el; + this.$el = $('').css('height', this.height); + } + + if (this.$editor) + { + this.$editor.addClass('redactor_editor').attr('contenteditable', true).attr('dir', this.opts.direction); + } + + if (this.opts.tabindex !== false) + { + this.$content.attr('tabindex', this.opts.tabindex); + } + + if (this.opts.minHeight !== false) + { + this.$content.css('min-height', this.opts.minHeight + 'px'); + } + + if (this.opts.wym === true) + { + this.$content.addClass('redactor_editor_wym'); + } + + if (this.opts.autoresize === false) + { + this.$content.css('height', this.height); + } + + // hide textarea + this.$el.hide(); + + // append box and frame + var html = ''; + if (this.textareamode) + { + // get html + html = this.$el.val(); + html = this.savePreCode(html); + + this.$box.insertAfter(this.$el).append(this.$content).append(this.$el); + } + else + { + // get html + html = this.$editor.html(); + html = this.savePreCode(html); + + this.$box.insertAfter(this.$content).append(this.$el).append(this.$editor); + + } + + // conver newlines to p + html = this.paragraphy(html); + + // enable + if (this.$editor) + { + this.$editor.html(html); + } + + if (this.textareamode === false) + { + this.syncCode(); + } + } + else + { + if (this.$el.get(0).tagName !== 'TEXTAREA') + { + var html = this.$el.val(); + var textarea = $('').css('height', this.height).val(html); + this.$el.hide(); + this.$el.after(textarea); + } + } + + if (whendone && this.$editor) + { + whendone.call(this); + } + + }, + enableAir: function() + { + if (this.opts.air === false) + { + return false; + } + + this.air.hide(); + + this.$editor.bind('textselect', $.proxy(function(e) + { + this.showAir(e); + + }, this)); + + this.$editor.bind('textunselect', $.proxy(function() + { + this.air.hide(); + + }, this)); + + }, + showAir: function(e) + { + $('.redactor_air').hide(); + + var width = this.air.innerWidth(); + var left = e.clientX; + + if ($(this.document).width() < (left + width)) + { + left = left - width; + } + + var top = e.clientY + $(document).scrollTop() + 14; + if (this.opts.iframe === true) + { + top = top + this.$box.position().top; + left = left + this.$box.position().left; + } + + this.air.css({ left: left + 'px', top: top + 'px' }).show(); + }, + syncCode: function() + { + this.$el.val(this.$editor.html()); + }, + + // API functions + setCode: function(html) + { + html = this.stripTags(html); + this.$editor.html(html).focus(); + + this.syncCode(); + }, + getCode: function() + { + var html = ''; + if (this.opts.visual) + { + html = this.$editor.html() + } + else + { + html = this.$el.val(); + } + + return this.stripTags(html); + }, + insertHtml: function(html) + { + this.$editor.focus(); + this.pasteHtmlAtCaret(html); + this.observeImages(); + this.syncCode(); + }, + + pasteHtmlAtCaret: function (html) + { + var sel, range; + if (this.document.getSelection) + { + sel = this.window.getSelection(); + if (sel.getRangeAt && sel.rangeCount) + { + range = sel.getRangeAt(0); + range.deleteContents(); + var el = this.document.createElement("div"); + el.innerHTML = html; + var frag = this.document.createDocumentFragment(), node, lastNode; + while (node = el.firstChild) + { + lastNode = frag.appendChild(node); + } + range.insertNode(frag); + + if (lastNode) + { + range = range.cloneRange(); + range.setStartAfter(lastNode); + range.collapse(true); + sel.removeAllRanges(); + sel.addRange(range); + } + } + } + else if (this.document.selection && this.document.selection.type != "Control") + { + this.document.selection.createRange().pasteHTML(html); + } + }, + + destroy: function() + { + var html = this.getCode(); + + if (this.textareamode) + { + this.$box.after(this.$el); + this.$box.remove(); + this.$el.height(this.height).val(html).show(); + } + else + { + this.$box.after(this.$editor); + this.$box.remove(); + this.$editor.removeClass('redactor_editor').removeClass('redactor_editor_wym').attr('contenteditable', false).html(html).show(); + } + + if (this.opts.toolbarExternal) + { + $(this.opts.toolbarExternal).empty(); + } + + $('.redactor_air').remove(); + + for (var i = 0; i < this.dropdowns.length; i++) + { + this.dropdowns[i].remove(); + delete(this.dropdowns[i]); + } + + if (this.opts.autosave !== false) + { + clearInterval(this.autosaveInterval); + } + + }, + // end API functions + + // OBSERVERS + observeFormatting: function() + { + var parent = this.getCurrentNode(); + + this.inactiveAllButtons(); + + $.each(this.opts.activeButtonsStates, $.proxy(function(i,s) + { + if ($(parent).closest(i,this.$editor.get()[0]).length != 0) + { + this.setBtnActive(s); + } + + }, this)); + + var tag = $(parent).closest(['p', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'td']); + + if (typeof tag[0] !== 'undefined' && typeof tag[0].elem !== 'undefined' && $(tag[0].elem).size() != 0) + { + var align = $(tag[0].elem).css('text-align'); + + switch (align) + { + case 'right': + this.setBtnActive('alignright'); + break; + case 'center': + this.setBtnActive('aligncenter'); + break; + case 'justify': + this.setBtnActive('justify'); + break; + default: + this.setBtnActive('alignleft'); + break; + } + } + }, + observeImages: function() + { + if (this.opts.observeImages === false) + { + return false; + } + + this.$editor.find('img').each($.proxy(function(i,s) + { + if (this.browser('msie')) + { + $(s).attr('unselectable', 'on'); + } + + this.resizeImage(s); + + }, this)); + + }, + observeTables: function() + { + this.$editor.find('table').click($.proxy(this.tableObserver, this)); + }, + observeScroll: function() + { + var scrolltop = $(this.document).scrollTop(); + var boxtop = this.$box.offset().top; + var left = 0; + + if (scrolltop > boxtop) + { + var width = '100%'; + if (this.opts.fixedBox) + { + left = this.$box.offset().left; + width = this.$box.innerWidth(); + } + + this.fixed = true; + this.$toolbar.css({ position: 'fixed', width: width, zIndex: 1005, top: this.opts.fixedTop + 'px', left: left }); + } + else + { + this.fixed = false; + this.$toolbar.css({ position: 'relative', width: 'auto', zIndex: 1, top: 0, left: left }); + } + }, + + // BUFFER + setBuffer: function() + { + this.saveSelection(); + this.opts.buffer = this.$editor.html(); + }, + getBuffer: function() + { + if (this.opts.buffer === false) + { + return false; + } + + this.$editor.html(this.opts.buffer); + + if (!this.browser('msie')) + { + this.restoreSelection(); + } + + this.opts.buffer = false; + }, + + + + // EXECCOMMAND + execCommand: function(cmd, param) + { + if (this.opts.visual == false) + { + this.$el.focus(); + return false; + } + + try + { + + var parent; + + if (cmd === 'inserthtml') + { + if (this.browser('msie')) + { + this.$editor.focus(); + this.document.selection.createRange().pasteHTML(param); + } + else + { + this.pasteHtmlAtCaret(param); + //this.execRun(cmd, param); + } + + this.observeImages(); + } + else if (cmd === 'unlink') + { + parent = this.getParentNode(); + if ($(parent).get(0).tagName === 'A') + { + $(parent).replaceWith($(parent).text()); + } + else + { + this.execRun(cmd, param); + } + } + else if (cmd === 'JustifyLeft' || cmd === 'JustifyCenter' || cmd === 'JustifyRight' || cmd === 'JustifyFull') + { + parent = this.getCurrentNode(); + var tag = $(parent).get(0).tagName; + + if (this.opts.iframe === false && $(parent).parents('.redactor_editor').size() == 0) + { + return false; + } + + var tagsArray = ['P', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'BLOCKQUOTE', 'TD']; + if ($.inArray(tag, tagsArray) != -1) + { + var align = false; + + if (cmd === 'JustifyCenter') + { + align = 'center'; + } + else if (cmd === 'JustifyRight') + { + align = 'right'; + } + else if (cmd === 'JustifyFull') + { + align = 'justify'; + } + + if (align === false) + { + $(parent).css('text-align', ''); + } + else + { + $(parent).css('text-align', align); + } + } + else + { + this.execRun(cmd, param); + } + } + else if (cmd === 'formatblock' && param === 'blockquote') + { + parent = this.getCurrentNode(); + if ($(parent).get(0).tagName === 'BLOCKQUOTE') + { + if (this.browser('msie')) + { + var node = $('

        ' + $(parent).html() + '

        '); + $(parent).replaceWith(node); + } + else + { + this.execRun(cmd, 'p'); + } + } + else if ($(parent).get(0).tagName === 'P') + { + var parent2 = $(parent).parent(); + if ($(parent2).get(0).tagName === 'BLOCKQUOTE') + { + var node = $('

        ' + $(parent).html() + '

        '); + $(parent2).replaceWith(node); + this.setSelection(node[0], 0, node[0], 0); + } + else + { + if (this.browser('msie')) + { + var node = $('
        ' + $(parent).html() + '
        '); + $(parent).replaceWith(node); + } + else + { + this.execRun(cmd, param); + } + } + } + else + { + this.execRun(cmd, param); + } + } + else if (cmd === 'formatblock' && (param === 'pre' || param === 'p')) + { + parent = this.getParentNode(); + + if ($(parent).get(0).tagName === 'PRE') + { + $(parent).replaceWith('

        ' + this.encodeEntities($(parent).text()) + '

        '); + } + else + { + this.execRun(cmd, param); + } + } + else + { + if (cmd === 'inserthorizontalrule' && this.browser('msie')) + { + this.$editor.focus(); + } + + if (cmd === 'formatblock' && this.browser('mozilla')) + { + this.$editor.focus(); + } + + this.execRun(cmd, param); + } + + if (cmd === 'inserthorizontalrule') + { + this.$editor.find('hr').removeAttr('id'); + } + + this.syncCode(); + + if (this.oldIE()) + { + this.$editor.focus(); + } + + if (typeof this.opts.execCommandCallback === 'function') + { + this.opts.execCommandCallback(this, cmd); + } + + if (this.opts.air) + { + this.air.hide(); + } + } + catch (e) { } + }, + execRun: function(cmd, param) + { + if (cmd === 'formatblock' && this.browser('msie')) + { + param = '<' + param + '>'; + } + + this.document.execCommand(cmd, false, param); + }, + + // FORMAT NEW LINE + formatNewLine: function(e) + { + var parent = this.getParentNode(); + + if (parent.nodeName === 'DIV' && parent.className === 'redactor_editor') + { + var element = $(this.getCurrentNode()); + + if (element.get(0).tagName === 'DIV' && (element.html() === '' || element.html() === '
        ')) + { + var newElement = $('

        ').append(element.clone().get(0).childNodes); + element.replaceWith(newElement); + newElement.html('
        '); + this.setSelection(newElement[0], 0, newElement[0], 0); + } + } + }, + + // SAFARI SHIFT KEY + ENTER + safariShiftKeyEnter: function(e, key) + { + if (e.shiftKey && key === 13) + { + e.preventDefault(); + this.insertNodeAtCaret($('
        ').get(0)); + this.syncCode(); + return false; + } + else + { + return true; + } + }, + + // FORMAT EMPTY + formatEmpty: function(e) + { + var html = $.trim(this.$editor.html()); + + html = html.replace(//i, ''); + var thtml = html.replace(/

        \s?<\/p>/gi, ''); + + if (html === '' || thtml === '') + { + e.preventDefault(); + + var node = $(this.opts.emptyHtml).get(0); + this.$editor.html(node); + this.setSelection(node, 0, node, 0); + + this.syncCode(); + return false; + } + else + { + this.syncCode(); + } + }, + + // PARAGRAPHY + paragraphy: function (str) + { + str = $.trim(str); + if (str === '' || str === '

        ') + { + return this.opts.emptyHtml; + } + + // convert div to p + if (this.opts.convertDivs) + { + str = str.replace(/([\w\W]*?)<\/div>/gi, '

        $2

        '); + } + + // inner functions + var X = function(x, a, b) { return x.replace(new RegExp(a, 'g'), b); }; + var R = function(a, b) { return X(str, a, b); }; + + // block elements + var blocks = '(table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|style|script|object|input|param|p|h[1-6])'; + + //str = '

        ' + str; + str += '\n'; + + R('
        \\s*
        ', '\n\n'); + R('(<' + blocks + '[^>]*>)', '\n$1'); + R('()', '$1\n\n'); + R('\r\n|\r', '\n'); // newlines + R('\n\n+', '\n\n'); // remove duplicates + R('\n?((.|\n)+?)$', '

        $1

        \n'); // including one at the end + R('

        \\s*?

        ', ''); // remove empty p + R('

        (]*>\\s*)', '$1

        '); + R('

        ([^<]+)\\s*?(]*>)', '

        $1

        $2'); + R('

        \\s*(]*>)\\s*

        ', '$1'); + R('

        (', '$1'); + R('

        \\s*(]*>)', '$1'); + R('(]*>)\\s*

        ', '$1'); + R('(]*>)\\s*
        ', '$1'); + R('
        (\\s*]*>)', '$1'); + + // pre + if (str.indexOf(')((.|\n)*?)', function(m0, m1, m2, m3) + { + return X(m1, '\\\\([\'\"\\\\])', '$1') + X(X(X(m3, '

        ', '\n'), '

        |
        ', ''), '\\\\([\'\"\\\\])', '$1') + ''; + }); + } + + return R('\n

        $', '

        '); + }, + + // REMOVE TAGS + stripTags: function(html) + { + var allowed = this.opts.allowedTags; + var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi; + return html.replace(tags, function ($0, $1) + { + return $.inArray($1.toLowerCase(), allowed) > '-1' ? $0 : ''; + }); + }, + + + savePreCode: function(html) + { + var pre = html.match(/([\w\W]*?)<\/pre>/gi); + if (pre !== null) + { + $.each(pre, $.proxy(function(i,s) + { + var arr = s.match(/([\w\W]*?)<\/pre>/i); + arr[2] = this.encodeEntities(arr[2]); + html = html.replace(s, '' + arr[2] + ''); + }, this)); + } + + return html; + }, + encodeEntities: function(str) + { + str = String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"'); + return String(str).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); + }, + cleanupPre: function(s) + { + s = s.replace(/
        /gi, '\n'); + s = s.replace(/<\/p>/gi, '\n'); + s = s.replace(/<\/div>/gi, '\n'); + + var tmp = this.document.createElement("div"); + tmp.innerHTML = s; + return tmp.textContent||tmp.innerText; + + }, + + + // PASTE CLEANUP + pasteCleanUp: function(html) + { + var parent = this.getParentNode(); + + // clean up pre + if ($(parent).get(0).tagName === 'PRE') + { + html = this.cleanupPre(html); + this.pasteCleanUpInsert(html); + return true; + } + + // remove comments and php tags + html = html.replace(/|<\?(?:php)?[\s\S]*?\?>/gi, ''); + + // remove nbsp + html = html.replace(/( ){2,}/gi, ' '); + + // remove google docs marker + html = html.replace(/([\w\W]*?)<\/b>/gi, "$2"); + + // strip tags + html = this.stripTags(html); + + // prevert + html = html.replace(/<\/td>/gi, '[td]'); + html = html.replace(/ <\/td>/gi, '[td]'); + html = html.replace(/
        <\/td>/gi, '[td]'); + html = html.replace(/([\w\W]*?)<\/a>/gi, '[a href="$2"]$4[/a]'); + html = html.replace(/([\w\W]*?)<\/iframe>/gi, '[iframe$1]$2[/iframe]'); + html = html.replace(/([\w\W]*?)<\/video>/gi, '[video$1]$2[/video]'); + html = html.replace(/([\w\W]*?)<\/audio>/gi, '[audio$1]$2[/audio]'); + html = html.replace(/([\w\W]*?)<\/embed>/gi, '[embed$1]$2[/embed]'); + html = html.replace(/([\w\W]*?)<\/object>/gi, '[object$1]$2[/object]'); + html = html.replace(//gi, '[param$1]'); + html = html.replace(//gi, '[img$1$3]'); + + // remove attributes + html = html.replace(/<(\w+)([\w\W]*?)>/gi, '<$1>'); + + // remove empty + html = html.replace(/<[^\/>][^>]*>(\s*|\t*|\n*| |
        )<\/[^>]+>/gi, ''); + html = html.replace(/<[^\/>][^>]*>(\s*|\t*|\n*| |
        )<\/[^>]+>/gi, ''); + + // revert + html = html.replace(/\[td\]/gi, ' '); + html = html.replace(/\[a href="(.*?)"\]([\w\W]*?)\[\/a\]/gi, '$2'); + html = html.replace(/\[iframe(.*?)\]([\w\W]*?)\[\/iframe\]/gi, '$2'); + html = html.replace(/\[video(.*?)\]([\w\W]*?)\[\/video\]/gi, '$2'); + html = html.replace(/\[audio(.*?)\]([\w\W]*?)\[\/audio\]/gi, '$2'); + html = html.replace(/\[embed(.*?)\]([\w\W]*?)\[\/embed\]/gi, '$2'); + html = html.replace(/\[object(.*?)\]([\w\W]*?)\[\/object\]/gi, '$2'); + html = html.replace(/\[param(.*?)\]/gi, ''); + html = html.replace(/\[img(.*?)\]/gi, ''); + + + // convert div to p + if (this.opts.convertDivs) + { + html = html.replace(/([\w\W]*?)<\/div>/gi, '

        $2

        '); + } + + // remove span + html = html.replace(/([\w\W]*?)<\/span>/gi, '$1'); + + html = html.replace(/\n{3,}/gi, '\n'); + + // remove dirty p + html = html.replace(/

        /gi, '

        '); + html = html.replace(/<\/p><\/p>/gi, '

        '); + + // FF fix + if (this.browser('mozilla')) + { + html = html.replace(/
        $/gi, ''); + } + + this.pasteCleanUpInsert(html); + + }, + + pasteCleanUpInsert: function(html) + { + this.execCommand('inserthtml', html); + + if (this.opts.autoresize === true) + { + $('body,html').scrollTop(this.saveScroll); + } + else + { + this.$editor.scrollTop(this.saveScroll); + } + }, + + + // TEXTAREA CODE FORMATTING + formattingRemove: function(html) + { + // save pre + var prebuffer = []; + var pre = html.match(/([\w\W]*?)<\/pre>/gi); + if (pre !== null) + { + $.each(pre, function(i,s) + { + html = html.replace(s, 'prebuffer_' + i); + prebuffer.push(s); + }); + } + + html = html.replace(/\s{2,}/g, ' '); + html = html.replace(/\n/g, ' '); + html = html.replace(/[\t]*/g, ''); + html = html.replace(/\n\s*\n/g, "\n"); + html = html.replace(/^[\s\n]*/g, ''); + html = html.replace(/[\s\n]*$/g, ''); + html = html.replace(/>\s+<'); + + if (prebuffer) + { + $.each(prebuffer, function(i,s) + { + html = html.replace('prebuffer_' + i, s); + }); + + prebuffer = []; + } + + return html; + }, + formattingIndenting: function(html) + { + html = html.replace(/
      • /g, "\t"); + + return html; + }, + formattingEmptyTags: function(html) + { + var etags = ["
        ","
        \\s*
        ","\\s*","
          ","
            ","
          1. ","
            ","","\\s*", " ", "\\s*", " ", "

            \\s*

            ", "

             

            ", "

            \\s*
            \\s*

            ", "
            \\s*
            ", "
            \\s*
            \\s*
            "]; + for (var i = 0; i < etags.length; ++i) + { + var bbb = etags[i]; + html = html.replace(new RegExp(bbb,'gi'), ""); + } + + return html; + }, + formattingAddBefore: function(html) + { + var lb = '\r\n'; + var btags = ["", '', "","', '
            ', '', '', '', '', '', '', '
            ', '
            ', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']; + for (var i = 0; i < atags.length; ++i) + { + var aaa = atags[i]; + html = html.replace(new RegExp(aaa,'gi'),aaa+lb); + } + + return html; + }, + formatting: function(html) + { + html = this.formattingRemove(html); + + // empty tags + html = this.formattingEmptyTags(html); + + // add formatting before + html = this.formattingAddBefore(html); + + // add formatting after + html = this.formattingAddAfter(html); + + // indenting + html = this.formattingIndenting(html); + + return html; + }, + + // TOGGLE + toggle: function() + { + var html; + + if (this.opts.visual) + { + var height = this.$editor.innerHeight(); + + this.$editor.hide(); + this.$content.hide(); + + html = this.$editor.html(); + //html = $.trim(this.formatting(html)); + + this.$el.height(height).val(html).show().focus(); + + this.setBtnActive('html'); + this.opts.visual = false; + } + else + { + this.$el.hide(); + var html = this.$el.val(); + + //html = this.savePreCode(html); + + // clean up + //html = this.stripTags(html); + + // set code + this.$editor.html(html).show(); + this.$content.show(); + + if (this.$editor.html() === '') + { + this.setCode(this.opts.emptyHtml); + } + + this.$editor.focus(); + + this.setBtnInactive('html'); + this.opts.visual = true; + + this.observeImages(); + this.observeTables(); + } + }, + + // AUTOSAVE + autoSave: function() + { + this.autosaveInterval = setInterval($.proxy(function() + { + $.ajax({ + url: this.opts.autosave, + type: 'post', + data: this.$el.attr('name') + '=' + escape(encodeURIComponent(this.getCode())), + success: $.proxy(function(data) + { + // callback + if (typeof this.opts.autosaveCallback === 'function') + { + this.opts.autosaveCallback(data, this); + } + + }, this) + }); + + + }, this), this.opts.interval*1000); + }, + + // TOOLBAR + buildToolbar: function() + { + if (this.opts.toolbar === false) + { + return false; + } + + this.$toolbar = $('
              ').addClass('redactor_toolbar'); + + if (this.opts.air) + { + $(this.air).append(this.$toolbar); + $('body').append(this.air); + } + else + { + if (this.opts.toolbarExternal === false) + { + this.$box.prepend(this.$toolbar); + } + else + { + $(this.opts.toolbarExternal).html(this.$toolbar); + } + } + + $.each(this.opts.buttons, $.proxy(function(i,key) + { + + if (key !== '|' && typeof this.opts.toolbar[key] !== 'undefined') + { + var s = this.opts.toolbar[key]; + + if (this.opts.fileUpload === false && key === 'file') + { + return true; + } + + this.$toolbar.append($('
            • ').append(this.buildButton(key, s))); + } + + + if (key === '|') + { + this.$toolbar.append($('
            • ')); + } + + }, this)); + + }, + buildButton: function(key, s) + { + var button = $(''); + + if (typeof s.func === 'undefined') + { + button.click($.proxy(function() + { + if ($.inArray(key, this.opts.activeButtons) != -1) + { + this.inactiveAllButtons(); + this.setBtnActive(key); + } + + if (this.browser('mozilla')) + { + this.$editor.focus(); + //this.restoreSelection(); + } + + this.execCommand(s.exec, key); + + }, this)); + } + else if (s.func !== 'show') + { + button.click($.proxy(function(e) { + + this[s.func](e); + + }, this)); + } + + if (typeof s.callback !== 'undefined' && s.callback !== false) + { + button.click($.proxy(function(e) { s.callback(this, e, key); }, this)); + } + + // dropdown + if (key === 'backcolor' || key === 'fontcolor' || typeof(s.dropdown) !== 'undefined') + { + var dropdown = $('',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Cn,popperConfig:null},Fn="show",Mn="out",Wn={HIDE:"hide"+Nn,HIDDEN:"hidden"+Nn,SHOW:"show"+Nn,SHOWN:"shown"+Nn,INSERTED:"inserted"+Nn,CLICK:"click"+Nn,FOCUSIN:"focusin"+Nn,FOCUSOUT:"focusout"+Nn,MOUSEENTER:"mouseenter"+Nn,MOUSELEAVE:"mouseleave"+Nn},Un="fade",Bn="show",qn=".tooltip-inner",Kn=".arrow",Qn="hover",Vn="focus",Yn="click",zn="manual",Xn=function(){function i(e,t){if("undefined"==typeof St)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=e,this.config=this._getConfig(t),this.tip=null,this._setListeners()}var e=i.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(e){if(this._isEnabled)if(e){var t=this.constructor.DATA_KEY,n=p(e.currentTarget).data(t);n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(t,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(Bn))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var e=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(e);var n=m.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&p(o).addClass(Un);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(o).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(o).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new St(this.element,o,this._getPopperConfig(a)),p(o).addClass(Bn),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var c=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,p(t.element).trigger(t.constructor.Event.SHOWN),e===Mn&&t._leave(null,t)};if(p(this.tip).hasClass(Un)){var h=m.getTransitionDurationFromElement(this.tip);p(this.tip).one(m.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},e.hide=function(e){function t(){n._hoverState!==Fn&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),p(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()}var n=this,i=this.getTipElement(),o=p.Event(this.constructor.Event.HIDE);if(p(this.element).trigger(o),!o.isDefaultPrevented()){if(p(i).removeClass(Bn),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger[Yn]=!1,this._activeTrigger[Vn]=!1,this._activeTrigger[Qn]=!1,p(this.tip).hasClass(Un)){var r=m.getTransitionDurationFromElement(i);p(i).one(m.TRANSITION_END,t).emulateTransitionEnd(r)}else t();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(e){p(this.getTipElement()).addClass(Ln+"-"+e)},e.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},e.setContent=function(){var e=this.getTipElement();this.setElementContent(p(e.querySelectorAll(qn)),this.getTitle()),p(e).removeClass(Un+" "+Bn)},e.setElementContent=function(e,t){"object"!=typeof t||!t.nodeType&&!t.jquery?this.config.html?(this.config.sanitize&&(t=In(t,this.config.whiteList,this.config.sanitizeFn)),e.html(t)):e.text(t):this.config.html?p(t).parent().is(e)||e.empty().append(t):e.text(p(t).text())},e.getTitle=function(){var e=this.element.getAttribute("data-original-title");return e=e||("function"==typeof this.config.title?this.config.title.call(this.element):this.config.title)},e._getPopperConfig=function(e){var t=this;return l({},{placement:e,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:Kn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){return t._handlePopperPlacementChange(e)}},{},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,{},t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},e._getAttachment=function(e){return Hn[e.toUpperCase()]},e._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(e){if("click"===e)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(e){return i.toggle(e)});else if(e!==zn){var t=e===Qn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=e===Qn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(t,i.config.selector,function(e){return i._enter(e)}).on(n,i.config.selector,function(e){return i._leave(e)})}}),this._hideModalHandler=function(){i.element&&i.hide()},p(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var e=typeof this.element.getAttribute("data-original-title");!this.element.getAttribute("title")&&"string"==e||(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusin"===e.type?Vn:Qn]=!0),p(t.getTipElement()).hasClass(Bn)||t._hoverState===Fn?t._hoverState=Fn:(clearTimeout(t._timeout),t._hoverState=Fn,t.config.delay&&t.config.delay.show?t._timeout=setTimeout(function(){t._hoverState===Fn&&t.show()},t.config.delay.show):t.show())},e._leave=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusout"===e.type?Vn:Qn]=!1),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState=Mn,t.config.delay&&t.config.delay.hide?t._timeout=setTimeout(function(){t._hoverState===Mn&&t.hide()},t.config.delay.hide):t.hide())},e._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},e._getConfig=function(e){var t=p(this.element).data();return Object.keys(t).forEach(function(e){-1!==xn.indexOf(e)&&delete t[e]}),"number"==typeof(e=l({},this.constructor.Default,{},t,{},"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),m.typeCheckConfig(An,e,this.constructor.DefaultType),e.sanitize&&(e.template=In(e.template,e.whiteList,e.sanitizeFn)),e},e._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},e._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(Pn);null!==t&&t.length&&e.removeClass(t.join(""))},e._handlePopperPlacementChange=function(e){var t=e.instance;this.tip=t.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(e.placement))},e._fixTransition=function(){var e=this.getTipElement(),t=this.config.animation;null===e.getAttribute("x-placement")&&(p(e).removeClass(Un),this.config.animation=!1,this.hide(),this.show(),this.config.animation=t)},i._jQueryInterface=function(n){return this.each(function(){var e=p(this).data(On),t="object"==typeof n&&n;if((e||!/dispose|hide/.test(n))&&(e||(e=new i(this,t),p(this).data(On,e)),"string"==typeof n)){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return Rn}},{key:"NAME",get:function(){return An}},{key:"DATA_KEY",get:function(){return On}},{key:"Event",get:function(){return Wn}},{key:"EVENT_KEY",get:function(){return Nn}},{key:"DefaultType",get:function(){return jn}}]),i}();p.fn[An]=Xn._jQueryInterface,p.fn[An].Constructor=Xn,p.fn[An].noConflict=function(){return p.fn[An]=kn,Xn._jQueryInterface};var Gn="popover",$n="bs.popover",Jn="."+$n,Zn=p.fn[Gn],ei="bs-popover",ti=new RegExp("(^|\\s)"+ei+"\\S+","g"),ni=l({},Xn.Default,{placement:"right",trigger:"click",content:"",template:''}),ii=l({},Xn.DefaultType,{content:"(string|element|function)"}),oi="fade",ri="show",si=".popover-header",ai=".popover-body",li={HIDE:"hide"+Jn,HIDDEN:"hidden"+Jn,SHOW:"show"+Jn,SHOWN:"shown"+Jn,INSERTED:"inserted"+Jn,CLICK:"click"+Jn,FOCUSIN:"focusin"+Jn,FOCUSOUT:"focusout"+Jn,MOUSEENTER:"mouseenter"+Jn,MOUSELEAVE:"mouseleave"+Jn},ci=function(e){function i(){return e.apply(this,arguments)||this}!function(e,t){e.prototype=Object.create(t.prototype),(e.prototype.constructor=e).__proto__=t}(i,e);var t=i.prototype;return t.isWithContent=function(){return this.getTitle()||this._getContent()},t.addAttachmentClass=function(e){p(this.getTipElement()).addClass(ei+"-"+e)},t.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},t.setContent=function(){var e=p(this.getTipElement());this.setElementContent(e.find(si),this.getTitle());var t=this._getContent();"function"==typeof t&&(t=t.call(this.element)),this.setElementContent(e.find(ai),t),e.removeClass(oi+" "+ri)},t._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},t._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(ti);null!==t&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||e {\n called = true\n })\n\n setTimeout(() => {\n if (!called) {\n Util.triggerTransitionEnd(this)\n }\n }, duration)\n\n return this\n}\n\nfunction setTransitionEndSupport() {\n $.fn.emulateTransitionEnd = transitionEndEmulator\n $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n\n TRANSITION_END: 'bsTransitionEnd',\n\n getUID(prefix) {\n do {\n // eslint-disable-next-line no-bitwise\n prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix))\n return prefix\n },\n\n getSelectorFromElement(element) {\n let selector = element.getAttribute('data-target')\n\n if (!selector || selector === '#') {\n const hrefAttr = element.getAttribute('href')\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n }\n\n try {\n return document.querySelector(selector) ? selector : null\n } catch (err) {\n return null\n }\n },\n\n getTransitionDurationFromElement(element) {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let transitionDuration = $(element).css('transition-duration')\n let transitionDelay = $(element).css('transition-delay')\n\n const floatTransitionDuration = parseFloat(transitionDuration)\n const floatTransitionDelay = parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n },\n\n reflow(element) {\n return element.offsetHeight\n },\n\n triggerTransitionEnd(element) {\n $(element).trigger(TRANSITION_END)\n },\n\n // TODO: Remove in v5\n supportsTransitionEnd() {\n return Boolean(TRANSITION_END)\n },\n\n isElement(obj) {\n return (obj[0] || obj).nodeType\n },\n\n typeCheckConfig(componentName, config, configTypes) {\n for (const property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && Util.isElement(value)\n ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(\n `${componentName.toUpperCase()}: ` +\n `Option \"${property}\" provided type \"${valueType}\" ` +\n `but expected type \"${expectedTypes}\".`)\n }\n }\n }\n },\n\n findShadowRoot(element) {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return Util.findShadowRoot(element.parentNode)\n },\n\n jQueryDetection() {\n if (typeof $ === 'undefined') {\n throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.')\n }\n\n const version = $.fn.jquery.split(' ')[0].split('.')\n const minMajor = 1\n const ltMajor = 2\n const minMinor = 9\n const minPatch = 1\n const maxMajor = 4\n\n if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\n }\n }\n}\n\nUtil.jQueryDetection()\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.4.1): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst VERSION = '4.4.1'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Selector = {\n DISMISS : '[data-dismiss=\"alert\"]'\n}\n\nconst Event = {\n CLOSE : `close${EVENT_KEY}`,\n CLOSED : `closed${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n ALERT : 'alert',\n FADE : 'fade',\n SHOW : 'show'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n close(element) {\n let rootElement = this._element\n if (element) {\n rootElement = this._getRootElement(element)\n }\n\n const customEvent = this._triggerCloseEvent(rootElement)\n\n if (customEvent.isDefaultPrevented()) {\n return\n }\n\n this._removeElement(rootElement)\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Private\n\n _getRootElement(element) {\n const selector = Util.getSelectorFromElement(element)\n let parent = false\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n if (!parent) {\n parent = $(element).closest(`.${ClassName.ALERT}`)[0]\n }\n\n return parent\n }\n\n _triggerCloseEvent(element) {\n const closeEvent = $.Event(Event.CLOSE)\n\n $(element).trigger(closeEvent)\n return closeEvent\n }\n\n _removeElement(element) {\n $(element).removeClass(ClassName.SHOW)\n\n if (!$(element).hasClass(ClassName.FADE)) {\n this._destroyElement(element)\n return\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(element)\n\n $(element)\n .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))\n .emulateTransitionEnd(transitionDuration)\n }\n\n _destroyElement(element) {\n $(element)\n .detach()\n .trigger(Event.CLOSED)\n .remove()\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n\n if (!data) {\n data = new Alert(this)\n $element.data(DATA_KEY, data)\n }\n\n if (config === 'close') {\n data[config](this)\n }\n })\n }\n\n static _handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault()\n }\n\n alertInstance.close(this)\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(\n Event.CLICK_DATA_API,\n Selector.DISMISS,\n Alert._handleDismiss(new Alert())\n)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Alert._jQueryInterface\n$.fn[NAME].Constructor = Alert\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Alert._jQueryInterface\n}\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.4.1): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst VERSION = '4.4.1'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst ClassName = {\n ACTIVE : 'active',\n BUTTON : 'btn',\n FOCUS : 'focus'\n}\n\nconst Selector = {\n DATA_TOGGLE_CARROT : '[data-toggle^=\"button\"]',\n DATA_TOGGLES : '[data-toggle=\"buttons\"]',\n DATA_TOGGLE : '[data-toggle=\"button\"]',\n DATA_TOGGLES_BUTTONS : '[data-toggle=\"buttons\"] .btn',\n INPUT : 'input:not([type=\"hidden\"])',\n ACTIVE : '.active',\n BUTTON : '.btn'\n}\n\nconst Event = {\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +\n `blur${EVENT_KEY}${DATA_API_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n toggle() {\n let triggerChangeEvent = true\n let addAriaPressed = true\n const rootElement = $(this._element).closest(\n Selector.DATA_TOGGLES\n )[0]\n\n if (rootElement) {\n const input = this._element.querySelector(Selector.INPUT)\n\n if (input) {\n if (input.type === 'radio') {\n if (input.checked &&\n this._element.classList.contains(ClassName.ACTIVE)) {\n triggerChangeEvent = false\n } else {\n const activeElement = rootElement.querySelector(Selector.ACTIVE)\n\n if (activeElement) {\n $(activeElement).removeClass(ClassName.ACTIVE)\n }\n }\n } else if (input.type === 'checkbox') {\n if (this._element.tagName === 'LABEL' && input.checked === this._element.classList.contains(ClassName.ACTIVE)) {\n triggerChangeEvent = false\n }\n } else {\n // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input\n triggerChangeEvent = false\n }\n\n if (triggerChangeEvent) {\n input.checked = !this._element.classList.contains(ClassName.ACTIVE)\n $(input).trigger('change')\n }\n\n input.focus()\n addAriaPressed = false\n }\n }\n\n if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {\n if (addAriaPressed) {\n this._element.setAttribute('aria-pressed',\n !this._element.classList.contains(ClassName.ACTIVE))\n }\n\n if (triggerChangeEvent) {\n $(this._element).toggleClass(ClassName.ACTIVE)\n }\n }\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new Button(this)\n $(this).data(DATA_KEY, data)\n }\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n let button = event.target\n\n if (!$(button).hasClass(ClassName.BUTTON)) {\n button = $(button).closest(Selector.BUTTON)[0]\n }\n\n if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {\n event.preventDefault() // work around Firefox bug #1540995\n } else {\n const inputBtn = button.querySelector(Selector.INPUT)\n\n if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {\n event.preventDefault() // work around Firefox bug #1540995\n return\n }\n\n Button._jQueryInterface.call($(button), 'toggle')\n }\n })\n .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n const button = $(event.target).closest(Selector.BUTTON)[0]\n $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\n })\n\n$(window).on(Event.LOAD_DATA_API, () => {\n // ensure correct active class is set to match the controls' actual values/states\n\n // find all checkboxes/readio buttons inside data-toggle groups\n let buttons = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLES_BUTTONS))\n for (let i = 0, len = buttons.length; i < len; i++) {\n const button = buttons[i]\n const input = button.querySelector(Selector.INPUT)\n if (input.checked || input.hasAttribute('checked')) {\n button.classList.add(ClassName.ACTIVE)\n } else {\n button.classList.remove(ClassName.ACTIVE)\n }\n }\n\n // find all button toggles\n buttons = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n for (let i = 0, len = buttons.length; i < len; i++) {\n const button = buttons[i]\n if (button.getAttribute('aria-pressed') === 'true') {\n button.classList.add(ClassName.ACTIVE)\n } else {\n button.classList.remove(ClassName.ACTIVE)\n }\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Button._jQueryInterface\n$.fn[NAME].Constructor = Button\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Button._jQueryInterface\n}\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.4.1): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst VERSION = '4.4.1'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval : 5000,\n keyboard : true,\n slide : false,\n pause : 'hover',\n wrap : true,\n touch : true\n}\n\nconst DefaultType = {\n interval : '(number|boolean)',\n keyboard : 'boolean',\n slide : '(boolean|string)',\n pause : '(string|boolean)',\n wrap : 'boolean',\n touch : 'boolean'\n}\n\nconst Direction = {\n NEXT : 'next',\n PREV : 'prev',\n LEFT : 'left',\n RIGHT : 'right'\n}\n\nconst Event = {\n SLIDE : `slide${EVENT_KEY}`,\n SLID : `slid${EVENT_KEY}`,\n KEYDOWN : `keydown${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`,\n TOUCHSTART : `touchstart${EVENT_KEY}`,\n TOUCHMOVE : `touchmove${EVENT_KEY}`,\n TOUCHEND : `touchend${EVENT_KEY}`,\n POINTERDOWN : `pointerdown${EVENT_KEY}`,\n POINTERUP : `pointerup${EVENT_KEY}`,\n DRAG_START : `dragstart${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n CAROUSEL : 'carousel',\n ACTIVE : 'active',\n SLIDE : 'slide',\n RIGHT : 'carousel-item-right',\n LEFT : 'carousel-item-left',\n NEXT : 'carousel-item-next',\n PREV : 'carousel-item-prev',\n ITEM : 'carousel-item',\n POINTER_EVENT : 'pointer-event'\n}\n\nconst Selector = {\n ACTIVE : '.active',\n ACTIVE_ITEM : '.active.carousel-item',\n ITEM : '.carousel-item',\n ITEM_IMG : '.carousel-item img',\n NEXT_PREV : '.carousel-item-next, .carousel-item-prev',\n INDICATORS : '.carousel-indicators',\n DATA_SLIDE : '[data-slide], [data-slide-to]',\n DATA_RIDE : '[data-ride=\"carousel\"]'\n}\n\nconst PointerType = {\n TOUCH : 'touch',\n PEN : 'pen'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel {\n constructor(element, config) {\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._element = element\n this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n next() {\n if (!this._isSliding) {\n this._slide(Direction.NEXT)\n }\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden &&\n ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {\n this.next()\n }\n }\n\n prev() {\n if (!this._isSliding) {\n this._slide(Direction.PREV)\n }\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (this._element.querySelector(Selector.NEXT_PREV)) {\n Util.triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config.interval && !this._isPaused) {\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n $(this._element).one(Event.SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const direction = index > activeIndex\n ? Direction.NEXT\n : Direction.PREV\n\n this._slide(direction, this._items[index])\n }\n\n dispose() {\n $(this._element).off(EVENT_KEY)\n $.removeData(this._element, DATA_KEY)\n\n this._items = null\n this._config = null\n this._element = null\n this._interval = null\n this._isPaused = null\n this._isSliding = null\n this._activeElement = null\n this._indicatorsElement = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n this.touchDeltaX = 0\n\n // swipe left\n if (direction > 0) {\n this.prev()\n }\n\n // swipe right\n if (direction < 0) {\n this.next()\n }\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n $(this._element)\n .on(Event.KEYDOWN, (event) => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n $(this._element)\n .on(Event.MOUSEENTER, (event) => this.pause(event))\n .on(Event.MOUSELEAVE, (event) => this.cycle(event))\n }\n\n if (this._config.touch) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n if (!this._touchSupported) {\n return\n }\n\n const start = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchStartX = event.originalEvent.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.originalEvent.touches[0].clientX\n }\n }\n\n const move = (event) => {\n // ensure swiping with one touch and not pinching\n if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n this.touchDeltaX = 0\n } else {\n this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\n }\n }\n\n const end = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())\n if (this._pointerEvent) {\n $(this._element).on(Event.POINTERDOWN, (event) => start(event))\n $(this._element).on(Event.POINTERUP, (event) => end(event))\n\n this._element.classList.add(ClassName.POINTER_EVENT)\n } else {\n $(this._element).on(Event.TOUCHSTART, (event) => start(event))\n $(this._element).on(Event.TOUCHMOVE, (event) => move(event))\n $(this._element).on(Event.TOUCHEND, (event) => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n event.preventDefault()\n this.prev()\n break\n case ARROW_RIGHT_KEYCODE:\n event.preventDefault()\n this.next()\n break\n default:\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode\n ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))\n : []\n return this._items.indexOf(element)\n }\n\n _getItemByDirection(direction, activeElement) {\n const isNextDirection = direction === Direction.NEXT\n const isPrevDirection = direction === Direction.PREV\n const activeIndex = this._getItemIndex(activeElement)\n const lastItemIndex = this._items.length - 1\n const isGoingToWrap = isPrevDirection && activeIndex === 0 ||\n isNextDirection && activeIndex === lastItemIndex\n\n if (isGoingToWrap && !this._config.wrap) {\n return activeElement\n }\n\n const delta = direction === Direction.PREV ? -1 : 1\n const itemIndex = (activeIndex + delta) % this._items.length\n\n return itemIndex === -1\n ? this._items[this._items.length - 1] : this._items[itemIndex]\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))\n const slideEvent = $.Event(Event.SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n\n $(this._element).trigger(slideEvent)\n\n return slideEvent\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))\n $(indicators)\n .removeClass(ClassName.ACTIVE)\n\n const nextIndicator = this._indicatorsElement.children[\n this._getItemIndex(element)\n ]\n\n if (nextIndicator) {\n $(nextIndicator).addClass(ClassName.ACTIVE)\n }\n }\n }\n\n _slide(direction, element) {\n const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || activeElement &&\n this._getItemByDirection(direction, activeElement)\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n let directionalClassName\n let orderClassName\n let eventDirectionName\n\n if (direction === Direction.NEXT) {\n directionalClassName = ClassName.LEFT\n orderClassName = ClassName.NEXT\n eventDirectionName = Direction.LEFT\n } else {\n directionalClassName = ClassName.RIGHT\n orderClassName = ClassName.PREV\n eventDirectionName = Direction.RIGHT\n }\n\n if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\n this._isSliding = false\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.isDefaultPrevented()) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n\n const slidEvent = $.Event(Event.SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n\n if ($(this._element).hasClass(ClassName.SLIDE)) {\n $(nextElement).addClass(orderClassName)\n\n Util.reflow(nextElement)\n\n $(activeElement).addClass(directionalClassName)\n $(nextElement).addClass(directionalClassName)\n\n const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\n if (nextElementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = nextElementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\n\n $(activeElement)\n .one(Util.TRANSITION_END, () => {\n $(nextElement)\n .removeClass(`${directionalClassName} ${orderClassName}`)\n .addClass(ClassName.ACTIVE)\n\n $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)\n\n this._isSliding = false\n\n setTimeout(() => $(this._element).trigger(slidEvent), 0)\n })\n .emulateTransitionEnd(transitionDuration)\n } else {\n $(activeElement).removeClass(ClassName.ACTIVE)\n $(nextElement).addClass(ClassName.ACTIVE)\n\n this._isSliding = false\n $(this._element).trigger(slidEvent)\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n let _config = {\n ...Default,\n ...$(this).data()\n }\n\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (!data) {\n data = new Carousel(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n })\n }\n\n static _dataApiClickHandler(event) {\n const selector = Util.getSelectorFromElement(this)\n\n if (!selector) {\n return\n }\n\n const target = $(selector)[0]\n\n if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\n return\n }\n\n const config = {\n ...$(target).data(),\n ...$(this).data()\n }\n const slideIndex = this.getAttribute('data-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel._jQueryInterface.call($(target), config)\n\n if (slideIndex) {\n $(target).data(DATA_KEY).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))\n for (let i = 0, len = carousels.length; i < len; i++) {\n const $carousel = $(carousels[i])\n Carousel._jQueryInterface.call($carousel, $carousel.data())\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Carousel._jQueryInterface\n$.fn[NAME].Constructor = Carousel\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Carousel._jQueryInterface\n}\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.4.1): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst VERSION = '4.4.1'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n toggle : true,\n parent : ''\n}\n\nconst DefaultType = {\n toggle : 'boolean',\n parent : '(string|element)'\n}\n\nconst Event = {\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SHOW : 'show',\n COLLAPSE : 'collapse',\n COLLAPSING : 'collapsing',\n COLLAPSED : 'collapsed'\n}\n\nconst Dimension = {\n WIDTH : 'width',\n HEIGHT : 'height'\n}\n\nconst Selector = {\n ACTIVES : '.show, .collapsing',\n DATA_TOGGLE : '[data-toggle=\"collapse\"]'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse {\n constructor(element, config) {\n this._isTransitioning = false\n this._element = element\n this._config = this._getConfig(config)\n this._triggerArray = [].slice.call(document.querySelectorAll(\n `[data-toggle=\"collapse\"][href=\"#${element.id}\"],` +\n `[data-toggle=\"collapse\"][data-target=\"#${element.id}\"]`\n ))\n\n const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = Util.getSelectorFromElement(elem)\n const filterElement = [].slice.call(document.querySelectorAll(selector))\n .filter((foundElem) => foundElem === element)\n\n if (selector !== null && filterElement.length > 0) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray)\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle() {\n if ($(this._element).hasClass(ClassName.SHOW)) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning ||\n $(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n let actives\n let activesData\n\n if (this._parent) {\n actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))\n .filter((elem) => {\n if (typeof this._config.parent === 'string') {\n return elem.getAttribute('data-parent') === this._config.parent\n }\n\n return elem.classList.contains(ClassName.COLLAPSE)\n })\n\n if (actives.length === 0) {\n actives = null\n }\n }\n\n if (actives) {\n activesData = $(actives).not(this._selector).data(DATA_KEY)\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = $.Event(Event.SHOW)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n if (actives) {\n Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\n if (!activesData) {\n $(actives).data(DATA_KEY, null)\n }\n }\n\n const dimension = this._getDimension()\n\n $(this._element)\n .removeClass(ClassName.COLLAPSE)\n .addClass(ClassName.COLLAPSING)\n\n this._element.style[dimension] = 0\n\n if (this._triggerArray.length) {\n $(this._triggerArray)\n .removeClass(ClassName.COLLAPSED)\n .attr('aria-expanded', true)\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .addClass(ClassName.SHOW)\n\n this._element.style[dimension] = ''\n\n this.setTransitioning(false)\n\n $(this._element).trigger(Event.SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning ||\n !$(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n const startEvent = $.Event(Event.HIDE)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n Util.reflow(this._element)\n\n $(this._element)\n .addClass(ClassName.COLLAPSING)\n .removeClass(ClassName.COLLAPSE)\n .removeClass(ClassName.SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n if (triggerArrayLength > 0) {\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const selector = Util.getSelectorFromElement(trigger)\n\n if (selector !== null) {\n const $elem = $([].slice.call(document.querySelectorAll(selector)))\n if (!$elem.hasClass(ClassName.SHOW)) {\n $(trigger).addClass(ClassName.COLLAPSED)\n .attr('aria-expanded', false)\n }\n }\n }\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n this.setTransitioning(false)\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .trigger(Event.HIDDEN)\n }\n\n this._element.style[dimension] = ''\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n }\n\n setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._parent = null\n this._element = null\n this._triggerArray = null\n this._isTransitioning = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n const hasWidth = $(this._element).hasClass(Dimension.WIDTH)\n return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT\n }\n\n _getParent() {\n let parent\n\n if (Util.isElement(this._config.parent)) {\n parent = this._config.parent\n\n // It's a jQuery object\n if (typeof this._config.parent.jquery !== 'undefined') {\n parent = this._config.parent[0]\n }\n } else {\n parent = document.querySelector(this._config.parent)\n }\n\n const selector =\n `[data-toggle=\"collapse\"][data-parent=\"${this._config.parent}\"]`\n\n const children = [].slice.call(parent.querySelectorAll(selector))\n $(children).each((i, element) => {\n this._addAriaAndCollapsedClass(\n Collapse._getTargetFromElement(element),\n [element]\n )\n })\n\n return parent\n }\n\n _addAriaAndCollapsedClass(element, triggerArray) {\n const isOpen = $(element).hasClass(ClassName.SHOW)\n\n if (triggerArray.length) {\n $(triggerArray)\n .toggleClass(ClassName.COLLAPSED, !isOpen)\n .attr('aria-expanded', isOpen)\n }\n }\n\n // Static\n\n static _getTargetFromElement(element) {\n const selector = Util.getSelectorFromElement(element)\n return selector ? document.querySelector(selector) : null\n }\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n const _config = {\n ...Default,\n ...$this.data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data && _config.toggle && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n if (!data) {\n data = new Collapse(this, _config)\n $this.data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.currentTarget.tagName === 'A') {\n event.preventDefault()\n }\n\n const $trigger = $(this)\n const selector = Util.getSelectorFromElement(this)\n const selectors = [].slice.call(document.querySelectorAll(selector))\n\n $(selectors).each(function () {\n const $target = $(this)\n const data = $target.data(DATA_KEY)\n const config = data ? 'toggle' : $trigger.data()\n Collapse._jQueryInterface.call($target, config)\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Collapse._jQueryInterface\n$.fn[NAME].Constructor = Collapse\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Collapse._jQueryInterface\n}\n\nexport default Collapse\n","/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.16.0\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';\n\nvar timeoutDuration = function () {\n var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n return 1;\n }\n }\n return 0;\n}();\n\nfunction microtaskDebounce(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n called = true;\n window.Promise.resolve().then(function () {\n called = false;\n fn();\n });\n };\n}\n\nfunction taskDebounce(fn) {\n var scheduled = false;\n return function () {\n if (!scheduled) {\n scheduled = true;\n setTimeout(function () {\n scheduled = false;\n fn();\n }, timeoutDuration);\n }\n };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nfunction isFunction(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nfunction getStyleComputedProperty(element, property) {\n if (element.nodeType !== 1) {\n return [];\n }\n // NOTE: 1 DOM access here\n var window = element.ownerDocument.defaultView;\n var css = window.getComputedStyle(element, null);\n return property ? css[property] : css;\n}\n\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nfunction getParentNode(element) {\n if (element.nodeName === 'HTML') {\n return element;\n }\n return element.parentNode || element.host;\n}\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nfunction getScrollParent(element) {\n // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n if (!element) {\n return document.body;\n }\n\n switch (element.nodeName) {\n case 'HTML':\n case 'BODY':\n return element.ownerDocument.body;\n case '#document':\n return element.body;\n }\n\n // Firefox want us to check `-x` and `-y` variations as well\n\n var _getStyleComputedProp = getStyleComputedProperty(element),\n overflow = _getStyleComputedProp.overflow,\n overflowX = _getStyleComputedProp.overflowX,\n overflowY = _getStyleComputedProp.overflowY;\n\n if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n return element;\n }\n\n return getScrollParent(getParentNode(element));\n}\n\n/**\n * Returns the reference node of the reference object, or the reference object itself.\n * @method\n * @memberof Popper.Utils\n * @param {Element|Object} reference - the reference element (the popper will be relative to this)\n * @returns {Element} parent\n */\nfunction getReferenceNode(reference) {\n return reference && reference.referenceNode ? reference.referenceNode : reference;\n}\n\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nfunction isIE(version) {\n if (version === 11) {\n return isIE11;\n }\n if (version === 10) {\n return isIE10;\n }\n return isIE11 || isIE10;\n}\n\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nfunction getOffsetParent(element) {\n if (!element) {\n return document.documentElement;\n }\n\n var noOffsetParent = isIE(10) ? document.body : null;\n\n // NOTE: 1 DOM access here\n var offsetParent = element.offsetParent || null;\n // Skip hidden elements which don't have an offsetParent\n while (offsetParent === noOffsetParent && element.nextElementSibling) {\n offsetParent = (element = element.nextElementSibling).offsetParent;\n }\n\n var nodeName = offsetParent && offsetParent.nodeName;\n\n if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n return element ? element.ownerDocument.documentElement : document.documentElement;\n }\n\n // .offsetParent will return the closest TH, TD or TABLE in case\n // no offsetParent is present, I hate this job...\n if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n return getOffsetParent(offsetParent);\n }\n\n return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY') {\n return false;\n }\n return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nfunction getRoot(node) {\n if (node.parentNode !== null) {\n return getRoot(node.parentNode);\n }\n\n return node;\n}\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nfunction findCommonOffsetParent(element1, element2) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n return document.documentElement;\n }\n\n // Here we make sure to give as \"start\" the element that comes first in the DOM\n var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n var start = order ? element1 : element2;\n var end = order ? element2 : element1;\n\n // Get common ancestor container\n var range = document.createRange();\n range.setStart(start, 0);\n range.setEnd(end, 0);\n var commonAncestorContainer = range.commonAncestorContainer;\n\n // Both nodes are inside #document\n\n if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n if (isOffsetContainer(commonAncestorContainer)) {\n return commonAncestorContainer;\n }\n\n return getOffsetParent(commonAncestorContainer);\n }\n\n // one of the nodes is inside shadowDOM, find which one\n var element1root = getRoot(element1);\n if (element1root.host) {\n return findCommonOffsetParent(element1root.host, element2);\n } else {\n return findCommonOffsetParent(element1, getRoot(element2).host);\n }\n}\n\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nfunction getScroll(element) {\n var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n var html = element.ownerDocument.documentElement;\n var scrollingElement = element.ownerDocument.scrollingElement || html;\n return scrollingElement[upperSide];\n }\n\n return element[upperSide];\n}\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nfunction includeScroll(rect, element) {\n var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n var modifier = subtract ? -1 : 1;\n rect.top += scrollTop * modifier;\n rect.bottom += scrollTop * modifier;\n rect.left += scrollLeft * modifier;\n rect.right += scrollLeft * modifier;\n return rect;\n}\n\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nfunction getBordersSize(styles, axis) {\n var sideA = axis === 'x' ? 'Left' : 'Top';\n var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\n}\n\nfunction getSize(axis, body, html, computedStyle) {\n return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n}\n\nfunction getWindowSizes(document) {\n var body = document.body;\n var html = document.documentElement;\n var computedStyle = isIE(10) && getComputedStyle(html);\n\n return {\n height: getSize('Height', body, html, computedStyle),\n width: getSize('Width', body, html, computedStyle)\n };\n}\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\nvar defineProperty = function (obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nfunction getClientRect(offsets) {\n return _extends({}, offsets, {\n right: offsets.left + offsets.width,\n bottom: offsets.top + offsets.height\n });\n}\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nfunction getBoundingClientRect(element) {\n var rect = {};\n\n // IE10 10 FIX: Please, don't ask, the element isn't\n // considered in DOM in some circumstances...\n // This isn't reproducible in IE10 compatibility mode of IE11\n try {\n if (isIE(10)) {\n rect = element.getBoundingClientRect();\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n rect.top += scrollTop;\n rect.left += scrollLeft;\n rect.bottom += scrollTop;\n rect.right += scrollLeft;\n } else {\n rect = element.getBoundingClientRect();\n }\n } catch (e) {}\n\n var result = {\n left: rect.left,\n top: rect.top,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n\n // subtract scrollbar size from sizes\n var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n var width = sizes.width || element.clientWidth || result.width;\n var height = sizes.height || element.clientHeight || result.height;\n\n var horizScrollbar = element.offsetWidth - width;\n var vertScrollbar = element.offsetHeight - height;\n\n // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n // we make this check conditional for performance reasons\n if (horizScrollbar || vertScrollbar) {\n var styles = getStyleComputedProperty(element);\n horizScrollbar -= getBordersSize(styles, 'x');\n vertScrollbar -= getBordersSize(styles, 'y');\n\n result.width -= horizScrollbar;\n result.height -= vertScrollbar;\n }\n\n return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var isIE10 = isIE(10);\n var isHTML = parent.nodeName === 'HTML';\n var childrenRect = getBoundingClientRect(children);\n var parentRect = getBoundingClientRect(parent);\n var scrollParent = getScrollParent(children);\n\n var styles = getStyleComputedProperty(parent);\n var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\n var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\n\n // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n if (fixedPosition && isHTML) {\n parentRect.top = Math.max(parentRect.top, 0);\n parentRect.left = Math.max(parentRect.left, 0);\n }\n var offsets = getClientRect({\n top: childrenRect.top - parentRect.top - borderTopWidth,\n left: childrenRect.left - parentRect.left - borderLeftWidth,\n width: childrenRect.width,\n height: childrenRect.height\n });\n offsets.marginTop = 0;\n offsets.marginLeft = 0;\n\n // Subtract margins of documentElement in case it's being used as parent\n // we do this only on HTML because it's the only element that behaves\n // differently when margins are applied to it. The margins are included in\n // the box of the documentElement, in the other cases not.\n if (!isIE10 && isHTML) {\n var marginTop = parseFloat(styles.marginTop, 10);\n var marginLeft = parseFloat(styles.marginLeft, 10);\n\n offsets.top -= borderTopWidth - marginTop;\n offsets.bottom -= borderTopWidth - marginTop;\n offsets.left -= borderLeftWidth - marginLeft;\n offsets.right -= borderLeftWidth - marginLeft;\n\n // Attach marginTop and marginLeft because in some circumstances we may need them\n offsets.marginTop = marginTop;\n offsets.marginLeft = marginLeft;\n }\n\n if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n offsets = includeScroll(offsets, parent);\n }\n\n return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var html = element.ownerDocument.documentElement;\n var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n var width = Math.max(html.clientWidth, window.innerWidth || 0);\n var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n var scrollTop = !excludeScroll ? getScroll(html) : 0;\n var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n var offset = {\n top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n width: width,\n height: height\n };\n\n return getClientRect(offset);\n}\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nfunction isFixed(element) {\n var nodeName = element.nodeName;\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n return false;\n }\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\n return true;\n }\n var parentNode = getParentNode(element);\n if (!parentNode) {\n return false;\n }\n return isFixed(parentNode);\n}\n\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nfunction getFixedPositionOffsetParent(element) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element || !element.parentElement || isIE()) {\n return document.documentElement;\n }\n var el = element.parentElement;\n while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n el = el.parentElement;\n }\n return el || document.documentElement;\n}\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n // NOTE: 1 DOM access here\n\n var boundaries = { top: 0, left: 0 };\n var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n\n // Handle viewport case\n if (boundariesElement === 'viewport') {\n boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n } else {\n // Handle other cases based on DOM element used as boundaries\n var boundariesNode = void 0;\n if (boundariesElement === 'scrollParent') {\n boundariesNode = getScrollParent(getParentNode(reference));\n if (boundariesNode.nodeName === 'BODY') {\n boundariesNode = popper.ownerDocument.documentElement;\n }\n } else if (boundariesElement === 'window') {\n boundariesNode = popper.ownerDocument.documentElement;\n } else {\n boundariesNode = boundariesElement;\n }\n\n var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n // In case of HTML, we need a different computation\n if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n height = _getWindowSizes.height,\n width = _getWindowSizes.width;\n\n boundaries.top += offsets.top - offsets.marginTop;\n boundaries.bottom = height + offsets.top;\n boundaries.left += offsets.left - offsets.marginLeft;\n boundaries.right = width + offsets.left;\n } else {\n // for all the other DOM elements, this one is good\n boundaries = offsets;\n }\n }\n\n // Add paddings\n padding = padding || 0;\n var isPaddingNumber = typeof padding === 'number';\n boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n return boundaries;\n}\n\nfunction getArea(_ref) {\n var width = _ref.width,\n height = _ref.height;\n\n return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n if (placement.indexOf('auto') === -1) {\n return placement;\n }\n\n var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n var rects = {\n top: {\n width: boundaries.width,\n height: refRect.top - boundaries.top\n },\n right: {\n width: boundaries.right - refRect.right,\n height: boundaries.height\n },\n bottom: {\n width: boundaries.width,\n height: boundaries.bottom - refRect.bottom\n },\n left: {\n width: refRect.left - boundaries.left,\n height: boundaries.height\n }\n };\n\n var sortedAreas = Object.keys(rects).map(function (key) {\n return _extends({\n key: key\n }, rects[key], {\n area: getArea(rects[key])\n });\n }).sort(function (a, b) {\n return b.area - a.area;\n });\n\n var filteredAreas = sortedAreas.filter(function (_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n return width >= popper.clientWidth && height >= popper.clientHeight;\n });\n\n var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n var variation = placement.split('-')[1];\n\n return computedPlacement + (variation ? '-' + variation : '');\n}\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nfunction getReferenceOffsets(state, popper, reference) {\n var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nfunction getOuterSizes(element) {\n var window = element.ownerDocument.defaultView;\n var styles = window.getComputedStyle(element);\n var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n var result = {\n width: element.offsetWidth + y,\n height: element.offsetHeight + x\n };\n return result;\n}\n\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nfunction getOppositePlacement(placement) {\n var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n placement = placement.split('-')[0];\n\n // Get popper node sizes\n var popperRect = getOuterSizes(popper);\n\n // Add position, width and height to our offsets object\n var popperOffsets = {\n width: popperRect.width,\n height: popperRect.height\n };\n\n // depending by the popper placement we have to compute its offsets slightly differently\n var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n var mainSide = isHoriz ? 'top' : 'left';\n var secondarySide = isHoriz ? 'left' : 'top';\n var measurement = isHoriz ? 'height' : 'width';\n var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n if (placement === secondarySide) {\n popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n } else {\n popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n }\n\n return popperOffsets;\n}\n\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction find(arr, check) {\n // use native find if supported\n if (Array.prototype.find) {\n return arr.find(check);\n }\n\n // use `filter` to obtain the same behavior of `find`\n return arr.filter(check)[0];\n}\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction findIndex(arr, prop, value) {\n // use native findIndex if supported\n if (Array.prototype.findIndex) {\n return arr.findIndex(function (cur) {\n return cur[prop] === value;\n });\n }\n\n // use `find` + `indexOf` if `findIndex` isn't supported\n var match = find(arr, function (obj) {\n return obj[prop] === value;\n });\n return arr.indexOf(match);\n}\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nfunction runModifiers(modifiers, data, ends) {\n var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n modifiersToRun.forEach(function (modifier) {\n if (modifier['function']) {\n // eslint-disable-line dot-notation\n console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n }\n var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n if (modifier.enabled && isFunction(fn)) {\n // Add properties to offsets to make them a complete clientRect object\n // we do this before each modifier to make sure the previous one doesn't\n // mess with these values\n data.offsets.popper = getClientRect(data.offsets.popper);\n data.offsets.reference = getClientRect(data.offsets.reference);\n\n data = fn(data, modifier);\n }\n });\n\n return data;\n}\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.
              \n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nfunction update() {\n // if popper is destroyed, don't perform any further update\n if (this.state.isDestroyed) {\n return;\n }\n\n var data = {\n instance: this,\n styles: {},\n arrowStyles: {},\n attributes: {},\n flipped: false,\n offsets: {}\n };\n\n // compute reference element offsets\n data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n // store the computed placement inside `originalPlacement`\n data.originalPlacement = data.placement;\n\n data.positionFixed = this.options.positionFixed;\n\n // compute the popper offsets\n data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n // run the modifiers\n data = runModifiers(this.modifiers, data);\n\n // the first `update` will call `onCreate` callback\n // the other ones will call `onUpdate` callback\n if (!this.state.isCreated) {\n this.state.isCreated = true;\n this.options.onCreate(data);\n } else {\n this.options.onUpdate(data);\n }\n}\n\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nfunction isModifierEnabled(modifiers, modifierName) {\n return modifiers.some(function (_ref) {\n var name = _ref.name,\n enabled = _ref.enabled;\n return enabled && name === modifierName;\n });\n}\n\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nfunction getSupportedPropertyName(property) {\n var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n for (var i = 0; i < prefixes.length; i++) {\n var prefix = prefixes[i];\n var toCheck = prefix ? '' + prefix + upperProp : property;\n if (typeof document.body.style[toCheck] !== 'undefined') {\n return toCheck;\n }\n }\n return null;\n}\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nfunction destroy() {\n this.state.isDestroyed = true;\n\n // touch DOM only if `applyStyle` modifier is enabled\n if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n this.popper.removeAttribute('x-placement');\n this.popper.style.position = '';\n this.popper.style.top = '';\n this.popper.style.left = '';\n this.popper.style.right = '';\n this.popper.style.bottom = '';\n this.popper.style.willChange = '';\n this.popper.style[getSupportedPropertyName('transform')] = '';\n }\n\n this.disableEventListeners();\n\n // remove the popper if user explicitly asked for the deletion on destroy\n // do not use `remove` because IE11 doesn't support it\n if (this.options.removeOnDestroy) {\n this.popper.parentNode.removeChild(this.popper);\n }\n return this;\n}\n\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nfunction getWindow(element) {\n var ownerDocument = element.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n var isBody = scrollParent.nodeName === 'BODY';\n var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n target.addEventListener(event, callback, { passive: true });\n\n if (!isBody) {\n attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n }\n scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction setupEventListeners(reference, options, state, updateBound) {\n // Resize event listener on window\n state.updateBound = updateBound;\n getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n // Scroll event listener on scroll parents\n var scrollElement = getScrollParent(reference);\n attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n state.scrollElement = scrollElement;\n state.eventsEnabled = true;\n\n return state;\n}\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nfunction enableEventListeners() {\n if (!this.state.eventsEnabled) {\n this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n }\n}\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction removeEventListeners(reference, state) {\n // Remove resize event listener on window\n getWindow(reference).removeEventListener('resize', state.updateBound);\n\n // Remove scroll event listener on scroll parents\n state.scrollParents.forEach(function (target) {\n target.removeEventListener('scroll', state.updateBound);\n });\n\n // Reset state\n state.updateBound = null;\n state.scrollParents = [];\n state.scrollElement = null;\n state.eventsEnabled = false;\n return state;\n}\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nfunction disableEventListeners() {\n if (this.state.eventsEnabled) {\n cancelAnimationFrame(this.scheduleUpdate);\n this.state = removeEventListeners(this.reference, this.state);\n }\n}\n\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nfunction isNumeric(n) {\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setStyles(element, styles) {\n Object.keys(styles).forEach(function (prop) {\n var unit = '';\n // add unit if the value is numeric and is one of the following\n if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n unit = 'px';\n }\n element.style[prop] = styles[prop] + unit;\n });\n}\n\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setAttributes(element, attributes) {\n Object.keys(attributes).forEach(function (prop) {\n var value = attributes[prop];\n if (value !== false) {\n element.setAttribute(prop, attributes[prop]);\n } else {\n element.removeAttribute(prop);\n }\n });\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nfunction applyStyle(data) {\n // any property present in `data.styles` will be applied to the popper,\n // in this way we can make the 3rd party modifiers add custom styles to it\n // Be aware, modifiers could override the properties defined in the previous\n // lines of this modifier!\n setStyles(data.instance.popper, data.styles);\n\n // any property present in `data.attributes` will be applied to the popper,\n // they will be set as HTML attributes of the element\n setAttributes(data.instance.popper, data.attributes);\n\n // if arrowElement is defined and arrowStyles has some properties\n if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n setStyles(data.arrowElement, data.arrowStyles);\n }\n\n return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n // compute reference element offsets\n var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n popper.setAttribute('x-placement', placement);\n\n // Apply `position` to popper before anything else because\n // without the position applied we can't guarantee correct computations\n setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n return options;\n}\n\n/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nfunction getRoundedOffsets(data, shouldRound) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n var round = Math.round,\n floor = Math.floor;\n\n var noRound = function noRound(v) {\n return v;\n };\n\n var referenceWidth = round(reference.width);\n var popperWidth = round(popper.width);\n\n var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n var isVariation = data.placement.indexOf('-') !== -1;\n var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n var verticalToInteger = !shouldRound ? noRound : round;\n\n return {\n left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n top: verticalToInteger(popper.top),\n bottom: verticalToInteger(popper.bottom),\n right: horizontalToInteger(popper.right)\n };\n}\n\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeStyle(data, options) {\n var x = options.x,\n y = options.y;\n var popper = data.offsets.popper;\n\n // Remove this legacy support in Popper.js v2\n\n var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'applyStyle';\n }).gpuAcceleration;\n if (legacyGpuAccelerationOption !== undefined) {\n console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n }\n var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n var offsetParent = getOffsetParent(data.instance.popper);\n var offsetParentRect = getBoundingClientRect(offsetParent);\n\n // Styles\n var styles = {\n position: popper.position\n };\n\n var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n var sideA = x === 'bottom' ? 'top' : 'bottom';\n var sideB = y === 'right' ? 'left' : 'right';\n\n // if gpuAcceleration is set to `true` and transform is supported,\n // we use `translate3d` to apply the position to the popper we\n // automatically use the supported prefixed version if needed\n var prefixedProperty = getSupportedPropertyName('transform');\n\n // now, let's make a step back and look at this code closely (wtf?)\n // If the content of the popper grows once it's been positioned, it\n // may happen that the popper gets misplaced because of the new content\n // overflowing its reference element\n // To avoid this problem, we provide two options (x and y), which allow\n // the consumer to define the offset origin.\n // If we position a popper on top of a reference element, we can set\n // `x` to `top` to make the popper grow towards its top instead of\n // its bottom.\n var left = void 0,\n top = void 0;\n if (sideA === 'bottom') {\n // when offsetParent is the positioning is relative to the bottom of the screen (excluding the scrollbar)\n // and not the bottom of the html element\n if (offsetParent.nodeName === 'HTML') {\n top = -offsetParent.clientHeight + offsets.bottom;\n } else {\n top = -offsetParentRect.height + offsets.bottom;\n }\n } else {\n top = offsets.top;\n }\n if (sideB === 'right') {\n if (offsetParent.nodeName === 'HTML') {\n left = -offsetParent.clientWidth + offsets.right;\n } else {\n left = -offsetParentRect.width + offsets.right;\n }\n } else {\n left = offsets.left;\n }\n if (gpuAcceleration && prefixedProperty) {\n styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n styles[sideA] = 0;\n styles[sideB] = 0;\n styles.willChange = 'transform';\n } else {\n // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n var invertTop = sideA === 'bottom' ? -1 : 1;\n var invertLeft = sideB === 'right' ? -1 : 1;\n styles[sideA] = top * invertTop;\n styles[sideB] = left * invertLeft;\n styles.willChange = sideA + ', ' + sideB;\n }\n\n // Attributes\n var attributes = {\n 'x-placement': data.placement\n };\n\n // Update `data` attributes, styles and arrowStyles\n data.attributes = _extends({}, attributes, data.attributes);\n data.styles = _extends({}, styles, data.styles);\n data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n return data;\n}\n\n/**\n * Helper used to know if the given modifier depends from another one.
              \n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n var requesting = find(modifiers, function (_ref) {\n var name = _ref.name;\n return name === requestingName;\n });\n\n var isRequired = !!requesting && modifiers.some(function (modifier) {\n return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n });\n\n if (!isRequired) {\n var _requesting = '`' + requestingName + '`';\n var requested = '`' + requestedName + '`';\n console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n }\n return isRequired;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction arrow(data, options) {\n var _data$offsets$arrow;\n\n // arrow depends on keepTogether in order to work\n if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n return data;\n }\n\n var arrowElement = options.element;\n\n // if arrowElement is a string, suppose it's a CSS selector\n if (typeof arrowElement === 'string') {\n arrowElement = data.instance.popper.querySelector(arrowElement);\n\n // if arrowElement is not found, don't run the modifier\n if (!arrowElement) {\n return data;\n }\n } else {\n // if the arrowElement isn't a query selector we must check that the\n // provided DOM node is child of its popper node\n if (!data.instance.popper.contains(arrowElement)) {\n console.warn('WARNING: `arrow.element` must be child of its popper element!');\n return data;\n }\n }\n\n var placement = data.placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n var len = isVertical ? 'height' : 'width';\n var sideCapitalized = isVertical ? 'Top' : 'Left';\n var side = sideCapitalized.toLowerCase();\n var altSide = isVertical ? 'left' : 'top';\n var opSide = isVertical ? 'bottom' : 'right';\n var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n //\n // extends keepTogether behavior making sure the popper and its\n // reference have enough pixels in conjunction\n //\n\n // top/left side\n if (reference[opSide] - arrowElementSize < popper[side]) {\n data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n }\n // bottom/right side\n if (reference[side] + arrowElementSize > popper[opSide]) {\n data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n }\n data.offsets.popper = getClientRect(data.offsets.popper);\n\n // compute center of the popper\n var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n // Compute the sideValue using the updated popper offsets\n // take popper margin in account because we don't have this info available\n var css = getStyleComputedProperty(data.instance.popper);\n var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\n var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\n var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n // prevent arrowElement from being placed not contiguously to its popper\n sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n data.arrowElement = arrowElement;\n data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n return data;\n}\n\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nfunction getOppositeVariation(variation) {\n if (variation === 'end') {\n return 'start';\n } else if (variation === 'start') {\n return 'end';\n }\n return variation;\n}\n\n/**\n * List of accepted placements to use as values of the `placement` option.
              \n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.
              \n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n// Get rid of `auto` `auto-start` and `auto-end`\nvar validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nfunction clockwise(placement) {\n var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var index = validPlacements.indexOf(placement);\n var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n FLIP: 'flip',\n CLOCKWISE: 'clockwise',\n COUNTERCLOCKWISE: 'counterclockwise'\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction flip(data, options) {\n // if `inner` modifier is enabled, we can't use the `flip` modifier\n if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n return data;\n }\n\n if (data.flipped && data.placement === data.originalPlacement) {\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n return data;\n }\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n var placement = data.placement.split('-')[0];\n var placementOpposite = getOppositePlacement(placement);\n var variation = data.placement.split('-')[1] || '';\n\n var flipOrder = [];\n\n switch (options.behavior) {\n case BEHAVIORS.FLIP:\n flipOrder = [placement, placementOpposite];\n break;\n case BEHAVIORS.CLOCKWISE:\n flipOrder = clockwise(placement);\n break;\n case BEHAVIORS.COUNTERCLOCKWISE:\n flipOrder = clockwise(placement, true);\n break;\n default:\n flipOrder = options.behavior;\n }\n\n flipOrder.forEach(function (step, index) {\n if (placement !== step || flipOrder.length === index + 1) {\n return data;\n }\n\n placement = data.placement.split('-')[0];\n placementOpposite = getOppositePlacement(placement);\n\n var popperOffsets = data.offsets.popper;\n var refOffsets = data.offsets.reference;\n\n // using floor because the reference offsets may contain decimals we are not going to consider here\n var floor = Math.floor;\n var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n // flip the variation if required\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n\n // flips variation if reference element overflows boundaries\n var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n // flips variation if popper content overflows boundaries\n var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);\n\n var flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n if (overlapsRef || overflowsBoundaries || flippedVariation) {\n // this boolean to detect any flip loop\n data.flipped = true;\n\n if (overlapsRef || overflowsBoundaries) {\n placement = flipOrder[index + 1];\n }\n\n if (flippedVariation) {\n variation = getOppositeVariation(variation);\n }\n\n data.placement = placement + (variation ? '-' + variation : '');\n\n // this object contains `position`, we want to preserve it along with\n // any additional property we may add in the future\n data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n data = runModifiers(data.instance.modifiers, data, 'flip');\n }\n });\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction keepTogether(data) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var placement = data.placement.split('-')[0];\n var floor = Math.floor;\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var side = isVertical ? 'right' : 'bottom';\n var opSide = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n if (popper[side] < floor(reference[opSide])) {\n data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n }\n if (popper[opSide] > floor(reference[side])) {\n data.offsets.popper[opSide] = floor(reference[side]);\n }\n\n return data;\n}\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n // separate value from unit\n var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n var value = +split[1];\n var unit = split[2];\n\n // If it's not a number it's an operator, I guess\n if (!value) {\n return str;\n }\n\n if (unit.indexOf('%') === 0) {\n var element = void 0;\n switch (unit) {\n case '%p':\n element = popperOffsets;\n break;\n case '%':\n case '%r':\n default:\n element = referenceOffsets;\n }\n\n var rect = getClientRect(element);\n return rect[measurement] / 100 * value;\n } else if (unit === 'vh' || unit === 'vw') {\n // if is a vh or vw, we calculate the size based on the viewport\n var size = void 0;\n if (unit === 'vh') {\n size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n } else {\n size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n return size / 100 * value;\n } else {\n // if is an explicit pixel unit, we get rid of the unit and keep the value\n // if is an implicit unit, it's px, and we return just the value\n return value;\n }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n var offsets = [0, 0];\n\n // Use height if placement is left or right and index is 0 otherwise use width\n // in this way the first offset will use an axis and the second one\n // will use the other one\n var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n // Split the offset string to obtain a list of values and operands\n // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n return frag.trim();\n });\n\n // Detect if the offset string contains a pair of values or a single one\n // they could be separated by comma or space\n var divider = fragments.indexOf(find(fragments, function (frag) {\n return frag.search(/,|\\s/) !== -1;\n }));\n\n if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n }\n\n // If divider is found, we divide the list of values and operands to divide\n // them by ofset X and Y.\n var splitRegex = /\\s*,\\s*|\\s+/;\n var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n // Convert the values with units to absolute pixels to allow our computations\n ops = ops.map(function (op, index) {\n // Most of the units rely on the orientation of the popper\n var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n var mergeWithPrevious = false;\n return op\n // This aggregates any `+` or `-` sign that aren't considered operators\n // e.g.: 10 + +5 => [10, +, +5]\n .reduce(function (a, b) {\n if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n a[a.length - 1] = b;\n mergeWithPrevious = true;\n return a;\n } else if (mergeWithPrevious) {\n a[a.length - 1] += b;\n mergeWithPrevious = false;\n return a;\n } else {\n return a.concat(b);\n }\n }, [])\n // Here we convert the string values into number values (in px)\n .map(function (str) {\n return toValue(str, measurement, popperOffsets, referenceOffsets);\n });\n });\n\n // Loop trough the offsets arrays and execute the operations\n ops.forEach(function (op, index) {\n op.forEach(function (frag, index2) {\n if (isNumeric(frag)) {\n offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n }\n });\n });\n return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nfunction offset(data, _ref) {\n var offset = _ref.offset;\n var placement = data.placement,\n _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var basePlacement = placement.split('-')[0];\n\n var offsets = void 0;\n if (isNumeric(+offset)) {\n offsets = [+offset, 0];\n } else {\n offsets = parseOffset(offset, popper, reference, basePlacement);\n }\n\n if (basePlacement === 'left') {\n popper.top += offsets[0];\n popper.left -= offsets[1];\n } else if (basePlacement === 'right') {\n popper.top += offsets[0];\n popper.left += offsets[1];\n } else if (basePlacement === 'top') {\n popper.left += offsets[0];\n popper.top -= offsets[1];\n } else if (basePlacement === 'bottom') {\n popper.left += offsets[0];\n popper.top += offsets[1];\n }\n\n data.popper = popper;\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction preventOverflow(data, options) {\n var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n // If offsetParent is the reference element, we really want to\n // go one step up and use the next offsetParent as reference to\n // avoid to make this modifier completely useless and look like broken\n if (data.instance.reference === boundariesElement) {\n boundariesElement = getOffsetParent(boundariesElement);\n }\n\n // NOTE: DOM access here\n // resets the popper's position so that the document size can be calculated excluding\n // the size of the popper element itself\n var transformProp = getSupportedPropertyName('transform');\n var popperStyles = data.instance.popper.style; // assignment to help minification\n var top = popperStyles.top,\n left = popperStyles.left,\n transform = popperStyles[transformProp];\n\n popperStyles.top = '';\n popperStyles.left = '';\n popperStyles[transformProp] = '';\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n // NOTE: DOM access here\n // restores the original style properties after the offsets have been computed\n popperStyles.top = top;\n popperStyles.left = left;\n popperStyles[transformProp] = transform;\n\n options.boundaries = boundaries;\n\n var order = options.priority;\n var popper = data.offsets.popper;\n\n var check = {\n primary: function primary(placement) {\n var value = popper[placement];\n if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n value = Math.max(popper[placement], boundaries[placement]);\n }\n return defineProperty({}, placement, value);\n },\n secondary: function secondary(placement) {\n var mainSide = placement === 'right' ? 'left' : 'top';\n var value = popper[mainSide];\n if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n }\n return defineProperty({}, mainSide, value);\n }\n };\n\n order.forEach(function (placement) {\n var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n popper = _extends({}, popper, check[side](placement));\n });\n\n data.offsets.popper = popper;\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction shift(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var shiftvariation = placement.split('-')[1];\n\n // if shift shiftvariation is specified, run the modifier\n if (shiftvariation) {\n var _data$offsets = data.offsets,\n reference = _data$offsets.reference,\n popper = _data$offsets.popper;\n\n var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n var side = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n var shiftOffsets = {\n start: defineProperty({}, side, reference[side]),\n end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n };\n\n data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction hide(data) {\n if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n return data;\n }\n\n var refRect = data.offsets.reference;\n var bound = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'preventOverflow';\n }).boundaries;\n\n if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === true) {\n return data;\n }\n\n data.hide = true;\n data.attributes['x-out-of-boundaries'] = '';\n } else {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === false) {\n return data;\n }\n\n data.hide = false;\n data.attributes['x-out-of-boundaries'] = false;\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction inner(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n data.placement = getOppositePlacement(placement);\n data.offsets.popper = getClientRect(popper);\n\n return data;\n}\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.
              \n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.
              \n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nvar modifiers = {\n /**\n * Modifier used to shift the popper on the start or end of its reference\n * element.
              \n * It will read the variation of the `placement` property.
              \n * It can be one either `-end` or `-start`.\n * @memberof modifiers\n * @inner\n */\n shift: {\n /** @prop {number} order=100 - Index used to define the order of execution */\n order: 100,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: shift\n },\n\n /**\n * The `offset` modifier can shift your popper on both its axis.\n *\n * It accepts the following units:\n * - `px` or unit-less, interpreted as pixels\n * - `%` or `%r`, percentage relative to the length of the reference element\n * - `%p`, percentage relative to the length of the popper element\n * - `vw`, CSS viewport width unit\n * - `vh`, CSS viewport height unit\n *\n * For length is intended the main axis relative to the placement of the popper.
              \n * This means that if the placement is `top` or `bottom`, the length will be the\n * `width`. In case of `left` or `right`, it will be the `height`.\n *\n * You can provide a single value (as `Number` or `String`), or a pair of values\n * as `String` divided by a comma or one (or more) white spaces.
              \n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.
              \n * Additionally, it accepts additions and subtractions between different units.\n * Note that multiplications and divisions aren't supported.\n *\n * Valid examples are:\n * ```\n * 10\n * '10%'\n * '10, 10'\n * '10%, 10'\n * '10 + 10%'\n * '10 - 5vh + 3%'\n * '-10px + 5vh, 5px - 6%'\n * ```\n * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n *\n * @memberof modifiers\n * @inner\n */\n offset: {\n /** @prop {number} order=200 - Index used to define the order of execution */\n order: 200,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: offset,\n /** @prop {Number|String} offset=0\n * The offset value as described in the modifier description\n */\n offset: 0\n },\n\n /**\n * Modifier used to prevent the popper from being positioned outside the boundary.\n *\n * A scenario exists where the reference itself is not within the boundaries.
              \n * We can say it has \"escaped the boundaries\" — or just \"escaped\".
              \n * In this case we need to decide whether the popper should either:\n *\n * - detach from the reference and remain \"trapped\" in the boundaries, or\n * - if it should ignore the boundary and \"escape with its reference\"\n *\n * When `escapeWithReference` is set to`true` and reference is completely\n * outside its boundaries, the popper will overflow (or completely leave)\n * the boundaries in order to remain attached to the edge of the reference.\n *\n * @memberof modifiers\n * @inner\n */\n preventOverflow: {\n /** @prop {number} order=300 - Index used to define the order of execution */\n order: 300,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: preventOverflow,\n /**\n * @prop {Array} [priority=['left','right','top','bottom']]\n * Popper will try to prevent overflow following these priorities by default,\n * then, it could overflow on the left and on top of the `boundariesElement`\n */\n priority: ['left', 'right', 'top', 'bottom'],\n /**\n * @prop {number} padding=5\n * Amount of pixel used to define a minimum distance between the boundaries\n * and the popper. This makes sure the popper always has a little padding\n * between the edges of its container\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='scrollParent'\n * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n * `viewport` or any DOM element.\n */\n boundariesElement: 'scrollParent'\n },\n\n /**\n * Modifier used to make sure the reference and its popper stay near each other\n * without leaving any gap between the two. Especially useful when the arrow is\n * enabled and you want to ensure that it points to its reference element.\n * It cares only about the first axis. You can still have poppers with margin\n * between the popper and its reference element.\n * @memberof modifiers\n * @inner\n */\n keepTogether: {\n /** @prop {number} order=400 - Index used to define the order of execution */\n order: 400,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: keepTogether\n },\n\n /**\n * This modifier is used to move the `arrowElement` of the popper to make\n * sure it is positioned between the reference element and its popper element.\n * It will read the outer size of the `arrowElement` node to detect how many\n * pixels of conjunction are needed.\n *\n * It has no effect if no `arrowElement` is provided.\n * @memberof modifiers\n * @inner\n */\n arrow: {\n /** @prop {number} order=500 - Index used to define the order of execution */\n order: 500,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: arrow,\n /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n element: '[x-arrow]'\n },\n\n /**\n * Modifier used to flip the popper's placement when it starts to overlap its\n * reference element.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n *\n * **NOTE:** this modifier will interrupt the current update cycle and will\n * restart it if it detects the need to flip the placement.\n * @memberof modifiers\n * @inner\n */\n flip: {\n /** @prop {number} order=600 - Index used to define the order of execution */\n order: 600,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: flip,\n /**\n * @prop {String|Array} behavior='flip'\n * The behavior used to change the popper's placement. It can be one of\n * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n * placements (with optional variations)\n */\n behavior: 'flip',\n /**\n * @prop {number} padding=5\n * The popper will flip if it hits the edges of the `boundariesElement`\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='viewport'\n * The element which will define the boundaries of the popper position.\n * The popper will never be placed outside of the defined boundaries\n * (except if `keepTogether` is enabled)\n */\n boundariesElement: 'viewport',\n /**\n * @prop {Boolean} flipVariations=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the reference element overlaps its boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariations: false,\n /**\n * @prop {Boolean} flipVariationsByContent=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the popper element overlaps its reference boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariationsByContent: false\n },\n\n /**\n * Modifier used to make the popper flow toward the inner of the reference element.\n * By default, when this modifier is disabled, the popper will be placed outside\n * the reference element.\n * @memberof modifiers\n * @inner\n */\n inner: {\n /** @prop {number} order=700 - Index used to define the order of execution */\n order: 700,\n /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n enabled: false,\n /** @prop {ModifierFn} */\n fn: inner\n },\n\n /**\n * Modifier used to hide the popper when its reference element is outside of the\n * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n * be used to hide with a CSS selector the popper when its reference is\n * out of boundaries.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n * @memberof modifiers\n * @inner\n */\n hide: {\n /** @prop {number} order=800 - Index used to define the order of execution */\n order: 800,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: hide\n },\n\n /**\n * Computes the style that will be applied to the popper element to gets\n * properly positioned.\n *\n * Note that this modifier will not touch the DOM, it just prepares the styles\n * so that `applyStyle` modifier can apply it. This separation is useful\n * in case you need to replace `applyStyle` with a custom implementation.\n *\n * This modifier has `850` as `order` value to maintain backward compatibility\n * with previous versions of Popper.js. Expect the modifiers ordering method\n * to change in future major versions of the library.\n *\n * @memberof modifiers\n * @inner\n */\n computeStyle: {\n /** @prop {number} order=850 - Index used to define the order of execution */\n order: 850,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: computeStyle,\n /**\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: true,\n /**\n * @prop {string} [x='bottom']\n * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n * Change this if your popper should grow in a direction different from `bottom`\n */\n x: 'bottom',\n /**\n * @prop {string} [x='left']\n * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n * Change this if your popper should grow in a direction different from `right`\n */\n y: 'right'\n },\n\n /**\n * Applies the computed styles to the popper element.\n *\n * All the DOM manipulations are limited to this modifier. This is useful in case\n * you want to integrate Popper.js inside a framework or view library and you\n * want to delegate all the DOM manipulations to it.\n *\n * Note that if you disable this modifier, you must make sure the popper element\n * has its position set to `absolute` before Popper.js can do its work!\n *\n * Just disable this modifier and define your own to achieve the desired effect.\n *\n * @memberof modifiers\n * @inner\n */\n applyStyle: {\n /** @prop {number} order=900 - Index used to define the order of execution */\n order: 900,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: applyStyle,\n /** @prop {Function} */\n onLoad: applyStyleOnLoad,\n /**\n * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: undefined\n }\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.
              \n * These can be overridden using the `options` argument of Popper.js.
              \n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n * modifiers: {\n * preventOverflow: { enabled: false }\n * }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nvar Defaults = {\n /**\n * Popper's placement.\n * @prop {Popper.placements} placement='bottom'\n */\n placement: 'bottom',\n\n /**\n * Set this to true if you want popper to position it self in 'fixed' mode\n * @prop {Boolean} positionFixed=false\n */\n positionFixed: false,\n\n /**\n * Whether events (resize, scroll) are initially enabled.\n * @prop {Boolean} eventsEnabled=true\n */\n eventsEnabled: true,\n\n /**\n * Set to true if you want to automatically remove the popper when\n * you call the `destroy` method.\n * @prop {Boolean} removeOnDestroy=false\n */\n removeOnDestroy: false,\n\n /**\n * Callback called when the popper is created.
              \n * By default, it is set to no-op.
              \n * Access Popper.js instance with `data.instance`.\n * @prop {onCreate}\n */\n onCreate: function onCreate() {},\n\n /**\n * Callback called when the popper is updated. This callback is not called\n * on the initialization/creation of the popper, but only on subsequent\n * updates.
              \n * By default, it is set to no-op.
              \n * Access Popper.js instance with `data.instance`.\n * @prop {onUpdate}\n */\n onUpdate: function onUpdate() {},\n\n /**\n * List of modifiers used to modify the offsets before they are applied to the popper.\n * They provide most of the functionalities of Popper.js.\n * @prop {modifiers}\n */\n modifiers: modifiers\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n\n// Utils\n// Methods\nvar Popper = function () {\n /**\n * Creates a new Popper.js instance.\n * @class Popper\n * @param {Element|referenceObject} reference - The reference element used to position the popper\n * @param {Element} popper - The HTML / XML element used as the popper\n * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n * @return {Object} instance - The generated Popper.js instance\n */\n function Popper(reference, popper) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n classCallCheck(this, Popper);\n\n this.scheduleUpdate = function () {\n return requestAnimationFrame(_this.update);\n };\n\n // make update() debounced, so that it only runs at most once-per-tick\n this.update = debounce(this.update.bind(this));\n\n // with {} we create a new object with the options inside it\n this.options = _extends({}, Popper.Defaults, options);\n\n // init state\n this.state = {\n isDestroyed: false,\n isCreated: false,\n scrollParents: []\n };\n\n // get reference and popper elements (allow jQuery wrappers)\n this.reference = reference && reference.jquery ? reference[0] : reference;\n this.popper = popper && popper.jquery ? popper[0] : popper;\n\n // Deep merge modifiers options\n this.options.modifiers = {};\n Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n });\n\n // Refactoring modifiers' list (Object => Array)\n this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n return _extends({\n name: name\n }, _this.options.modifiers[name]);\n })\n // sort the modifiers by order\n .sort(function (a, b) {\n return a.order - b.order;\n });\n\n // modifiers have the ability to execute arbitrary code when Popper.js get inited\n // such code is executed in the same order of its modifier\n // they could add new properties to their options configuration\n // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n this.modifiers.forEach(function (modifierOptions) {\n if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n }\n });\n\n // fire the first update to position the popper in the right place\n this.update();\n\n var eventsEnabled = this.options.eventsEnabled;\n if (eventsEnabled) {\n // setup event listeners, they will take care of update the position in specific situations\n this.enableEventListeners();\n }\n\n this.state.eventsEnabled = eventsEnabled;\n }\n\n // We can't use class properties because they don't get listed in the\n // class prototype and break stuff like Sinon stubs\n\n\n createClass(Popper, [{\n key: 'update',\n value: function update$$1() {\n return update.call(this);\n }\n }, {\n key: 'destroy',\n value: function destroy$$1() {\n return destroy.call(this);\n }\n }, {\n key: 'enableEventListeners',\n value: function enableEventListeners$$1() {\n return enableEventListeners.call(this);\n }\n }, {\n key: 'disableEventListeners',\n value: function disableEventListeners$$1() {\n return disableEventListeners.call(this);\n }\n\n /**\n * Schedules an update. It will run on the next UI update available.\n * @method scheduleUpdate\n * @memberof Popper\n */\n\n\n /**\n * Collection of utilities useful when writing custom modifiers.\n * Starting from version 1.7, this method is available only if you\n * include `popper-utils.js` before `popper.js`.\n *\n * **DEPRECATION**: This way to access PopperUtils is deprecated\n * and will be removed in v2! Use the PopperUtils module directly instead.\n * Due to the high instability of the methods contained in Utils, we can't\n * guarantee them to follow semver. Use them at your own risk!\n * @static\n * @private\n * @type {Object}\n * @deprecated since version 1.8\n * @member Utils\n * @memberof Popper\n */\n\n }]);\n return Popper;\n}();\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.
              \n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\n\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n\nexport default Popper;\n//# sourceMappingURL=popper.js.map\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.4.1): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst VERSION = '4.4.1'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\nconst SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key\nconst TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\n KEYUP_DATA_API : `keyup${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DISABLED : 'disabled',\n SHOW : 'show',\n DROPUP : 'dropup',\n DROPRIGHT : 'dropright',\n DROPLEFT : 'dropleft',\n MENURIGHT : 'dropdown-menu-right',\n MENULEFT : 'dropdown-menu-left',\n POSITION_STATIC : 'position-static'\n}\n\nconst Selector = {\n DATA_TOGGLE : '[data-toggle=\"dropdown\"]',\n FORM_CHILD : '.dropdown form',\n MENU : '.dropdown-menu',\n NAVBAR_NAV : '.navbar-nav',\n VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n}\n\nconst AttachmentMap = {\n TOP : 'top-start',\n TOPEND : 'top-end',\n BOTTOM : 'bottom-start',\n BOTTOMEND : 'bottom-end',\n RIGHT : 'right-start',\n RIGHTEND : 'right-end',\n LEFT : 'left-start',\n LEFTEND : 'left-end'\n}\n\nconst Default = {\n offset : 0,\n flip : true,\n boundary : 'scrollParent',\n reference : 'toggle',\n display : 'dynamic',\n popperConfig : null\n}\n\nconst DefaultType = {\n offset : '(number|string|function)',\n flip : 'boolean',\n boundary : '(string|element)',\n reference : '(string|element)',\n display : 'string',\n popperConfig : '(null|object)'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown {\n constructor(element, config) {\n this._element = element\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n toggle() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const isActive = $(this._menu).hasClass(ClassName.SHOW)\n\n Dropdown._clearMenus()\n\n if (isActive) {\n return\n }\n\n this.show(true)\n }\n\n show(usePopper = false) {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n // Disable totally Popper.js for Dropdown in Navbar\n if (!this._inNavbar && usePopper) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (Util.isElement(this._config.reference)) {\n referenceElement = this._config.reference\n\n // Check if it's jQuery element\n if (typeof this._config.reference.jquery !== 'undefined') {\n referenceElement = this._config.reference[0]\n }\n }\n\n // If boundary is not `scrollParent`, then set position to `static`\n // to allow the menu to \"escape\" the scroll parent's boundaries\n // https://github.com/twbs/bootstrap/issues/24251\n if (this._config.boundary !== 'scrollParent') {\n $(parent).addClass(ClassName.POSITION_STATIC)\n }\n this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n $(parent).closest(Selector.NAVBAR_NAV).length === 0) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n }\n\n hide() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._element).off(EVENT_KEY)\n this._element = null\n this._menu = null\n if (this._popper !== null) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Private\n\n _addEventListeners() {\n $(this._element).on(Event.CLICK, (event) => {\n event.preventDefault()\n event.stopPropagation()\n this.toggle()\n })\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...$(this._element).data(),\n ...config\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n return config\n }\n\n _getMenuElement() {\n if (!this._menu) {\n const parent = Dropdown._getParentFromElement(this._element)\n\n if (parent) {\n this._menu = parent.querySelector(Selector.MENU)\n }\n }\n return this._menu\n }\n\n _getPlacement() {\n const $parentDropdown = $(this._element.parentNode)\n let placement = AttachmentMap.BOTTOM\n\n // Handle dropup\n if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n placement = AttachmentMap.TOP\n if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.TOPEND\n }\n } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n placement = AttachmentMap.RIGHT\n } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n placement = AttachmentMap.LEFT\n } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.BOTTOMEND\n }\n return placement\n }\n\n _detectNavbar() {\n return $(this._element).closest('.navbar').length > 0\n }\n\n _getOffset() {\n const offset = {}\n\n if (typeof this._config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this._config.offset(data.offsets, this._element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this._config.offset\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const popperConfig = {\n placement: this._getPlacement(),\n modifiers: {\n offset: this._getOffset(),\n flip: {\n enabled: this._config.flip\n },\n preventOverflow: {\n boundariesElement: this._config.boundary\n }\n }\n }\n\n // Disable Popper.js if we have a static display\n if (this._config.display === 'static') {\n popperConfig.modifiers.applyStyle = {\n enabled: false\n }\n }\n\n return {\n ...popperConfig,\n ...this._config.popperConfig\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data) {\n data = new Dropdown(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n\n static _clearMenus(event) {\n if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\n event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n return\n }\n\n const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const parent = Dropdown._getParentFromElement(toggles[i])\n const context = $(toggles[i]).data(DATA_KEY)\n const relatedTarget = {\n relatedTarget: toggles[i]\n }\n\n if (event && event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n if (!context) {\n continue\n }\n\n const dropdownMenu = context._menu\n if (!$(parent).hasClass(ClassName.SHOW)) {\n continue\n }\n\n if (event && (event.type === 'click' &&\n /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\n $.contains(parent, event.target)) {\n continue\n }\n\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n $(parent).trigger(hideEvent)\n if (hideEvent.isDefaultPrevented()) {\n continue\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n toggles[i].setAttribute('aria-expanded', 'false')\n\n if (context._popper) {\n context._popper.destroy()\n }\n\n $(dropdownMenu).removeClass(ClassName.SHOW)\n $(parent)\n .removeClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n }\n\n static _getParentFromElement(element) {\n let parent\n const selector = Util.getSelectorFromElement(element)\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n return parent || element.parentNode\n }\n\n // eslint-disable-next-line complexity\n static _dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName)\n ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\n (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\n $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this)\n const isActive = $(parent).hasClass(ClassName.SHOW)\n\n if (!isActive && event.which === ESCAPE_KEYCODE) {\n return\n }\n\n if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n if (event.which === ESCAPE_KEYCODE) {\n const toggle = parent.querySelector(Selector.DATA_TOGGLE)\n $(toggle).trigger('focus')\n }\n\n $(this).trigger('click')\n return\n }\n\n const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))\n .filter((item) => $(item).is(':visible'))\n\n if (items.length === 0) {\n return\n }\n\n let index = items.indexOf(event.target)\n\n if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\n index--\n }\n\n if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\n index++\n }\n\n if (index < 0) {\n index = 0\n }\n\n items[index].focus()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\n .on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)\n .on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault()\n event.stopPropagation()\n Dropdown._jQueryInterface.call($(this), 'toggle')\n })\n .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {\n e.stopPropagation()\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Dropdown._jQueryInterface\n$.fn[NAME].Constructor = Dropdown\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Dropdown._jQueryInterface\n}\n\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.4.1): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst VERSION = '4.4.1'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\n\nconst Default = {\n backdrop : true,\n keyboard : true,\n focus : true,\n show : true\n}\n\nconst DefaultType = {\n backdrop : '(boolean|string)',\n keyboard : 'boolean',\n focus : 'boolean',\n show : 'boolean'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDE_PREVENTED : `hidePrevented${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n RESIZE : `resize${EVENT_KEY}`,\n CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\n KEYDOWN_DISMISS : `keydown.dismiss${EVENT_KEY}`,\n MOUSEUP_DISMISS : `mouseup.dismiss${EVENT_KEY}`,\n MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SCROLLABLE : 'modal-dialog-scrollable',\n SCROLLBAR_MEASURER : 'modal-scrollbar-measure',\n BACKDROP : 'modal-backdrop',\n OPEN : 'modal-open',\n FADE : 'fade',\n SHOW : 'show',\n STATIC : 'modal-static'\n}\n\nconst Selector = {\n DIALOG : '.modal-dialog',\n MODAL_BODY : '.modal-body',\n DATA_TOGGLE : '[data-toggle=\"modal\"]',\n DATA_DISMISS : '[data-dismiss=\"modal\"]',\n FIXED_CONTENT : '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n STICKY_CONTENT : '.sticky-top'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal {\n constructor(element, config) {\n this._config = this._getConfig(config)\n this._element = element\n this._dialog = element.querySelector(Selector.DIALOG)\n this._backdrop = null\n this._isShown = false\n this._isBodyOverflowing = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollbarWidth = 0\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n this._isTransitioning = true\n }\n\n const showEvent = $.Event(Event.SHOW, {\n relatedTarget\n })\n\n $(this._element).trigger(showEvent)\n\n if (this._isShown || showEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = true\n\n this._checkScrollbar()\n this._setScrollbar()\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n $(this._element).on(\n Event.CLICK_DISMISS,\n Selector.DATA_DISMISS,\n (event) => this.hide(event)\n )\n\n $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {\n $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {\n if ($(event.target).is(this._element)) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide(event) {\n if (event) {\n event.preventDefault()\n }\n\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = $.Event(Event.HIDE)\n\n $(this._element).trigger(hideEvent)\n\n if (!this._isShown || hideEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = false\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (transition) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n $(document).off(Event.FOCUSIN)\n\n $(this._element).removeClass(ClassName.SHOW)\n\n $(this._element).off(Event.CLICK_DISMISS)\n $(this._dialog).off(Event.MOUSEDOWN_DISMISS)\n\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, (event) => this._hideModal(event))\n .emulateTransitionEnd(transitionDuration)\n } else {\n this._hideModal()\n }\n }\n\n dispose() {\n [window, this._element, this._dialog]\n .forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))\n\n /**\n * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n * Do not move `document` in `htmlElements` array\n * It will remove `Event.CLICK_DATA_API` event that should remain\n */\n $(document).off(Event.FOCUSIN)\n\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._element = null\n this._dialog = null\n this._backdrop = null\n this._isShown = null\n this._isBodyOverflowing = null\n this._ignoreBackdropClick = null\n this._isTransitioning = null\n this._scrollbarWidth = null\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _triggerBackdropTransition() {\n if (this._config.backdrop === 'static') {\n const hideEventPrevented = $.Event(Event.HIDE_PREVENTED)\n\n $(this._element).trigger(hideEventPrevented)\n if (hideEventPrevented.defaultPrevented) {\n return\n }\n\n this._element.classList.add(ClassName.STATIC)\n\n const modalTransitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element).one(Util.TRANSITION_END, () => {\n this._element.classList.remove(ClassName.STATIC)\n })\n .emulateTransitionEnd(modalTransitionDuration)\n this._element.focus()\n } else {\n this.hide()\n }\n }\n\n _showElement(relatedTarget) {\n const transition = $(this._element).hasClass(ClassName.FADE)\n const modalBody = this._dialog ? this._dialog.querySelector(Selector.MODAL_BODY) : null\n\n if (!this._element.parentNode ||\n this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n\n if ($(this._dialog).hasClass(ClassName.SCROLLABLE) && modalBody) {\n modalBody.scrollTop = 0\n } else {\n this._element.scrollTop = 0\n }\n\n if (transition) {\n Util.reflow(this._element)\n }\n\n $(this._element).addClass(ClassName.SHOW)\n\n if (this._config.focus) {\n this._enforceFocus()\n }\n\n const shownEvent = $.Event(Event.SHOWN, {\n relatedTarget\n })\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._element.focus()\n }\n this._isTransitioning = false\n $(this._element).trigger(shownEvent)\n }\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n\n $(this._dialog)\n .one(Util.TRANSITION_END, transitionComplete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n transitionComplete()\n }\n }\n\n _enforceFocus() {\n $(document)\n .off(Event.FOCUSIN) // Guard against infinite focus loop\n .on(Event.FOCUSIN, (event) => {\n if (document !== event.target &&\n this._element !== event.target &&\n $(this._element).has(event.target).length === 0) {\n this._element.focus()\n }\n })\n }\n\n _setEscapeEvent() {\n if (this._isShown && this._config.keyboard) {\n $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {\n if (event.which === ESCAPE_KEYCODE) {\n this._triggerBackdropTransition()\n }\n })\n } else if (!this._isShown) {\n $(this._element).off(Event.KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n $(window).on(Event.RESIZE, (event) => this.handleUpdate(event))\n } else {\n $(window).off(Event.RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._isTransitioning = false\n this._showBackdrop(() => {\n $(document.body).removeClass(ClassName.OPEN)\n this._resetAdjustments()\n this._resetScrollbar()\n $(this._element).trigger(Event.HIDDEN)\n })\n }\n\n _removeBackdrop() {\n if (this._backdrop) {\n $(this._backdrop).remove()\n this._backdrop = null\n }\n }\n\n _showBackdrop(callback) {\n const animate = $(this._element).hasClass(ClassName.FADE)\n ? ClassName.FADE : ''\n\n if (this._isShown && this._config.backdrop) {\n this._backdrop = document.createElement('div')\n this._backdrop.className = ClassName.BACKDROP\n\n if (animate) {\n this._backdrop.classList.add(animate)\n }\n\n $(this._backdrop).appendTo(document.body)\n\n $(this._element).on(Event.CLICK_DISMISS, (event) => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n if (event.target !== event.currentTarget) {\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n if (animate) {\n Util.reflow(this._backdrop)\n }\n\n $(this._backdrop).addClass(ClassName.SHOW)\n\n if (!callback) {\n return\n }\n\n if (!animate) {\n callback()\n return\n }\n\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callback)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else if (!this._isShown && this._backdrop) {\n $(this._backdrop).removeClass(ClassName.SHOW)\n\n const callbackRemove = () => {\n this._removeBackdrop()\n if (callback) {\n callback()\n }\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callbackRemove)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else {\n callbackRemove()\n }\n } else if (callback) {\n callback()\n }\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // todo (fat): these should probably be refactored out of modal.js\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing =\n this._element.scrollHeight > document.documentElement.clientHeight\n\n if (!this._isBodyOverflowing && isModalOverflowing) {\n this._element.style.paddingLeft = `${this._scrollbarWidth}px`\n }\n\n if (this._isBodyOverflowing && !isModalOverflowing) {\n this._element.style.paddingRight = `${this._scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n _checkScrollbar() {\n const rect = document.body.getBoundingClientRect()\n this._isBodyOverflowing = rect.left + rect.right < window.innerWidth\n this._scrollbarWidth = this._getScrollbarWidth()\n }\n\n _setScrollbar() {\n if (this._isBodyOverflowing) {\n // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n const stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT))\n\n // Adjust fixed content padding\n $(fixedContent).each((index, element) => {\n const actualPadding = element.style.paddingRight\n const calculatedPadding = $(element).css('padding-right')\n $(element)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n })\n\n // Adjust sticky content margin\n $(stickyContent).each((index, element) => {\n const actualMargin = element.style.marginRight\n const calculatedMargin = $(element).css('margin-right')\n $(element)\n .data('margin-right', actualMargin)\n .css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)\n })\n\n // Adjust body padding\n const actualPadding = document.body.style.paddingRight\n const calculatedPadding = $(document.body).css('padding-right')\n $(document.body)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n }\n\n $(document.body).addClass(ClassName.OPEN)\n }\n\n _resetScrollbar() {\n // Restore fixed content padding\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n $(fixedContent).each((index, element) => {\n const padding = $(element).data('padding-right')\n $(element).removeData('padding-right')\n element.style.paddingRight = padding ? padding : ''\n })\n\n // Restore sticky content\n const elements = [].slice.call(document.querySelectorAll(`${Selector.STICKY_CONTENT}`))\n $(elements).each((index, element) => {\n const margin = $(element).data('margin-right')\n if (typeof margin !== 'undefined') {\n $(element).css('margin-right', margin).removeData('margin-right')\n }\n })\n\n // Restore body padding\n const padding = $(document.body).data('padding-right')\n $(document.body).removeData('padding-right')\n document.body.style.paddingRight = padding ? padding : ''\n }\n\n _getScrollbarWidth() { // thx d.walsh\n const scrollDiv = document.createElement('div')\n scrollDiv.className = ClassName.SCROLLBAR_MEASURER\n document.body.appendChild(scrollDiv)\n const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\n document.body.removeChild(scrollDiv)\n return scrollbarWidth\n }\n\n // Static\n\n static _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Modal(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config](relatedTarget)\n } else if (_config.show) {\n data.show(relatedTarget)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n let target\n const selector = Util.getSelectorFromElement(this)\n\n if (selector) {\n target = document.querySelector(selector)\n }\n\n const config = $(target).data(DATA_KEY)\n ? 'toggle' : {\n ...$(target).data(),\n ...$(this).data()\n }\n\n if (this.tagName === 'A' || this.tagName === 'AREA') {\n event.preventDefault()\n }\n\n const $target = $(target).one(Event.SHOW, (showEvent) => {\n if (showEvent.isDefaultPrevented()) {\n // Only register focus restorer if modal will actually get shown\n return\n }\n\n $target.one(Event.HIDDEN, () => {\n if ($(this).is(':visible')) {\n this.focus()\n }\n })\n })\n\n Modal._jQueryInterface.call($(target), config, this)\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Modal._jQueryInterface\n$.fn[NAME].Constructor = Modal\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Modal._jQueryInterface\n}\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.4.1): tools/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = [\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n]\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultWhitelist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\n\nfunction allowedAttribute(attr, allowedAttributeList) {\n const attrName = attr.nodeName.toLowerCase()\n\n if (allowedAttributeList.indexOf(attrName) !== -1) {\n if (uriAttrs.indexOf(attrName) !== -1) {\n return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, l = regExp.length; i < l; i++) {\n if (attrName.match(regExp[i])) {\n return true\n }\n }\n\n return false\n}\n\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n if (unsafeHtml.length === 0) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const whitelistKeys = Object.keys(whiteList)\n const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const el = elements[i]\n const elName = el.nodeName.toLowerCase()\n\n if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n el.parentNode.removeChild(el)\n\n continue\n }\n\n const attributeList = [].slice.call(el.attributes)\n const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\n attributeList.forEach((attr) => {\n if (!allowedAttribute(attr, whitelistedAttributes)) {\n el.removeAttribute(attr.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.4.1): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n DefaultWhitelist,\n sanitizeHtml\n} from './tools/sanitizer'\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst VERSION = '4.4.1'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\nconst DefaultType = {\n animation : 'boolean',\n template : 'string',\n title : '(string|element|function)',\n trigger : 'string',\n delay : '(number|object)',\n html : 'boolean',\n selector : '(string|boolean)',\n placement : '(string|function)',\n offset : '(number|string|function)',\n container : '(string|element|boolean)',\n fallbackPlacement : '(string|array)',\n boundary : '(string|element)',\n sanitize : 'boolean',\n sanitizeFn : '(null|function)',\n whiteList : 'object',\n popperConfig : '(null|object)'\n}\n\nconst AttachmentMap = {\n AUTO : 'auto',\n TOP : 'top',\n RIGHT : 'right',\n BOTTOM : 'bottom',\n LEFT : 'left'\n}\n\nconst Default = {\n animation : true,\n template : '
              ' +\n '
              ' +\n '
              ',\n trigger : 'hover focus',\n title : '',\n delay : 0,\n html : false,\n selector : false,\n placement : 'top',\n offset : 0,\n container : false,\n fallbackPlacement : 'flip',\n boundary : 'scrollParent',\n sanitize : true,\n sanitizeFn : null,\n whiteList : DefaultWhitelist,\n popperConfig : null\n}\n\nconst HoverState = {\n SHOW : 'show',\n OUT : 'out'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TOOLTIP : '.tooltip',\n TOOLTIP_INNER : '.tooltip-inner',\n ARROW : '.arrow'\n}\n\nconst Trigger = {\n HOVER : 'hover',\n FOCUS : 'focus',\n CLICK : 'click',\n MANUAL : 'manual'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)')\n }\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this.element = element\n this.config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const dataKey = this.constructor.DATA_KEY\n let context = $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n $.removeData(this.element, this.constructor.DATA_KEY)\n\n $(this.element).off(this.constructor.EVENT_KEY)\n $(this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler)\n\n if (this.tip) {\n $(this.tip).remove()\n }\n\n this._isEnabled = null\n this._timeout = null\n this._hoverState = null\n this._activeTrigger = null\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._popper = null\n this.element = null\n this.config = null\n this.tip = null\n }\n\n show() {\n if ($(this.element).css('display') === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n const showEvent = $.Event(this.constructor.Event.SHOW)\n if (this.isWithContent() && this._isEnabled) {\n $(this.element).trigger(showEvent)\n\n const shadowRoot = Util.findShadowRoot(this.element)\n const isInTheDom = $.contains(\n shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\n this.element\n )\n\n if (showEvent.isDefaultPrevented() || !isInTheDom) {\n return\n }\n\n const tip = this.getTipElement()\n const tipId = Util.getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this.element.setAttribute('aria-describedby', tipId)\n\n this.setContent()\n\n if (this.config.animation) {\n $(tip).addClass(ClassName.FADE)\n }\n\n const placement = typeof this.config.placement === 'function'\n ? this.config.placement.call(this, tip, this.element)\n : this.config.placement\n\n const attachment = this._getAttachment(placement)\n this.addAttachmentClass(attachment)\n\n const container = this._getContainer()\n $(tip).data(this.constructor.DATA_KEY, this)\n\n if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n $(tip).appendTo(container)\n }\n\n $(this.element).trigger(this.constructor.Event.INSERTED)\n\n this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment))\n\n $(tip).addClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n const complete = () => {\n if (this.config.animation) {\n this._fixTransition()\n }\n const prevHoverState = this._hoverState\n this._hoverState = null\n\n $(this.element).trigger(this.constructor.Event.SHOWN)\n\n if (prevHoverState === HoverState.OUT) {\n this._leave(null, this)\n }\n }\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\n\n $(this.tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n }\n\n hide(callback) {\n const tip = this.getTipElement()\n const hideEvent = $.Event(this.constructor.Event.HIDE)\n const complete = () => {\n if (this._hoverState !== HoverState.SHOW && tip.parentNode) {\n tip.parentNode.removeChild(tip)\n }\n\n this._cleanTipClass()\n this.element.removeAttribute('aria-describedby')\n $(this.element).trigger(this.constructor.Event.HIDDEN)\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n if (callback) {\n callback()\n }\n }\n\n $(this.element).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(tip).removeClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n this._activeTrigger[Trigger.CLICK] = false\n this._activeTrigger[Trigger.FOCUS] = false\n this._activeTrigger[Trigger.HOVER] = false\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(tip)\n\n $(tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const tip = this.getTipElement()\n this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle())\n $(tip).removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n setElementContent($element, content) {\n if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n // Content is a DOM node or a jQuery\n if (this.config.html) {\n if (!$(content).parent().is($element)) {\n $element.empty().append(content)\n }\n } else {\n $element.text($(content).text())\n }\n\n return\n }\n\n if (this.config.html) {\n if (this.config.sanitize) {\n content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\n }\n\n $element.html(content)\n } else {\n $element.text(content)\n }\n }\n\n getTitle() {\n let title = this.element.getAttribute('data-original-title')\n\n if (!title) {\n title = typeof this.config.title === 'function'\n ? this.config.title.call(this.element)\n : this.config.title\n }\n\n return title\n }\n\n // Private\n\n _getPopperConfig(attachment) {\n const defaultBsConfig = {\n placement: attachment,\n modifiers: {\n offset: this._getOffset(),\n flip: {\n behavior: this.config.fallbackPlacement\n },\n arrow: {\n element: Selector.ARROW\n },\n preventOverflow: {\n boundariesElement: this.config.boundary\n }\n },\n onCreate: (data) => {\n if (data.originalPlacement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n },\n onUpdate: (data) => this._handlePopperPlacementChange(data)\n }\n\n return {\n ...defaultBsConfig,\n ...this.config.popperConfig\n }\n }\n\n _getOffset() {\n const offset = {}\n\n if (typeof this.config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this.config.offset(data.offsets, this.element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this.config.offset\n }\n\n return offset\n }\n\n _getContainer() {\n if (this.config.container === false) {\n return document.body\n }\n\n if (Util.isElement(this.config.container)) {\n return $(this.config.container)\n }\n\n return $(document).find(this.config.container)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this.config.trigger.split(' ')\n\n triggers.forEach((trigger) => {\n if (trigger === 'click') {\n $(this.element).on(\n this.constructor.Event.CLICK,\n this.config.selector,\n (event) => this.toggle(event)\n )\n } else if (trigger !== Trigger.MANUAL) {\n const eventIn = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSEENTER\n : this.constructor.Event.FOCUSIN\n const eventOut = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSELEAVE\n : this.constructor.Event.FOCUSOUT\n\n $(this.element)\n .on(\n eventIn,\n this.config.selector,\n (event) => this._enter(event)\n )\n .on(\n eventOut,\n this.config.selector,\n (event) => this._leave(event)\n )\n }\n })\n\n this._hideModalHandler = () => {\n if (this.element) {\n this.hide()\n }\n }\n\n $(this.element).closest('.modal').on(\n 'hide.bs.modal',\n this._hideModalHandler\n )\n\n if (this.config.selector) {\n this.config = {\n ...this.config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const titleType = typeof this.element.getAttribute('data-original-title')\n\n if (this.element.getAttribute('title') || titleType !== 'string') {\n this.element.setAttribute(\n 'data-original-title',\n this.element.getAttribute('title') || ''\n )\n\n this.element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER\n ] = true\n }\n\n if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n context._hoverState = HoverState.SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.SHOW\n\n if (!context.config.delay || !context.config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.SHOW) {\n context.show()\n }\n }, context.config.delay.show)\n }\n\n _leave(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER\n ] = false\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.OUT\n\n if (!context.config.delay || !context.config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.OUT) {\n context.hide()\n }\n }, context.config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = $(this.element).data()\n\n Object.keys(dataAttributes)\n .forEach((dataAttr) => {\n if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n if (this.config) {\n for (const key in this.config) {\n if (this.constructor.Default[key] !== this.config[key]) {\n config[key] = this.config[key]\n }\n }\n }\n\n return config\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n _handlePopperPlacementChange(popperData) {\n const popperInstance = popperData.instance\n this.tip = popperInstance.popper\n this._cleanTipClass()\n this.addAttachmentClass(this._getAttachment(popperData.placement))\n }\n\n _fixTransition() {\n const tip = this.getTipElement()\n const initConfigAnimation = this.config.animation\n\n if (tip.getAttribute('x-placement') !== null) {\n return\n }\n\n $(tip).removeClass(ClassName.FADE)\n this.config.animation = false\n this.hide()\n this.show()\n this.config.animation = initConfigAnimation\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Tooltip(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tooltip._jQueryInterface\n$.fn[NAME].Constructor = Tooltip\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Tooltip._jQueryInterface\n}\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.4.1): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst VERSION = '4.4.1'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-popover'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst Default = {\n ...Tooltip.Default,\n placement : 'right',\n trigger : 'click',\n content : '',\n template : '
              ' +\n '
              ' +\n '

              ' +\n '
              '\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content : '(string|element|function)'\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TITLE : '.popover-header',\n CONTENT : '.popover-body'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const $tip = $(this.getTipElement())\n\n // We use append for html objects to maintain js events\n this.setElementContent($tip.find(Selector.TITLE), this.getTitle())\n let content = this._getContent()\n if (typeof content === 'function') {\n content = content.call(this.element)\n }\n this.setElementContent($tip.find(Selector.CONTENT), content)\n\n $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n // Private\n\n _getContent() {\n return this.element.getAttribute('data-content') ||\n this.config.content\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length > 0) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Popover(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Popover._jQueryInterface\n$.fn[NAME].Constructor = Popover\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Popover._jQueryInterface\n}\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.4.1): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst VERSION = '4.4.1'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n offset : 10,\n method : 'auto',\n target : ''\n}\n\nconst DefaultType = {\n offset : 'number',\n method : 'string',\n target : '(string|element)'\n}\n\nconst Event = {\n ACTIVATE : `activate${EVENT_KEY}`,\n SCROLL : `scroll${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DROPDOWN_ITEM : 'dropdown-item',\n DROPDOWN_MENU : 'dropdown-menu',\n ACTIVE : 'active'\n}\n\nconst Selector = {\n DATA_SPY : '[data-spy=\"scroll\"]',\n ACTIVE : '.active',\n NAV_LIST_GROUP : '.nav, .list-group',\n NAV_LINKS : '.nav-link',\n NAV_ITEMS : '.nav-item',\n LIST_ITEMS : '.list-group-item',\n DROPDOWN : '.dropdown',\n DROPDOWN_ITEMS : '.dropdown-item',\n DROPDOWN_TOGGLE : '.dropdown-toggle'\n}\n\nconst OffsetMethod = {\n OFFSET : 'offset',\n POSITION : 'position'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy {\n constructor(element, config) {\n this._element = element\n this._scrollElement = element.tagName === 'BODY' ? window : element\n this._config = this._getConfig(config)\n this._selector = `${this._config.target} ${Selector.NAV_LINKS},` +\n `${this._config.target} ${Selector.LIST_ITEMS},` +\n `${this._config.target} ${Selector.DROPDOWN_ITEMS}`\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window\n ? OffsetMethod.OFFSET : OffsetMethod.POSITION\n\n const offsetMethod = this._config.method === 'auto'\n ? autoMethod : this._config.method\n\n const offsetBase = offsetMethod === OffsetMethod.POSITION\n ? this._getScrollTop() : 0\n\n this._offsets = []\n this._targets = []\n\n this._scrollHeight = this._getScrollHeight()\n\n const targets = [].slice.call(document.querySelectorAll(this._selector))\n\n targets\n .map((element) => {\n let target\n const targetSelector = Util.getSelectorFromElement(element)\n\n if (targetSelector) {\n target = document.querySelector(targetSelector)\n }\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n // TODO (fat): remove sketch reliance on jQuery position/offset\n return [\n $(target)[offsetMethod]().top + offsetBase,\n targetSelector\n ]\n }\n }\n return null\n })\n .filter((item) => item)\n .sort((a, b) => a[0] - b[0])\n .forEach((item) => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n this._config = null\n this._selector = null\n this._offsets = null\n this._targets = null\n this._activeTarget = null\n this._scrollHeight = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.target !== 'string') {\n let id = $(config.target).attr('id')\n if (!id) {\n id = Util.getUID(NAME)\n $(config.target).attr('id', id)\n }\n config.target = `#${id}`\n }\n\n Util.typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window\n ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window\n ? window.innerHeight : this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset +\n scrollHeight -\n this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n const offsetLength = this._offsets.length\n for (let i = offsetLength; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' ||\n scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = this._selector\n .split(',')\n .map((selector) => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\n if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)\n $link.addClass(ClassName.ACTIVE)\n } else {\n // Set triggered link as active\n $link.addClass(ClassName.ACTIVE)\n // Set triggered links parents as active\n // With both