[
  {
    "path": ".gitignore",
    "content": "/var/cache/*\n!var/log/.gitkeep\n.idea/*\n\n/public/build/fonts/glyphicons-*\n/public/build/images/glyphicons-*\n\n###> symfony/framework-bundle ###\n/.env\n/.env.local\n/.env.*.local\n/public/bundles/\n/var/\n/vendor/\n###< symfony/framework-bundle ###\n\n###> symfony/phpunit-bridge ###\n.phpunit\n/phpunit.xml\n###< symfony/phpunit-bridge ###\n\n###> symfony/web-server-bundle ###\n/.web-server-pid\n###< symfony/web-server-bundle ###\n\n###> friendsofphp/php-cs-fixer ###\n/.php_cs\n/.php_cs.cache\n###< friendsofphp/php-cs-fixer ###\n\n###> symfony/webpack-encore-bundle ###\n/node_modules/\nnpm-debug.log\nyarn-error.log\n###< symfony/webpack-encore-bundle ###\n\n\n# Our app\npublic/share\n"
  },
  {
    "path": "bin/console",
    "content": "#!/usr/bin/env php\n<?php\nuse Symfony4\\Kernel;\nuse Symfony\\Bundle\\FrameworkBundle\\Console\\Application;\nuse Symfony\\Component\\Console\\Input\\ArgvInput;\nuse Symfony\\Component\\Debug\\Debug;\nset_time_limit(0);\nrequire dirname(__DIR__).'/vendor/autoload.php';\nif (!class_exists(Application::class)) {\n    throw new RuntimeException('You need to add \"symfony/framework-bundle\" as a Composer dependency.');\n}\n$input = new ArgvInput();\nif (null !== $_ENV['APP_ENV'] = $input->getParameterOption(['--env', '-e'], null, true)) {\n    putenv('APP_ENV='.$_ENV['APP_ENV']);\n    // force loading .env files when --env is defined\n    $_SERVER['APP_ENV'] = null;\n}\nif ($input->hasParameterOption('--no-debug', true)) {\n    putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0');\n}\nrequire dirname(__DIR__).'/config/bootstrap.php';\nif ($_SERVER['APP_DEBUG']) {\n    umask(0000);\n    if (class_exists(Debug::class)) {\n        Debug::enable();\n    }\n}\n$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);\n$application = new Application($kernel);\n$application->run($input);\n"
  },
  {
    "path": "bin/phpunit",
    "content": "#!/usr/bin/env php\n<?php\n\nif (!file_exists(dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit')) {\n    echo \"Unable to find the `simple-phpunit` script in `vendor/symfony/phpunit-bridge/bin/`.\\n\";\n    exit(1);\n}\nif (false === getenv('SYMFONY_PHPUNIT_REMOVE')) {\n    putenv('SYMFONY_PHPUNIT_REMOVE=');\n}\nif (false === getenv('SYMFONY_PHPUNIT_VERSION')) {\n    putenv('SYMFONY_PHPUNIT_VERSION=6.5');\n}\nif (false === getenv('SYMFONY_PHPUNIT_DIR')) {\n    putenv('SYMFONY_PHPUNIT_DIR='.__DIR__.'/.phpunit');\n}\n\nrequire dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit';\n"
  },
  {
    "path": "composer.json",
    "content": "{\n  \"name\": \"vagrant/seat\",\n  \"license\": \"proprietary\",\n  \"type\": \"project\",\n  \"autoload\": {\n    \"psr-4\": {\n      \"Symfony4\\\\\": \"src/Seat/Infrastructure/Symfony4/\",\n      \"Seat\\\\\": \"src/Seat/\"\n    }\n  },\n  \"autoload-dev\": {\n    \"psr-4\": {\n      \"SeatTest\\\\\": \"tests/unit/Seat/\"\n    }\n  },\n  \"config\": {\n    \"platform\": {\n      \"php\": \"7.2.0\"\n    }\n  },\n  \"require\": {\n    \"php\": \">=7.2.0\",\n    \"ext-json\": \"*\",\n    \"symfony/symfony\": \"^4.0\",\n    \"twig/twig\": \"^2.7\",\n    \"doctrine/doctrine-bundle\": \"^1.6\",\n    \"doctrine/orm\": \"^2.5\",\n    \"doctrine/doctrine-migrations-bundle\": \"^1.2\",\n    \"symfony/swiftmailer-bundle\": \"^3.2\",\n    \"symfony/monolog-bundle\": \"^3.3\",\n    \"twig/extensions\": \"^1.4\",\n    \"ramsey/uuid\": \"^3.8\",\n    \"beberlei/assert\": \"^3.2\",\n    \"symfony/flex\": \"^1.2\",\n    \"sensio/framework-extra-bundle\": \"^5.3\",\n    \"symfony/webpack-encore-bundle\": \"^1.5\",\n    \"easycorp/easyadmin-bundle\": \"^2.1\",\n    \"friendsofsymfony/ckeditor-bundle\": \"^2.0\",\n    \"vich/uploader-bundle\": \"^1.9\",\n    \"oro/doctrine-extensions\": \"^1.2\",\n    \"sentry/sentry-symfony\": \"^2.3\",\n    \"symfony/twig-bundle\": \"^4.2\"\n  },\n  \"require-dev\": {\n    \"phpunit/phpunit\": \"^7.5\",\n    \"symfony/phpunit-bridge\": \"*\"\n  },\n  \"scripts\": {\n    \"auto-scripts\": {\n      \"bin/console cache:clear\": \"script\",\n      \"bin/console ckeditor:install --clear=drop\": \"symfony-cmd\",\n      \"bin/console assets:install --symlink --relative %PUBLIC_DIR%\": \"script\"\n    },\n    \"post-install-cmd\": [\n      \"@auto-scripts\"\n    ],\n    \"post-update-cmd\": [\n      \"@auto-scripts\"\n    ]\n  }\n}\n"
  },
  {
    "path": "config/bootstrap.php",
    "content": "<?php\ndeclare(strict_types=1);\n\nuse Symfony\\Component\\Dotenv\\Dotenv;\n\nrequire dirname(__DIR__).'/vendor/autoload.php';\nif (!array_key_exists('APP_ENV', $_SERVER)) {\n    $_SERVER['APP_ENV'] = $_ENV['APP_ENV'] ?? null;\n}\nif ('prod' !== $_SERVER['APP_ENV']) {\n    if (!class_exists(Dotenv::class)) {\n        throw new RuntimeException(\n            'The \"APP_ENV\" environment variable is not set to \"prod\". Please run \"composer require symfony/dotenv\" to load the \".env\" files configuring the application.'\n        );\n    }\n    (new Dotenv())->loadEnv(dirname(__DIR__).'/.env');\n}\n$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $_SERVER['APP_ENV'] ?: $_ENV['APP_ENV'] ?: 'dev';\n$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV'];\n$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0';\n"
  },
  {
    "path": "config/bundles.php",
    "content": "<?php\ndeclare(strict_types=1);\n\nreturn [\n    Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle::class => ['all' => true],\n    Symfony\\Bundle\\SecurityBundle\\SecurityBundle::class => ['all' => true],\n    Doctrine\\Bundle\\DoctrineCacheBundle\\DoctrineCacheBundle::class => ['all' => true],\n    Doctrine\\Bundle\\DoctrineBundle\\DoctrineBundle::class => ['all' => true],\n    Sensio\\Bundle\\FrameworkExtraBundle\\SensioFrameworkExtraBundle::class => ['all' => true],\n    Symfony\\Bundle\\MonologBundle\\MonologBundle::class => ['all' => true],\n    Symfony\\Bundle\\SwiftmailerBundle\\SwiftmailerBundle::class => ['all' => true],\n    Symfony\\Bundle\\TwigBundle\\TwigBundle::class => ['all' => true],\n    Symfony\\Bundle\\DebugBundle\\DebugBundle::class => ['dev' => true, 'test' => true],\n    Symfony\\Bundle\\WebServerBundle\\WebServerBundle::class => ['dev' => true],\n    Symfony\\Bundle\\WebProfilerBundle\\WebProfilerBundle::class => ['dev' => true, 'test' => true],\n    Doctrine\\Bundle\\MigrationsBundle\\DoctrineMigrationsBundle::class => ['all' => true],\n    Symfony\\WebpackEncoreBundle\\WebpackEncoreBundle::class => ['all' => true],\n    EasyCorp\\Bundle\\EasyAdminBundle\\EasyAdminBundle::class => ['all' => true],\n    FOS\\CKEditorBundle\\FOSCKEditorBundle::class => ['all' => true],\n    Vich\\UploaderBundle\\VichUploaderBundle::class => ['all' => true],\n    Sentry\\SentryBundle\\SentryBundle::class => ['all' => true],\n];\n"
  },
  {
    "path": "config/packages/assets.yaml",
    "content": "framework:\n    assets:\n        json_manifest_path: '%kernel.project_dir%/public/build/manifest.json'\n"
  },
  {
    "path": "config/packages/dev/debug.yaml",
    "content": "debug:\n    # Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser.\n    # See the \"server:dump\" command to start a new server.\n    dump_destination: \"tcp://%env(VAR_DUMPER_SERVER)%\"\n"
  },
  {
    "path": "config/packages/dev/monolog.yaml",
    "content": "monolog:\n    handlers:\n        main:\n            type: stream\n            path: '%kernel.logs_dir%/%kernel.environment%.log'\n            level: debug\n            channels: ['!event']\n        # uncomment to get logging in your browser\n        # you may have to allow bigger header sizes in your Web server configuration\n        #firephp:\n        #    type: firephp\n        #    level: info\n        #chromephp:\n        #    type: chromephp\n        #    level: info\n        console:\n            type:   console\n            process_psr_3_messages: false\n            channels: ['!event', '!doctrine', '!console']\n"
  },
  {
    "path": "config/packages/dev/routing.yaml",
    "content": "framework:\n    router:\n        strict_requirements: true\n"
  },
  {
    "path": "config/packages/dev/security_checker.yaml",
    "content": "#services:\n#    SensioLabs\\Security\\SecurityChecker:\n#        public: false\n#\n#    SensioLabs\\Security\\Command\\SecurityCheckerCommand:\n#        arguments: ['@SensioLabs\\Security\\SecurityChecker']\n#        tags:\n#            - { name: console.command }\n"
  },
  {
    "path": "config/packages/dev/swiftmailer.yaml",
    "content": "# See https://symfony.com/doc/current/email/dev_environment.html\nswiftmailer:\n    #  send all emails to a specific address\n    #delivery_addresses: ['me@example.com']\n"
  },
  {
    "path": "config/packages/dev/web_profiler.yaml",
    "content": "web_profiler:\n    toolbar: true\n    intercept_redirects: false\n\nframework:\n    profiler: { only_exceptions: false }\n"
  },
  {
    "path": "config/packages/doctrine.yaml",
    "content": "parameters:\n  # Adds a fallback DATABASE_URL if the env var is not set. This allows you\n  # to run cache:warmup even if your environment variables are not available\n  # yet. You should not need to change this value.\n  env(DATABASE_URL): ''\n\ndoctrine:\n  dbal:\n    url: '%env(resolve:DATABASE_URL)%'\n  orm:\n    auto_generate_proxy_classes: '%kernel.debug%'\n    naming_strategy: doctrine.orm.naming_strategy.underscore\n    auto_mapping: true\n    mappings:\n      App:\n        is_bundle: false\n        type: annotation\n        dir: '%kernel.project_dir%/src/Seat/Infrastructure/Symfony4/Doctrine'\n        prefix: 'Symfony4\\Doctrine'\n\n    dql:\n      string_functions:\n        cast:           Oro\\ORM\\Query\\AST\\Functions\\Cast\n"
  },
  {
    "path": "config/packages/doctrine_migrations.yaml",
    "content": "doctrine_migrations:\n    dir_name: '%kernel.project_dir%/src/Migrations'\n    # namespace is arbitrary but should be different from App\\Migrations\n    # as migrations classes should NOT be autoloaded\n    namespace: DoctrineMigrations\n"
  },
  {
    "path": "config/packages/easy_admin.yaml",
    "content": "easy_admin:\n  user:\n    name_property_path: 'fullName'\n  site_name: \"S'eat\"\n  entities:\n    CommandLaHulpe:\n      label: 'Commandes La Hulpe'\n      role: 'ROLE_SANDWICH'\n      disabled_actions: ['new','edit','delete','search']\n      class: Symfony4\\Doctrine\\Command\n      templates:\n        list: 'admin/command/list.twig'\n      list:\n        title: \"Les commandes du jour à La Hulpe\"\n        dql_filter: 'SUBSTRING(CAST(entity.date as string),1,10) = SUBSTRING(CAST(CURRENT_DATE() as string),1,10)'\n        sort: ['date', 'ASC']\n        sortable: false\n        max_results: 9999999999\n        fields:\n          - { property: 'date', format: 'H\\hi', sortable: false }\n          - orderTypeString\n          - quantity\n          - name\n          - option\n          - supplements\n          - comment\n          - { property: 'comment', type: 'id' }\n          - { property: 'id', fsortable: false }\n    CommandWaterloo:\n      label: 'Commandes Waterloo'\n      role: 'ROLE_SANDWICH'\n      disabled_actions: ['new','edit','delete','search']\n      class: Symfony4\\Doctrine\\Command\n      templates:\n        list: 'admin/command/list.twig'\n      list:\n        title: \"Les commandes du jour à Waterloo\"\n        dql_filter: 'SUBSTRING(CAST(entity.date as string),1,10) = SUBSTRING(CAST(CURRENT_DATE() as string),1,10)'\n        sort: ['date', 'ASC']\n        max_results: 9999999999\n        fields:\n          - { property: 'date', format: 'H\\hi', sortable: false }\n          - orderTypeString\n          - quantity\n          - name\n          - option\n          - supplements\n          - { property: 'comment', type: 'id' }\n          - { property: 'id', fsortable: false }\n    Category:\n      role: 'ROLE_ADMIN'\n      class: Symfony4\\Doctrine\\Category\n      list:\n        fields:\n          - 'name'\n          - 'description'\n          - 'order'\n        sort: ['order', 'ASC']\n    Option:\n      role: 'ROLE_ADMIN'\n      class: Symfony4\\Doctrine\\CategoryOption\n      list:\n        fields:\n          - 'category'\n          - 'name'\n          - { property: 'price', format: '%01.2f €' }\n          - 'order'\n        sort: ['order', 'ASC']\n      form:\n        fields:\n          - 'category'\n          - 'name'\n          - { property: 'price', type: 'money', type_options: { currency: 'EUR' } }\n          - 'order'\n\n    Supplement:\n      role: 'ROLE_ADMIN'\n      class: Symfony4\\Doctrine\\CategorySupplement\n      list:\n        fields:\n          - 'category'\n          - 'name'\n          - { property: 'price', format: '%01.2f €' }\n          - 'order'\n        sort: ['order', 'ASC']\n      form:\n        fields:\n          - 'category'\n          - 'name'\n          - { property: 'price', type: 'money', type_options: { currency: 'EUR' } }\n          - 'order'\n    Company:\n      role: 'ROLE_ADMIN'\n      class: Symfony4\\Doctrine\\Company\n      list:\n        fields:\n          - 'id'\n          - 'name'\n          - 'isEnabled'\n          - 'canBeDelivered'\n          - 'orderDeliveryDeadLine'\n          - 'tournee'\n          - store\n      form:\n        fields:\n          - { type: 'section', label: 'Basic information' }\n          - isEnabled\n          - hasInvoice\n          - name\n          - slug\n          - vat\n          - comment\n          - { property: 'store', type: 'choice', type_options: { choices:{'La hulpe':'la-hulpe','Waterloo':'waterloo'} } }\n          - { type: 'section', label: 'Contact information' }\n          - streetNumber\n          - street\n          - zipCode\n          - city\n          - phoneNumber\n          - contactEmail\n          - { type: 'section', label: 'Delivery' }\n          - 'canBeDelivered'\n          - { property: 'adminCommandBefore', label: 'Commander avant', type: 'time', type_options: { minutes:['10','25','40','55'] } }\n          - tournee\n\n    Content:\n      role: 'ROLE_ADMIN'\n      class: Symfony4\\Doctrine\\HtmlContent\n      new:\n        fields:\n          - 'name'\n          - { property: 'html', type: 'fos_ckeditor' }\n      edit:\n        fields:\n          - { property: 'html', type: 'fos_ckeditor' }\n\n    Product:\n      role: 'ROLE_ADMIN'\n      class: Symfony4\\Doctrine\\Product\n      list:\n        fields:\n          - category\n          - name\n          - { property: 'price', format: '%01.2f €' }\n          - isEnabled\n          - order\n      form:\n        fields:\n          - category\n          - name\n          - description\n          - { property: 'price', type: 'money', type_options: { currency: 'EUR' } }\n          - isEnabled\n          - order\n        sort: ['category', 'ASC']\n    Tournee:\n      role: 'ROLE_ADMIN'\n      class: Symfony4\\Doctrine\\Tournee\n    Pdf:\n      role: 'ROLE_ADMIN'\n      class: Symfony4\\Doctrine\\Pdf\n      new:\n        fields:\n          - id\n          - text\n          - { property: 'pdfFile', type: 'file' }\n\n      edit:\n        fields:\n          - text\n          - { property: 'pdfFile', type: 'file' }\n    User:\n      role: 'ROLE_ADMIN'\n      class: Symfony4\\Doctrine\\User\n      list:\n        fields:\n          - firstName\n          - lastName\n          - company\n          - phoneNumber\n          - email\n          - store\n          - isEnabled\n      form:\n        fields:\n          - isEnabled\n          - firstName\n          - lastName\n          - company\n          - phoneNumber\n          - email\n          - { property: 'store', type: 'choice', type_options: { choices:{'La hulpe':'la-hulpe','Waterloo':'waterloo'} } }\n          - { property: 'role', type: 'choice', type_options: { choices:{'admin':'admin','sandwich':'sandwich','client':'client'} } }\n"
  },
  {
    "path": "config/packages/fos_ck_editor.yaml",
    "content": "fos_ck_editor:\n  default_config: my_custom_config\n  configs:\n    my_custom_config:\n      language:                   \"fr\"\n      toolbar:                    [ [ 'Bold','Italic','Underline','Strike','-','RemoveFormat'], [ 'NumberedList','BulletedList','-','Outdent','Indent','-','-','JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock' ], [ 'Link','Unlink'],[ 'Preview' ], [ 'Source' ], \"/\", [ 'Styles', 'Format','Font','FontSize' ], [ 'TextColor'] ]\n      stylesSet:\n        - { name: \"Important\", element: \"span\",  attributes: { class: \"important\" }}\n        - { name: \"Ecriture rouge\", element: \"span\",  attributes: { class: \"red-text lighten-2\" }}\n        - { name: \"Encart rouge\", element: \"div\",  attributes: { class: \"card-panel red lighten-2\"}}\n        - { name: \"Encart vert\", element: \"div\",  attributes: { class: \"card-panel light-green\"}}\n        - { name: \"Encart vert 2\", element: \"div\",  attributes: { class: \"card-panel light-green lighten-2\"}}\n        - { name: \"Encart vert 3\", element: \"div\",  attributes: { class: \"card-panel light-green lighten-3\"}}\n        - { name: \"Encart vert 4\", element: \"div\",  attributes: { class: \"card-panel light-green darken-1\"}}\n        - { name: \"Encart vert 5\", element: \"div\",  attributes: { class: \"card-panel light-green darken-2\"}}\n      # Chargement des styles personnalisables my_styles (voir plus bas)\n      uiColor:                    \"#FCFCFC\"           # Couleur de fond de l'interface\n      height:                     \"600px\"             # Hauteur par défaut\n      contentsCss:                ['/css/seat-base.css','/css/materialize.min.css'] # Charge les styles dans l'éditeur (permet de voir en temps réel le résultat)\n"
  },
  {
    "path": "config/packages/framework.yaml",
    "content": "framework:\n  secret: '%env(APP_SECRET)%'\n  csrf_protection: true\n  http_method_override: true\n  trusted_hosts: ~\n  session:\n    # With this config, PHP's native session handling is used\n    handler_id: ~\n    cookie_secure: auto\n    cookie_samesite: lax\n  php_errors:\n    log: true\n  assets:\n    json_manifest_path: '%kernel.project_dir%/public/build/manifest.json'\n  cache:\n    # this value is used as part of the \"namespace\" generated for the cache item keys\n    # to avoid collisions when multiple apps share the same cache backend (e.g. a Redis server)\n    # See https://symfony.com/doc/current/reference/configuration/framework.html#prefix-seed\n    prefix_seed: restaurant-seat\n  # The 'ide' option turns all of the file paths in an exception page\n  # into clickable links that open the given file using your favorite IDE.\n  # When 'ide' is set to null the file is opened in your web browser.\n  # See https://symfony.com/doc/current/reference/configuration/framework.html#ide\n  ide: phpstorm\n  validation:\n    email_validation_mode: 'html5'\n    enable_annotations: true\n  form: ~\n"
  },
  {
    "path": "config/packages/html_sanitizer.yaml",
    "content": "#html_sanitizer:\n#    default_sanitizer: 'default'\n#    sanitizers:\n#        default:\n#            # Read https://github.com/tgalopin/html-sanitizer/blob/master/docs/1-getting-started.md#extensions\n#            # to learn more about which extensions you would like to enable.\n#            extensions:\n#                - 'basic'\n#                - 'list'\n#                - 'table'\n#                - 'image'\n#                - 'code'\n#\n#            # Read https://github.com/tgalopin/html-sanitizer/blob/master/docs/3-configuration-reference.md\n#            # to discover all the available options for each extension.\n"
  },
  {
    "path": "config/packages/prod/doctrine.yaml",
    "content": "doctrine:\n  dbal:\n    driver: 'pdo_postgresql'\n    url: '%env(resolve:DATABASE_URL)%'\n    server_version: '11'\n    charset: utf8\n    default_table_options:\n      charset: utf8\n      collate: utf8_unicode_ci\n  orm:\n    metadata_cache_driver:\n      type: service\n      id: doctrine.system_cache_provider\n    query_cache_driver:\n      type: service\n      id: doctrine.system_cache_provider\n    result_cache_driver:\n      type: service\n      id: doctrine.result_cache_provider\n\nservices:\n  doctrine.result_cache_provider:\n    class: Symfony\\Component\\Cache\\DoctrineProvider\n    public: false\n    arguments:\n      - '@doctrine.result_cache_pool'\n  doctrine.system_cache_provider:\n    class: Symfony\\Component\\Cache\\DoctrineProvider\n    public: false\n    arguments:\n      - '@doctrine.system_cache_pool'\n\nframework:\n  cache:\n    pools:\n      doctrine.result_cache_pool:\n        adapter: cache.app\n      doctrine.system_cache_pool:\n        adapter: cache.system\n"
  },
  {
    "path": "config/packages/prod/monolog.yaml",
    "content": "monolog:\n    handlers:\n        filter_for_errors:\n            type: fingers_crossed\n            action_level: error\n            handler: error_log_handler\n            excluded_404s:\n                # regex: exclude all 404 errors from the logs\n                - ^/\n\n        error_log_handler:\n            type: error_log\n            level: info\n"
  },
  {
    "path": "config/packages/prod/webpack_encore.yaml",
    "content": "#webpack_encore:\n    # Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes)\n    # Available in version 1.2\n    #cache: true\n"
  },
  {
    "path": "config/packages/routing.yaml",
    "content": "framework:\n    router:\n        strict_requirements: ~\n        utf8: true\n"
  },
  {
    "path": "config/packages/security.yaml",
    "content": "security:\n    encoders:\n        # Our user class and the algorithm we'll use to encode passwords\n        # https://symfony.com/doc/current/security.html#c-encoding-the-user-s-password\n        Symfony4\\Security\\User: bcrypt\n\n    providers:\n        # https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded\n        # In this example, users are stored via Doctrine in the database\n        # To see the users at src/App/DataFixtures/ORM/LoadFixtures.php\n        # To load users from somewhere else: https://symfony.com/doc/current/security/custom_provider.html\n        client_user_provider:\n            id: Symfony4\\Security\\Service\\ClientUserProvider\n\n    # https://symfony.com/doc/current/security.html#initial-security-yml-setup-authentication\n    firewalls:\n        dev:\n            pattern: ^/(_(profiler|wdt)|css|images|js)/\n            security: false\n\n        main:\n            # this firewall applies to all URLs\n            pattern: ^/\n\n            # but the firewall does not require login on every page\n            # denying access is done in access_control or in your controllers\n            anonymous: true\n\n            # This allows the user to login by submitting a username and password\n            # Reference: https://symfony.com/doc/current/security/form_login_setup.html\n            form_login:\n                # The route name that the login form submits to\n                check_path: login_check\n                # The name of the route where the login form lives\n                # When the user tries to access a protected page, they are redirected here\n                login_path: login\n                # Secure the login form against CSRF\n                # Reference: https://symfony.com/doc/current/security/csrf_in_login_form.html\n                csrf_token_generator: security.csrf.token_manager\n                # The page users are redirect to when there is no previous page stored in the\n                # session (for example when the users access directly to the login page).\n                default_target_path: home\n\n            logout:\n                invalidate_session: false\n                # The route name the user can go to in order to logout\n                path: logout\n                # The name of the route to redirect to after logging out\n                target: home\n            guard:\n                authenticators:\n                    - Symfony4\\Security\\Service\\FormAuthenticator\n            remember_me:\n                secret:      \"%kernel.secret%\"\n                lifetime: 315360000 # 10 years :)\n                path:     /\n                always_remember_me: true\n    access_control:\n        # this is a catch-all for the admin area\n        # additional security lives in the controllers\n        - { path: '^/work', roles: ROLE_SANDWICH }\n\n    role_hierarchy:\n        ROLE_SANDWICH: ROLE_CLIENT\n        ROLE_ADMIN: ROLE_SANDWICH\n"
  },
  {
    "path": "config/packages/security_checker.yaml",
    "content": "#services:\n#    SensioLabs\\Security\\SecurityChecker:\n#        public: false\n#\n#    SensioLabs\\Security\\Command\\SecurityCheckerCommand:\n#        arguments: ['@SensioLabs\\Security\\SecurityChecker']\n#        public: false\n#        tags:\n#            - { name: console.command, command: 'security:check' }\n"
  },
  {
    "path": "config/packages/sensio_framework_extra.yaml",
    "content": "sensio_framework_extra:\n    router:\n        annotations: false\n"
  },
  {
    "path": "config/packages/sentry.yml",
    "content": "sentry:\n  dsn: \"https://your@sentry.io/url\"\n"
  },
  {
    "path": "config/packages/swiftmailer.yaml",
    "content": "swiftmailer:\n    url: '%env(MAILER_URL)%'\n    spool: { type: 'memory' }\n"
  },
  {
    "path": "config/packages/test/dama_doctrine_test_bundle.yaml",
    "content": "dama_doctrine_test:\n    enable_static_connection: true\n    enable_static_meta_data_cache: true\n    enable_static_query_cache: true\n"
  },
  {
    "path": "config/packages/test/framework.yaml",
    "content": "framework:\n    test: true\n    session:\n        storage_id: session.storage.mock_file\n"
  },
  {
    "path": "config/packages/test/monolog.yaml",
    "content": "monolog:\n    handlers:\n        main:\n            type: stream\n            path: \"%kernel.logs_dir%/%kernel.environment%.log\"\n            level: debug\n            channels: [\"!event\"]\n"
  },
  {
    "path": "config/packages/test/routing.yaml",
    "content": "framework:\n    router:\n        strict_requirements: true\n"
  },
  {
    "path": "config/packages/test/security.yaml",
    "content": "# this configuration simplifies testing URLs protected by the security mechanism\n# See https://symfony.com/doc/current/cookbook/testing/http_authentication.html\nsecurity:\n    encoders:\n        # to make tests much faster, BCrypt cost is changed to its minimum allowed value (4)\n        # See https://symfony.com/doc/current/reference/configuration/security.html#using-the-bcrypt-password-encoder\n        Symfony4\\Security\\User: { algorithm: bcrypt, cost: 4 }\n\n    firewalls:\n        main:\n            http_basic: ~\n"
  },
  {
    "path": "config/packages/test/swiftmailer.yaml",
    "content": "swiftmailer:\n    disable_delivery: true\n"
  },
  {
    "path": "config/packages/test/web_profiler.yaml",
    "content": "web_profiler:\n    toolbar: false\n    intercept_redirects: false\n\nframework:\n    profiler: { collect: false }\n"
  },
  {
    "path": "config/packages/translation.yaml",
    "content": "framework:\n    default_locale: '%locale%'\n    translator:\n        default_path: '%kernel.project_dir%/resources/translations'\n        fallbacks:\n            - '%locale%'\n"
  },
  {
    "path": "config/packages/twig.yaml",
    "content": "twig:\n    debug: '%kernel.debug%'\n    default_path: '%kernel.project_dir%/resources/templates'\n    strict_variables: '%kernel.debug%'\n    form_themes:\n        - '@FOSCKEditor/Form/ckeditor_widget.html.twig'\n    globals:\n        pdf_path: '%app.path.download_pdf%'\n"
  },
  {
    "path": "config/packages/twig_extensions.yaml",
    "content": "services:\n    _defaults:\n        public: false\n        autowire: true\n        autoconfigure: true\n\n    #Twig\\Extensions\\ArrayExtension: ~\n    #Twig\\Extensions\\DateExtension: ~\n    Twig\\Extensions\\IntlExtension: ~   # needed for the 'localizeddate' filter\n    #Twig\\Extensions\\TextExtension: ~\n"
  },
  {
    "path": "config/packages/validator.yaml",
    "content": "framework:\n    validation:\n        email_validation_mode: html5\n"
  },
  {
    "path": "config/packages/vich_uploader.yaml",
    "content": "vich_uploader:\n  db_driver: orm\n  mappings:\n    pdf:\n      uri_prefix:         '%app.path.download_pdf%'\n      upload_destination: '%kernel.project_dir%/public%app.path.download_pdf%'\n"
  },
  {
    "path": "config/packages/webpack_encore.yaml",
    "content": "webpack_encore:\n    # The path where Encore is building the assets.\n    # This should match Encore.setOutputPath() in webpack.config.js.\n    output_path: '%kernel.project_dir%/public/build'\n"
  },
  {
    "path": "config/routes/annotations.yaml",
    "content": "controllers:\n    resource: '../../src/Seat/Infrastructure/Symfony4/Controller/'\n    type: annotation\n    requirements:\n        _locale: '%app_locales%'\n    defaults:\n        _locale: '%locale%'\n"
  },
  {
    "path": "config/routes/dev/twig.yaml",
    "content": "_errors:\n    resource: '@TwigBundle/Resources/config/routing/errors.xml'\n    prefix:   /_error\n"
  },
  {
    "path": "config/routes/dev/web_profiler.yaml",
    "content": "web_profiler_wdt:\n    resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml'\n    prefix: /_wdt\n\nweb_profiler_profiler:\n    resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml'\n    prefix: /_profiler\n"
  },
  {
    "path": "config/routes/easy_admin.yaml",
    "content": "easy_admin_bundle:\n    resource: 'Symfony4\\Controller\\AdminController'\n    prefix: /work\n    type: annotation\n"
  },
  {
    "path": "config/services.yaml",
    "content": "# Learn more about services, parameters and containers at\n# http://symfony.com/doc/current/book/service_container.html\nparameters:\n  locale: fr\n  seat_email: commande@seat.be\n  app_locales: fr\n  app.path.download_pdf: /share/download/pdf\n\nservices:\n  # default configuration for services in *this* file\n  _defaults:\n    # automatically injects dependencies in your services\n    autowire: true\n    # automatically registers your services as commands, event subscribers, etc.\n    autoconfigure: true\n    # this means you cannot fetch services directly from the container via $container->get()\n    # if you need to do this, you can override this setting on individual services\n    public: false\n\n  Symfony4\\Doctrine\\:\n    resource: '../src/Seat/Infrastructure/Symfony4/Doctrine/*'\n    tags: ['seat.autowire']\n\n  Symfony4\\:\n    resource: '../src/Seat/Infrastructure/Symfony4/*'\n    exclude: '../src/Seat/Infrastructure/Symfony4/{Doctrine,Kernel.php}'\n\n  Symfony4\\Twig\\:\n    resource: '../src/Seat/Infrastructure/Symfony4/Twig'\n    tags: ['twig.extension']\n\n  Seat\\Domain\\:\n    resource: '../src/Seat/Domain/*'\n    exclude: '../src/Seat/Domain/{**/Entity,**/Error,**/Model}'\n\n  Seat\\Presentation\\:\n    resource: '../src/Seat/Presentation/*'\n    exclude: '../src/Seat/Presentation/{**/Entity,**/Error,**/Model}'\n\n  Seat\\SharedKernel\\:\n    resource: '../src/Seat/SharedKernel'\n\n  Seat\\SharedKernel\\Service\\PasswordHasher:\n    alias: Seat\\SharedKernel\\Service\\NativePasswordHasher\n\n  Symfony\\Component\\HttpFoundation\\Session\\Session:\n    alias: 'session'\n\n  Symfony4\\Controller\\:\n    resource: '../src/Seat/Infrastructure/Symfony4/Controller'\n    tags: ['controller.service_arguments']\n\n  Symfony4\\DependencyInjection\\Compiler\\AdminFilterRolePass:\n    tags:\n      - name: \"easyadmin.config_pass\"\n        priority: 75 # before menu\n"
  },
  {
    "path": "package.json",
    "content": "{\n    \"devDependencies\": {\n        \"@symfony/webpack-encore\": \"^0.27.0\",\n        \"core-js\": \"^3.0.0\",\n        \"webpack-notifier\": \"^1.6.0\"\n    },\n    \"license\": \"UNLICENSED\",\n    \"private\": true,\n    \"scripts\": {\n        \"dev-server\": \"encore dev-server\",\n        \"dev\": \"encore dev\",\n        \"watch\": \"encore dev --watch\",\n        \"build\": \"encore production --progress\"\n    },\n    \"dependencies\": {}\n}\n"
  },
  {
    "path": "phpunit.xml.dist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:noNamespaceSchemaLocation=\"http://schema.phpunit.de/7.5/phpunit.xsd\"\n         backupGlobals=\"false\"\n         colors=\"true\"\n         bootstrap=\"vendor/autoload.php\"\n>\n    <testsuites>\n        <testsuite name=\"Project Test Suite\">\n            <directory>tests/unit</directory>\n        </testsuite>\n    </testsuites>\n</phpunit>\n"
  },
  {
    "path": "public/.htaccess",
    "content": "<IfModule mod_rewrite.c>\n    Options -MultiViews\n    RewriteEngine On\n    RewriteCond %{REQUEST_FILENAME} !-f\n    RewriteRule ^(.*)$ index.php [QSA,L]\n</IfModule>\n\n<IfModule !mod_rewrite.c>\n    <IfModule mod_alias.c>\n        RedirectMatch 302 ^/$ /index.php/\n    </IfModule>\n</IfModule>\n"
  },
  {
    "path": "public/build/app.css",
    "content": "body {\n    background-color: lightgray;\n}\n\n\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vYXBwLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLDJCQUEyQjtBQUMvQiIsImZpbGUiOiJhcHAuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiYm9keSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==*/"
  },
  {
    "path": "public/build/app.js",
    "content": "(window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || []).push([[\"app\"],{\n\n/***/ \"./resources/assets/css/app.css\":\n/*!**************************************!*\\\n  !*** ./resources/assets/css/app.css ***!\n  \\**************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ \"./resources/assets/js/app.js\":\n/*!************************************!*\\\n  !*** ./resources/assets/js/app.js ***!\n  \\************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Welcome to your app's main JavaScript file!\n *\n * We recommend including the built version of this JavaScript file\n * (and its CSS file) in your base layout (base.html.twig).\n */\n// any CSS you require will output into a single css file (app.css in this case)\n__webpack_require__(/*! ../css/app.css */ \"./resources/assets/css/app.css\"); // Need jQuery? Install it with \"yarn add jquery\", then uncomment to require it.\n// const $ = require('jquery');\n\n\nconsole.log('Hello Webpack Encore! Edit me in assets/js/app.js');\n\n/***/ })\n\n},[[\"./resources/assets/js/app.js\",\"runtime\"]]]);\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2Nzcy9hcHAuY3NzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9hc3NldHMvanMvYXBwLmpzIl0sIm5hbWVzIjpbInJlcXVpcmUiLCJjb25zb2xlIiwibG9nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSx1Qzs7Ozs7Ozs7Ozs7QUNBQTs7Ozs7O0FBT0E7QUFDQUEsbUJBQU8sQ0FBQyxzREFBRCxDQUFQLEMsQ0FFQTtBQUNBOzs7QUFFQUMsT0FBTyxDQUFDQyxHQUFSLENBQVksbURBQVosRSIsImZpbGUiOiJhcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCIvKlxuICogV2VsY29tZSB0byB5b3VyIGFwcCdzIG1haW4gSmF2YVNjcmlwdCBmaWxlIVxuICpcbiAqIFdlIHJlY29tbWVuZCBpbmNsdWRpbmcgdGhlIGJ1aWx0IHZlcnNpb24gb2YgdGhpcyBKYXZhU2NyaXB0IGZpbGVcbiAqIChhbmQgaXRzIENTUyBmaWxlKSBpbiB5b3VyIGJhc2UgbGF5b3V0IChiYXNlLmh0bWwudHdpZykuXG4gKi9cblxuLy8gYW55IENTUyB5b3UgcmVxdWlyZSB3aWxsIG91dHB1dCBpbnRvIGEgc2luZ2xlIGNzcyBmaWxlIChhcHAuY3NzIGluIHRoaXMgY2FzZSlcbnJlcXVpcmUoJy4uL2Nzcy9hcHAuY3NzJyk7XG5cbi8vIE5lZWQgalF1ZXJ5PyBJbnN0YWxsIGl0IHdpdGggXCJ5YXJuIGFkZCBqcXVlcnlcIiwgdGhlbiB1bmNvbW1lbnQgdG8gcmVxdWlyZSBpdC5cbi8vIGNvbnN0ICQgPSByZXF1aXJlKCdqcXVlcnknKTtcblxuY29uc29sZS5sb2coJ0hlbGxvIFdlYnBhY2sgRW5jb3JlISBFZGl0IG1lIGluIGFzc2V0cy9qcy9hcHAuanMnKTtcbiJdLCJzb3VyY2VSb290IjoiIn0="
  },
  {
    "path": "public/build/entrypoints.json",
    "content": "{\n  \"entrypoints\": {\n    \"app\": {\n      \"js\": [\n        \"/build/runtime.js\",\n        \"/build/app.js\"\n      ],\n      \"css\": [\n        \"/build/app.css\"\n      ]\n    }\n  }\n}"
  },
  {
    "path": "public/build/manifest.json",
    "content": "{\n  \"build/app.css\": \"/build/app.css\",\n  \"build/app.js\": \"/build/app.js\",\n  \"build/runtime.js\": \"/build/runtime.js\"\n}"
  },
  {
    "path": "public/build/runtime.js",
    "content": "/******/ (function(modules) { // webpackBootstrap\n/******/ \t// install a JSONP callback for chunk loading\n/******/ \tfunction webpackJsonpCallback(data) {\n/******/ \t\tvar chunkIds = data[0];\n/******/ \t\tvar moreModules = data[1];\n/******/ \t\tvar executeModules = data[2];\n/******/\n/******/ \t\t// add \"moreModules\" to the modules object,\n/******/ \t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\tvar moduleId, chunkId, i = 0, resolves = [];\n/******/ \t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\tchunkId = chunkIds[i];\n/******/ \t\t\tif(installedChunks[chunkId]) {\n/******/ \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n/******/ \t\t\t}\n/******/ \t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t}\n/******/ \t\tfor(moduleId in moreModules) {\n/******/ \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n/******/ \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n/******/\n/******/ \t\twhile(resolves.length) {\n/******/ \t\t\tresolves.shift()();\n/******/ \t\t}\n/******/\n/******/ \t\t// add entry modules from loaded chunk to deferred list\n/******/ \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n/******/\n/******/ \t\t// run deferred modules when all chunks ready\n/******/ \t\treturn checkDeferredModules();\n/******/ \t};\n/******/ \tfunction checkDeferredModules() {\n/******/ \t\tvar result;\n/******/ \t\tfor(var i = 0; i < deferredModules.length; i++) {\n/******/ \t\t\tvar deferredModule = deferredModules[i];\n/******/ \t\t\tvar fulfilled = true;\n/******/ \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n/******/ \t\t\t\tvar depId = deferredModule[j];\n/******/ \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n/******/ \t\t\t}\n/******/ \t\t\tif(fulfilled) {\n/******/ \t\t\t\tdeferredModules.splice(i--, 1);\n/******/ \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\treturn result;\n/******/ \t}\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// object to store loaded and loading chunks\n/******/ \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n/******/ \t// Promise = chunk loading, 0 = chunk loaded\n/******/ \tvar installedChunks = {\n/******/ \t\t\"runtime\": 0\n/******/ \t};\n/******/\n/******/ \tvar deferredModules = [];\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/build/\";\n/******/\n/******/ \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n/******/ \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n/******/ \tjsonpArray.push = webpackJsonpCallback;\n/******/ \tjsonpArray = jsonpArray.slice();\n/******/ \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n/******/ \tvar parentJsonpFunction = oldJsonpFunction;\n/******/\n/******/\n/******/ \t// run deferred modules from other chunks\n/******/ \tcheckDeferredModules();\n/******/ })\n/************************************************************************/\n/******/ ([]);\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQVEsb0JBQW9CO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQWlCLDRCQUE0QjtBQUM3QztBQUNBO0FBQ0EsMEJBQWtCLDJCQUEyQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrREFBMEMsZ0NBQWdDO0FBQzFFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0VBQXdELGtCQUFrQjtBQUMxRTtBQUNBLHlEQUFpRCxjQUFjO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBeUMsaUNBQWlDO0FBQzFFLHdIQUFnSCxtQkFBbUIsRUFBRTtBQUNySTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQWdCLHVCQUF1QjtBQUN2Qzs7O0FBR0E7QUFDQSIsImZpbGUiOiJydW50aW1lLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gaW5zdGFsbCBhIEpTT05QIGNhbGxiYWNrIGZvciBjaHVuayBsb2FkaW5nXG4gXHRmdW5jdGlvbiB3ZWJwYWNrSnNvbnBDYWxsYmFjayhkYXRhKSB7XG4gXHRcdHZhciBjaHVua0lkcyA9IGRhdGFbMF07XG4gXHRcdHZhciBtb3JlTW9kdWxlcyA9IGRhdGFbMV07XG4gXHRcdHZhciBleGVjdXRlTW9kdWxlcyA9IGRhdGFbMl07XG5cbiBcdFx0Ly8gYWRkIFwibW9yZU1vZHVsZXNcIiB0byB0aGUgbW9kdWxlcyBvYmplY3QsXG4gXHRcdC8vIHRoZW4gZmxhZyBhbGwgXCJjaHVua0lkc1wiIGFzIGxvYWRlZCBhbmQgZmlyZSBjYWxsYmFja1xuIFx0XHR2YXIgbW9kdWxlSWQsIGNodW5rSWQsIGkgPSAwLCByZXNvbHZlcyA9IFtdO1xuIFx0XHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuIFx0XHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcbiBcdFx0XHRpZihpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcbiBcdFx0XHRcdHJlc29sdmVzLnB1c2goaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdWzBdKTtcbiBcdFx0XHR9XG4gXHRcdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMDtcbiBcdFx0fVxuIFx0XHRmb3IobW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcbiBcdFx0XHRpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuIFx0XHRcdFx0bW9kdWxlc1ttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0fVxuIFx0XHR9XG4gXHRcdGlmKHBhcmVudEpzb25wRnVuY3Rpb24pIHBhcmVudEpzb25wRnVuY3Rpb24oZGF0YSk7XG5cbiBcdFx0d2hpbGUocmVzb2x2ZXMubGVuZ3RoKSB7XG4gXHRcdFx0cmVzb2x2ZXMuc2hpZnQoKSgpO1xuIFx0XHR9XG5cbiBcdFx0Ly8gYWRkIGVudHJ5IG1vZHVsZXMgZnJvbSBsb2FkZWQgY2h1bmsgdG8gZGVmZXJyZWQgbGlzdFxuIFx0XHRkZWZlcnJlZE1vZHVsZXMucHVzaC5hcHBseShkZWZlcnJlZE1vZHVsZXMsIGV4ZWN1dGVNb2R1bGVzIHx8IFtdKTtcblxuIFx0XHQvLyBydW4gZGVmZXJyZWQgbW9kdWxlcyB3aGVuIGFsbCBjaHVua3MgcmVhZHlcbiBcdFx0cmV0dXJuIGNoZWNrRGVmZXJyZWRNb2R1bGVzKCk7XG4gXHR9O1xuIFx0ZnVuY3Rpb24gY2hlY2tEZWZlcnJlZE1vZHVsZXMoKSB7XG4gXHRcdHZhciByZXN1bHQ7XG4gXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBkZWZlcnJlZE1vZHVsZXMubGVuZ3RoOyBpKyspIHtcbiBcdFx0XHR2YXIgZGVmZXJyZWRNb2R1bGUgPSBkZWZlcnJlZE1vZHVsZXNbaV07XG4gXHRcdFx0dmFyIGZ1bGZpbGxlZCA9IHRydWU7XG4gXHRcdFx0Zm9yKHZhciBqID0gMTsgaiA8IGRlZmVycmVkTW9kdWxlLmxlbmd0aDsgaisrKSB7XG4gXHRcdFx0XHR2YXIgZGVwSWQgPSBkZWZlcnJlZE1vZHVsZVtqXTtcbiBcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rc1tkZXBJZF0gIT09IDApIGZ1bGZpbGxlZCA9IGZhbHNlO1xuIFx0XHRcdH1cbiBcdFx0XHRpZihmdWxmaWxsZWQpIHtcbiBcdFx0XHRcdGRlZmVycmVkTW9kdWxlcy5zcGxpY2UoaS0tLCAxKTtcbiBcdFx0XHRcdHJlc3VsdCA9IF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gZGVmZXJyZWRNb2R1bGVbMF0pO1xuIFx0XHRcdH1cbiBcdFx0fVxuIFx0XHRyZXR1cm4gcmVzdWx0O1xuIFx0fVxuXG4gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuIFx0Ly8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4gXHQvLyBQcm9taXNlID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxuIFx0dmFyIGluc3RhbGxlZENodW5rcyA9IHtcbiBcdFx0XCJydW50aW1lXCI6IDBcbiBcdH07XG5cbiBcdHZhciBkZWZlcnJlZE1vZHVsZXMgPSBbXTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvYnVpbGQvXCI7XG5cbiBcdHZhciBqc29ucEFycmF5ID0gd2luZG93W1wid2VicGFja0pzb25wXCJdID0gd2luZG93W1wid2VicGFja0pzb25wXCJdIHx8IFtdO1xuIFx0dmFyIG9sZEpzb25wRnVuY3Rpb24gPSBqc29ucEFycmF5LnB1c2guYmluZChqc29ucEFycmF5KTtcbiBcdGpzb25wQXJyYXkucHVzaCA9IHdlYnBhY2tKc29ucENhbGxiYWNrO1xuIFx0anNvbnBBcnJheSA9IGpzb25wQXJyYXkuc2xpY2UoKTtcbiBcdGZvcih2YXIgaSA9IDA7IGkgPCBqc29ucEFycmF5Lmxlbmd0aDsgaSsrKSB3ZWJwYWNrSnNvbnBDYWxsYmFjayhqc29ucEFycmF5W2ldKTtcbiBcdHZhciBwYXJlbnRKc29ucEZ1bmN0aW9uID0gb2xkSnNvbnBGdW5jdGlvbjtcblxuXG4gXHQvLyBydW4gZGVmZXJyZWQgbW9kdWxlcyBmcm9tIG90aGVyIGNodW5rc1xuIFx0Y2hlY2tEZWZlcnJlZE1vZHVsZXMoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0="
  },
  {
    "path": "public/css/materialize.css",
    "content": "/*!\r\n * Materialize v1.0.0 (http://materializecss.com)\r\n * Copyright 2014-2017 Materialize\r\n * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE)\r\n */\r\n.materialize-red {\n  background-color: #e51c23 !important;\n}\n\n.materialize-red-text {\n  color: #e51c23 !important;\n}\n\n.materialize-red.lighten-5 {\n  background-color: #fdeaeb !important;\n}\n\n.materialize-red-text.text-lighten-5 {\n  color: #fdeaeb !important;\n}\n\n.materialize-red.lighten-4 {\n  background-color: #f8c1c3 !important;\n}\n\n.materialize-red-text.text-lighten-4 {\n  color: #f8c1c3 !important;\n}\n\n.materialize-red.lighten-3 {\n  background-color: #f3989b !important;\n}\n\n.materialize-red-text.text-lighten-3 {\n  color: #f3989b !important;\n}\n\n.materialize-red.lighten-2 {\n  background-color: #ee6e73 !important;\n}\n\n.materialize-red-text.text-lighten-2 {\n  color: #ee6e73 !important;\n}\n\n.materialize-red.lighten-1 {\n  background-color: #ea454b !important;\n}\n\n.materialize-red-text.text-lighten-1 {\n  color: #ea454b !important;\n}\n\n.materialize-red.darken-1 {\n  background-color: #d0181e !important;\n}\n\n.materialize-red-text.text-darken-1 {\n  color: #d0181e !important;\n}\n\n.materialize-red.darken-2 {\n  background-color: #b9151b !important;\n}\n\n.materialize-red-text.text-darken-2 {\n  color: #b9151b !important;\n}\n\n.materialize-red.darken-3 {\n  background-color: #a21318 !important;\n}\n\n.materialize-red-text.text-darken-3 {\n  color: #a21318 !important;\n}\n\n.materialize-red.darken-4 {\n  background-color: #8b1014 !important;\n}\n\n.materialize-red-text.text-darken-4 {\n  color: #8b1014 !important;\n}\n\n.red {\n  background-color: #F44336 !important;\n}\n\n.red-text {\n  color: #F44336 !important;\n}\n\n.red.lighten-5 {\n  background-color: #FFEBEE !important;\n}\n\n.red-text.text-lighten-5 {\n  color: #FFEBEE !important;\n}\n\n.red.lighten-4 {\n  background-color: #FFCDD2 !important;\n}\n\n.red-text.text-lighten-4 {\n  color: #FFCDD2 !important;\n}\n\n.red.lighten-3 {\n  background-color: #EF9A9A !important;\n}\n\n.red-text.text-lighten-3 {\n  color: #EF9A9A !important;\n}\n\n.red.lighten-2 {\n  background-color: #E57373 !important;\n}\n\n.red-text.text-lighten-2 {\n  color: #E57373 !important;\n}\n\n.red.lighten-1 {\n  background-color: #EF5350 !important;\n}\n\n.red-text.text-lighten-1 {\n  color: #EF5350 !important;\n}\n\n.red.darken-1 {\n  background-color: #E53935 !important;\n}\n\n.red-text.text-darken-1 {\n  color: #E53935 !important;\n}\n\n.red.darken-2 {\n  background-color: #D32F2F !important;\n}\n\n.red-text.text-darken-2 {\n  color: #D32F2F !important;\n}\n\n.red.darken-3 {\n  background-color: #C62828 !important;\n}\n\n.red-text.text-darken-3 {\n  color: #C62828 !important;\n}\n\n.red.darken-4 {\n  background-color: #B71C1C !important;\n}\n\n.red-text.text-darken-4 {\n  color: #B71C1C !important;\n}\n\n.red.accent-1 {\n  background-color: #FF8A80 !important;\n}\n\n.red-text.text-accent-1 {\n  color: #FF8A80 !important;\n}\n\n.red.accent-2 {\n  background-color: #FF5252 !important;\n}\n\n.red-text.text-accent-2 {\n  color: #FF5252 !important;\n}\n\n.red.accent-3 {\n  background-color: #FF1744 !important;\n}\n\n.red-text.text-accent-3 {\n  color: #FF1744 !important;\n}\n\n.red.accent-4 {\n  background-color: #D50000 !important;\n}\n\n.red-text.text-accent-4 {\n  color: #D50000 !important;\n}\n\n.pink {\n  background-color: #e91e63 !important;\n}\n\n.pink-text {\n  color: #e91e63 !important;\n}\n\n.pink.lighten-5 {\n  background-color: #fce4ec !important;\n}\n\n.pink-text.text-lighten-5 {\n  color: #fce4ec !important;\n}\n\n.pink.lighten-4 {\n  background-color: #f8bbd0 !important;\n}\n\n.pink-text.text-lighten-4 {\n  color: #f8bbd0 !important;\n}\n\n.pink.lighten-3 {\n  background-color: #f48fb1 !important;\n}\n\n.pink-text.text-lighten-3 {\n  color: #f48fb1 !important;\n}\n\n.pink.lighten-2 {\n  background-color: #f06292 !important;\n}\n\n.pink-text.text-lighten-2 {\n  color: #f06292 !important;\n}\n\n.pink.lighten-1 {\n  background-color: #ec407a !important;\n}\n\n.pink-text.text-lighten-1 {\n  color: #ec407a !important;\n}\n\n.pink.darken-1 {\n  background-color: #d81b60 !important;\n}\n\n.pink-text.text-darken-1 {\n  color: #d81b60 !important;\n}\n\n.pink.darken-2 {\n  background-color: #c2185b !important;\n}\n\n.pink-text.text-darken-2 {\n  color: #c2185b !important;\n}\n\n.pink.darken-3 {\n  background-color: #ad1457 !important;\n}\n\n.pink-text.text-darken-3 {\n  color: #ad1457 !important;\n}\n\n.pink.darken-4 {\n  background-color: #880e4f !important;\n}\n\n.pink-text.text-darken-4 {\n  color: #880e4f !important;\n}\n\n.pink.accent-1 {\n  background-color: #ff80ab !important;\n}\n\n.pink-text.text-accent-1 {\n  color: #ff80ab !important;\n}\n\n.pink.accent-2 {\n  background-color: #ff4081 !important;\n}\n\n.pink-text.text-accent-2 {\n  color: #ff4081 !important;\n}\n\n.pink.accent-3 {\n  background-color: #f50057 !important;\n}\n\n.pink-text.text-accent-3 {\n  color: #f50057 !important;\n}\n\n.pink.accent-4 {\n  background-color: #c51162 !important;\n}\n\n.pink-text.text-accent-4 {\n  color: #c51162 !important;\n}\n\n.purple {\n  background-color: #9c27b0 !important;\n}\n\n.purple-text {\n  color: #9c27b0 !important;\n}\n\n.purple.lighten-5 {\n  background-color: #f3e5f5 !important;\n}\n\n.purple-text.text-lighten-5 {\n  color: #f3e5f5 !important;\n}\n\n.purple.lighten-4 {\n  background-color: #e1bee7 !important;\n}\n\n.purple-text.text-lighten-4 {\n  color: #e1bee7 !important;\n}\n\n.purple.lighten-3 {\n  background-color: #ce93d8 !important;\n}\n\n.purple-text.text-lighten-3 {\n  color: #ce93d8 !important;\n}\n\n.purple.lighten-2 {\n  background-color: #ba68c8 !important;\n}\n\n.purple-text.text-lighten-2 {\n  color: #ba68c8 !important;\n}\n\n.purple.lighten-1 {\n  background-color: #ab47bc !important;\n}\n\n.purple-text.text-lighten-1 {\n  color: #ab47bc !important;\n}\n\n.purple.darken-1 {\n  background-color: #8e24aa !important;\n}\n\n.purple-text.text-darken-1 {\n  color: #8e24aa !important;\n}\n\n.purple.darken-2 {\n  background-color: #7b1fa2 !important;\n}\n\n.purple-text.text-darken-2 {\n  color: #7b1fa2 !important;\n}\n\n.purple.darken-3 {\n  background-color: #6a1b9a !important;\n}\n\n.purple-text.text-darken-3 {\n  color: #6a1b9a !important;\n}\n\n.purple.darken-4 {\n  background-color: #4a148c !important;\n}\n\n.purple-text.text-darken-4 {\n  color: #4a148c !important;\n}\n\n.purple.accent-1 {\n  background-color: #ea80fc !important;\n}\n\n.purple-text.text-accent-1 {\n  color: #ea80fc !important;\n}\n\n.purple.accent-2 {\n  background-color: #e040fb !important;\n}\n\n.purple-text.text-accent-2 {\n  color: #e040fb !important;\n}\n\n.purple.accent-3 {\n  background-color: #d500f9 !important;\n}\n\n.purple-text.text-accent-3 {\n  color: #d500f9 !important;\n}\n\n.purple.accent-4 {\n  background-color: #aa00ff !important;\n}\n\n.purple-text.text-accent-4 {\n  color: #aa00ff !important;\n}\n\n.deep-purple {\n  background-color: #673ab7 !important;\n}\n\n.deep-purple-text {\n  color: #673ab7 !important;\n}\n\n.deep-purple.lighten-5 {\n  background-color: #ede7f6 !important;\n}\n\n.deep-purple-text.text-lighten-5 {\n  color: #ede7f6 !important;\n}\n\n.deep-purple.lighten-4 {\n  background-color: #d1c4e9 !important;\n}\n\n.deep-purple-text.text-lighten-4 {\n  color: #d1c4e9 !important;\n}\n\n.deep-purple.lighten-3 {\n  background-color: #b39ddb !important;\n}\n\n.deep-purple-text.text-lighten-3 {\n  color: #b39ddb !important;\n}\n\n.deep-purple.lighten-2 {\n  background-color: #9575cd !important;\n}\n\n.deep-purple-text.text-lighten-2 {\n  color: #9575cd !important;\n}\n\n.deep-purple.lighten-1 {\n  background-color: #7e57c2 !important;\n}\n\n.deep-purple-text.text-lighten-1 {\n  color: #7e57c2 !important;\n}\n\n.deep-purple.darken-1 {\n  background-color: #5e35b1 !important;\n}\n\n.deep-purple-text.text-darken-1 {\n  color: #5e35b1 !important;\n}\n\n.deep-purple.darken-2 {\n  background-color: #512da8 !important;\n}\n\n.deep-purple-text.text-darken-2 {\n  color: #512da8 !important;\n}\n\n.deep-purple.darken-3 {\n  background-color: #4527a0 !important;\n}\n\n.deep-purple-text.text-darken-3 {\n  color: #4527a0 !important;\n}\n\n.deep-purple.darken-4 {\n  background-color: #311b92 !important;\n}\n\n.deep-purple-text.text-darken-4 {\n  color: #311b92 !important;\n}\n\n.deep-purple.accent-1 {\n  background-color: #b388ff !important;\n}\n\n.deep-purple-text.text-accent-1 {\n  color: #b388ff !important;\n}\n\n.deep-purple.accent-2 {\n  background-color: #7c4dff !important;\n}\n\n.deep-purple-text.text-accent-2 {\n  color: #7c4dff !important;\n}\n\n.deep-purple.accent-3 {\n  background-color: #651fff !important;\n}\n\n.deep-purple-text.text-accent-3 {\n  color: #651fff !important;\n}\n\n.deep-purple.accent-4 {\n  background-color: #6200ea !important;\n}\n\n.deep-purple-text.text-accent-4 {\n  color: #6200ea !important;\n}\n\n.indigo {\n  background-color: #3f51b5 !important;\n}\n\n.indigo-text {\n  color: #3f51b5 !important;\n}\n\n.indigo.lighten-5 {\n  background-color: #e8eaf6 !important;\n}\n\n.indigo-text.text-lighten-5 {\n  color: #e8eaf6 !important;\n}\n\n.indigo.lighten-4 {\n  background-color: #c5cae9 !important;\n}\n\n.indigo-text.text-lighten-4 {\n  color: #c5cae9 !important;\n}\n\n.indigo.lighten-3 {\n  background-color: #9fa8da !important;\n}\n\n.indigo-text.text-lighten-3 {\n  color: #9fa8da !important;\n}\n\n.indigo.lighten-2 {\n  background-color: #7986cb !important;\n}\n\n.indigo-text.text-lighten-2 {\n  color: #7986cb !important;\n}\n\n.indigo.lighten-1 {\n  background-color: #5c6bc0 !important;\n}\n\n.indigo-text.text-lighten-1 {\n  color: #5c6bc0 !important;\n}\n\n.indigo.darken-1 {\n  background-color: #3949ab !important;\n}\n\n.indigo-text.text-darken-1 {\n  color: #3949ab !important;\n}\n\n.indigo.darken-2 {\n  background-color: #303f9f !important;\n}\n\n.indigo-text.text-darken-2 {\n  color: #303f9f !important;\n}\n\n.indigo.darken-3 {\n  background-color: #283593 !important;\n}\n\n.indigo-text.text-darken-3 {\n  color: #283593 !important;\n}\n\n.indigo.darken-4 {\n  background-color: #1a237e !important;\n}\n\n.indigo-text.text-darken-4 {\n  color: #1a237e !important;\n}\n\n.indigo.accent-1 {\n  background-color: #8c9eff !important;\n}\n\n.indigo-text.text-accent-1 {\n  color: #8c9eff !important;\n}\n\n.indigo.accent-2 {\n  background-color: #536dfe !important;\n}\n\n.indigo-text.text-accent-2 {\n  color: #536dfe !important;\n}\n\n.indigo.accent-3 {\n  background-color: #3d5afe !important;\n}\n\n.indigo-text.text-accent-3 {\n  color: #3d5afe !important;\n}\n\n.indigo.accent-4 {\n  background-color: #304ffe !important;\n}\n\n.indigo-text.text-accent-4 {\n  color: #304ffe !important;\n}\n\n.blue {\n  background-color: #2196F3 !important;\n}\n\n.blue-text {\n  color: #2196F3 !important;\n}\n\n.blue.lighten-5 {\n  background-color: #E3F2FD !important;\n}\n\n.blue-text.text-lighten-5 {\n  color: #E3F2FD !important;\n}\n\n.blue.lighten-4 {\n  background-color: #BBDEFB !important;\n}\n\n.blue-text.text-lighten-4 {\n  color: #BBDEFB !important;\n}\n\n.blue.lighten-3 {\n  background-color: #90CAF9 !important;\n}\n\n.blue-text.text-lighten-3 {\n  color: #90CAF9 !important;\n}\n\n.blue.lighten-2 {\n  background-color: #64B5F6 !important;\n}\n\n.blue-text.text-lighten-2 {\n  color: #64B5F6 !important;\n}\n\n.blue.lighten-1 {\n  background-color: #42A5F5 !important;\n}\n\n.blue-text.text-lighten-1 {\n  color: #42A5F5 !important;\n}\n\n.blue.darken-1 {\n  background-color: #1E88E5 !important;\n}\n\n.blue-text.text-darken-1 {\n  color: #1E88E5 !important;\n}\n\n.blue.darken-2 {\n  background-color: #1976D2 !important;\n}\n\n.blue-text.text-darken-2 {\n  color: #1976D2 !important;\n}\n\n.blue.darken-3 {\n  background-color: #1565C0 !important;\n}\n\n.blue-text.text-darken-3 {\n  color: #1565C0 !important;\n}\n\n.blue.darken-4 {\n  background-color: #0D47A1 !important;\n}\n\n.blue-text.text-darken-4 {\n  color: #0D47A1 !important;\n}\n\n.blue.accent-1 {\n  background-color: #82B1FF !important;\n}\n\n.blue-text.text-accent-1 {\n  color: #82B1FF !important;\n}\n\n.blue.accent-2 {\n  background-color: #448AFF !important;\n}\n\n.blue-text.text-accent-2 {\n  color: #448AFF !important;\n}\n\n.blue.accent-3 {\n  background-color: #2979FF !important;\n}\n\n.blue-text.text-accent-3 {\n  color: #2979FF !important;\n}\n\n.blue.accent-4 {\n  background-color: #2962FF !important;\n}\n\n.blue-text.text-accent-4 {\n  color: #2962FF !important;\n}\n\n.light-blue {\n  background-color: #03a9f4 !important;\n}\n\n.light-blue-text {\n  color: #03a9f4 !important;\n}\n\n.light-blue.lighten-5 {\n  background-color: #e1f5fe !important;\n}\n\n.light-blue-text.text-lighten-5 {\n  color: #e1f5fe !important;\n}\n\n.light-blue.lighten-4 {\n  background-color: #b3e5fc !important;\n}\n\n.light-blue-text.text-lighten-4 {\n  color: #b3e5fc !important;\n}\n\n.light-blue.lighten-3 {\n  background-color: #81d4fa !important;\n}\n\n.light-blue-text.text-lighten-3 {\n  color: #81d4fa !important;\n}\n\n.light-blue.lighten-2 {\n  background-color: #4fc3f7 !important;\n}\n\n.light-blue-text.text-lighten-2 {\n  color: #4fc3f7 !important;\n}\n\n.light-blue.lighten-1 {\n  background-color: #29b6f6 !important;\n}\n\n.light-blue-text.text-lighten-1 {\n  color: #29b6f6 !important;\n}\n\n.light-blue.darken-1 {\n  background-color: #039be5 !important;\n}\n\n.light-blue-text.text-darken-1 {\n  color: #039be5 !important;\n}\n\n.light-blue.darken-2 {\n  background-color: #0288d1 !important;\n}\n\n.light-blue-text.text-darken-2 {\n  color: #0288d1 !important;\n}\n\n.light-blue.darken-3 {\n  background-color: #0277bd !important;\n}\n\n.light-blue-text.text-darken-3 {\n  color: #0277bd !important;\n}\n\n.light-blue.darken-4 {\n  background-color: #01579b !important;\n}\n\n.light-blue-text.text-darken-4 {\n  color: #01579b !important;\n}\n\n.light-blue.accent-1 {\n  background-color: #80d8ff !important;\n}\n\n.light-blue-text.text-accent-1 {\n  color: #80d8ff !important;\n}\n\n.light-blue.accent-2 {\n  background-color: #40c4ff !important;\n}\n\n.light-blue-text.text-accent-2 {\n  color: #40c4ff !important;\n}\n\n.light-blue.accent-3 {\n  background-color: #00b0ff !important;\n}\n\n.light-blue-text.text-accent-3 {\n  color: #00b0ff !important;\n}\n\n.light-blue.accent-4 {\n  background-color: #0091ea !important;\n}\n\n.light-blue-text.text-accent-4 {\n  color: #0091ea !important;\n}\n\n.cyan {\n  background-color: #00bcd4 !important;\n}\n\n.cyan-text {\n  color: #00bcd4 !important;\n}\n\n.cyan.lighten-5 {\n  background-color: #e0f7fa !important;\n}\n\n.cyan-text.text-lighten-5 {\n  color: #e0f7fa !important;\n}\n\n.cyan.lighten-4 {\n  background-color: #b2ebf2 !important;\n}\n\n.cyan-text.text-lighten-4 {\n  color: #b2ebf2 !important;\n}\n\n.cyan.lighten-3 {\n  background-color: #80deea !important;\n}\n\n.cyan-text.text-lighten-3 {\n  color: #80deea !important;\n}\n\n.cyan.lighten-2 {\n  background-color: #4dd0e1 !important;\n}\n\n.cyan-text.text-lighten-2 {\n  color: #4dd0e1 !important;\n}\n\n.cyan.lighten-1 {\n  background-color: #26c6da !important;\n}\n\n.cyan-text.text-lighten-1 {\n  color: #26c6da !important;\n}\n\n.cyan.darken-1 {\n  background-color: #00acc1 !important;\n}\n\n.cyan-text.text-darken-1 {\n  color: #00acc1 !important;\n}\n\n.cyan.darken-2 {\n  background-color: #0097a7 !important;\n}\n\n.cyan-text.text-darken-2 {\n  color: #0097a7 !important;\n}\n\n.cyan.darken-3 {\n  background-color: #00838f !important;\n}\n\n.cyan-text.text-darken-3 {\n  color: #00838f !important;\n}\n\n.cyan.darken-4 {\n  background-color: #006064 !important;\n}\n\n.cyan-text.text-darken-4 {\n  color: #006064 !important;\n}\n\n.cyan.accent-1 {\n  background-color: #84ffff !important;\n}\n\n.cyan-text.text-accent-1 {\n  color: #84ffff !important;\n}\n\n.cyan.accent-2 {\n  background-color: #18ffff !important;\n}\n\n.cyan-text.text-accent-2 {\n  color: #18ffff !important;\n}\n\n.cyan.accent-3 {\n  background-color: #00e5ff !important;\n}\n\n.cyan-text.text-accent-3 {\n  color: #00e5ff !important;\n}\n\n.cyan.accent-4 {\n  background-color: #00b8d4 !important;\n}\n\n.cyan-text.text-accent-4 {\n  color: #00b8d4 !important;\n}\n\n.teal {\n  background-color: #009688 !important;\n}\n\n.teal-text {\n  color: #009688 !important;\n}\n\n.teal.lighten-5 {\n  background-color: #e0f2f1 !important;\n}\n\n.teal-text.text-lighten-5 {\n  color: #e0f2f1 !important;\n}\n\n.teal.lighten-4 {\n  background-color: #b2dfdb !important;\n}\n\n.teal-text.text-lighten-4 {\n  color: #b2dfdb !important;\n}\n\n.teal.lighten-3 {\n  background-color: #80cbc4 !important;\n}\n\n.teal-text.text-lighten-3 {\n  color: #80cbc4 !important;\n}\n\n.teal.lighten-2 {\n  background-color: #4db6ac !important;\n}\n\n.teal-text.text-lighten-2 {\n  color: #4db6ac !important;\n}\n\n.teal.lighten-1 {\n  background-color: #26a69a !important;\n}\n\n.teal-text.text-lighten-1 {\n  color: #26a69a !important;\n}\n\n.teal.darken-1 {\n  background-color: #00897b !important;\n}\n\n.teal-text.text-darken-1 {\n  color: #00897b !important;\n}\n\n.teal.darken-2 {\n  background-color: #00796b !important;\n}\n\n.teal-text.text-darken-2 {\n  color: #00796b !important;\n}\n\n.teal.darken-3 {\n  background-color: #00695c !important;\n}\n\n.teal-text.text-darken-3 {\n  color: #00695c !important;\n}\n\n.teal.darken-4 {\n  background-color: #004d40 !important;\n}\n\n.teal-text.text-darken-4 {\n  color: #004d40 !important;\n}\n\n.teal.accent-1 {\n  background-color: #a7ffeb !important;\n}\n\n.teal-text.text-accent-1 {\n  color: #a7ffeb !important;\n}\n\n.teal.accent-2 {\n  background-color: #64ffda !important;\n}\n\n.teal-text.text-accent-2 {\n  color: #64ffda !important;\n}\n\n.teal.accent-3 {\n  background-color: #1de9b6 !important;\n}\n\n.teal-text.text-accent-3 {\n  color: #1de9b6 !important;\n}\n\n.teal.accent-4 {\n  background-color: #00bfa5 !important;\n}\n\n.teal-text.text-accent-4 {\n  color: #00bfa5 !important;\n}\n\n.green {\n  background-color: #4CAF50 !important;\n}\n\n.green-text {\n  color: #4CAF50 !important;\n}\n\n.green.lighten-5 {\n  background-color: #E8F5E9 !important;\n}\n\n.green-text.text-lighten-5 {\n  color: #E8F5E9 !important;\n}\n\n.green.lighten-4 {\n  background-color: #C8E6C9 !important;\n}\n\n.green-text.text-lighten-4 {\n  color: #C8E6C9 !important;\n}\n\n.green.lighten-3 {\n  background-color: #A5D6A7 !important;\n}\n\n.green-text.text-lighten-3 {\n  color: #A5D6A7 !important;\n}\n\n.green.lighten-2 {\n  background-color: #81C784 !important;\n}\n\n.green-text.text-lighten-2 {\n  color: #81C784 !important;\n}\n\n.green.lighten-1 {\n  background-color: #66BB6A !important;\n}\n\n.green-text.text-lighten-1 {\n  color: #66BB6A !important;\n}\n\n.green.darken-1 {\n  background-color: #43A047 !important;\n}\n\n.green-text.text-darken-1 {\n  color: #43A047 !important;\n}\n\n.green.darken-2 {\n  background-color: #388E3C !important;\n}\n\n.green-text.text-darken-2 {\n  color: #388E3C !important;\n}\n\n.green.darken-3 {\n  background-color: #2E7D32 !important;\n}\n\n.green-text.text-darken-3 {\n  color: #2E7D32 !important;\n}\n\n.green.darken-4 {\n  background-color: #1B5E20 !important;\n}\n\n.green-text.text-darken-4 {\n  color: #1B5E20 !important;\n}\n\n.green.accent-1 {\n  background-color: #B9F6CA !important;\n}\n\n.green-text.text-accent-1 {\n  color: #B9F6CA !important;\n}\n\n.green.accent-2 {\n  background-color: #69F0AE !important;\n}\n\n.green-text.text-accent-2 {\n  color: #69F0AE !important;\n}\n\n.green.accent-3 {\n  background-color: #00E676 !important;\n}\n\n.green-text.text-accent-3 {\n  color: #00E676 !important;\n}\n\n.green.accent-4 {\n  background-color: #00C853 !important;\n}\n\n.green-text.text-accent-4 {\n  color: #00C853 !important;\n}\n\n.light-green {\n  background-color: #8bc34a !important;\n}\n\n.light-green-text {\n  color: #8bc34a !important;\n}\n\n.light-green.lighten-5 {\n  background-color: #f1f8e9 !important;\n}\n\n.light-green-text.text-lighten-5 {\n  color: #f1f8e9 !important;\n}\n\n.light-green.lighten-4 {\n  background-color: #dcedc8 !important;\n}\n\n.light-green-text.text-lighten-4 {\n  color: #dcedc8 !important;\n}\n\n.light-green.lighten-3 {\n  background-color: #c5e1a5 !important;\n}\n\n.light-green-text.text-lighten-3 {\n  color: #c5e1a5 !important;\n}\n\n.light-green.lighten-2 {\n  background-color: #aed581 !important;\n}\n\n.light-green-text.text-lighten-2 {\n  color: #aed581 !important;\n}\n\n.light-green.lighten-1 {\n  background-color: #9ccc65 !important;\n}\n\n.light-green-text.text-lighten-1 {\n  color: #9ccc65 !important;\n}\n\n.light-green.darken-1 {\n  background-color: #7cb342 !important;\n}\n\n.light-green-text.text-darken-1 {\n  color: #7cb342 !important;\n}\n\n.light-green.darken-2 {\n  background-color: #689f38 !important;\n}\n\n.light-green-text.text-darken-2 {\n  color: #689f38 !important;\n}\n\n.light-green.darken-3 {\n  background-color: #558b2f !important;\n}\n\n.light-green-text.text-darken-3 {\n  color: #558b2f !important;\n}\n\n.light-green.darken-4 {\n  background-color: #33691e !important;\n}\n\n.light-green-text.text-darken-4 {\n  color: #33691e !important;\n}\n\n.light-green.accent-1 {\n  background-color: #ccff90 !important;\n}\n\n.light-green-text.text-accent-1 {\n  color: #ccff90 !important;\n}\n\n.light-green.accent-2 {\n  background-color: #b2ff59 !important;\n}\n\n.light-green-text.text-accent-2 {\n  color: #b2ff59 !important;\n}\n\n.light-green.accent-3 {\n  background-color: #76ff03 !important;\n}\n\n.light-green-text.text-accent-3 {\n  color: #76ff03 !important;\n}\n\n.light-green.accent-4 {\n  background-color: #64dd17 !important;\n}\n\n.light-green-text.text-accent-4 {\n  color: #64dd17 !important;\n}\n\n.lime {\n  background-color: #cddc39 !important;\n}\n\n.lime-text {\n  color: #cddc39 !important;\n}\n\n.lime.lighten-5 {\n  background-color: #f9fbe7 !important;\n}\n\n.lime-text.text-lighten-5 {\n  color: #f9fbe7 !important;\n}\n\n.lime.lighten-4 {\n  background-color: #f0f4c3 !important;\n}\n\n.lime-text.text-lighten-4 {\n  color: #f0f4c3 !important;\n}\n\n.lime.lighten-3 {\n  background-color: #e6ee9c !important;\n}\n\n.lime-text.text-lighten-3 {\n  color: #e6ee9c !important;\n}\n\n.lime.lighten-2 {\n  background-color: #dce775 !important;\n}\n\n.lime-text.text-lighten-2 {\n  color: #dce775 !important;\n}\n\n.lime.lighten-1 {\n  background-color: #d4e157 !important;\n}\n\n.lime-text.text-lighten-1 {\n  color: #d4e157 !important;\n}\n\n.lime.darken-1 {\n  background-color: #c0ca33 !important;\n}\n\n.lime-text.text-darken-1 {\n  color: #c0ca33 !important;\n}\n\n.lime.darken-2 {\n  background-color: #afb42b !important;\n}\n\n.lime-text.text-darken-2 {\n  color: #afb42b !important;\n}\n\n.lime.darken-3 {\n  background-color: #9e9d24 !important;\n}\n\n.lime-text.text-darken-3 {\n  color: #9e9d24 !important;\n}\n\n.lime.darken-4 {\n  background-color: #827717 !important;\n}\n\n.lime-text.text-darken-4 {\n  color: #827717 !important;\n}\n\n.lime.accent-1 {\n  background-color: #f4ff81 !important;\n}\n\n.lime-text.text-accent-1 {\n  color: #f4ff81 !important;\n}\n\n.lime.accent-2 {\n  background-color: #eeff41 !important;\n}\n\n.lime-text.text-accent-2 {\n  color: #eeff41 !important;\n}\n\n.lime.accent-3 {\n  background-color: #c6ff00 !important;\n}\n\n.lime-text.text-accent-3 {\n  color: #c6ff00 !important;\n}\n\n.lime.accent-4 {\n  background-color: #aeea00 !important;\n}\n\n.lime-text.text-accent-4 {\n  color: #aeea00 !important;\n}\n\n.yellow {\n  background-color: #ffeb3b !important;\n}\n\n.yellow-text {\n  color: #ffeb3b !important;\n}\n\n.yellow.lighten-5 {\n  background-color: #fffde7 !important;\n}\n\n.yellow-text.text-lighten-5 {\n  color: #fffde7 !important;\n}\n\n.yellow.lighten-4 {\n  background-color: #fff9c4 !important;\n}\n\n.yellow-text.text-lighten-4 {\n  color: #fff9c4 !important;\n}\n\n.yellow.lighten-3 {\n  background-color: #fff59d !important;\n}\n\n.yellow-text.text-lighten-3 {\n  color: #fff59d !important;\n}\n\n.yellow.lighten-2 {\n  background-color: #fff176 !important;\n}\n\n.yellow-text.text-lighten-2 {\n  color: #fff176 !important;\n}\n\n.yellow.lighten-1 {\n  background-color: #ffee58 !important;\n}\n\n.yellow-text.text-lighten-1 {\n  color: #ffee58 !important;\n}\n\n.yellow.darken-1 {\n  background-color: #fdd835 !important;\n}\n\n.yellow-text.text-darken-1 {\n  color: #fdd835 !important;\n}\n\n.yellow.darken-2 {\n  background-color: #fbc02d !important;\n}\n\n.yellow-text.text-darken-2 {\n  color: #fbc02d !important;\n}\n\n.yellow.darken-3 {\n  background-color: #f9a825 !important;\n}\n\n.yellow-text.text-darken-3 {\n  color: #f9a825 !important;\n}\n\n.yellow.darken-4 {\n  background-color: #f57f17 !important;\n}\n\n.yellow-text.text-darken-4 {\n  color: #f57f17 !important;\n}\n\n.yellow.accent-1 {\n  background-color: #ffff8d !important;\n}\n\n.yellow-text.text-accent-1 {\n  color: #ffff8d !important;\n}\n\n.yellow.accent-2 {\n  background-color: #ffff00 !important;\n}\n\n.yellow-text.text-accent-2 {\n  color: #ffff00 !important;\n}\n\n.yellow.accent-3 {\n  background-color: #ffea00 !important;\n}\n\n.yellow-text.text-accent-3 {\n  color: #ffea00 !important;\n}\n\n.yellow.accent-4 {\n  background-color: #ffd600 !important;\n}\n\n.yellow-text.text-accent-4 {\n  color: #ffd600 !important;\n}\n\n.amber {\n  background-color: #ffc107 !important;\n}\n\n.amber-text {\n  color: #ffc107 !important;\n}\n\n.amber.lighten-5 {\n  background-color: #fff8e1 !important;\n}\n\n.amber-text.text-lighten-5 {\n  color: #fff8e1 !important;\n}\n\n.amber.lighten-4 {\n  background-color: #ffecb3 !important;\n}\n\n.amber-text.text-lighten-4 {\n  color: #ffecb3 !important;\n}\n\n.amber.lighten-3 {\n  background-color: #ffe082 !important;\n}\n\n.amber-text.text-lighten-3 {\n  color: #ffe082 !important;\n}\n\n.amber.lighten-2 {\n  background-color: #ffd54f !important;\n}\n\n.amber-text.text-lighten-2 {\n  color: #ffd54f !important;\n}\n\n.amber.lighten-1 {\n  background-color: #ffca28 !important;\n}\n\n.amber-text.text-lighten-1 {\n  color: #ffca28 !important;\n}\n\n.amber.darken-1 {\n  background-color: #ffb300 !important;\n}\n\n.amber-text.text-darken-1 {\n  color: #ffb300 !important;\n}\n\n.amber.darken-2 {\n  background-color: #ffa000 !important;\n}\n\n.amber-text.text-darken-2 {\n  color: #ffa000 !important;\n}\n\n.amber.darken-3 {\n  background-color: #ff8f00 !important;\n}\n\n.amber-text.text-darken-3 {\n  color: #ff8f00 !important;\n}\n\n.amber.darken-4 {\n  background-color: #ff6f00 !important;\n}\n\n.amber-text.text-darken-4 {\n  color: #ff6f00 !important;\n}\n\n.amber.accent-1 {\n  background-color: #ffe57f !important;\n}\n\n.amber-text.text-accent-1 {\n  color: #ffe57f !important;\n}\n\n.amber.accent-2 {\n  background-color: #ffd740 !important;\n}\n\n.amber-text.text-accent-2 {\n  color: #ffd740 !important;\n}\n\n.amber.accent-3 {\n  background-color: #ffc400 !important;\n}\n\n.amber-text.text-accent-3 {\n  color: #ffc400 !important;\n}\n\n.amber.accent-4 {\n  background-color: #ffab00 !important;\n}\n\n.amber-text.text-accent-4 {\n  color: #ffab00 !important;\n}\n\n.orange {\n  background-color: #ff9800 !important;\n}\n\n.orange-text {\n  color: #ff9800 !important;\n}\n\n.orange.lighten-5 {\n  background-color: #fff3e0 !important;\n}\n\n.orange-text.text-lighten-5 {\n  color: #fff3e0 !important;\n}\n\n.orange.lighten-4 {\n  background-color: #ffe0b2 !important;\n}\n\n.orange-text.text-lighten-4 {\n  color: #ffe0b2 !important;\n}\n\n.orange.lighten-3 {\n  background-color: #ffcc80 !important;\n}\n\n.orange-text.text-lighten-3 {\n  color: #ffcc80 !important;\n}\n\n.orange.lighten-2 {\n  background-color: #ffb74d !important;\n}\n\n.orange-text.text-lighten-2 {\n  color: #ffb74d !important;\n}\n\n.orange.lighten-1 {\n  background-color: #ffa726 !important;\n}\n\n.orange-text.text-lighten-1 {\n  color: #ffa726 !important;\n}\n\n.orange.darken-1 {\n  background-color: #fb8c00 !important;\n}\n\n.orange-text.text-darken-1 {\n  color: #fb8c00 !important;\n}\n\n.orange.darken-2 {\n  background-color: #f57c00 !important;\n}\n\n.orange-text.text-darken-2 {\n  color: #f57c00 !important;\n}\n\n.orange.darken-3 {\n  background-color: #ef6c00 !important;\n}\n\n.orange-text.text-darken-3 {\n  color: #ef6c00 !important;\n}\n\n.orange.darken-4 {\n  background-color: #e65100 !important;\n}\n\n.orange-text.text-darken-4 {\n  color: #e65100 !important;\n}\n\n.orange.accent-1 {\n  background-color: #ffd180 !important;\n}\n\n.orange-text.text-accent-1 {\n  color: #ffd180 !important;\n}\n\n.orange.accent-2 {\n  background-color: #ffab40 !important;\n}\n\n.orange-text.text-accent-2 {\n  color: #ffab40 !important;\n}\n\n.orange.accent-3 {\n  background-color: #ff9100 !important;\n}\n\n.orange-text.text-accent-3 {\n  color: #ff9100 !important;\n}\n\n.orange.accent-4 {\n  background-color: #ff6d00 !important;\n}\n\n.orange-text.text-accent-4 {\n  color: #ff6d00 !important;\n}\n\n.deep-orange {\n  background-color: #ff5722 !important;\n}\n\n.deep-orange-text {\n  color: #ff5722 !important;\n}\n\n.deep-orange.lighten-5 {\n  background-color: #fbe9e7 !important;\n}\n\n.deep-orange-text.text-lighten-5 {\n  color: #fbe9e7 !important;\n}\n\n.deep-orange.lighten-4 {\n  background-color: #ffccbc !important;\n}\n\n.deep-orange-text.text-lighten-4 {\n  color: #ffccbc !important;\n}\n\n.deep-orange.lighten-3 {\n  background-color: #ffab91 !important;\n}\n\n.deep-orange-text.text-lighten-3 {\n  color: #ffab91 !important;\n}\n\n.deep-orange.lighten-2 {\n  background-color: #ff8a65 !important;\n}\n\n.deep-orange-text.text-lighten-2 {\n  color: #ff8a65 !important;\n}\n\n.deep-orange.lighten-1 {\n  background-color: #ff7043 !important;\n}\n\n.deep-orange-text.text-lighten-1 {\n  color: #ff7043 !important;\n}\n\n.deep-orange.darken-1 {\n  background-color: #f4511e !important;\n}\n\n.deep-orange-text.text-darken-1 {\n  color: #f4511e !important;\n}\n\n.deep-orange.darken-2 {\n  background-color: #e64a19 !important;\n}\n\n.deep-orange-text.text-darken-2 {\n  color: #e64a19 !important;\n}\n\n.deep-orange.darken-3 {\n  background-color: #d84315 !important;\n}\n\n.deep-orange-text.text-darken-3 {\n  color: #d84315 !important;\n}\n\n.deep-orange.darken-4 {\n  background-color: #bf360c !important;\n}\n\n.deep-orange-text.text-darken-4 {\n  color: #bf360c !important;\n}\n\n.deep-orange.accent-1 {\n  background-color: #ff9e80 !important;\n}\n\n.deep-orange-text.text-accent-1 {\n  color: #ff9e80 !important;\n}\n\n.deep-orange.accent-2 {\n  background-color: #ff6e40 !important;\n}\n\n.deep-orange-text.text-accent-2 {\n  color: #ff6e40 !important;\n}\n\n.deep-orange.accent-3 {\n  background-color: #ff3d00 !important;\n}\n\n.deep-orange-text.text-accent-3 {\n  color: #ff3d00 !important;\n}\n\n.deep-orange.accent-4 {\n  background-color: #dd2c00 !important;\n}\n\n.deep-orange-text.text-accent-4 {\n  color: #dd2c00 !important;\n}\n\n.brown {\n  background-color: #795548 !important;\n}\n\n.brown-text {\n  color: #795548 !important;\n}\n\n.brown.lighten-5 {\n  background-color: #efebe9 !important;\n}\n\n.brown-text.text-lighten-5 {\n  color: #efebe9 !important;\n}\n\n.brown.lighten-4 {\n  background-color: #d7ccc8 !important;\n}\n\n.brown-text.text-lighten-4 {\n  color: #d7ccc8 !important;\n}\n\n.brown.lighten-3 {\n  background-color: #bcaaa4 !important;\n}\n\n.brown-text.text-lighten-3 {\n  color: #bcaaa4 !important;\n}\n\n.brown.lighten-2 {\n  background-color: #a1887f !important;\n}\n\n.brown-text.text-lighten-2 {\n  color: #a1887f !important;\n}\n\n.brown.lighten-1 {\n  background-color: #8d6e63 !important;\n}\n\n.brown-text.text-lighten-1 {\n  color: #8d6e63 !important;\n}\n\n.brown.darken-1 {\n  background-color: #6d4c41 !important;\n}\n\n.brown-text.text-darken-1 {\n  color: #6d4c41 !important;\n}\n\n.brown.darken-2 {\n  background-color: #5d4037 !important;\n}\n\n.brown-text.text-darken-2 {\n  color: #5d4037 !important;\n}\n\n.brown.darken-3 {\n  background-color: #4e342e !important;\n}\n\n.brown-text.text-darken-3 {\n  color: #4e342e !important;\n}\n\n.brown.darken-4 {\n  background-color: #3e2723 !important;\n}\n\n.brown-text.text-darken-4 {\n  color: #3e2723 !important;\n}\n\n.blue-grey {\n  background-color: #607d8b !important;\n}\n\n.blue-grey-text {\n  color: #607d8b !important;\n}\n\n.blue-grey.lighten-5 {\n  background-color: #eceff1 !important;\n}\n\n.blue-grey-text.text-lighten-5 {\n  color: #eceff1 !important;\n}\n\n.blue-grey.lighten-4 {\n  background-color: #cfd8dc !important;\n}\n\n.blue-grey-text.text-lighten-4 {\n  color: #cfd8dc !important;\n}\n\n.blue-grey.lighten-3 {\n  background-color: #b0bec5 !important;\n}\n\n.blue-grey-text.text-lighten-3 {\n  color: #b0bec5 !important;\n}\n\n.blue-grey.lighten-2 {\n  background-color: #90a4ae !important;\n}\n\n.blue-grey-text.text-lighten-2 {\n  color: #90a4ae !important;\n}\n\n.blue-grey.lighten-1 {\n  background-color: #78909c !important;\n}\n\n.blue-grey-text.text-lighten-1 {\n  color: #78909c !important;\n}\n\n.blue-grey.darken-1 {\n  background-color: #546e7a !important;\n}\n\n.blue-grey-text.text-darken-1 {\n  color: #546e7a !important;\n}\n\n.blue-grey.darken-2 {\n  background-color: #455a64 !important;\n}\n\n.blue-grey-text.text-darken-2 {\n  color: #455a64 !important;\n}\n\n.blue-grey.darken-3 {\n  background-color: #37474f !important;\n}\n\n.blue-grey-text.text-darken-3 {\n  color: #37474f !important;\n}\n\n.blue-grey.darken-4 {\n  background-color: #263238 !important;\n}\n\n.blue-grey-text.text-darken-4 {\n  color: #263238 !important;\n}\n\n.grey {\n  background-color: #9e9e9e !important;\n}\n\n.grey-text {\n  color: #9e9e9e !important;\n}\n\n.grey.lighten-5 {\n  background-color: #fafafa !important;\n}\n\n.grey-text.text-lighten-5 {\n  color: #fafafa !important;\n}\n\n.grey.lighten-4 {\n  background-color: #f5f5f5 !important;\n}\n\n.grey-text.text-lighten-4 {\n  color: #f5f5f5 !important;\n}\n\n.grey.lighten-3 {\n  background-color: #eeeeee !important;\n}\n\n.grey-text.text-lighten-3 {\n  color: #eeeeee !important;\n}\n\n.grey.lighten-2 {\n  background-color: #e0e0e0 !important;\n}\n\n.grey-text.text-lighten-2 {\n  color: #e0e0e0 !important;\n}\n\n.grey.lighten-1 {\n  background-color: #bdbdbd !important;\n}\n\n.grey-text.text-lighten-1 {\n  color: #bdbdbd !important;\n}\n\n.grey.darken-1 {\n  background-color: #757575 !important;\n}\n\n.grey-text.text-darken-1 {\n  color: #757575 !important;\n}\n\n.grey.darken-2 {\n  background-color: #616161 !important;\n}\n\n.grey-text.text-darken-2 {\n  color: #616161 !important;\n}\n\n.grey.darken-3 {\n  background-color: #424242 !important;\n}\n\n.grey-text.text-darken-3 {\n  color: #424242 !important;\n}\n\n.grey.darken-4 {\n  background-color: #212121 !important;\n}\n\n.grey-text.text-darken-4 {\n  color: #212121 !important;\n}\n\n.black {\n  background-color: #000000 !important;\n}\n\n.black-text {\n  color: #000000 !important;\n}\n\n.white {\n  background-color: #FFFFFF !important;\n}\n\n.white-text {\n  color: #FFFFFF !important;\n}\n\n.transparent {\n  background-color: transparent !important;\n}\n\n.transparent-text {\n  color: transparent !important;\n}\n\n/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */\n/* Document\n   ========================================================================== */\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in\n *    IE on Windows Phone and in iOS.\n */\nhtml {\n  line-height: 1.15;\n  /* 1 */\n  -ms-text-size-adjust: 100%;\n  /* 2 */\n  -webkit-text-size-adjust: 100%;\n  /* 2 */\n}\n\n/* Sections\n   ========================================================================== */\n/**\n * Remove the margin in all browsers (opinionated).\n */\nbody {\n  margin: 0;\n}\n\n/**\n * Add the correct display in IE 9-.\n */\narticle,\naside,\nfooter,\nheader,\nnav,\nsection {\n  display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n/* Grouping content\n   ========================================================================== */\n/**\n * Add the correct display in IE 9-.\n * 1. Add the correct display in IE.\n */\nfigcaption,\nfigure,\nmain {\n  /* 1 */\n  display: block;\n}\n\n/**\n * Add the correct margin in IE 8.\n */\nfigure {\n  margin: 1em 40px;\n}\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\nhr {\n  -webkit-box-sizing: content-box;\n          box-sizing: content-box;\n  /* 1 */\n  height: 0;\n  /* 1 */\n  overflow: visible;\n  /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\npre {\n  font-family: monospace, monospace;\n  /* 1 */\n  font-size: 1em;\n  /* 2 */\n}\n\n/* Text-level semantics\n   ========================================================================== */\n/**\n * 1. Remove the gray background on active links in IE 10.\n * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.\n */\na {\n  background-color: transparent;\n  /* 1 */\n  -webkit-text-decoration-skip: objects;\n  /* 2 */\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57- and Firefox 39-.\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\nabbr[title] {\n  border-bottom: none;\n  /* 1 */\n  text-decoration: underline;\n  /* 2 */\n  -webkit-text-decoration: underline dotted;\n     -moz-text-decoration: underline dotted;\n          text-decoration: underline dotted;\n  /* 2 */\n}\n\n/**\n * Prevent the duplicate application of `bolder` by the next rule in Safari 6.\n */\nb,\nstrong {\n  font-weight: inherit;\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\nb,\nstrong {\n  font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\ncode,\nkbd,\nsamp {\n  font-family: monospace, monospace;\n  /* 1 */\n  font-size: 1em;\n  /* 2 */\n}\n\n/**\n * Add the correct font style in Android 4.3-.\n */\ndfn {\n  font-style: italic;\n}\n\n/**\n * Add the correct background and color in IE 9-.\n */\nmark {\n  background-color: #ff0;\n  color: #000;\n}\n\n/**\n * Add the correct font size in all browsers.\n */\nsmall {\n  font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\n/* Embedded content\n   ========================================================================== */\n/**\n * Add the correct display in IE 9-.\n */\naudio,\nvideo {\n  display: inline-block;\n}\n\n/**\n * Add the correct display in iOS 4-7.\n */\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n/**\n * Remove the border on images inside links in IE 10-.\n */\nimg {\n  border-style: none;\n}\n\n/**\n * Hide the overflow in IE.\n */\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n/* Forms\n   ========================================================================== */\n/**\n * 1. Change the font styles in all browsers (opinionated).\n * 2. Remove the margin in Firefox and Safari.\n */\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  font-family: sans-serif;\n  /* 1 */\n  font-size: 100%;\n  /* 1 */\n  line-height: 1.15;\n  /* 1 */\n  margin: 0;\n  /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\nbutton,\ninput {\n  /* 1 */\n  overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\nbutton,\nselect {\n  /* 1 */\n  text-transform: none;\n}\n\n/**\n * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n *    controls in Android 4.\n * 2. Correct the inability to style clickable types in iOS and Safari.\n */\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n  /* 2 */\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  border-style: none;\n  padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n  outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\nfieldset {\n  padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n *    `fieldset` elements in all browsers.\n */\nlegend {\n  -webkit-box-sizing: border-box;\n          box-sizing: border-box;\n  /* 1 */\n  color: inherit;\n  /* 2 */\n  display: table;\n  /* 1 */\n  max-width: 100%;\n  /* 1 */\n  padding: 0;\n  /* 3 */\n  white-space: normal;\n  /* 1 */\n}\n\n/**\n * 1. Add the correct display in IE 9-.\n * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\nprogress {\n  display: inline-block;\n  /* 1 */\n  vertical-align: baseline;\n  /* 2 */\n}\n\n/**\n * Remove the default vertical scrollbar in IE.\n */\ntextarea {\n  overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10-.\n * 2. Remove the padding in IE 10-.\n */\n[type=\"checkbox\"],\n[type=\"radio\"] {\n  -webkit-box-sizing: border-box;\n          box-sizing: border-box;\n  /* 1 */\n  padding: 0;\n  /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n[type=\"search\"] {\n  -webkit-appearance: textfield;\n  /* 1 */\n  outline-offset: -2px;\n  /* 2 */\n}\n\n/**\n * Remove the inner padding and cancel buttons in Chrome and Safari on macOS.\n */\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n::-webkit-file-upload-button {\n  -webkit-appearance: button;\n  /* 1 */\n  font: inherit;\n  /* 2 */\n}\n\n/* Interactive\n   ========================================================================== */\n/*\n * Add the correct display in IE 9-.\n * 1. Add the correct display in Edge, IE, and Firefox.\n */\ndetails,\nmenu {\n  display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\nsummary {\n  display: list-item;\n}\n\n/* Scripting\n   ========================================================================== */\n/**\n * Add the correct display in IE 9-.\n */\ncanvas {\n  display: inline-block;\n}\n\n/**\n * Add the correct display in IE.\n */\ntemplate {\n  display: none;\n}\n\n/* Hidden\n   ========================================================================== */\n/**\n * Add the correct display in IE 10-.\n */\n[hidden] {\n  display: none;\n}\n\nhtml {\n  -webkit-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\n*, *:before, *:after {\n  -webkit-box-sizing: inherit;\n          box-sizing: inherit;\n}\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n}\n\nul:not(.browser-default) {\n  padding-left: 0;\n  list-style-type: none;\n}\n\nul:not(.browser-default) > li {\n  list-style-type: none;\n}\n\na {\n  color: #039be5;\n  text-decoration: none;\n  -webkit-tap-highlight-color: transparent;\n}\n\n.valign-wrapper {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n}\n\n.clearfix {\n  clear: both;\n}\n\n.z-depth-0 {\n  -webkit-box-shadow: none !important;\n          box-shadow: none !important;\n}\n\n/* 2dp elevation modified*/\n.z-depth-1, nav, .card-panel, .card, .toast, .btn, .btn-large, .btn-small, .btn-floating, .dropdown-content, .collapsible, .sidenav {\n  -webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2);\n          box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2);\n}\n\n.z-depth-1-half, .btn:hover, .btn-large:hover, .btn-small:hover, .btn-floating:hover {\n  -webkit-box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2);\n}\n\n/* 6dp elevation modified*/\n.z-depth-2 {\n  -webkit-box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3);\n          box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3);\n}\n\n/* 12dp elevation modified*/\n.z-depth-3 {\n  -webkit-box-shadow: 0 8px 17px 2px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 8px 17px 2px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2);\n}\n\n/* 16dp elevation */\n.z-depth-4 {\n  -webkit-box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -7px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -7px rgba(0, 0, 0, 0.2);\n}\n\n/* 24dp elevation */\n.z-depth-5, .modal {\n  -webkit-box-shadow: 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12), 0 11px 15px -7px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12), 0 11px 15px -7px rgba(0, 0, 0, 0.2);\n}\n\n.hoverable {\n  -webkit-transition: -webkit-box-shadow .25s;\n  transition: -webkit-box-shadow .25s;\n  transition: box-shadow .25s;\n  transition: box-shadow .25s, -webkit-box-shadow .25s;\n}\n\n.hoverable:hover {\n  -webkit-box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);\n          box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);\n}\n\n.divider {\n  height: 1px;\n  overflow: hidden;\n  background-color: #e0e0e0;\n}\n\nblockquote {\n  margin: 20px 0;\n  padding-left: 1.5rem;\n  border-left: 5px solid #ee6e73;\n}\n\ni {\n  line-height: inherit;\n}\n\ni.left {\n  float: left;\n  margin-right: 15px;\n}\n\ni.right {\n  float: right;\n  margin-left: 15px;\n}\n\ni.tiny {\n  font-size: 1rem;\n}\n\ni.small {\n  font-size: 2rem;\n}\n\ni.medium {\n  font-size: 4rem;\n}\n\ni.large {\n  font-size: 6rem;\n}\n\nimg.responsive-img,\nvideo.responsive-video {\n  max-width: 100%;\n  height: auto;\n}\n\n.pagination li {\n  display: inline-block;\n  border-radius: 2px;\n  text-align: center;\n  vertical-align: top;\n  height: 30px;\n}\n\n.pagination li a {\n  color: #444;\n  display: inline-block;\n  font-size: 1.2rem;\n  padding: 0 10px;\n  line-height: 30px;\n}\n\n.pagination li.active a {\n  color: #fff;\n}\n\n.pagination li.active {\n  background-color: #ee6e73;\n}\n\n.pagination li.disabled a {\n  cursor: default;\n  color: #999;\n}\n\n.pagination li i {\n  font-size: 2rem;\n}\n\n.pagination li.pages ul li {\n  display: inline-block;\n  float: none;\n}\n\n@media only screen and (max-width: 992px) {\n  .pagination {\n    width: 100%;\n  }\n  .pagination li.prev,\n  .pagination li.next {\n    width: 10%;\n  }\n  .pagination li.pages {\n    width: 80%;\n    overflow: hidden;\n    white-space: nowrap;\n  }\n}\n\n.breadcrumb {\n  font-size: 18px;\n  color: rgba(255, 255, 255, 0.7);\n}\n\n.breadcrumb i,\n.breadcrumb [class^=\"mdi-\"], .breadcrumb [class*=\"mdi-\"],\n.breadcrumb i.material-icons {\n  display: inline-block;\n  float: left;\n  font-size: 24px;\n}\n\n.breadcrumb:before {\n  content: '\\E5CC';\n  color: rgba(255, 255, 255, 0.7);\n  vertical-align: top;\n  display: inline-block;\n  font-family: 'Material Icons';\n  font-weight: normal;\n  font-style: normal;\n  font-size: 25px;\n  margin: 0 10px 0 8px;\n  -webkit-font-smoothing: antialiased;\n}\n\n.breadcrumb:first-child:before {\n  display: none;\n}\n\n.breadcrumb:last-child {\n  color: #fff;\n}\n\n.parallax-container {\n  position: relative;\n  overflow: hidden;\n  height: 500px;\n}\n\n.parallax-container .parallax {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: -1;\n}\n\n.parallax-container .parallax img {\n  opacity: 0;\n  position: absolute;\n  left: 50%;\n  bottom: 0;\n  min-width: 100%;\n  min-height: 100%;\n  -webkit-transform: translate3d(0, 0, 0);\n          transform: translate3d(0, 0, 0);\n  -webkit-transform: translateX(-50%);\n          transform: translateX(-50%);\n}\n\n.pin-top, .pin-bottom {\n  position: relative;\n}\n\n.pinned {\n  position: fixed !important;\n}\n\n/*********************\n  Transition Classes\n**********************/\nul.staggered-list li {\n  opacity: 0;\n}\n\n.fade-in {\n  opacity: 0;\n  -webkit-transform-origin: 0 50%;\n          transform-origin: 0 50%;\n}\n\n/*********************\n  Media Query Classes\n**********************/\n@media only screen and (max-width: 600px) {\n  .hide-on-small-only, .hide-on-small-and-down {\n    display: none !important;\n  }\n}\n\n@media only screen and (max-width: 992px) {\n  .hide-on-med-and-down {\n    display: none !important;\n  }\n}\n\n@media only screen and (min-width: 601px) {\n  .hide-on-med-and-up {\n    display: none !important;\n  }\n}\n\n@media only screen and (min-width: 600px) and (max-width: 992px) {\n  .hide-on-med-only {\n    display: none !important;\n  }\n}\n\n@media only screen and (min-width: 993px) {\n  .hide-on-large-only {\n    display: none !important;\n  }\n}\n\n@media only screen and (min-width: 1201px) {\n  .hide-on-extra-large-only {\n    display: none !important;\n  }\n}\n\n@media only screen and (min-width: 1201px) {\n  .show-on-extra-large {\n    display: block !important;\n  }\n}\n\n@media only screen and (min-width: 993px) {\n  .show-on-large {\n    display: block !important;\n  }\n}\n\n@media only screen and (min-width: 600px) and (max-width: 992px) {\n  .show-on-medium {\n    display: block !important;\n  }\n}\n\n@media only screen and (max-width: 600px) {\n  .show-on-small {\n    display: block !important;\n  }\n}\n\n@media only screen and (min-width: 601px) {\n  .show-on-medium-and-up {\n    display: block !important;\n  }\n}\n\n@media only screen and (max-width: 992px) {\n  .show-on-medium-and-down {\n    display: block !important;\n  }\n}\n\n@media only screen and (max-width: 600px) {\n  .center-on-small-only {\n    text-align: center;\n  }\n}\n\n.page-footer {\n  padding-top: 20px;\n  color: #fff;\n  background-color: #ee6e73;\n}\n\n.page-footer .footer-copyright {\n  overflow: hidden;\n  min-height: 50px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-box-pack: justify;\n  -webkit-justify-content: space-between;\n      -ms-flex-pack: justify;\n          justify-content: space-between;\n  padding: 10px 0px;\n  color: rgba(255, 255, 255, 0.8);\n  background-color: rgba(51, 51, 51, 0.08);\n}\n\ntable, th, td {\n  border: none;\n}\n\ntable {\n  width: 100%;\n  display: table;\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntable.striped tr {\n  border-bottom: none;\n}\n\ntable.striped > tbody > tr:nth-child(odd) {\n  background-color: rgba(242, 242, 242, 0.5);\n}\n\ntable.striped > tbody > tr > td {\n  border-radius: 0;\n}\n\ntable.highlight > tbody > tr {\n  -webkit-transition: background-color .25s ease;\n  transition: background-color .25s ease;\n}\n\ntable.highlight > tbody > tr:hover {\n  background-color: rgba(242, 242, 242, 0.5);\n}\n\ntable.centered thead tr th, table.centered tbody tr td {\n  text-align: center;\n}\n\ntr {\n  border-bottom: 1px solid rgba(0, 0, 0, 0.12);\n}\n\ntd, th {\n  padding: 15px 5px;\n  display: table-cell;\n  text-align: left;\n  vertical-align: middle;\n  border-radius: 2px;\n}\n\n@media only screen and (max-width: 992px) {\n  table.responsive-table {\n    width: 100%;\n    border-collapse: collapse;\n    border-spacing: 0;\n    display: block;\n    position: relative;\n    /* sort out borders */\n  }\n  table.responsive-table td:empty:before {\n    content: '\\00a0';\n  }\n  table.responsive-table th,\n  table.responsive-table td {\n    margin: 0;\n    vertical-align: top;\n  }\n  table.responsive-table th {\n    text-align: left;\n  }\n  table.responsive-table thead {\n    display: block;\n    float: left;\n  }\n  table.responsive-table thead tr {\n    display: block;\n    padding: 0 10px 0 0;\n  }\n  table.responsive-table thead tr th::before {\n    content: \"\\00a0\";\n  }\n  table.responsive-table tbody {\n    display: block;\n    width: auto;\n    position: relative;\n    overflow-x: auto;\n    white-space: nowrap;\n  }\n  table.responsive-table tbody tr {\n    display: inline-block;\n    vertical-align: top;\n  }\n  table.responsive-table th {\n    display: block;\n    text-align: right;\n  }\n  table.responsive-table td {\n    display: block;\n    min-height: 1.25em;\n    text-align: left;\n  }\n  table.responsive-table tr {\n    border-bottom: none;\n    padding: 0 10px;\n  }\n  table.responsive-table thead {\n    border: 0;\n    border-right: 1px solid rgba(0, 0, 0, 0.12);\n  }\n}\n\n.collection {\n  margin: 0.5rem 0 1rem 0;\n  border: 1px solid #e0e0e0;\n  border-radius: 2px;\n  overflow: hidden;\n  position: relative;\n}\n\n.collection .collection-item {\n  background-color: #fff;\n  line-height: 1.5rem;\n  padding: 10px 20px;\n  margin: 0;\n  border-bottom: 1px solid #e0e0e0;\n}\n\n.collection .collection-item.avatar {\n  min-height: 84px;\n  padding-left: 72px;\n  position: relative;\n}\n\n.collection .collection-item.avatar:not(.circle-clipper) > .circle,\n.collection .collection-item.avatar :not(.circle-clipper) > .circle {\n  position: absolute;\n  width: 42px;\n  height: 42px;\n  overflow: hidden;\n  left: 15px;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.collection .collection-item.avatar i.circle {\n  font-size: 18px;\n  line-height: 42px;\n  color: #fff;\n  background-color: #999;\n  text-align: center;\n}\n\n.collection .collection-item.avatar .title {\n  font-size: 16px;\n}\n\n.collection .collection-item.avatar p {\n  margin: 0;\n}\n\n.collection .collection-item.avatar .secondary-content {\n  position: absolute;\n  top: 16px;\n  right: 16px;\n}\n\n.collection .collection-item:last-child {\n  border-bottom: none;\n}\n\n.collection .collection-item.active {\n  background-color: #26a69a;\n  color: #eafaf9;\n}\n\n.collection .collection-item.active .secondary-content {\n  color: #fff;\n}\n\n.collection a.collection-item {\n  display: block;\n  -webkit-transition: .25s;\n  transition: .25s;\n  color: #26a69a;\n}\n\n.collection a.collection-item:not(.active):hover {\n  background-color: #ddd;\n}\n\n.collection.with-header .collection-header {\n  background-color: #fff;\n  border-bottom: 1px solid #e0e0e0;\n  padding: 10px 20px;\n}\n\n.collection.with-header .collection-item {\n  padding-left: 30px;\n}\n\n.collection.with-header .collection-item.avatar {\n  padding-left: 72px;\n}\n\n.secondary-content {\n  float: right;\n  color: #26a69a;\n}\n\n.collapsible .collection {\n  margin: 0;\n  border: none;\n}\n\n.video-container {\n  position: relative;\n  padding-bottom: 56.25%;\n  height: 0;\n  overflow: hidden;\n}\n\n.video-container iframe, .video-container object, .video-container embed {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.progress {\n  position: relative;\n  height: 4px;\n  display: block;\n  width: 100%;\n  background-color: #acece6;\n  border-radius: 2px;\n  margin: 0.5rem 0 1rem 0;\n  overflow: hidden;\n}\n\n.progress .determinate {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  background-color: #26a69a;\n  -webkit-transition: width .3s linear;\n  transition: width .3s linear;\n}\n\n.progress .indeterminate {\n  background-color: #26a69a;\n}\n\n.progress .indeterminate:before {\n  content: '';\n  position: absolute;\n  background-color: inherit;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  will-change: left, right;\n  -webkit-animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;\n          animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;\n}\n\n.progress .indeterminate:after {\n  content: '';\n  position: absolute;\n  background-color: inherit;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  will-change: left, right;\n  -webkit-animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;\n          animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;\n  -webkit-animation-delay: 1.15s;\n          animation-delay: 1.15s;\n}\n\n@-webkit-keyframes indeterminate {\n  0% {\n    left: -35%;\n    right: 100%;\n  }\n  60% {\n    left: 100%;\n    right: -90%;\n  }\n  100% {\n    left: 100%;\n    right: -90%;\n  }\n}\n\n@keyframes indeterminate {\n  0% {\n    left: -35%;\n    right: 100%;\n  }\n  60% {\n    left: 100%;\n    right: -90%;\n  }\n  100% {\n    left: 100%;\n    right: -90%;\n  }\n}\n\n@-webkit-keyframes indeterminate-short {\n  0% {\n    left: -200%;\n    right: 100%;\n  }\n  60% {\n    left: 107%;\n    right: -8%;\n  }\n  100% {\n    left: 107%;\n    right: -8%;\n  }\n}\n\n@keyframes indeterminate-short {\n  0% {\n    left: -200%;\n    right: 100%;\n  }\n  60% {\n    left: 107%;\n    right: -8%;\n  }\n  100% {\n    left: 107%;\n    right: -8%;\n  }\n}\n\n/*******************\n  Utility Classes\n*******************/\n.hide {\n  display: none !important;\n}\n\n.left-align {\n  text-align: left;\n}\n\n.right-align {\n  text-align: right;\n}\n\n.center, .center-align {\n  text-align: center;\n}\n\n.left {\n  float: left !important;\n}\n\n.right {\n  float: right !important;\n}\n\n.no-select, input[type=range],\ninput[type=range] + .thumb {\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n\n.circle {\n  border-radius: 50%;\n}\n\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.truncate {\n  display: block;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.no-padding {\n  padding: 0 !important;\n}\n\nspan.badge {\n  min-width: 3rem;\n  padding: 0 6px;\n  margin-left: 14px;\n  text-align: center;\n  font-size: 1rem;\n  line-height: 22px;\n  height: 22px;\n  color: #757575;\n  float: right;\n  -webkit-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nspan.badge.new {\n  font-weight: 300;\n  font-size: 0.8rem;\n  color: #fff;\n  background-color: #26a69a;\n  border-radius: 2px;\n}\n\nspan.badge.new:after {\n  content: \" new\";\n}\n\nspan.badge[data-badge-caption]::after {\n  content: \" \" attr(data-badge-caption);\n}\n\nnav ul a span.badge {\n  display: inline-block;\n  float: none;\n  margin-left: 4px;\n  line-height: 22px;\n  height: 22px;\n  -webkit-font-smoothing: auto;\n}\n\n.collection-item span.badge {\n  margin-top: calc(0.75rem - 11px);\n}\n\n.collapsible span.badge {\n  margin-left: auto;\n}\n\n.sidenav span.badge {\n  margin-top: calc(24px - 11px);\n}\n\ntable span.badge {\n  display: inline-block;\n  float: none;\n  margin-left: auto;\n}\n\n/* This is needed for some mobile phones to display the Google Icon font properly */\n.material-icons {\n  text-rendering: optimizeLegibility;\n  -webkit-font-feature-settings: 'liga';\n     -moz-font-feature-settings: 'liga';\n          font-feature-settings: 'liga';\n}\n\n.container {\n  margin: 0 auto;\n  max-width: 1280px;\n  width: 90%;\n}\n\n@media only screen and (min-width: 601px) {\n  .container {\n    width: 85%;\n  }\n}\n\n@media only screen and (min-width: 993px) {\n  .container {\n    width: 70%;\n  }\n}\n\n.col .row {\n  margin-left: -0.75rem;\n  margin-right: -0.75rem;\n}\n\n.section {\n  padding-top: 1rem;\n  padding-bottom: 1rem;\n}\n\n.section.no-pad {\n  padding: 0;\n}\n\n.section.no-pad-bot {\n  padding-bottom: 0;\n}\n\n.section.no-pad-top {\n  padding-top: 0;\n}\n\n.row {\n  margin-left: auto;\n  margin-right: auto;\n  margin-bottom: 20px;\n}\n\n.row:after {\n  content: \"\";\n  display: table;\n  clear: both;\n}\n\n.row .col {\n  float: left;\n  -webkit-box-sizing: border-box;\n          box-sizing: border-box;\n  padding: 0 0.75rem;\n  min-height: 1px;\n}\n\n.row .col[class*=\"push-\"], .row .col[class*=\"pull-\"] {\n  position: relative;\n}\n\n.row .col.s1 {\n  width: 8.3333333333%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s2 {\n  width: 16.6666666667%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s3 {\n  width: 25%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s4 {\n  width: 33.3333333333%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s5 {\n  width: 41.6666666667%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s6 {\n  width: 50%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s7 {\n  width: 58.3333333333%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s8 {\n  width: 66.6666666667%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s9 {\n  width: 75%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s10 {\n  width: 83.3333333333%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s11 {\n  width: 91.6666666667%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.s12 {\n  width: 100%;\n  margin-left: auto;\n  left: auto;\n  right: auto;\n}\n\n.row .col.offset-s1 {\n  margin-left: 8.3333333333%;\n}\n\n.row .col.pull-s1 {\n  right: 8.3333333333%;\n}\n\n.row .col.push-s1 {\n  left: 8.3333333333%;\n}\n\n.row .col.offset-s2 {\n  margin-left: 16.6666666667%;\n}\n\n.row .col.pull-s2 {\n  right: 16.6666666667%;\n}\n\n.row .col.push-s2 {\n  left: 16.6666666667%;\n}\n\n.row .col.offset-s3 {\n  margin-left: 25%;\n}\n\n.row .col.pull-s3 {\n  right: 25%;\n}\n\n.row .col.push-s3 {\n  left: 25%;\n}\n\n.row .col.offset-s4 {\n  margin-left: 33.3333333333%;\n}\n\n.row .col.pull-s4 {\n  right: 33.3333333333%;\n}\n\n.row .col.push-s4 {\n  left: 33.3333333333%;\n}\n\n.row .col.offset-s5 {\n  margin-left: 41.6666666667%;\n}\n\n.row .col.pull-s5 {\n  right: 41.6666666667%;\n}\n\n.row .col.push-s5 {\n  left: 41.6666666667%;\n}\n\n.row .col.offset-s6 {\n  margin-left: 50%;\n}\n\n.row .col.pull-s6 {\n  right: 50%;\n}\n\n.row .col.push-s6 {\n  left: 50%;\n}\n\n.row .col.offset-s7 {\n  margin-left: 58.3333333333%;\n}\n\n.row .col.pull-s7 {\n  right: 58.3333333333%;\n}\n\n.row .col.push-s7 {\n  left: 58.3333333333%;\n}\n\n.row .col.offset-s8 {\n  margin-left: 66.6666666667%;\n}\n\n.row .col.pull-s8 {\n  right: 66.6666666667%;\n}\n\n.row .col.push-s8 {\n  left: 66.6666666667%;\n}\n\n.row .col.offset-s9 {\n  margin-left: 75%;\n}\n\n.row .col.pull-s9 {\n  right: 75%;\n}\n\n.row .col.push-s9 {\n  left: 75%;\n}\n\n.row .col.offset-s10 {\n  margin-left: 83.3333333333%;\n}\n\n.row .col.pull-s10 {\n  right: 83.3333333333%;\n}\n\n.row .col.push-s10 {\n  left: 83.3333333333%;\n}\n\n.row .col.offset-s11 {\n  margin-left: 91.6666666667%;\n}\n\n.row .col.pull-s11 {\n  right: 91.6666666667%;\n}\n\n.row .col.push-s11 {\n  left: 91.6666666667%;\n}\n\n.row .col.offset-s12 {\n  margin-left: 100%;\n}\n\n.row .col.pull-s12 {\n  right: 100%;\n}\n\n.row .col.push-s12 {\n  left: 100%;\n}\n\n@media only screen and (min-width: 601px) {\n  .row .col.m1 {\n    width: 8.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m2 {\n    width: 16.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m3 {\n    width: 25%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m4 {\n    width: 33.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m5 {\n    width: 41.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m6 {\n    width: 50%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m7 {\n    width: 58.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m8 {\n    width: 66.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m9 {\n    width: 75%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m10 {\n    width: 83.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m11 {\n    width: 91.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.m12 {\n    width: 100%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.offset-m1 {\n    margin-left: 8.3333333333%;\n  }\n  .row .col.pull-m1 {\n    right: 8.3333333333%;\n  }\n  .row .col.push-m1 {\n    left: 8.3333333333%;\n  }\n  .row .col.offset-m2 {\n    margin-left: 16.6666666667%;\n  }\n  .row .col.pull-m2 {\n    right: 16.6666666667%;\n  }\n  .row .col.push-m2 {\n    left: 16.6666666667%;\n  }\n  .row .col.offset-m3 {\n    margin-left: 25%;\n  }\n  .row .col.pull-m3 {\n    right: 25%;\n  }\n  .row .col.push-m3 {\n    left: 25%;\n  }\n  .row .col.offset-m4 {\n    margin-left: 33.3333333333%;\n  }\n  .row .col.pull-m4 {\n    right: 33.3333333333%;\n  }\n  .row .col.push-m4 {\n    left: 33.3333333333%;\n  }\n  .row .col.offset-m5 {\n    margin-left: 41.6666666667%;\n  }\n  .row .col.pull-m5 {\n    right: 41.6666666667%;\n  }\n  .row .col.push-m5 {\n    left: 41.6666666667%;\n  }\n  .row .col.offset-m6 {\n    margin-left: 50%;\n  }\n  .row .col.pull-m6 {\n    right: 50%;\n  }\n  .row .col.push-m6 {\n    left: 50%;\n  }\n  .row .col.offset-m7 {\n    margin-left: 58.3333333333%;\n  }\n  .row .col.pull-m7 {\n    right: 58.3333333333%;\n  }\n  .row .col.push-m7 {\n    left: 58.3333333333%;\n  }\n  .row .col.offset-m8 {\n    margin-left: 66.6666666667%;\n  }\n  .row .col.pull-m8 {\n    right: 66.6666666667%;\n  }\n  .row .col.push-m8 {\n    left: 66.6666666667%;\n  }\n  .row .col.offset-m9 {\n    margin-left: 75%;\n  }\n  .row .col.pull-m9 {\n    right: 75%;\n  }\n  .row .col.push-m9 {\n    left: 75%;\n  }\n  .row .col.offset-m10 {\n    margin-left: 83.3333333333%;\n  }\n  .row .col.pull-m10 {\n    right: 83.3333333333%;\n  }\n  .row .col.push-m10 {\n    left: 83.3333333333%;\n  }\n  .row .col.offset-m11 {\n    margin-left: 91.6666666667%;\n  }\n  .row .col.pull-m11 {\n    right: 91.6666666667%;\n  }\n  .row .col.push-m11 {\n    left: 91.6666666667%;\n  }\n  .row .col.offset-m12 {\n    margin-left: 100%;\n  }\n  .row .col.pull-m12 {\n    right: 100%;\n  }\n  .row .col.push-m12 {\n    left: 100%;\n  }\n}\n\n@media only screen and (min-width: 993px) {\n  .row .col.l1 {\n    width: 8.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l2 {\n    width: 16.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l3 {\n    width: 25%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l4 {\n    width: 33.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l5 {\n    width: 41.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l6 {\n    width: 50%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l7 {\n    width: 58.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l8 {\n    width: 66.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l9 {\n    width: 75%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l10 {\n    width: 83.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l11 {\n    width: 91.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.l12 {\n    width: 100%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.offset-l1 {\n    margin-left: 8.3333333333%;\n  }\n  .row .col.pull-l1 {\n    right: 8.3333333333%;\n  }\n  .row .col.push-l1 {\n    left: 8.3333333333%;\n  }\n  .row .col.offset-l2 {\n    margin-left: 16.6666666667%;\n  }\n  .row .col.pull-l2 {\n    right: 16.6666666667%;\n  }\n  .row .col.push-l2 {\n    left: 16.6666666667%;\n  }\n  .row .col.offset-l3 {\n    margin-left: 25%;\n  }\n  .row .col.pull-l3 {\n    right: 25%;\n  }\n  .row .col.push-l3 {\n    left: 25%;\n  }\n  .row .col.offset-l4 {\n    margin-left: 33.3333333333%;\n  }\n  .row .col.pull-l4 {\n    right: 33.3333333333%;\n  }\n  .row .col.push-l4 {\n    left: 33.3333333333%;\n  }\n  .row .col.offset-l5 {\n    margin-left: 41.6666666667%;\n  }\n  .row .col.pull-l5 {\n    right: 41.6666666667%;\n  }\n  .row .col.push-l5 {\n    left: 41.6666666667%;\n  }\n  .row .col.offset-l6 {\n    margin-left: 50%;\n  }\n  .row .col.pull-l6 {\n    right: 50%;\n  }\n  .row .col.push-l6 {\n    left: 50%;\n  }\n  .row .col.offset-l7 {\n    margin-left: 58.3333333333%;\n  }\n  .row .col.pull-l7 {\n    right: 58.3333333333%;\n  }\n  .row .col.push-l7 {\n    left: 58.3333333333%;\n  }\n  .row .col.offset-l8 {\n    margin-left: 66.6666666667%;\n  }\n  .row .col.pull-l8 {\n    right: 66.6666666667%;\n  }\n  .row .col.push-l8 {\n    left: 66.6666666667%;\n  }\n  .row .col.offset-l9 {\n    margin-left: 75%;\n  }\n  .row .col.pull-l9 {\n    right: 75%;\n  }\n  .row .col.push-l9 {\n    left: 75%;\n  }\n  .row .col.offset-l10 {\n    margin-left: 83.3333333333%;\n  }\n  .row .col.pull-l10 {\n    right: 83.3333333333%;\n  }\n  .row .col.push-l10 {\n    left: 83.3333333333%;\n  }\n  .row .col.offset-l11 {\n    margin-left: 91.6666666667%;\n  }\n  .row .col.pull-l11 {\n    right: 91.6666666667%;\n  }\n  .row .col.push-l11 {\n    left: 91.6666666667%;\n  }\n  .row .col.offset-l12 {\n    margin-left: 100%;\n  }\n  .row .col.pull-l12 {\n    right: 100%;\n  }\n  .row .col.push-l12 {\n    left: 100%;\n  }\n}\n\n@media only screen and (min-width: 1201px) {\n  .row .col.xl1 {\n    width: 8.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.xl2 {\n    width: 16.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.xl3 {\n    width: 25%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.xl4 {\n    width: 33.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.xl5 {\n    width: 41.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.xl6 {\n    width: 50%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.xl7 {\n    width: 58.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.xl8 {\n    width: 66.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.xl9 {\n    width: 75%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.xl10 {\n    width: 83.3333333333%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.xl11 {\n    width: 91.6666666667%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.xl12 {\n    width: 100%;\n    margin-left: auto;\n    left: auto;\n    right: auto;\n  }\n  .row .col.offset-xl1 {\n    margin-left: 8.3333333333%;\n  }\n  .row .col.pull-xl1 {\n    right: 8.3333333333%;\n  }\n  .row .col.push-xl1 {\n    left: 8.3333333333%;\n  }\n  .row .col.offset-xl2 {\n    margin-left: 16.6666666667%;\n  }\n  .row .col.pull-xl2 {\n    right: 16.6666666667%;\n  }\n  .row .col.push-xl2 {\n    left: 16.6666666667%;\n  }\n  .row .col.offset-xl3 {\n    margin-left: 25%;\n  }\n  .row .col.pull-xl3 {\n    right: 25%;\n  }\n  .row .col.push-xl3 {\n    left: 25%;\n  }\n  .row .col.offset-xl4 {\n    margin-left: 33.3333333333%;\n  }\n  .row .col.pull-xl4 {\n    right: 33.3333333333%;\n  }\n  .row .col.push-xl4 {\n    left: 33.3333333333%;\n  }\n  .row .col.offset-xl5 {\n    margin-left: 41.6666666667%;\n  }\n  .row .col.pull-xl5 {\n    right: 41.6666666667%;\n  }\n  .row .col.push-xl5 {\n    left: 41.6666666667%;\n  }\n  .row .col.offset-xl6 {\n    margin-left: 50%;\n  }\n  .row .col.pull-xl6 {\n    right: 50%;\n  }\n  .row .col.push-xl6 {\n    left: 50%;\n  }\n  .row .col.offset-xl7 {\n    margin-left: 58.3333333333%;\n  }\n  .row .col.pull-xl7 {\n    right: 58.3333333333%;\n  }\n  .row .col.push-xl7 {\n    left: 58.3333333333%;\n  }\n  .row .col.offset-xl8 {\n    margin-left: 66.6666666667%;\n  }\n  .row .col.pull-xl8 {\n    right: 66.6666666667%;\n  }\n  .row .col.push-xl8 {\n    left: 66.6666666667%;\n  }\n  .row .col.offset-xl9 {\n    margin-left: 75%;\n  }\n  .row .col.pull-xl9 {\n    right: 75%;\n  }\n  .row .col.push-xl9 {\n    left: 75%;\n  }\n  .row .col.offset-xl10 {\n    margin-left: 83.3333333333%;\n  }\n  .row .col.pull-xl10 {\n    right: 83.3333333333%;\n  }\n  .row .col.push-xl10 {\n    left: 83.3333333333%;\n  }\n  .row .col.offset-xl11 {\n    margin-left: 91.6666666667%;\n  }\n  .row .col.pull-xl11 {\n    right: 91.6666666667%;\n  }\n  .row .col.push-xl11 {\n    left: 91.6666666667%;\n  }\n  .row .col.offset-xl12 {\n    margin-left: 100%;\n  }\n  .row .col.pull-xl12 {\n    right: 100%;\n  }\n  .row .col.push-xl12 {\n    left: 100%;\n  }\n}\n\nnav {\n  color: #fff;\n  background-color: #ee6e73;\n  width: 100%;\n  height: 56px;\n  line-height: 56px;\n}\n\nnav.nav-extended {\n  height: auto;\n}\n\nnav.nav-extended .nav-wrapper {\n  min-height: 56px;\n  height: auto;\n}\n\nnav.nav-extended .nav-content {\n  position: relative;\n  line-height: normal;\n}\n\nnav a {\n  color: #fff;\n}\n\nnav i,\nnav [class^=\"mdi-\"], nav [class*=\"mdi-\"],\nnav i.material-icons {\n  display: block;\n  font-size: 24px;\n  height: 56px;\n  line-height: 56px;\n}\n\nnav .nav-wrapper {\n  position: relative;\n  height: 100%;\n}\n\n@media only screen and (min-width: 993px) {\n  nav a.sidenav-trigger {\n    display: none;\n  }\n}\n\nnav .sidenav-trigger {\n  float: left;\n  position: relative;\n  z-index: 1;\n  height: 56px;\n  margin: 0 18px;\n}\n\nnav .sidenav-trigger i {\n  height: 56px;\n  line-height: 56px;\n}\n\nnav .brand-logo {\n  position: absolute;\n  color: #fff;\n  display: inline-block;\n  font-size: 2.1rem;\n  padding: 0;\n}\n\nnav .brand-logo.center {\n  left: 50%;\n  -webkit-transform: translateX(-50%);\n          transform: translateX(-50%);\n}\n\n@media only screen and (max-width: 992px) {\n  nav .brand-logo {\n    left: 50%;\n    -webkit-transform: translateX(-50%);\n            transform: translateX(-50%);\n  }\n  nav .brand-logo.left, nav .brand-logo.right {\n    padding: 0;\n    -webkit-transform: none;\n            transform: none;\n  }\n  nav .brand-logo.left {\n    left: 0.5rem;\n  }\n  nav .brand-logo.right {\n    right: 0.5rem;\n    left: auto;\n  }\n}\n\nnav .brand-logo.right {\n  right: 0.5rem;\n  padding: 0;\n}\n\nnav .brand-logo i,\nnav .brand-logo [class^=\"mdi-\"], nav .brand-logo [class*=\"mdi-\"],\nnav .brand-logo i.material-icons {\n  float: left;\n  margin-right: 15px;\n}\n\nnav .nav-title {\n  display: inline-block;\n  font-size: 32px;\n  padding: 28px 0;\n}\n\nnav ul {\n  margin: 0;\n}\n\nnav ul li {\n  -webkit-transition: background-color .3s;\n  transition: background-color .3s;\n  float: left;\n  padding: 0;\n}\n\nnav ul li.active {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n\nnav ul a {\n  -webkit-transition: background-color .3s;\n  transition: background-color .3s;\n  font-size: 1rem;\n  color: #fff;\n  display: block;\n  padding: 0 15px;\n  cursor: pointer;\n}\n\nnav ul a.btn, nav ul a.btn-large, nav ul a.btn-small, nav ul a.btn-large, nav ul a.btn-flat, nav ul a.btn-floating {\n  margin-top: -2px;\n  margin-left: 15px;\n  margin-right: 15px;\n}\n\nnav ul a.btn > .material-icons, nav ul a.btn-large > .material-icons, nav ul a.btn-small > .material-icons, nav ul a.btn-large > .material-icons, nav ul a.btn-flat > .material-icons, nav ul a.btn-floating > .material-icons {\n  height: inherit;\n  line-height: inherit;\n}\n\nnav ul a:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n\nnav ul.left {\n  float: left;\n}\n\nnav form {\n  height: 100%;\n}\n\nnav .input-field {\n  margin: 0;\n  height: 100%;\n}\n\nnav .input-field input {\n  height: 100%;\n  font-size: 1.2rem;\n  border: none;\n  padding-left: 2rem;\n}\n\nnav .input-field input:focus, nav .input-field input[type=text]:valid, nav .input-field input[type=password]:valid, nav .input-field input[type=email]:valid, nav .input-field input[type=url]:valid, nav .input-field input[type=date]:valid {\n  border: none;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\nnav .input-field label {\n  top: 0;\n  left: 0;\n}\n\nnav .input-field label i {\n  color: rgba(255, 255, 255, 0.7);\n  -webkit-transition: color .3s;\n  transition: color .3s;\n}\n\nnav .input-field label.active i {\n  color: #fff;\n}\n\n.navbar-fixed {\n  position: relative;\n  height: 56px;\n  z-index: 997;\n}\n\n.navbar-fixed nav {\n  position: fixed;\n}\n\n@media only screen and (min-width: 601px) {\n  nav.nav-extended .nav-wrapper {\n    min-height: 64px;\n  }\n  nav, nav .nav-wrapper i, nav a.sidenav-trigger, nav a.sidenav-trigger i {\n    height: 64px;\n    line-height: 64px;\n  }\n  .navbar-fixed {\n    height: 64px;\n  }\n}\n\na {\n  text-decoration: none;\n}\n\nhtml {\n  line-height: 1.5;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n  font-weight: normal;\n  color: rgba(0, 0, 0, 0.87);\n}\n\n@media only screen and (min-width: 0) {\n  html {\n    font-size: 14px;\n  }\n}\n\n@media only screen and (min-width: 992px) {\n  html {\n    font-size: 14.5px;\n  }\n}\n\n@media only screen and (min-width: 1200px) {\n  html {\n    font-size: 15px;\n  }\n}\n\nh1, h2, h3, h4, h5, h6 {\n  font-weight: 400;\n  line-height: 1.3;\n}\n\nh1 a, h2 a, h3 a, h4 a, h5 a, h6 a {\n  font-weight: inherit;\n}\n\nh1 {\n  font-size: 4.2rem;\n  line-height: 110%;\n  margin: 2.8rem 0 1.68rem 0;\n}\n\nh2 {\n  font-size: 3.56rem;\n  line-height: 110%;\n  margin: 2.3733333333rem 0 1.424rem 0;\n}\n\nh3 {\n  font-size: 2.92rem;\n  line-height: 110%;\n  margin: 1.9466666667rem 0 1.168rem 0;\n}\n\nh4 {\n  font-size: 2.28rem;\n  line-height: 110%;\n  margin: 1.52rem 0 0.912rem 0;\n}\n\nh5 {\n  font-size: 1.64rem;\n  line-height: 110%;\n  margin: 1.0933333333rem 0 0.656rem 0;\n}\n\nh6 {\n  font-size: 1.15rem;\n  line-height: 110%;\n  margin: 0.7666666667rem 0 0.46rem 0;\n}\n\nem {\n  font-style: italic;\n}\n\nstrong {\n  font-weight: 500;\n}\n\nsmall {\n  font-size: 75%;\n}\n\n.light {\n  font-weight: 300;\n}\n\n.thin {\n  font-weight: 200;\n}\n\n@media only screen and (min-width: 360px) {\n  .flow-text {\n    font-size: 1.2rem;\n  }\n}\n\n@media only screen and (min-width: 390px) {\n  .flow-text {\n    font-size: 1.224rem;\n  }\n}\n\n@media only screen and (min-width: 420px) {\n  .flow-text {\n    font-size: 1.248rem;\n  }\n}\n\n@media only screen and (min-width: 450px) {\n  .flow-text {\n    font-size: 1.272rem;\n  }\n}\n\n@media only screen and (min-width: 480px) {\n  .flow-text {\n    font-size: 1.296rem;\n  }\n}\n\n@media only screen and (min-width: 510px) {\n  .flow-text {\n    font-size: 1.32rem;\n  }\n}\n\n@media only screen and (min-width: 540px) {\n  .flow-text {\n    font-size: 1.344rem;\n  }\n}\n\n@media only screen and (min-width: 570px) {\n  .flow-text {\n    font-size: 1.368rem;\n  }\n}\n\n@media only screen and (min-width: 600px) {\n  .flow-text {\n    font-size: 1.392rem;\n  }\n}\n\n@media only screen and (min-width: 630px) {\n  .flow-text {\n    font-size: 1.416rem;\n  }\n}\n\n@media only screen and (min-width: 660px) {\n  .flow-text {\n    font-size: 1.44rem;\n  }\n}\n\n@media only screen and (min-width: 690px) {\n  .flow-text {\n    font-size: 1.464rem;\n  }\n}\n\n@media only screen and (min-width: 720px) {\n  .flow-text {\n    font-size: 1.488rem;\n  }\n}\n\n@media only screen and (min-width: 750px) {\n  .flow-text {\n    font-size: 1.512rem;\n  }\n}\n\n@media only screen and (min-width: 780px) {\n  .flow-text {\n    font-size: 1.536rem;\n  }\n}\n\n@media only screen and (min-width: 810px) {\n  .flow-text {\n    font-size: 1.56rem;\n  }\n}\n\n@media only screen and (min-width: 840px) {\n  .flow-text {\n    font-size: 1.584rem;\n  }\n}\n\n@media only screen and (min-width: 870px) {\n  .flow-text {\n    font-size: 1.608rem;\n  }\n}\n\n@media only screen and (min-width: 900px) {\n  .flow-text {\n    font-size: 1.632rem;\n  }\n}\n\n@media only screen and (min-width: 930px) {\n  .flow-text {\n    font-size: 1.656rem;\n  }\n}\n\n@media only screen and (min-width: 960px) {\n  .flow-text {\n    font-size: 1.68rem;\n  }\n}\n\n@media only screen and (max-width: 360px) {\n  .flow-text {\n    font-size: 1.2rem;\n  }\n}\n\n.scale-transition {\n  -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;\n  transition: -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;\n  transition: transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;\n  transition: transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63), -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;\n}\n\n.scale-transition.scale-out {\n  -webkit-transform: scale(0);\n          transform: scale(0);\n  -webkit-transition: -webkit-transform .2s !important;\n  transition: -webkit-transform .2s !important;\n  transition: transform .2s !important;\n  transition: transform .2s, -webkit-transform .2s !important;\n}\n\n.scale-transition.scale-in {\n  -webkit-transform: scale(1);\n          transform: scale(1);\n}\n\n.card-panel {\n  -webkit-transition: -webkit-box-shadow .25s;\n  transition: -webkit-box-shadow .25s;\n  transition: box-shadow .25s;\n  transition: box-shadow .25s, -webkit-box-shadow .25s;\n  padding: 24px;\n  margin: 0.5rem 0 1rem 0;\n  border-radius: 2px;\n  background-color: #fff;\n}\n\n.card {\n  position: relative;\n  margin: 0.5rem 0 1rem 0;\n  background-color: #fff;\n  -webkit-transition: -webkit-box-shadow .25s;\n  transition: -webkit-box-shadow .25s;\n  transition: box-shadow .25s;\n  transition: box-shadow .25s, -webkit-box-shadow .25s;\n  border-radius: 2px;\n}\n\n.card .card-title {\n  font-size: 24px;\n  font-weight: 300;\n}\n\n.card .card-title.activator {\n  cursor: pointer;\n}\n\n.card.small, .card.medium, .card.large {\n  position: relative;\n}\n\n.card.small .card-image, .card.medium .card-image, .card.large .card-image {\n  max-height: 60%;\n  overflow: hidden;\n}\n\n.card.small .card-image + .card-content, .card.medium .card-image + .card-content, .card.large .card-image + .card-content {\n  max-height: 40%;\n}\n\n.card.small .card-content, .card.medium .card-content, .card.large .card-content {\n  max-height: 100%;\n  overflow: hidden;\n}\n\n.card.small .card-action, .card.medium .card-action, .card.large .card-action {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  right: 0;\n}\n\n.card.small {\n  height: 300px;\n}\n\n.card.medium {\n  height: 400px;\n}\n\n.card.large {\n  height: 500px;\n}\n\n.card.horizontal {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n}\n\n.card.horizontal.small .card-image, .card.horizontal.medium .card-image, .card.horizontal.large .card-image {\n  height: 100%;\n  max-height: none;\n  overflow: visible;\n}\n\n.card.horizontal.small .card-image img, .card.horizontal.medium .card-image img, .card.horizontal.large .card-image img {\n  height: 100%;\n}\n\n.card.horizontal .card-image {\n  max-width: 50%;\n}\n\n.card.horizontal .card-image img {\n  border-radius: 2px 0 0 2px;\n  max-width: 100%;\n  width: auto;\n}\n\n.card.horizontal .card-stacked {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1;\n  position: relative;\n}\n\n.card.horizontal .card-stacked .card-content {\n  -webkit-box-flex: 1;\n  -webkit-flex-grow: 1;\n      -ms-flex-positive: 1;\n          flex-grow: 1;\n}\n\n.card.sticky-action .card-action {\n  z-index: 2;\n}\n\n.card.sticky-action .card-reveal {\n  z-index: 1;\n  padding-bottom: 64px;\n}\n\n.card .card-image {\n  position: relative;\n}\n\n.card .card-image img {\n  display: block;\n  border-radius: 2px 2px 0 0;\n  position: relative;\n  left: 0;\n  right: 0;\n  top: 0;\n  bottom: 0;\n  width: 100%;\n}\n\n.card .card-image .card-title {\n  color: #fff;\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  max-width: 100%;\n  padding: 24px;\n}\n\n.card .card-content {\n  padding: 24px;\n  border-radius: 0 0 2px 2px;\n}\n\n.card .card-content p {\n  margin: 0;\n}\n\n.card .card-content .card-title {\n  display: block;\n  line-height: 32px;\n  margin-bottom: 8px;\n}\n\n.card .card-content .card-title i {\n  line-height: 32px;\n}\n\n.card .card-action {\n  background-color: inherit;\n  border-top: 1px solid rgba(160, 160, 160, 0.2);\n  position: relative;\n  padding: 16px 24px;\n}\n\n.card .card-action:last-child {\n  border-radius: 0 0 2px 2px;\n}\n\n.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating) {\n  color: #ffab40;\n  margin-right: 24px;\n  -webkit-transition: color .3s ease;\n  transition: color .3s ease;\n  text-transform: uppercase;\n}\n\n.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating):hover {\n  color: #ffd8a6;\n}\n\n.card .card-reveal {\n  padding: 24px;\n  position: absolute;\n  background-color: #fff;\n  width: 100%;\n  overflow-y: auto;\n  left: 0;\n  top: 100%;\n  height: 100%;\n  z-index: 3;\n  display: none;\n}\n\n.card .card-reveal .card-title {\n  cursor: pointer;\n  display: block;\n}\n\n#toast-container {\n  display: block;\n  position: fixed;\n  z-index: 10000;\n}\n\n@media only screen and (max-width: 600px) {\n  #toast-container {\n    min-width: 100%;\n    bottom: 0%;\n  }\n}\n\n@media only screen and (min-width: 601px) and (max-width: 992px) {\n  #toast-container {\n    left: 5%;\n    bottom: 7%;\n    max-width: 90%;\n  }\n}\n\n@media only screen and (min-width: 993px) {\n  #toast-container {\n    top: 10%;\n    right: 7%;\n    max-width: 86%;\n  }\n}\n\n.toast {\n  border-radius: 2px;\n  top: 35px;\n  width: auto;\n  margin-top: 10px;\n  position: relative;\n  max-width: 100%;\n  height: auto;\n  min-height: 48px;\n  line-height: 1.5em;\n  background-color: #323232;\n  padding: 10px 25px;\n  font-size: 1.1rem;\n  font-weight: 300;\n  color: #fff;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-box-pack: justify;\n  -webkit-justify-content: space-between;\n      -ms-flex-pack: justify;\n          justify-content: space-between;\n  cursor: default;\n}\n\n.toast .toast-action {\n  color: #eeff41;\n  font-weight: 500;\n  margin-right: -25px;\n  margin-left: 3rem;\n}\n\n.toast.rounded {\n  border-radius: 24px;\n}\n\n@media only screen and (max-width: 600px) {\n  .toast {\n    width: 100%;\n    border-radius: 0;\n  }\n}\n\n.tabs {\n  position: relative;\n  overflow-x: auto;\n  overflow-y: hidden;\n  height: 48px;\n  width: 100%;\n  background-color: #fff;\n  margin: 0 auto;\n  white-space: nowrap;\n}\n\n.tabs.tabs-transparent {\n  background-color: transparent;\n}\n\n.tabs.tabs-transparent .tab a,\n.tabs.tabs-transparent .tab.disabled a,\n.tabs.tabs-transparent .tab.disabled a:hover {\n  color: rgba(255, 255, 255, 0.7);\n}\n\n.tabs.tabs-transparent .tab a:hover,\n.tabs.tabs-transparent .tab a.active {\n  color: #fff;\n}\n\n.tabs.tabs-transparent .indicator {\n  background-color: #fff;\n}\n\n.tabs.tabs-fixed-width {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n}\n\n.tabs.tabs-fixed-width .tab {\n  -webkit-box-flex: 1;\n  -webkit-flex-grow: 1;\n      -ms-flex-positive: 1;\n          flex-grow: 1;\n}\n\n.tabs .tab {\n  display: inline-block;\n  text-align: center;\n  line-height: 48px;\n  height: 48px;\n  padding: 0;\n  margin: 0;\n  text-transform: uppercase;\n}\n\n.tabs .tab a {\n  color: rgba(238, 110, 115, 0.7);\n  display: block;\n  width: 100%;\n  height: 100%;\n  padding: 0 24px;\n  font-size: 14px;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  -webkit-transition: color .28s ease, background-color .28s ease;\n  transition: color .28s ease, background-color .28s ease;\n}\n\n.tabs .tab a:focus, .tabs .tab a:focus.active {\n  background-color: rgba(246, 178, 181, 0.2);\n  outline: none;\n}\n\n.tabs .tab a:hover, .tabs .tab a.active {\n  background-color: transparent;\n  color: #ee6e73;\n}\n\n.tabs .tab.disabled a,\n.tabs .tab.disabled a:hover {\n  color: rgba(238, 110, 115, 0.4);\n  cursor: default;\n}\n\n.tabs .indicator {\n  position: absolute;\n  bottom: 0;\n  height: 2px;\n  background-color: #f6b2b5;\n  will-change: left, right;\n}\n\n@media only screen and (max-width: 992px) {\n  .tabs {\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -ms-flexbox;\n    display: flex;\n  }\n  .tabs .tab {\n    -webkit-box-flex: 1;\n    -webkit-flex-grow: 1;\n        -ms-flex-positive: 1;\n            flex-grow: 1;\n  }\n  .tabs .tab a {\n    padding: 0 12px;\n  }\n}\n\n.material-tooltip {\n  padding: 10px 8px;\n  font-size: 1rem;\n  z-index: 2000;\n  background-color: transparent;\n  border-radius: 2px;\n  color: #fff;\n  min-height: 36px;\n  line-height: 120%;\n  opacity: 0;\n  position: absolute;\n  text-align: center;\n  max-width: calc(100% - 4px);\n  overflow: hidden;\n  left: 0;\n  top: 0;\n  pointer-events: none;\n  visibility: hidden;\n  background-color: #323232;\n}\n\n.backdrop {\n  position: absolute;\n  opacity: 0;\n  height: 7px;\n  width: 14px;\n  border-radius: 0 0 50% 50%;\n  background-color: #323232;\n  z-index: -1;\n  -webkit-transform-origin: 50% 0%;\n          transform-origin: 50% 0%;\n  visibility: hidden;\n}\n\n.btn, .btn-large, .btn-small,\n.btn-flat {\n  border: none;\n  border-radius: 2px;\n  display: inline-block;\n  height: 36px;\n  line-height: 36px;\n  padding: 0 16px;\n  text-transform: uppercase;\n  vertical-align: middle;\n  -webkit-tap-highlight-color: transparent;\n}\n\n.btn.disabled, .disabled.btn-large, .disabled.btn-small,\n.btn-floating.disabled,\n.btn-large.disabled,\n.btn-small.disabled,\n.btn-flat.disabled,\n.btn:disabled,\n.btn-large:disabled,\n.btn-small:disabled,\n.btn-floating:disabled,\n.btn-large:disabled,\n.btn-small:disabled,\n.btn-flat:disabled,\n.btn[disabled],\n.btn-large[disabled],\n.btn-small[disabled],\n.btn-floating[disabled],\n.btn-large[disabled],\n.btn-small[disabled],\n.btn-flat[disabled] {\n  pointer-events: none;\n  background-color: #DFDFDF !important;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  color: #9F9F9F !important;\n  cursor: default;\n}\n\n.btn.disabled:hover, .disabled.btn-large:hover, .disabled.btn-small:hover,\n.btn-floating.disabled:hover,\n.btn-large.disabled:hover,\n.btn-small.disabled:hover,\n.btn-flat.disabled:hover,\n.btn:disabled:hover,\n.btn-large:disabled:hover,\n.btn-small:disabled:hover,\n.btn-floating:disabled:hover,\n.btn-large:disabled:hover,\n.btn-small:disabled:hover,\n.btn-flat:disabled:hover,\n.btn[disabled]:hover,\n.btn-large[disabled]:hover,\n.btn-small[disabled]:hover,\n.btn-floating[disabled]:hover,\n.btn-large[disabled]:hover,\n.btn-small[disabled]:hover,\n.btn-flat[disabled]:hover {\n  background-color: #DFDFDF !important;\n  color: #9F9F9F !important;\n}\n\n.btn, .btn-large, .btn-small,\n.btn-floating,\n.btn-large,\n.btn-small,\n.btn-flat {\n  font-size: 14px;\n  outline: 0;\n}\n\n.btn i, .btn-large i, .btn-small i,\n.btn-floating i,\n.btn-large i,\n.btn-small i,\n.btn-flat i {\n  font-size: 1.3rem;\n  line-height: inherit;\n}\n\n.btn:focus, .btn-large:focus, .btn-small:focus,\n.btn-floating:focus {\n  background-color: #1d7d74;\n}\n\n.btn, .btn-large, .btn-small {\n  text-decoration: none;\n  color: #fff;\n  background-color: #26a69a;\n  text-align: center;\n  letter-spacing: .5px;\n  -webkit-transition: background-color .2s ease-out;\n  transition: background-color .2s ease-out;\n  cursor: pointer;\n}\n\n.btn:hover, .btn-large:hover, .btn-small:hover {\n  background-color: #2bbbad;\n}\n\n.btn-floating {\n  display: inline-block;\n  color: #fff;\n  position: relative;\n  overflow: hidden;\n  z-index: 1;\n  width: 40px;\n  height: 40px;\n  line-height: 40px;\n  padding: 0;\n  background-color: #26a69a;\n  border-radius: 50%;\n  -webkit-transition: background-color .3s;\n  transition: background-color .3s;\n  cursor: pointer;\n  vertical-align: middle;\n}\n\n.btn-floating:hover {\n  background-color: #26a69a;\n}\n\n.btn-floating:before {\n  border-radius: 0;\n}\n\n.btn-floating.btn-large {\n  width: 56px;\n  height: 56px;\n  padding: 0;\n}\n\n.btn-floating.btn-large.halfway-fab {\n  bottom: -28px;\n}\n\n.btn-floating.btn-large i {\n  line-height: 56px;\n}\n\n.btn-floating.btn-small {\n  width: 32.4px;\n  height: 32.4px;\n}\n\n.btn-floating.btn-small.halfway-fab {\n  bottom: -16.2px;\n}\n\n.btn-floating.btn-small i {\n  line-height: 32.4px;\n}\n\n.btn-floating.halfway-fab {\n  position: absolute;\n  right: 24px;\n  bottom: -20px;\n}\n\n.btn-floating.halfway-fab.left {\n  right: auto;\n  left: 24px;\n}\n\n.btn-floating i {\n  width: inherit;\n  display: inline-block;\n  text-align: center;\n  color: #fff;\n  font-size: 1.6rem;\n  line-height: 40px;\n}\n\nbutton.btn-floating {\n  border: none;\n}\n\n.fixed-action-btn {\n  position: fixed;\n  right: 23px;\n  bottom: 23px;\n  padding-top: 15px;\n  margin-bottom: 0;\n  z-index: 997;\n}\n\n.fixed-action-btn.active ul {\n  visibility: visible;\n}\n\n.fixed-action-btn.direction-left, .fixed-action-btn.direction-right {\n  padding: 0 0 0 15px;\n}\n\n.fixed-action-btn.direction-left ul, .fixed-action-btn.direction-right ul {\n  text-align: right;\n  right: 64px;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n          transform: translateY(-50%);\n  height: 100%;\n  left: auto;\n  /*width 100% only goes to width of button container */\n  width: 500px;\n}\n\n.fixed-action-btn.direction-left ul li, .fixed-action-btn.direction-right ul li {\n  display: inline-block;\n  margin: 7.5px 15px 0 0;\n}\n\n.fixed-action-btn.direction-right {\n  padding: 0 15px 0 0;\n}\n\n.fixed-action-btn.direction-right ul {\n  text-align: left;\n  direction: rtl;\n  left: 64px;\n  right: auto;\n}\n\n.fixed-action-btn.direction-right ul li {\n  margin: 7.5px 0 0 15px;\n}\n\n.fixed-action-btn.direction-bottom {\n  padding: 0 0 15px 0;\n}\n\n.fixed-action-btn.direction-bottom ul {\n  top: 64px;\n  bottom: auto;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: reverse;\n  -webkit-flex-direction: column-reverse;\n      -ms-flex-direction: column-reverse;\n          flex-direction: column-reverse;\n}\n\n.fixed-action-btn.direction-bottom ul li {\n  margin: 15px 0 0 0;\n}\n\n.fixed-action-btn.toolbar {\n  padding: 0;\n  height: 56px;\n}\n\n.fixed-action-btn.toolbar.active > a i {\n  opacity: 0;\n}\n\n.fixed-action-btn.toolbar ul {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  top: 0;\n  bottom: 0;\n  z-index: 1;\n}\n\n.fixed-action-btn.toolbar ul li {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n      -ms-flex: 1;\n          flex: 1;\n  display: inline-block;\n  margin: 0;\n  height: 100%;\n  -webkit-transition: none;\n  transition: none;\n}\n\n.fixed-action-btn.toolbar ul li a {\n  display: block;\n  overflow: hidden;\n  position: relative;\n  width: 100%;\n  height: 100%;\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  color: #fff;\n  line-height: 56px;\n  z-index: 1;\n}\n\n.fixed-action-btn.toolbar ul li a i {\n  line-height: inherit;\n}\n\n.fixed-action-btn ul {\n  left: 0;\n  right: 0;\n  text-align: center;\n  position: absolute;\n  bottom: 64px;\n  margin: 0;\n  visibility: hidden;\n}\n\n.fixed-action-btn ul li {\n  margin-bottom: 15px;\n}\n\n.fixed-action-btn ul a.btn-floating {\n  opacity: 0;\n}\n\n.fixed-action-btn .fab-backdrop {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: -1;\n  width: 40px;\n  height: 40px;\n  background-color: #26a69a;\n  border-radius: 50%;\n  -webkit-transform: scale(0);\n          transform: scale(0);\n}\n\n.btn-flat {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  background-color: transparent;\n  color: #343434;\n  cursor: pointer;\n  -webkit-transition: background-color .2s;\n  transition: background-color .2s;\n}\n\n.btn-flat:focus, .btn-flat:hover {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-flat:focus {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n\n.btn-flat.disabled, .btn-flat.btn-flat[disabled] {\n  background-color: transparent !important;\n  color: #b3b2b2 !important;\n  cursor: default;\n}\n\n.btn-large {\n  height: 54px;\n  line-height: 54px;\n  font-size: 15px;\n  padding: 0 28px;\n}\n\n.btn-large i {\n  font-size: 1.6rem;\n}\n\n.btn-small {\n  height: 32.4px;\n  line-height: 32.4px;\n  font-size: 13px;\n}\n\n.btn-small i {\n  font-size: 1.2rem;\n}\n\n.btn-block {\n  display: block;\n}\n\n.dropdown-content {\n  background-color: #fff;\n  margin: 0;\n  display: none;\n  min-width: 100px;\n  overflow-y: auto;\n  opacity: 0;\n  position: absolute;\n  left: 0;\n  top: 0;\n  z-index: 9999;\n  -webkit-transform-origin: 0 0;\n          transform-origin: 0 0;\n}\n\n.dropdown-content:focus {\n  outline: 0;\n}\n\n.dropdown-content li {\n  clear: both;\n  color: rgba(0, 0, 0, 0.87);\n  cursor: pointer;\n  min-height: 50px;\n  line-height: 1.5rem;\n  width: 100%;\n  text-align: left;\n}\n\n.dropdown-content li:hover, .dropdown-content li.active {\n  background-color: #eee;\n}\n\n.dropdown-content li:focus {\n  outline: none;\n}\n\n.dropdown-content li.divider {\n  min-height: 0;\n  height: 1px;\n}\n\n.dropdown-content li > a, .dropdown-content li > span {\n  font-size: 16px;\n  color: #26a69a;\n  display: block;\n  line-height: 22px;\n  padding: 14px 16px;\n}\n\n.dropdown-content li > span > label {\n  top: 1px;\n  left: 0;\n  height: 18px;\n}\n\n.dropdown-content li > a > i {\n  height: inherit;\n  line-height: inherit;\n  float: left;\n  margin: 0 24px 0 0;\n  width: 24px;\n}\n\nbody.keyboard-focused .dropdown-content li:focus {\n  background-color: #dadada;\n}\n\n.input-field.col .dropdown-content [type=\"checkbox\"] + label {\n  top: 1px;\n  left: 0;\n  height: 18px;\n  -webkit-transform: none;\n          transform: none;\n}\n\n.dropdown-trigger {\n  cursor: pointer;\n}\n\n/*!\r\n * Waves v0.6.0\r\n * http://fian.my.id/Waves\r\n *\r\n * Copyright 2014 Alfiana E. Sibuea and other contributors\r\n * Released under the MIT license\r\n * https://github.com/fians/Waves/blob/master/LICENSE\r\n */\n.waves-effect {\n  position: relative;\n  cursor: pointer;\n  display: inline-block;\n  overflow: hidden;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  -webkit-tap-highlight-color: transparent;\n  vertical-align: middle;\n  z-index: 1;\n  -webkit-transition: .3s ease-out;\n  transition: .3s ease-out;\n}\n\n.waves-effect .waves-ripple {\n  position: absolute;\n  border-radius: 50%;\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  opacity: 0;\n  background: rgba(0, 0, 0, 0.2);\n  -webkit-transition: all 0.7s ease-out;\n  transition: all 0.7s ease-out;\n  -webkit-transition-property: opacity, -webkit-transform;\n  transition-property: opacity, -webkit-transform;\n  transition-property: transform, opacity;\n  transition-property: transform, opacity, -webkit-transform;\n  -webkit-transform: scale(0);\n          transform: scale(0);\n  pointer-events: none;\n}\n\n.waves-effect.waves-light .waves-ripple {\n  background-color: rgba(255, 255, 255, 0.45);\n}\n\n.waves-effect.waves-red .waves-ripple {\n  background-color: rgba(244, 67, 54, 0.7);\n}\n\n.waves-effect.waves-yellow .waves-ripple {\n  background-color: rgba(255, 235, 59, 0.7);\n}\n\n.waves-effect.waves-orange .waves-ripple {\n  background-color: rgba(255, 152, 0, 0.7);\n}\n\n.waves-effect.waves-purple .waves-ripple {\n  background-color: rgba(156, 39, 176, 0.7);\n}\n\n.waves-effect.waves-green .waves-ripple {\n  background-color: rgba(76, 175, 80, 0.7);\n}\n\n.waves-effect.waves-teal .waves-ripple {\n  background-color: rgba(0, 150, 136, 0.7);\n}\n\n.waves-effect input[type=\"button\"], .waves-effect input[type=\"reset\"], .waves-effect input[type=\"submit\"] {\n  border: 0;\n  font-style: normal;\n  font-size: inherit;\n  text-transform: inherit;\n  background: none;\n}\n\n.waves-effect img {\n  position: relative;\n  z-index: -1;\n}\n\n.waves-notransition {\n  -webkit-transition: none !important;\n  transition: none !important;\n}\n\n.waves-circle {\n  -webkit-transform: translateZ(0);\n          transform: translateZ(0);\n  -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%);\n}\n\n.waves-input-wrapper {\n  border-radius: 0.2em;\n  vertical-align: bottom;\n}\n\n.waves-input-wrapper .waves-button-input {\n  position: relative;\n  top: 0;\n  left: 0;\n  z-index: 1;\n}\n\n.waves-circle {\n  text-align: center;\n  width: 2.5em;\n  height: 2.5em;\n  line-height: 2.5em;\n  border-radius: 50%;\n  -webkit-mask-image: none;\n}\n\n.waves-block {\n  display: block;\n}\n\n/* Firefox Bug: link not triggered */\n.waves-effect .waves-ripple {\n  z-index: -1;\n}\n\n.modal {\n  display: none;\n  position: fixed;\n  left: 0;\n  right: 0;\n  background-color: #fafafa;\n  padding: 0;\n  max-height: 70%;\n  width: 55%;\n  margin: auto;\n  overflow-y: auto;\n  border-radius: 2px;\n  will-change: top, opacity;\n}\n\n.modal:focus {\n  outline: none;\n}\n\n@media only screen and (max-width: 992px) {\n  .modal {\n    width: 80%;\n  }\n}\n\n.modal h1, .modal h2, .modal h3, .modal h4 {\n  margin-top: 0;\n}\n\n.modal .modal-content {\n  padding: 24px;\n}\n\n.modal .modal-close {\n  cursor: pointer;\n}\n\n.modal .modal-footer {\n  border-radius: 0 0 2px 2px;\n  background-color: #fafafa;\n  padding: 4px 6px;\n  height: 56px;\n  width: 100%;\n  text-align: right;\n}\n\n.modal .modal-footer .btn, .modal .modal-footer .btn-large, .modal .modal-footer .btn-small, .modal .modal-footer .btn-flat {\n  margin: 6px 0;\n}\n\n.modal-overlay {\n  position: fixed;\n  z-index: 999;\n  top: -25%;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  height: 125%;\n  width: 100%;\n  background: #000;\n  display: none;\n  will-change: opacity;\n}\n\n.modal.modal-fixed-footer {\n  padding: 0;\n  height: 70%;\n}\n\n.modal.modal-fixed-footer .modal-content {\n  position: absolute;\n  height: calc(100% - 56px);\n  max-height: 100%;\n  width: 100%;\n  overflow-y: auto;\n}\n\n.modal.modal-fixed-footer .modal-footer {\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n  position: absolute;\n  bottom: 0;\n}\n\n.modal.bottom-sheet {\n  top: auto;\n  bottom: -100%;\n  margin: 0;\n  width: 100%;\n  max-height: 45%;\n  border-radius: 0;\n  will-change: bottom, opacity;\n}\n\n.collapsible {\n  border-top: 1px solid #ddd;\n  border-right: 1px solid #ddd;\n  border-left: 1px solid #ddd;\n  margin: 0.5rem 0 1rem 0;\n}\n\n.collapsible-header {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  cursor: pointer;\n  -webkit-tap-highlight-color: transparent;\n  line-height: 1.5;\n  padding: 1rem;\n  background-color: #fff;\n  border-bottom: 1px solid #ddd;\n}\n\n.collapsible-header:focus {\n  outline: 0;\n}\n\n.collapsible-header i {\n  width: 2rem;\n  font-size: 1.6rem;\n  display: inline-block;\n  text-align: center;\n  margin-right: 1rem;\n}\n\n.keyboard-focused .collapsible-header:focus {\n  background-color: #eee;\n}\n\n.collapsible-body {\n  display: none;\n  border-bottom: 1px solid #ddd;\n  -webkit-box-sizing: border-box;\n          box-sizing: border-box;\n  padding: 2rem;\n}\n\n.sidenav .collapsible,\n.sidenav.fixed .collapsible {\n  border: none;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.sidenav .collapsible li,\n.sidenav.fixed .collapsible li {\n  padding: 0;\n}\n\n.sidenav .collapsible-header,\n.sidenav.fixed .collapsible-header {\n  background-color: transparent;\n  border: none;\n  line-height: inherit;\n  height: inherit;\n  padding: 0 16px;\n}\n\n.sidenav .collapsible-header:hover,\n.sidenav.fixed .collapsible-header:hover {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n.sidenav .collapsible-header i,\n.sidenav.fixed .collapsible-header i {\n  line-height: inherit;\n}\n\n.sidenav .collapsible-body,\n.sidenav.fixed .collapsible-body {\n  border: 0;\n  background-color: #fff;\n}\n\n.sidenav .collapsible-body li a,\n.sidenav.fixed .collapsible-body li a {\n  padding: 0 23.5px 0 31px;\n}\n\n.collapsible.popout {\n  border: none;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.collapsible.popout > li {\n  -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);\n          box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);\n  margin: 0 24px;\n  -webkit-transition: margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n  transition: margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n}\n\n.collapsible.popout > li.active {\n  -webkit-box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);\n  margin: 16px 0;\n}\n\n.chip {\n  display: inline-block;\n  height: 32px;\n  font-size: 13px;\n  font-weight: 500;\n  color: rgba(0, 0, 0, 0.6);\n  line-height: 32px;\n  padding: 0 12px;\n  border-radius: 16px;\n  background-color: #e4e4e4;\n  margin-bottom: 5px;\n  margin-right: 5px;\n}\n\n.chip:focus {\n  outline: none;\n  background-color: #26a69a;\n  color: #fff;\n}\n\n.chip > img {\n  float: left;\n  margin: 0 8px 0 -12px;\n  height: 32px;\n  width: 32px;\n  border-radius: 50%;\n}\n\n.chip .close {\n  cursor: pointer;\n  float: right;\n  font-size: 16px;\n  line-height: 32px;\n  padding-left: 8px;\n}\n\n.chips {\n  border: none;\n  border-bottom: 1px solid #9e9e9e;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  margin: 0 0 8px 0;\n  min-height: 45px;\n  outline: none;\n  -webkit-transition: all .3s;\n  transition: all .3s;\n}\n\n.chips.focus {\n  border-bottom: 1px solid #26a69a;\n  -webkit-box-shadow: 0 1px 0 0 #26a69a;\n          box-shadow: 0 1px 0 0 #26a69a;\n}\n\n.chips:hover {\n  cursor: text;\n}\n\n.chips .input {\n  background: none;\n  border: 0;\n  color: rgba(0, 0, 0, 0.6);\n  display: inline-block;\n  font-size: 16px;\n  height: 3rem;\n  line-height: 32px;\n  outline: 0;\n  margin: 0;\n  padding: 0 !important;\n  width: 120px !important;\n}\n\n.chips .input:focus {\n  border: 0 !important;\n  -webkit-box-shadow: none !important;\n          box-shadow: none !important;\n}\n\n.chips .autocomplete-content {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.prefix ~ .chips {\n  margin-left: 3rem;\n  width: 92%;\n  width: calc(100% - 3rem);\n}\n\n.chips:empty ~ label {\n  font-size: 0.8rem;\n  -webkit-transform: translateY(-140%);\n          transform: translateY(-140%);\n}\n\n.materialboxed {\n  display: block;\n  cursor: -webkit-zoom-in;\n  cursor: zoom-in;\n  position: relative;\n  -webkit-transition: opacity .4s;\n  transition: opacity .4s;\n  -webkit-backface-visibility: hidden;\n}\n\n.materialboxed:hover:not(.active) {\n  opacity: .8;\n}\n\n.materialboxed.active {\n  cursor: -webkit-zoom-out;\n  cursor: zoom-out;\n}\n\n#materialbox-overlay {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: #292929;\n  z-index: 1000;\n  will-change: opacity;\n}\n\n.materialbox-caption {\n  position: fixed;\n  display: none;\n  color: #fff;\n  line-height: 50px;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  text-align: center;\n  padding: 0% 15%;\n  height: 50px;\n  z-index: 1000;\n  -webkit-font-smoothing: antialiased;\n}\n\nselect:focus {\n  outline: 1px solid #c9f3ef;\n}\n\nbutton:focus {\n  outline: none;\n  background-color: #2ab7a9;\n}\n\nlabel {\n  font-size: 0.8rem;\n  color: #9e9e9e;\n}\n\n/* Text Inputs + Textarea\n   ========================================================================== */\n/* Style Placeholders */\n::-webkit-input-placeholder {\n  color: #d1d1d1;\n}\n::-moz-placeholder {\n  color: #d1d1d1;\n}\n:-ms-input-placeholder {\n  color: #d1d1d1;\n}\n::-ms-input-placeholder {\n  color: #d1d1d1;\n}\n::placeholder {\n  color: #d1d1d1;\n}\n\n/* Text inputs */\ninput:not([type]),\ninput[type=text]:not(.browser-default),\ninput[type=password]:not(.browser-default),\ninput[type=email]:not(.browser-default),\ninput[type=url]:not(.browser-default),\ninput[type=time]:not(.browser-default),\ninput[type=date]:not(.browser-default),\ninput[type=datetime]:not(.browser-default),\ninput[type=datetime-local]:not(.browser-default),\ninput[type=tel]:not(.browser-default),\ninput[type=number]:not(.browser-default),\ninput[type=search]:not(.browser-default),\ntextarea.materialize-textarea {\n  background-color: transparent;\n  border: none;\n  border-bottom: 1px solid #9e9e9e;\n  border-radius: 0;\n  outline: none;\n  height: 3rem;\n  width: 100%;\n  font-size: 16px;\n  margin: 0 0 8px 0;\n  padding: 0;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  -webkit-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-transition: border .3s, -webkit-box-shadow .3s;\n  transition: border .3s, -webkit-box-shadow .3s;\n  transition: box-shadow .3s, border .3s;\n  transition: box-shadow .3s, border .3s, -webkit-box-shadow .3s;\n}\n\ninput:not([type]):disabled, input:not([type])[readonly=\"readonly\"],\ninput[type=text]:not(.browser-default):disabled,\ninput[type=text]:not(.browser-default)[readonly=\"readonly\"],\ninput[type=password]:not(.browser-default):disabled,\ninput[type=password]:not(.browser-default)[readonly=\"readonly\"],\ninput[type=email]:not(.browser-default):disabled,\ninput[type=email]:not(.browser-default)[readonly=\"readonly\"],\ninput[type=url]:not(.browser-default):disabled,\ninput[type=url]:not(.browser-default)[readonly=\"readonly\"],\ninput[type=time]:not(.browser-default):disabled,\ninput[type=time]:not(.browser-default)[readonly=\"readonly\"],\ninput[type=date]:not(.browser-default):disabled,\ninput[type=date]:not(.browser-default)[readonly=\"readonly\"],\ninput[type=datetime]:not(.browser-default):disabled,\ninput[type=datetime]:not(.browser-default)[readonly=\"readonly\"],\ninput[type=datetime-local]:not(.browser-default):disabled,\ninput[type=datetime-local]:not(.browser-default)[readonly=\"readonly\"],\ninput[type=tel]:not(.browser-default):disabled,\ninput[type=tel]:not(.browser-default)[readonly=\"readonly\"],\ninput[type=number]:not(.browser-default):disabled,\ninput[type=number]:not(.browser-default)[readonly=\"readonly\"],\ninput[type=search]:not(.browser-default):disabled,\ninput[type=search]:not(.browser-default)[readonly=\"readonly\"],\ntextarea.materialize-textarea:disabled,\ntextarea.materialize-textarea[readonly=\"readonly\"] {\n  color: rgba(0, 0, 0, 0.42);\n  border-bottom: 1px dotted rgba(0, 0, 0, 0.42);\n}\n\ninput:not([type]):disabled + label,\ninput:not([type])[readonly=\"readonly\"] + label,\ninput[type=text]:not(.browser-default):disabled + label,\ninput[type=text]:not(.browser-default)[readonly=\"readonly\"] + label,\ninput[type=password]:not(.browser-default):disabled + label,\ninput[type=password]:not(.browser-default)[readonly=\"readonly\"] + label,\ninput[type=email]:not(.browser-default):disabled + label,\ninput[type=email]:not(.browser-default)[readonly=\"readonly\"] + label,\ninput[type=url]:not(.browser-default):disabled + label,\ninput[type=url]:not(.browser-default)[readonly=\"readonly\"] + label,\ninput[type=time]:not(.browser-default):disabled + label,\ninput[type=time]:not(.browser-default)[readonly=\"readonly\"] + label,\ninput[type=date]:not(.browser-default):disabled + label,\ninput[type=date]:not(.browser-default)[readonly=\"readonly\"] + label,\ninput[type=datetime]:not(.browser-default):disabled + label,\ninput[type=datetime]:not(.browser-default)[readonly=\"readonly\"] + label,\ninput[type=datetime-local]:not(.browser-default):disabled + label,\ninput[type=datetime-local]:not(.browser-default)[readonly=\"readonly\"] + label,\ninput[type=tel]:not(.browser-default):disabled + label,\ninput[type=tel]:not(.browser-default)[readonly=\"readonly\"] + label,\ninput[type=number]:not(.browser-default):disabled + label,\ninput[type=number]:not(.browser-default)[readonly=\"readonly\"] + label,\ninput[type=search]:not(.browser-default):disabled + label,\ninput[type=search]:not(.browser-default)[readonly=\"readonly\"] + label,\ntextarea.materialize-textarea:disabled + label,\ntextarea.materialize-textarea[readonly=\"readonly\"] + label {\n  color: rgba(0, 0, 0, 0.42);\n}\n\ninput:not([type]):focus:not([readonly]),\ninput[type=text]:not(.browser-default):focus:not([readonly]),\ninput[type=password]:not(.browser-default):focus:not([readonly]),\ninput[type=email]:not(.browser-default):focus:not([readonly]),\ninput[type=url]:not(.browser-default):focus:not([readonly]),\ninput[type=time]:not(.browser-default):focus:not([readonly]),\ninput[type=date]:not(.browser-default):focus:not([readonly]),\ninput[type=datetime]:not(.browser-default):focus:not([readonly]),\ninput[type=datetime-local]:not(.browser-default):focus:not([readonly]),\ninput[type=tel]:not(.browser-default):focus:not([readonly]),\ninput[type=number]:not(.browser-default):focus:not([readonly]),\ninput[type=search]:not(.browser-default):focus:not([readonly]),\ntextarea.materialize-textarea:focus:not([readonly]) {\n  border-bottom: 1px solid #26a69a;\n  -webkit-box-shadow: 0 1px 0 0 #26a69a;\n          box-shadow: 0 1px 0 0 #26a69a;\n}\n\ninput:not([type]):focus:not([readonly]) + label,\ninput[type=text]:not(.browser-default):focus:not([readonly]) + label,\ninput[type=password]:not(.browser-default):focus:not([readonly]) + label,\ninput[type=email]:not(.browser-default):focus:not([readonly]) + label,\ninput[type=url]:not(.browser-default):focus:not([readonly]) + label,\ninput[type=time]:not(.browser-default):focus:not([readonly]) + label,\ninput[type=date]:not(.browser-default):focus:not([readonly]) + label,\ninput[type=datetime]:not(.browser-default):focus:not([readonly]) + label,\ninput[type=datetime-local]:not(.browser-default):focus:not([readonly]) + label,\ninput[type=tel]:not(.browser-default):focus:not([readonly]) + label,\ninput[type=number]:not(.browser-default):focus:not([readonly]) + label,\ninput[type=search]:not(.browser-default):focus:not([readonly]) + label,\ntextarea.materialize-textarea:focus:not([readonly]) + label {\n  color: #26a69a;\n}\n\ninput:not([type]):focus.valid ~ label,\ninput[type=text]:not(.browser-default):focus.valid ~ label,\ninput[type=password]:not(.browser-default):focus.valid ~ label,\ninput[type=email]:not(.browser-default):focus.valid ~ label,\ninput[type=url]:not(.browser-default):focus.valid ~ label,\ninput[type=time]:not(.browser-default):focus.valid ~ label,\ninput[type=date]:not(.browser-default):focus.valid ~ label,\ninput[type=datetime]:not(.browser-default):focus.valid ~ label,\ninput[type=datetime-local]:not(.browser-default):focus.valid ~ label,\ninput[type=tel]:not(.browser-default):focus.valid ~ label,\ninput[type=number]:not(.browser-default):focus.valid ~ label,\ninput[type=search]:not(.browser-default):focus.valid ~ label,\ntextarea.materialize-textarea:focus.valid ~ label {\n  color: #4CAF50;\n}\n\ninput:not([type]):focus.invalid ~ label,\ninput[type=text]:not(.browser-default):focus.invalid ~ label,\ninput[type=password]:not(.browser-default):focus.invalid ~ label,\ninput[type=email]:not(.browser-default):focus.invalid ~ label,\ninput[type=url]:not(.browser-default):focus.invalid ~ label,\ninput[type=time]:not(.browser-default):focus.invalid ~ label,\ninput[type=date]:not(.browser-default):focus.invalid ~ label,\ninput[type=datetime]:not(.browser-default):focus.invalid ~ label,\ninput[type=datetime-local]:not(.browser-default):focus.invalid ~ label,\ninput[type=tel]:not(.browser-default):focus.invalid ~ label,\ninput[type=number]:not(.browser-default):focus.invalid ~ label,\ninput[type=search]:not(.browser-default):focus.invalid ~ label,\ntextarea.materialize-textarea:focus.invalid ~ label {\n  color: #F44336;\n}\n\ninput:not([type]).validate + label,\ninput[type=text]:not(.browser-default).validate + label,\ninput[type=password]:not(.browser-default).validate + label,\ninput[type=email]:not(.browser-default).validate + label,\ninput[type=url]:not(.browser-default).validate + label,\ninput[type=time]:not(.browser-default).validate + label,\ninput[type=date]:not(.browser-default).validate + label,\ninput[type=datetime]:not(.browser-default).validate + label,\ninput[type=datetime-local]:not(.browser-default).validate + label,\ninput[type=tel]:not(.browser-default).validate + label,\ninput[type=number]:not(.browser-default).validate + label,\ninput[type=search]:not(.browser-default).validate + label,\ntextarea.materialize-textarea.validate + label {\n  width: 100%;\n}\n\n/* Validation Sass Placeholders */\ninput.valid:not([type]), input.valid:not([type]):focus,\ninput.valid[type=text]:not(.browser-default),\ninput.valid[type=text]:not(.browser-default):focus,\ninput.valid[type=password]:not(.browser-default),\ninput.valid[type=password]:not(.browser-default):focus,\ninput.valid[type=email]:not(.browser-default),\ninput.valid[type=email]:not(.browser-default):focus,\ninput.valid[type=url]:not(.browser-default),\ninput.valid[type=url]:not(.browser-default):focus,\ninput.valid[type=time]:not(.browser-default),\ninput.valid[type=time]:not(.browser-default):focus,\ninput.valid[type=date]:not(.browser-default),\ninput.valid[type=date]:not(.browser-default):focus,\ninput.valid[type=datetime]:not(.browser-default),\ninput.valid[type=datetime]:not(.browser-default):focus,\ninput.valid[type=datetime-local]:not(.browser-default),\ninput.valid[type=datetime-local]:not(.browser-default):focus,\ninput.valid[type=tel]:not(.browser-default),\ninput.valid[type=tel]:not(.browser-default):focus,\ninput.valid[type=number]:not(.browser-default),\ninput.valid[type=number]:not(.browser-default):focus,\ninput.valid[type=search]:not(.browser-default),\ninput.valid[type=search]:not(.browser-default):focus,\ntextarea.materialize-textarea.valid,\ntextarea.materialize-textarea.valid:focus, .select-wrapper.valid > input.select-dropdown {\n  border-bottom: 1px solid #4CAF50;\n  -webkit-box-shadow: 0 1px 0 0 #4CAF50;\n          box-shadow: 0 1px 0 0 #4CAF50;\n}\n\ninput.invalid:not([type]), input.invalid:not([type]):focus,\ninput.invalid[type=text]:not(.browser-default),\ninput.invalid[type=text]:not(.browser-default):focus,\ninput.invalid[type=password]:not(.browser-default),\ninput.invalid[type=password]:not(.browser-default):focus,\ninput.invalid[type=email]:not(.browser-default),\ninput.invalid[type=email]:not(.browser-default):focus,\ninput.invalid[type=url]:not(.browser-default),\ninput.invalid[type=url]:not(.browser-default):focus,\ninput.invalid[type=time]:not(.browser-default),\ninput.invalid[type=time]:not(.browser-default):focus,\ninput.invalid[type=date]:not(.browser-default),\ninput.invalid[type=date]:not(.browser-default):focus,\ninput.invalid[type=datetime]:not(.browser-default),\ninput.invalid[type=datetime]:not(.browser-default):focus,\ninput.invalid[type=datetime-local]:not(.browser-default),\ninput.invalid[type=datetime-local]:not(.browser-default):focus,\ninput.invalid[type=tel]:not(.browser-default),\ninput.invalid[type=tel]:not(.browser-default):focus,\ninput.invalid[type=number]:not(.browser-default),\ninput.invalid[type=number]:not(.browser-default):focus,\ninput.invalid[type=search]:not(.browser-default),\ninput.invalid[type=search]:not(.browser-default):focus,\ntextarea.materialize-textarea.invalid,\ntextarea.materialize-textarea.invalid:focus, .select-wrapper.invalid > input.select-dropdown,\n.select-wrapper.invalid > input.select-dropdown:focus {\n  border-bottom: 1px solid #F44336;\n  -webkit-box-shadow: 0 1px 0 0 #F44336;\n          box-shadow: 0 1px 0 0 #F44336;\n}\n\ninput:not([type]).valid ~ .helper-text[data-success],\ninput:not([type]):focus.valid ~ .helper-text[data-success],\ninput:not([type]).invalid ~ .helper-text[data-error],\ninput:not([type]):focus.invalid ~ .helper-text[data-error],\ninput[type=text]:not(.browser-default).valid ~ .helper-text[data-success],\ninput[type=text]:not(.browser-default):focus.valid ~ .helper-text[data-success],\ninput[type=text]:not(.browser-default).invalid ~ .helper-text[data-error],\ninput[type=text]:not(.browser-default):focus.invalid ~ .helper-text[data-error],\ninput[type=password]:not(.browser-default).valid ~ .helper-text[data-success],\ninput[type=password]:not(.browser-default):focus.valid ~ .helper-text[data-success],\ninput[type=password]:not(.browser-default).invalid ~ .helper-text[data-error],\ninput[type=password]:not(.browser-default):focus.invalid ~ .helper-text[data-error],\ninput[type=email]:not(.browser-default).valid ~ .helper-text[data-success],\ninput[type=email]:not(.browser-default):focus.valid ~ .helper-text[data-success],\ninput[type=email]:not(.browser-default).invalid ~ .helper-text[data-error],\ninput[type=email]:not(.browser-default):focus.invalid ~ .helper-text[data-error],\ninput[type=url]:not(.browser-default).valid ~ .helper-text[data-success],\ninput[type=url]:not(.browser-default):focus.valid ~ .helper-text[data-success],\ninput[type=url]:not(.browser-default).invalid ~ .helper-text[data-error],\ninput[type=url]:not(.browser-default):focus.invalid ~ .helper-text[data-error],\ninput[type=time]:not(.browser-default).valid ~ .helper-text[data-success],\ninput[type=time]:not(.browser-default):focus.valid ~ .helper-text[data-success],\ninput[type=time]:not(.browser-default).invalid ~ .helper-text[data-error],\ninput[type=time]:not(.browser-default):focus.invalid ~ .helper-text[data-error],\ninput[type=date]:not(.browser-default).valid ~ .helper-text[data-success],\ninput[type=date]:not(.browser-default):focus.valid ~ .helper-text[data-success],\ninput[type=date]:not(.browser-default).invalid ~ .helper-text[data-error],\ninput[type=date]:not(.browser-default):focus.invalid ~ .helper-text[data-error],\ninput[type=datetime]:not(.browser-default).valid ~ .helper-text[data-success],\ninput[type=datetime]:not(.browser-default):focus.valid ~ .helper-text[data-success],\ninput[type=datetime]:not(.browser-default).invalid ~ .helper-text[data-error],\ninput[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text[data-error],\ninput[type=datetime-local]:not(.browser-default).valid ~ .helper-text[data-success],\ninput[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text[data-success],\ninput[type=datetime-local]:not(.browser-default).invalid ~ .helper-text[data-error],\ninput[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text[data-error],\ninput[type=tel]:not(.browser-default).valid ~ .helper-text[data-success],\ninput[type=tel]:not(.browser-default):focus.valid ~ .helper-text[data-success],\ninput[type=tel]:not(.browser-default).invalid ~ .helper-text[data-error],\ninput[type=tel]:not(.browser-default):focus.invalid ~ .helper-text[data-error],\ninput[type=number]:not(.browser-default).valid ~ .helper-text[data-success],\ninput[type=number]:not(.browser-default):focus.valid ~ .helper-text[data-success],\ninput[type=number]:not(.browser-default).invalid ~ .helper-text[data-error],\ninput[type=number]:not(.browser-default):focus.invalid ~ .helper-text[data-error],\ninput[type=search]:not(.browser-default).valid ~ .helper-text[data-success],\ninput[type=search]:not(.browser-default):focus.valid ~ .helper-text[data-success],\ninput[type=search]:not(.browser-default).invalid ~ .helper-text[data-error],\ninput[type=search]:not(.browser-default):focus.invalid ~ .helper-text[data-error],\ntextarea.materialize-textarea.valid ~ .helper-text[data-success],\ntextarea.materialize-textarea:focus.valid ~ .helper-text[data-success],\ntextarea.materialize-textarea.invalid ~ .helper-text[data-error],\ntextarea.materialize-textarea:focus.invalid ~ .helper-text[data-error], .select-wrapper.valid .helper-text[data-success],\n.select-wrapper.invalid ~ .helper-text[data-error] {\n  color: transparent;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  pointer-events: none;\n}\n\ninput:not([type]).valid ~ .helper-text:after,\ninput:not([type]):focus.valid ~ .helper-text:after,\ninput[type=text]:not(.browser-default).valid ~ .helper-text:after,\ninput[type=text]:not(.browser-default):focus.valid ~ .helper-text:after,\ninput[type=password]:not(.browser-default).valid ~ .helper-text:after,\ninput[type=password]:not(.browser-default):focus.valid ~ .helper-text:after,\ninput[type=email]:not(.browser-default).valid ~ .helper-text:after,\ninput[type=email]:not(.browser-default):focus.valid ~ .helper-text:after,\ninput[type=url]:not(.browser-default).valid ~ .helper-text:after,\ninput[type=url]:not(.browser-default):focus.valid ~ .helper-text:after,\ninput[type=time]:not(.browser-default).valid ~ .helper-text:after,\ninput[type=time]:not(.browser-default):focus.valid ~ .helper-text:after,\ninput[type=date]:not(.browser-default).valid ~ .helper-text:after,\ninput[type=date]:not(.browser-default):focus.valid ~ .helper-text:after,\ninput[type=datetime]:not(.browser-default).valid ~ .helper-text:after,\ninput[type=datetime]:not(.browser-default):focus.valid ~ .helper-text:after,\ninput[type=datetime-local]:not(.browser-default).valid ~ .helper-text:after,\ninput[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text:after,\ninput[type=tel]:not(.browser-default).valid ~ .helper-text:after,\ninput[type=tel]:not(.browser-default):focus.valid ~ .helper-text:after,\ninput[type=number]:not(.browser-default).valid ~ .helper-text:after,\ninput[type=number]:not(.browser-default):focus.valid ~ .helper-text:after,\ninput[type=search]:not(.browser-default).valid ~ .helper-text:after,\ninput[type=search]:not(.browser-default):focus.valid ~ .helper-text:after,\ntextarea.materialize-textarea.valid ~ .helper-text:after,\ntextarea.materialize-textarea:focus.valid ~ .helper-text:after, .select-wrapper.valid ~ .helper-text:after {\n  content: attr(data-success);\n  color: #4CAF50;\n}\n\ninput:not([type]).invalid ~ .helper-text:after,\ninput:not([type]):focus.invalid ~ .helper-text:after,\ninput[type=text]:not(.browser-default).invalid ~ .helper-text:after,\ninput[type=text]:not(.browser-default):focus.invalid ~ .helper-text:after,\ninput[type=password]:not(.browser-default).invalid ~ .helper-text:after,\ninput[type=password]:not(.browser-default):focus.invalid ~ .helper-text:after,\ninput[type=email]:not(.browser-default).invalid ~ .helper-text:after,\ninput[type=email]:not(.browser-default):focus.invalid ~ .helper-text:after,\ninput[type=url]:not(.browser-default).invalid ~ .helper-text:after,\ninput[type=url]:not(.browser-default):focus.invalid ~ .helper-text:after,\ninput[type=time]:not(.browser-default).invalid ~ .helper-text:after,\ninput[type=time]:not(.browser-default):focus.invalid ~ .helper-text:after,\ninput[type=date]:not(.browser-default).invalid ~ .helper-text:after,\ninput[type=date]:not(.browser-default):focus.invalid ~ .helper-text:after,\ninput[type=datetime]:not(.browser-default).invalid ~ .helper-text:after,\ninput[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text:after,\ninput[type=datetime-local]:not(.browser-default).invalid ~ .helper-text:after,\ninput[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text:after,\ninput[type=tel]:not(.browser-default).invalid ~ .helper-text:after,\ninput[type=tel]:not(.browser-default):focus.invalid ~ .helper-text:after,\ninput[type=number]:not(.browser-default).invalid ~ .helper-text:after,\ninput[type=number]:not(.browser-default):focus.invalid ~ .helper-text:after,\ninput[type=search]:not(.browser-default).invalid ~ .helper-text:after,\ninput[type=search]:not(.browser-default):focus.invalid ~ .helper-text:after,\ntextarea.materialize-textarea.invalid ~ .helper-text:after,\ntextarea.materialize-textarea:focus.invalid ~ .helper-text:after, .select-wrapper.invalid ~ .helper-text:after {\n  content: attr(data-error);\n  color: #F44336;\n}\n\ninput:not([type]) + label:after,\ninput[type=text]:not(.browser-default) + label:after,\ninput[type=password]:not(.browser-default) + label:after,\ninput[type=email]:not(.browser-default) + label:after,\ninput[type=url]:not(.browser-default) + label:after,\ninput[type=time]:not(.browser-default) + label:after,\ninput[type=date]:not(.browser-default) + label:after,\ninput[type=datetime]:not(.browser-default) + label:after,\ninput[type=datetime-local]:not(.browser-default) + label:after,\ninput[type=tel]:not(.browser-default) + label:after,\ninput[type=number]:not(.browser-default) + label:after,\ninput[type=search]:not(.browser-default) + label:after,\ntextarea.materialize-textarea + label:after, .select-wrapper + label:after {\n  display: block;\n  content: \"\";\n  position: absolute;\n  top: 100%;\n  left: 0;\n  opacity: 0;\n  -webkit-transition: .2s opacity ease-out, .2s color ease-out;\n  transition: .2s opacity ease-out, .2s color ease-out;\n}\n\n.input-field {\n  position: relative;\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n}\n\n.input-field.inline {\n  display: inline-block;\n  vertical-align: middle;\n  margin-left: 5px;\n}\n\n.input-field.inline input,\n.input-field.inline .select-dropdown {\n  margin-bottom: 1rem;\n}\n\n.input-field.col label {\n  left: 0.75rem;\n}\n\n.input-field.col .prefix ~ label,\n.input-field.col .prefix ~ .validate ~ label {\n  width: calc(100% - 3rem - 1.5rem);\n}\n\n.input-field > label {\n  color: #9e9e9e;\n  position: absolute;\n  top: 0;\n  left: 0;\n  font-size: 1rem;\n  cursor: text;\n  -webkit-transition: color .2s ease-out, -webkit-transform .2s ease-out;\n  transition: color .2s ease-out, -webkit-transform .2s ease-out;\n  transition: transform .2s ease-out, color .2s ease-out;\n  transition: transform .2s ease-out, color .2s ease-out, -webkit-transform .2s ease-out;\n  -webkit-transform-origin: 0% 100%;\n          transform-origin: 0% 100%;\n  text-align: initial;\n  -webkit-transform: translateY(12px);\n          transform: translateY(12px);\n}\n\n.input-field > label:not(.label-icon).active {\n  -webkit-transform: translateY(-14px) scale(0.8);\n          transform: translateY(-14px) scale(0.8);\n  -webkit-transform-origin: 0 0;\n          transform-origin: 0 0;\n}\n\n.input-field > input[type]:-webkit-autofill:not(.browser-default):not([type=\"search\"]) + label,\n.input-field > input[type=date]:not(.browser-default) + label,\n.input-field > input[type=time]:not(.browser-default) + label {\n  -webkit-transform: translateY(-14px) scale(0.8);\n          transform: translateY(-14px) scale(0.8);\n  -webkit-transform-origin: 0 0;\n          transform-origin: 0 0;\n}\n\n.input-field .helper-text {\n  position: relative;\n  min-height: 18px;\n  display: block;\n  font-size: 12px;\n  color: rgba(0, 0, 0, 0.54);\n}\n\n.input-field .helper-text::after {\n  opacity: 1;\n  position: absolute;\n  top: 0;\n  left: 0;\n}\n\n.input-field .prefix {\n  position: absolute;\n  width: 3rem;\n  font-size: 2rem;\n  -webkit-transition: color .2s;\n  transition: color .2s;\n  top: 0.5rem;\n}\n\n.input-field .prefix.active {\n  color: #26a69a;\n}\n\n.input-field .prefix ~ input,\n.input-field .prefix ~ textarea,\n.input-field .prefix ~ label,\n.input-field .prefix ~ .validate ~ label,\n.input-field .prefix ~ .helper-text,\n.input-field .prefix ~ .autocomplete-content {\n  margin-left: 3rem;\n  width: 92%;\n  width: calc(100% - 3rem);\n}\n\n.input-field .prefix ~ label {\n  margin-left: 3rem;\n}\n\n@media only screen and (max-width: 992px) {\n  .input-field .prefix ~ input {\n    width: 86%;\n    width: calc(100% - 3rem);\n  }\n}\n\n@media only screen and (max-width: 600px) {\n  .input-field .prefix ~ input {\n    width: 80%;\n    width: calc(100% - 3rem);\n  }\n}\n\n/* Search Field */\n.input-field input[type=search] {\n  display: block;\n  line-height: inherit;\n  -webkit-transition: .3s background-color;\n  transition: .3s background-color;\n}\n\n.nav-wrapper .input-field input[type=search] {\n  height: inherit;\n  padding-left: 4rem;\n  width: calc(100% - 4rem);\n  border: 0;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.input-field input[type=search]:focus:not(.browser-default) {\n  background-color: #fff;\n  border: 0;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  color: #444;\n}\n\n.input-field input[type=search]:focus:not(.browser-default) + label i,\n.input-field input[type=search]:focus:not(.browser-default) ~ .mdi-navigation-close,\n.input-field input[type=search]:focus:not(.browser-default) ~ .material-icons {\n  color: #444;\n}\n\n.input-field input[type=search] + .label-icon {\n  -webkit-transform: none;\n          transform: none;\n  left: 1rem;\n}\n\n.input-field input[type=search] ~ .mdi-navigation-close,\n.input-field input[type=search] ~ .material-icons {\n  position: absolute;\n  top: 0;\n  right: 1rem;\n  color: transparent;\n  cursor: pointer;\n  font-size: 2rem;\n  -webkit-transition: .3s color;\n  transition: .3s color;\n}\n\n/* Textarea */\ntextarea {\n  width: 100%;\n  height: 3rem;\n  background-color: transparent;\n}\n\ntextarea.materialize-textarea {\n  line-height: normal;\n  overflow-y: hidden;\n  /* prevents scroll bar flash */\n  padding: .8rem 0 .8rem 0;\n  /* prevents text jump on Enter keypress */\n  resize: none;\n  min-height: 3rem;\n  -webkit-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\n.hiddendiv {\n  visibility: hidden;\n  white-space: pre-wrap;\n  word-wrap: break-word;\n  overflow-wrap: break-word;\n  /* future version of deprecated 'word-wrap' */\n  padding-top: 1.2rem;\n  /* prevents text jump on Enter keypress */\n  position: absolute;\n  top: 0;\n  z-index: -1;\n}\n\n/* Autocomplete */\n.autocomplete-content li .highlight {\n  color: #444;\n}\n\n.autocomplete-content li img {\n  height: 40px;\n  width: 40px;\n  margin: 5px 15px;\n}\n\n/* Character Counter */\n.character-counter {\n  min-height: 18px;\n}\n\n/* Radio Buttons\n   ========================================================================== */\n[type=\"radio\"]:not(:checked),\n[type=\"radio\"]:checked {\n  position: absolute;\n  opacity: 0;\n  pointer-events: none;\n}\n\n[type=\"radio\"]:not(:checked) + span,\n[type=\"radio\"]:checked + span {\n  position: relative;\n  padding-left: 35px;\n  cursor: pointer;\n  display: inline-block;\n  height: 25px;\n  line-height: 25px;\n  font-size: 1rem;\n  -webkit-transition: .28s ease;\n  transition: .28s ease;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n\n[type=\"radio\"] + span:before,\n[type=\"radio\"] + span:after {\n  content: '';\n  position: absolute;\n  left: 0;\n  top: 0;\n  margin: 4px;\n  width: 16px;\n  height: 16px;\n  z-index: 0;\n  -webkit-transition: .28s ease;\n  transition: .28s ease;\n}\n\n/* Unchecked styles */\n[type=\"radio\"]:not(:checked) + span:before,\n[type=\"radio\"]:not(:checked) + span:after,\n[type=\"radio\"]:checked + span:before,\n[type=\"radio\"]:checked + span:after,\n[type=\"radio\"].with-gap:checked + span:before,\n[type=\"radio\"].with-gap:checked + span:after {\n  border-radius: 50%;\n}\n\n[type=\"radio\"]:not(:checked) + span:before,\n[type=\"radio\"]:not(:checked) + span:after {\n  border: 2px solid #5a5a5a;\n}\n\n[type=\"radio\"]:not(:checked) + span:after {\n  -webkit-transform: scale(0);\n          transform: scale(0);\n}\n\n/* Checked styles */\n[type=\"radio\"]:checked + span:before {\n  border: 2px solid transparent;\n}\n\n[type=\"radio\"]:checked + span:after,\n[type=\"radio\"].with-gap:checked + span:before,\n[type=\"radio\"].with-gap:checked + span:after {\n  border: 2px solid #26a69a;\n}\n\n[type=\"radio\"]:checked + span:after,\n[type=\"radio\"].with-gap:checked + span:after {\n  background-color: #26a69a;\n}\n\n[type=\"radio\"]:checked + span:after {\n  -webkit-transform: scale(1.02);\n          transform: scale(1.02);\n}\n\n/* Radio With gap */\n[type=\"radio\"].with-gap:checked + span:after {\n  -webkit-transform: scale(0.5);\n          transform: scale(0.5);\n}\n\n/* Focused styles */\n[type=\"radio\"].tabbed:focus + span:before {\n  -webkit-box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1);\n          box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1);\n}\n\n/* Disabled Radio With gap */\n[type=\"radio\"].with-gap:disabled:checked + span:before {\n  border: 2px solid rgba(0, 0, 0, 0.42);\n}\n\n[type=\"radio\"].with-gap:disabled:checked + span:after {\n  border: none;\n  background-color: rgba(0, 0, 0, 0.42);\n}\n\n/* Disabled style */\n[type=\"radio\"]:disabled:not(:checked) + span:before,\n[type=\"radio\"]:disabled:checked + span:before {\n  background-color: transparent;\n  border-color: rgba(0, 0, 0, 0.42);\n}\n\n[type=\"radio\"]:disabled + span {\n  color: rgba(0, 0, 0, 0.42);\n}\n\n[type=\"radio\"]:disabled:not(:checked) + span:before {\n  border-color: rgba(0, 0, 0, 0.42);\n}\n\n[type=\"radio\"]:disabled:checked + span:after {\n  background-color: rgba(0, 0, 0, 0.42);\n  border-color: #949494;\n}\n\n/* Checkboxes\n   ========================================================================== */\n/* Remove default checkbox */\n[type=\"checkbox\"]:not(:checked),\n[type=\"checkbox\"]:checked {\n  position: absolute;\n  opacity: 0;\n  pointer-events: none;\n}\n\n[type=\"checkbox\"] {\n  /* checkbox aspect */\n}\n\n[type=\"checkbox\"] + span:not(.lever) {\n  position: relative;\n  padding-left: 35px;\n  cursor: pointer;\n  display: inline-block;\n  height: 25px;\n  line-height: 25px;\n  font-size: 1rem;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n\n[type=\"checkbox\"] + span:not(.lever):before,\n[type=\"checkbox\"]:not(.filled-in) + span:not(.lever):after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 18px;\n  height: 18px;\n  z-index: 0;\n  border: 2px solid #5a5a5a;\n  border-radius: 1px;\n  margin-top: 3px;\n  -webkit-transition: .2s;\n  transition: .2s;\n}\n\n[type=\"checkbox\"]:not(.filled-in) + span:not(.lever):after {\n  border: 0;\n  -webkit-transform: scale(0);\n          transform: scale(0);\n}\n\n[type=\"checkbox\"]:not(:checked):disabled + span:not(.lever):before {\n  border: none;\n  background-color: rgba(0, 0, 0, 0.42);\n}\n\n[type=\"checkbox\"].tabbed:focus + span:not(.lever):after {\n  -webkit-transform: scale(1);\n          transform: scale(1);\n  border: 0;\n  border-radius: 50%;\n  -webkit-box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1);\n          box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1);\n  background-color: rgba(0, 0, 0, 0.1);\n}\n\n[type=\"checkbox\"]:checked + span:not(.lever):before {\n  top: -4px;\n  left: -5px;\n  width: 12px;\n  height: 22px;\n  border-top: 2px solid transparent;\n  border-left: 2px solid transparent;\n  border-right: 2px solid #26a69a;\n  border-bottom: 2px solid #26a69a;\n  -webkit-transform: rotate(40deg);\n          transform: rotate(40deg);\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  -webkit-transform-origin: 100% 100%;\n          transform-origin: 100% 100%;\n}\n\n[type=\"checkbox\"]:checked:disabled + span:before {\n  border-right: 2px solid rgba(0, 0, 0, 0.42);\n  border-bottom: 2px solid rgba(0, 0, 0, 0.42);\n}\n\n/* Indeterminate checkbox */\n[type=\"checkbox\"]:indeterminate + span:not(.lever):before {\n  top: -11px;\n  left: -12px;\n  width: 10px;\n  height: 22px;\n  border-top: none;\n  border-left: none;\n  border-right: 2px solid #26a69a;\n  border-bottom: none;\n  -webkit-transform: rotate(90deg);\n          transform: rotate(90deg);\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  -webkit-transform-origin: 100% 100%;\n          transform-origin: 100% 100%;\n}\n\n[type=\"checkbox\"]:indeterminate:disabled + span:not(.lever):before {\n  border-right: 2px solid rgba(0, 0, 0, 0.42);\n  background-color: transparent;\n}\n\n[type=\"checkbox\"].filled-in + span:not(.lever):after {\n  border-radius: 2px;\n}\n\n[type=\"checkbox\"].filled-in + span:not(.lever):before,\n[type=\"checkbox\"].filled-in + span:not(.lever):after {\n  content: '';\n  left: 0;\n  position: absolute;\n  /* .1s delay is for check animation */\n  -webkit-transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;\n  transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;\n  z-index: 1;\n}\n\n[type=\"checkbox\"].filled-in:not(:checked) + span:not(.lever):before {\n  width: 0;\n  height: 0;\n  border: 3px solid transparent;\n  left: 6px;\n  top: 10px;\n  -webkit-transform: rotateZ(37deg);\n          transform: rotateZ(37deg);\n  -webkit-transform-origin: 100% 100%;\n          transform-origin: 100% 100%;\n}\n\n[type=\"checkbox\"].filled-in:not(:checked) + span:not(.lever):after {\n  height: 20px;\n  width: 20px;\n  background-color: transparent;\n  border: 2px solid #5a5a5a;\n  top: 0px;\n  z-index: 0;\n}\n\n[type=\"checkbox\"].filled-in:checked + span:not(.lever):before {\n  top: 0;\n  left: 1px;\n  width: 8px;\n  height: 13px;\n  border-top: 2px solid transparent;\n  border-left: 2px solid transparent;\n  border-right: 2px solid #fff;\n  border-bottom: 2px solid #fff;\n  -webkit-transform: rotateZ(37deg);\n          transform: rotateZ(37deg);\n  -webkit-transform-origin: 100% 100%;\n          transform-origin: 100% 100%;\n}\n\n[type=\"checkbox\"].filled-in:checked + span:not(.lever):after {\n  top: 0;\n  width: 20px;\n  height: 20px;\n  border: 2px solid #26a69a;\n  background-color: #26a69a;\n  z-index: 0;\n}\n\n[type=\"checkbox\"].filled-in.tabbed:focus + span:not(.lever):after {\n  border-radius: 2px;\n  border-color: #5a5a5a;\n  background-color: rgba(0, 0, 0, 0.1);\n}\n\n[type=\"checkbox\"].filled-in.tabbed:checked:focus + span:not(.lever):after {\n  border-radius: 2px;\n  background-color: #26a69a;\n  border-color: #26a69a;\n}\n\n[type=\"checkbox\"].filled-in:disabled:not(:checked) + span:not(.lever):before {\n  background-color: transparent;\n  border: 2px solid transparent;\n}\n\n[type=\"checkbox\"].filled-in:disabled:not(:checked) + span:not(.lever):after {\n  border-color: transparent;\n  background-color: #949494;\n}\n\n[type=\"checkbox\"].filled-in:disabled:checked + span:not(.lever):before {\n  background-color: transparent;\n}\n\n[type=\"checkbox\"].filled-in:disabled:checked + span:not(.lever):after {\n  background-color: #949494;\n  border-color: #949494;\n}\n\n/* Switch\r\n   ========================================================================== */\n.switch,\n.switch * {\n  -webkit-tap-highlight-color: transparent;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n\n.switch label {\n  cursor: pointer;\n}\n\n.switch label input[type=checkbox] {\n  opacity: 0;\n  width: 0;\n  height: 0;\n}\n\n.switch label input[type=checkbox]:checked + .lever {\n  background-color: #84c7c1;\n}\n\n.switch label input[type=checkbox]:checked + .lever:before, .switch label input[type=checkbox]:checked + .lever:after {\n  left: 18px;\n}\n\n.switch label input[type=checkbox]:checked + .lever:after {\n  background-color: #26a69a;\n}\n\n.switch label .lever {\n  content: \"\";\n  display: inline-block;\n  position: relative;\n  width: 36px;\n  height: 14px;\n  background-color: rgba(0, 0, 0, 0.38);\n  border-radius: 15px;\n  margin-right: 10px;\n  -webkit-transition: background 0.3s ease;\n  transition: background 0.3s ease;\n  vertical-align: middle;\n  margin: 0 16px;\n}\n\n.switch label .lever:before, .switch label .lever:after {\n  content: \"\";\n  position: absolute;\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  border-radius: 50%;\n  left: 0;\n  top: -3px;\n  -webkit-transition: left 0.3s ease, background .3s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease;\n  transition: left 0.3s ease, background .3s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease;\n  transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease;\n  transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease;\n}\n\n.switch label .lever:before {\n  background-color: rgba(38, 166, 154, 0.15);\n}\n\n.switch label .lever:after {\n  background-color: #F1F1F1;\n  -webkit-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);\n          box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);\n}\n\ninput[type=checkbox]:checked:not(:disabled) ~ .lever:active::before,\ninput[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::before {\n  -webkit-transform: scale(2.4);\n          transform: scale(2.4);\n  background-color: rgba(38, 166, 154, 0.15);\n}\n\ninput[type=checkbox]:not(:disabled) ~ .lever:active:before,\ninput[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::before {\n  -webkit-transform: scale(2.4);\n          transform: scale(2.4);\n  background-color: rgba(0, 0, 0, 0.08);\n}\n\n.switch input[type=checkbox][disabled] + .lever {\n  cursor: default;\n  background-color: rgba(0, 0, 0, 0.12);\n}\n\n.switch label input[type=checkbox][disabled] + .lever:after,\n.switch label input[type=checkbox][disabled]:checked + .lever:after {\n  background-color: #949494;\n}\n\n/* Select Field\n   ========================================================================== */\nselect {\n  display: none;\n}\n\nselect.browser-default {\n  display: block;\n}\n\nselect {\n  background-color: rgba(255, 255, 255, 0.9);\n  width: 100%;\n  padding: 5px;\n  border: 1px solid #f2f2f2;\n  border-radius: 2px;\n  height: 3rem;\n}\n\n.select-label {\n  position: absolute;\n}\n\n.select-wrapper {\n  position: relative;\n}\n\n.select-wrapper.valid + label,\n.select-wrapper.invalid + label {\n  width: 100%;\n  pointer-events: none;\n}\n\n.select-wrapper input.select-dropdown {\n  position: relative;\n  cursor: pointer;\n  background-color: transparent;\n  border: none;\n  border-bottom: 1px solid #9e9e9e;\n  outline: none;\n  height: 3rem;\n  line-height: 3rem;\n  width: 100%;\n  font-size: 16px;\n  margin: 0 0 8px 0;\n  padding: 0;\n  display: block;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  z-index: 1;\n}\n\n.select-wrapper input.select-dropdown:focus {\n  border-bottom: 1px solid #26a69a;\n}\n\n.select-wrapper .caret {\n  position: absolute;\n  right: 0;\n  top: 0;\n  bottom: 0;\n  margin: auto 0;\n  z-index: 0;\n  fill: rgba(0, 0, 0, 0.87);\n}\n\n.select-wrapper + label {\n  position: absolute;\n  top: -26px;\n  font-size: 0.8rem;\n}\n\nselect:disabled {\n  color: rgba(0, 0, 0, 0.42);\n}\n\n.select-wrapper.disabled + label {\n  color: rgba(0, 0, 0, 0.42);\n}\n\n.select-wrapper.disabled .caret {\n  fill: rgba(0, 0, 0, 0.42);\n}\n\n.select-wrapper input.select-dropdown:disabled {\n  color: rgba(0, 0, 0, 0.42);\n  cursor: default;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n\n.select-wrapper i {\n  color: rgba(0, 0, 0, 0.3);\n}\n\n.select-dropdown li.disabled,\n.select-dropdown li.disabled > span,\n.select-dropdown li.optgroup {\n  color: rgba(0, 0, 0, 0.3);\n  background-color: transparent;\n}\n\nbody.keyboard-focused .select-dropdown.dropdown-content li:focus {\n  background-color: rgba(0, 0, 0, 0.08);\n}\n\n.select-dropdown.dropdown-content li:hover {\n  background-color: rgba(0, 0, 0, 0.08);\n}\n\n.select-dropdown.dropdown-content li.selected {\n  background-color: rgba(0, 0, 0, 0.03);\n}\n\n.prefix ~ .select-wrapper {\n  margin-left: 3rem;\n  width: 92%;\n  width: calc(100% - 3rem);\n}\n\n.prefix ~ label {\n  margin-left: 3rem;\n}\n\n.select-dropdown li img {\n  height: 40px;\n  width: 40px;\n  margin: 5px 15px;\n  float: right;\n}\n\n.select-dropdown li.optgroup {\n  border-top: 1px solid #eee;\n}\n\n.select-dropdown li.optgroup.selected > span {\n  color: rgba(0, 0, 0, 0.7);\n}\n\n.select-dropdown li.optgroup > span {\n  color: rgba(0, 0, 0, 0.4);\n}\n\n.select-dropdown li.optgroup ~ li.optgroup-option {\n  padding-left: 1rem;\n}\n\n/* File Input\r\n   ========================================================================== */\n.file-field {\n  position: relative;\n}\n\n.file-field .file-path-wrapper {\n  overflow: hidden;\n  padding-left: 10px;\n}\n\n.file-field input.file-path {\n  width: 100%;\n}\n\n.file-field .btn, .file-field .btn-large, .file-field .btn-small {\n  float: left;\n  height: 3rem;\n  line-height: 3rem;\n}\n\n.file-field span {\n  cursor: pointer;\n}\n\n.file-field input[type=file] {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  bottom: 0;\n  width: 100%;\n  margin: 0;\n  padding: 0;\n  font-size: 20px;\n  cursor: pointer;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.file-field input[type=file]::-webkit-file-upload-button {\n  display: none;\n}\n\n/* Range\n   ========================================================================== */\n.range-field {\n  position: relative;\n}\n\ninput[type=range],\ninput[type=range] + .thumb {\n  cursor: pointer;\n}\n\ninput[type=range] {\n  position: relative;\n  background-color: transparent;\n  border: none;\n  outline: none;\n  width: 100%;\n  margin: 15px 0;\n  padding: 0;\n}\n\ninput[type=range]:focus {\n  outline: none;\n}\n\ninput[type=range] + .thumb {\n  position: absolute;\n  top: 10px;\n  left: 0;\n  border: none;\n  height: 0;\n  width: 0;\n  border-radius: 50%;\n  background-color: #26a69a;\n  margin-left: 7px;\n  -webkit-transform-origin: 50% 50%;\n          transform-origin: 50% 50%;\n  -webkit-transform: rotate(-45deg);\n          transform: rotate(-45deg);\n}\n\ninput[type=range] + .thumb .value {\n  display: block;\n  width: 30px;\n  text-align: center;\n  color: #26a69a;\n  font-size: 0;\n  -webkit-transform: rotate(45deg);\n          transform: rotate(45deg);\n}\n\ninput[type=range] + .thumb.active {\n  border-radius: 50% 50% 50% 0;\n}\n\ninput[type=range] + .thumb.active .value {\n  color: #fff;\n  margin-left: -1px;\n  margin-top: 8px;\n  font-size: 10px;\n}\n\ninput[type=range] {\n  -webkit-appearance: none;\n}\n\ninput[type=range]::-webkit-slider-runnable-track {\n  height: 3px;\n  background: #c2c0c2;\n  border: none;\n}\n\ninput[type=range]::-webkit-slider-thumb {\n  border: none;\n  height: 14px;\n  width: 14px;\n  border-radius: 50%;\n  background: #26a69a;\n  -webkit-transition: -webkit-box-shadow .3s;\n  transition: -webkit-box-shadow .3s;\n  transition: box-shadow .3s;\n  transition: box-shadow .3s, -webkit-box-shadow .3s;\n  -webkit-appearance: none;\n  background-color: #26a69a;\n  -webkit-transform-origin: 50% 50%;\n          transform-origin: 50% 50%;\n  margin: -5px 0 0 0;\n}\n\n.keyboard-focused input[type=range]:focus:not(.active)::-webkit-slider-thumb {\n  -webkit-box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26);\n          box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26);\n}\n\ninput[type=range] {\n  /* fix for FF unable to apply focus style bug  */\n  border: 1px solid white;\n  /*required for proper track sizing in FF*/\n}\n\ninput[type=range]::-moz-range-track {\n  height: 3px;\n  background: #c2c0c2;\n  border: none;\n}\n\ninput[type=range]::-moz-focus-inner {\n  border: 0;\n}\n\ninput[type=range]::-moz-range-thumb {\n  border: none;\n  height: 14px;\n  width: 14px;\n  border-radius: 50%;\n  background: #26a69a;\n  -webkit-transition: -webkit-box-shadow .3s;\n  transition: -webkit-box-shadow .3s;\n  transition: box-shadow .3s;\n  transition: box-shadow .3s, -webkit-box-shadow .3s;\n  margin-top: -5px;\n}\n\ninput[type=range]:-moz-focusring {\n  outline: 1px solid #fff;\n  outline-offset: -1px;\n}\n\n.keyboard-focused input[type=range]:focus:not(.active)::-moz-range-thumb {\n  box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26);\n}\n\ninput[type=range]::-ms-track {\n  height: 3px;\n  background: transparent;\n  border-color: transparent;\n  border-width: 6px 0;\n  /*remove default tick marks*/\n  color: transparent;\n}\n\ninput[type=range]::-ms-fill-lower {\n  background: #777;\n}\n\ninput[type=range]::-ms-fill-upper {\n  background: #ddd;\n}\n\ninput[type=range]::-ms-thumb {\n  border: none;\n  height: 14px;\n  width: 14px;\n  border-radius: 50%;\n  background: #26a69a;\n  -webkit-transition: -webkit-box-shadow .3s;\n  transition: -webkit-box-shadow .3s;\n  transition: box-shadow .3s;\n  transition: box-shadow .3s, -webkit-box-shadow .3s;\n}\n\n.keyboard-focused input[type=range]:focus:not(.active)::-ms-thumb {\n  box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26);\n}\n\n/***************\n    Nav List\n***************/\n.table-of-contents.fixed {\n  position: fixed;\n}\n\n.table-of-contents li {\n  padding: 2px 0;\n}\n\n.table-of-contents a {\n  display: inline-block;\n  font-weight: 300;\n  color: #757575;\n  padding-left: 16px;\n  height: 1.5rem;\n  line-height: 1.5rem;\n  letter-spacing: .4;\n  display: inline-block;\n}\n\n.table-of-contents a:hover {\n  color: #a8a8a8;\n  padding-left: 15px;\n  border-left: 1px solid #ee6e73;\n}\n\n.table-of-contents a.active {\n  font-weight: 500;\n  padding-left: 14px;\n  border-left: 2px solid #ee6e73;\n}\n\n.sidenav {\n  position: fixed;\n  width: 300px;\n  left: 0;\n  top: 0;\n  margin: 0;\n  -webkit-transform: translateX(-100%);\n          transform: translateX(-100%);\n  height: 100%;\n  height: calc(100% + 60px);\n  height: -moz-calc(100%);\n  padding-bottom: 60px;\n  background-color: #fff;\n  z-index: 999;\n  overflow-y: auto;\n  will-change: transform;\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  -webkit-transform: translateX(-105%);\n          transform: translateX(-105%);\n}\n\n.sidenav.right-aligned {\n  right: 0;\n  -webkit-transform: translateX(105%);\n          transform: translateX(105%);\n  left: auto;\n  -webkit-transform: translateX(100%);\n          transform: translateX(100%);\n}\n\n.sidenav .collapsible {\n  margin: 0;\n}\n\n.sidenav li {\n  float: none;\n  line-height: 48px;\n}\n\n.sidenav li.active {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n.sidenav li > a {\n  color: rgba(0, 0, 0, 0.87);\n  display: block;\n  font-size: 14px;\n  font-weight: 500;\n  height: 48px;\n  line-height: 48px;\n  padding: 0 32px;\n}\n\n.sidenav li > a:hover {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n.sidenav li > a.btn, .sidenav li > a.btn-large, .sidenav li > a.btn-small, .sidenav li > a.btn-large, .sidenav li > a.btn-flat, .sidenav li > a.btn-floating {\n  margin: 10px 15px;\n}\n\n.sidenav li > a.btn, .sidenav li > a.btn-large, .sidenav li > a.btn-small, .sidenav li > a.btn-large, .sidenav li > a.btn-floating {\n  color: #fff;\n}\n\n.sidenav li > a.btn-flat {\n  color: #343434;\n}\n\n.sidenav li > a.btn:hover, .sidenav li > a.btn-large:hover, .sidenav li > a.btn-small:hover, .sidenav li > a.btn-large:hover {\n  background-color: #2bbbad;\n}\n\n.sidenav li > a.btn-floating:hover {\n  background-color: #26a69a;\n}\n\n.sidenav li > a > i,\n.sidenav li > a > [class^=\"mdi-\"], .sidenav li > a li > a > [class*=\"mdi-\"],\n.sidenav li > a > i.material-icons {\n  float: left;\n  height: 48px;\n  line-height: 48px;\n  margin: 0 32px 0 0;\n  width: 24px;\n  color: rgba(0, 0, 0, 0.54);\n}\n\n.sidenav .divider {\n  margin: 8px 0 0 0;\n}\n\n.sidenav .subheader {\n  cursor: initial;\n  pointer-events: none;\n  color: rgba(0, 0, 0, 0.54);\n  font-size: 14px;\n  font-weight: 500;\n  line-height: 48px;\n}\n\n.sidenav .subheader:hover {\n  background-color: transparent;\n}\n\n.sidenav .user-view {\n  position: relative;\n  padding: 32px 32px 0;\n  margin-bottom: 8px;\n}\n\n.sidenav .user-view > a {\n  height: auto;\n  padding: 0;\n}\n\n.sidenav .user-view > a:hover {\n  background-color: transparent;\n}\n\n.sidenav .user-view .background {\n  overflow: hidden;\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: -1;\n}\n\n.sidenav .user-view .circle, .sidenav .user-view .name, .sidenav .user-view .email {\n  display: block;\n}\n\n.sidenav .user-view .circle {\n  height: 64px;\n  width: 64px;\n}\n\n.sidenav .user-view .name,\n.sidenav .user-view .email {\n  font-size: 14px;\n  line-height: 24px;\n}\n\n.sidenav .user-view .name {\n  margin-top: 16px;\n  font-weight: 500;\n}\n\n.sidenav .user-view .email {\n  padding-bottom: 16px;\n  font-weight: 400;\n}\n\n.drag-target {\n  height: 100%;\n  width: 10px;\n  position: fixed;\n  top: 0;\n  z-index: 998;\n}\n\n.drag-target.right-aligned {\n  right: 0;\n}\n\n.sidenav.sidenav-fixed {\n  left: 0;\n  -webkit-transform: translateX(0);\n          transform: translateX(0);\n  position: fixed;\n}\n\n.sidenav.sidenav-fixed.right-aligned {\n  right: 0;\n  left: auto;\n}\n\n@media only screen and (max-width: 992px) {\n  .sidenav.sidenav-fixed {\n    -webkit-transform: translateX(-105%);\n            transform: translateX(-105%);\n  }\n  .sidenav.sidenav-fixed.right-aligned {\n    -webkit-transform: translateX(105%);\n            transform: translateX(105%);\n  }\n  .sidenav > a {\n    padding: 0 16px;\n  }\n  .sidenav .user-view {\n    padding: 16px 16px 0;\n  }\n}\n\n.sidenav .collapsible-body > ul:not(.collapsible) > li.active,\n.sidenav.sidenav-fixed .collapsible-body > ul:not(.collapsible) > li.active {\n  background-color: #ee6e73;\n}\n\n.sidenav .collapsible-body > ul:not(.collapsible) > li.active a,\n.sidenav.sidenav-fixed .collapsible-body > ul:not(.collapsible) > li.active a {\n  color: #fff;\n}\n\n.sidenav .collapsible-body {\n  padding: 0;\n}\n\n.sidenav-overlay {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  opacity: 0;\n  height: 120vh;\n  background-color: rgba(0, 0, 0, 0.5);\n  z-index: 997;\n  display: none;\n}\n\n/*\r\n    @license\r\n    Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n    This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n    The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n    The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n    Code distributed by Google as part of the polymer project is also\r\n    subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\n/**************************/\n/* STYLES FOR THE SPINNER */\n/**************************/\n/*\r\n * Constants:\r\n *      STROKEWIDTH = 3px\r\n *      ARCSIZE     = 270 degrees (amount of circle the arc takes up)\r\n *      ARCTIME     = 1333ms (time it takes to expand and contract arc)\r\n *      ARCSTARTROT = 216 degrees (how much the start location of the arc\r\n *                                should rotate each time, 216 gives us a\r\n *                                5 pointed star shape (it's 360/5 * 3).\r\n *                                For a 7 pointed star, we might do\r\n *                                360/7 * 3 = 154.286)\r\n *      CONTAINERWIDTH = 28px\r\n *      SHRINK_TIME = 400ms\r\n */\n.preloader-wrapper {\n  display: inline-block;\n  position: relative;\n  width: 50px;\n  height: 50px;\n}\n\n.preloader-wrapper.small {\n  width: 36px;\n  height: 36px;\n}\n\n.preloader-wrapper.big {\n  width: 64px;\n  height: 64px;\n}\n\n.preloader-wrapper.active {\n  /* duration: 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */\n  -webkit-animation: container-rotate 1568ms linear infinite;\n  animation: container-rotate 1568ms linear infinite;\n}\n\n@-webkit-keyframes container-rotate {\n  to {\n    -webkit-transform: rotate(360deg);\n  }\n}\n\n@keyframes container-rotate {\n  to {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n  }\n}\n\n.spinner-layer {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  border-color: #26a69a;\n}\n\n.spinner-blue,\n.spinner-blue-only {\n  border-color: #4285f4;\n}\n\n.spinner-red,\n.spinner-red-only {\n  border-color: #db4437;\n}\n\n.spinner-yellow,\n.spinner-yellow-only {\n  border-color: #f4b400;\n}\n\n.spinner-green,\n.spinner-green-only {\n  border-color: #0f9d58;\n}\n\n/**\r\n * IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee):\r\n *\r\n * iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it doesn't\r\n * guarantee that the animation will start _exactly_ after that value. So we avoid using\r\n * animation-delay and instead set custom keyframes for each color (as redundant as it\r\n * seems).\r\n *\r\n * We write out each animation in full (instead of separating animation-name,\r\n * animation-duration, etc.) because under the polyfill, Safari does not recognize those\r\n * specific properties properly, treats them as -webkit-animation, and overrides the\r\n * other animation rules. See https://github.com/Polymer/platform/issues/53.\r\n */\n.active .spinner-layer.spinner-blue {\n  /* durations: 4 * ARCTIME */\n  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n}\n\n.active .spinner-layer.spinner-red {\n  /* durations: 4 * ARCTIME */\n  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n}\n\n.active .spinner-layer.spinner-yellow {\n  /* durations: 4 * ARCTIME */\n  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n}\n\n.active .spinner-layer.spinner-green {\n  /* durations: 4 * ARCTIME */\n  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n}\n\n.active .spinner-layer,\n.active .spinner-layer.spinner-blue-only,\n.active .spinner-layer.spinner-red-only,\n.active .spinner-layer.spinner-yellow-only,\n.active .spinner-layer.spinner-green-only {\n  /* durations: 4 * ARCTIME */\n  opacity: 1;\n  -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n  animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n}\n\n@-webkit-keyframes fill-unfill-rotate {\n  12.5% {\n    -webkit-transform: rotate(135deg);\n  }\n  /* 0.5 * ARCSIZE */\n  25% {\n    -webkit-transform: rotate(270deg);\n  }\n  /* 1   * ARCSIZE */\n  37.5% {\n    -webkit-transform: rotate(405deg);\n  }\n  /* 1.5 * ARCSIZE */\n  50% {\n    -webkit-transform: rotate(540deg);\n  }\n  /* 2   * ARCSIZE */\n  62.5% {\n    -webkit-transform: rotate(675deg);\n  }\n  /* 2.5 * ARCSIZE */\n  75% {\n    -webkit-transform: rotate(810deg);\n  }\n  /* 3   * ARCSIZE */\n  87.5% {\n    -webkit-transform: rotate(945deg);\n  }\n  /* 3.5 * ARCSIZE */\n  to {\n    -webkit-transform: rotate(1080deg);\n  }\n  /* 4   * ARCSIZE */\n}\n\n@keyframes fill-unfill-rotate {\n  12.5% {\n    -webkit-transform: rotate(135deg);\n            transform: rotate(135deg);\n  }\n  /* 0.5 * ARCSIZE */\n  25% {\n    -webkit-transform: rotate(270deg);\n            transform: rotate(270deg);\n  }\n  /* 1   * ARCSIZE */\n  37.5% {\n    -webkit-transform: rotate(405deg);\n            transform: rotate(405deg);\n  }\n  /* 1.5 * ARCSIZE */\n  50% {\n    -webkit-transform: rotate(540deg);\n            transform: rotate(540deg);\n  }\n  /* 2   * ARCSIZE */\n  62.5% {\n    -webkit-transform: rotate(675deg);\n            transform: rotate(675deg);\n  }\n  /* 2.5 * ARCSIZE */\n  75% {\n    -webkit-transform: rotate(810deg);\n            transform: rotate(810deg);\n  }\n  /* 3   * ARCSIZE */\n  87.5% {\n    -webkit-transform: rotate(945deg);\n            transform: rotate(945deg);\n  }\n  /* 3.5 * ARCSIZE */\n  to {\n    -webkit-transform: rotate(1080deg);\n            transform: rotate(1080deg);\n  }\n  /* 4   * ARCSIZE */\n}\n\n@-webkit-keyframes blue-fade-in-out {\n  from {\n    opacity: 1;\n  }\n  25% {\n    opacity: 1;\n  }\n  26% {\n    opacity: 0;\n  }\n  89% {\n    opacity: 0;\n  }\n  90% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n\n@keyframes blue-fade-in-out {\n  from {\n    opacity: 1;\n  }\n  25% {\n    opacity: 1;\n  }\n  26% {\n    opacity: 0;\n  }\n  89% {\n    opacity: 0;\n  }\n  90% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n\n@-webkit-keyframes red-fade-in-out {\n  from {\n    opacity: 0;\n  }\n  15% {\n    opacity: 0;\n  }\n  25% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 1;\n  }\n  51% {\n    opacity: 0;\n  }\n}\n\n@keyframes red-fade-in-out {\n  from {\n    opacity: 0;\n  }\n  15% {\n    opacity: 0;\n  }\n  25% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 1;\n  }\n  51% {\n    opacity: 0;\n  }\n}\n\n@-webkit-keyframes yellow-fade-in-out {\n  from {\n    opacity: 0;\n  }\n  40% {\n    opacity: 0;\n  }\n  50% {\n    opacity: 1;\n  }\n  75% {\n    opacity: 1;\n  }\n  76% {\n    opacity: 0;\n  }\n}\n\n@keyframes yellow-fade-in-out {\n  from {\n    opacity: 0;\n  }\n  40% {\n    opacity: 0;\n  }\n  50% {\n    opacity: 1;\n  }\n  75% {\n    opacity: 1;\n  }\n  76% {\n    opacity: 0;\n  }\n}\n\n@-webkit-keyframes green-fade-in-out {\n  from {\n    opacity: 0;\n  }\n  65% {\n    opacity: 0;\n  }\n  75% {\n    opacity: 1;\n  }\n  90% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n@keyframes green-fade-in-out {\n  from {\n    opacity: 0;\n  }\n  65% {\n    opacity: 0;\n  }\n  75% {\n    opacity: 1;\n  }\n  90% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n/**\r\n * Patch the gap that appear between the two adjacent div.circle-clipper while the\r\n * spinner is rotating (appears on Chrome 38, Safari 7.1, and IE 11).\r\n */\n.gap-patch {\n  position: absolute;\n  top: 0;\n  left: 45%;\n  width: 10%;\n  height: 100%;\n  overflow: hidden;\n  border-color: inherit;\n}\n\n.gap-patch .circle {\n  width: 1000%;\n  left: -450%;\n}\n\n.circle-clipper {\n  display: inline-block;\n  position: relative;\n  width: 50%;\n  height: 100%;\n  overflow: hidden;\n  border-color: inherit;\n}\n\n.circle-clipper .circle {\n  width: 200%;\n  height: 100%;\n  border-width: 3px;\n  /* STROKEWIDTH */\n  border-style: solid;\n  border-color: inherit;\n  border-bottom-color: transparent !important;\n  border-radius: 50%;\n  -webkit-animation: none;\n  animation: none;\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.circle-clipper.left .circle {\n  left: 0;\n  border-right-color: transparent !important;\n  -webkit-transform: rotate(129deg);\n  transform: rotate(129deg);\n}\n\n.circle-clipper.right .circle {\n  left: -100%;\n  border-left-color: transparent !important;\n  -webkit-transform: rotate(-129deg);\n  transform: rotate(-129deg);\n}\n\n.active .circle-clipper.left .circle {\n  /* duration: ARCTIME */\n  -webkit-animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n  animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n}\n\n.active .circle-clipper.right .circle {\n  /* duration: ARCTIME */\n  -webkit-animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n  animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;\n}\n\n@-webkit-keyframes left-spin {\n  from {\n    -webkit-transform: rotate(130deg);\n  }\n  50% {\n    -webkit-transform: rotate(-5deg);\n  }\n  to {\n    -webkit-transform: rotate(130deg);\n  }\n}\n\n@keyframes left-spin {\n  from {\n    -webkit-transform: rotate(130deg);\n            transform: rotate(130deg);\n  }\n  50% {\n    -webkit-transform: rotate(-5deg);\n            transform: rotate(-5deg);\n  }\n  to {\n    -webkit-transform: rotate(130deg);\n            transform: rotate(130deg);\n  }\n}\n\n@-webkit-keyframes right-spin {\n  from {\n    -webkit-transform: rotate(-130deg);\n  }\n  50% {\n    -webkit-transform: rotate(5deg);\n  }\n  to {\n    -webkit-transform: rotate(-130deg);\n  }\n}\n\n@keyframes right-spin {\n  from {\n    -webkit-transform: rotate(-130deg);\n            transform: rotate(-130deg);\n  }\n  50% {\n    -webkit-transform: rotate(5deg);\n            transform: rotate(5deg);\n  }\n  to {\n    -webkit-transform: rotate(-130deg);\n            transform: rotate(-130deg);\n  }\n}\n\n#spinnerContainer.cooldown {\n  /* duration: SHRINK_TIME */\n  -webkit-animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);\n  animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@-webkit-keyframes fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n\n@keyframes fade-out {\n  from {\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n  }\n}\n\n.slider {\n  position: relative;\n  height: 400px;\n  width: 100%;\n}\n\n.slider.fullscreen {\n  height: 100%;\n  width: 100%;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.slider.fullscreen ul.slides {\n  height: 100%;\n}\n\n.slider.fullscreen ul.indicators {\n  z-index: 2;\n  bottom: 30px;\n}\n\n.slider .slides {\n  background-color: #9e9e9e;\n  margin: 0;\n  height: 400px;\n}\n\n.slider .slides li {\n  opacity: 0;\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1;\n  width: 100%;\n  height: inherit;\n  overflow: hidden;\n}\n\n.slider .slides li img {\n  height: 100%;\n  width: 100%;\n  background-size: cover;\n  background-position: center;\n}\n\n.slider .slides li .caption {\n  color: #fff;\n  position: absolute;\n  top: 15%;\n  left: 15%;\n  width: 70%;\n  opacity: 0;\n}\n\n.slider .slides li .caption p {\n  color: #e0e0e0;\n}\n\n.slider .slides li.active {\n  z-index: 2;\n}\n\n.slider .indicators {\n  position: absolute;\n  text-align: center;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  margin: 0;\n}\n\n.slider .indicators .indicator-item {\n  display: inline-block;\n  position: relative;\n  cursor: pointer;\n  height: 16px;\n  width: 16px;\n  margin: 0 12px;\n  background-color: #e0e0e0;\n  -webkit-transition: background-color .3s;\n  transition: background-color .3s;\n  border-radius: 50%;\n}\n\n.slider .indicators .indicator-item.active {\n  background-color: #4CAF50;\n}\n\n.carousel {\n  overflow: hidden;\n  position: relative;\n  width: 100%;\n  height: 400px;\n  -webkit-perspective: 500px;\n          perspective: 500px;\n  -webkit-transform-style: preserve-3d;\n          transform-style: preserve-3d;\n  -webkit-transform-origin: 0% 50%;\n          transform-origin: 0% 50%;\n}\n\n.carousel.carousel-slider {\n  top: 0;\n  left: 0;\n}\n\n.carousel.carousel-slider .carousel-fixed-item {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 20px;\n  z-index: 1;\n}\n\n.carousel.carousel-slider .carousel-fixed-item.with-indicators {\n  bottom: 68px;\n}\n\n.carousel.carousel-slider .carousel-item {\n  width: 100%;\n  height: 100%;\n  min-height: 400px;\n  position: absolute;\n  top: 0;\n  left: 0;\n}\n\n.carousel.carousel-slider .carousel-item h2 {\n  font-size: 24px;\n  font-weight: 500;\n  line-height: 32px;\n}\n\n.carousel.carousel-slider .carousel-item p {\n  font-size: 15px;\n}\n\n.carousel .carousel-item {\n  visibility: hidden;\n  width: 200px;\n  height: 200px;\n  position: absolute;\n  top: 0;\n  left: 0;\n}\n\n.carousel .carousel-item > img {\n  width: 100%;\n}\n\n.carousel .indicators {\n  position: absolute;\n  text-align: center;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  margin: 0;\n}\n\n.carousel .indicators .indicator-item {\n  display: inline-block;\n  position: relative;\n  cursor: pointer;\n  height: 8px;\n  width: 8px;\n  margin: 24px 4px;\n  background-color: rgba(255, 255, 255, 0.5);\n  -webkit-transition: background-color .3s;\n  transition: background-color .3s;\n  border-radius: 50%;\n}\n\n.carousel .indicators .indicator-item.active {\n  background-color: #fff;\n}\n\n.carousel.scrolling .carousel-item .materialboxed,\n.carousel .carousel-item:not(.active) .materialboxed {\n  pointer-events: none;\n}\n\n.tap-target-wrapper {\n  width: 800px;\n  height: 800px;\n  position: fixed;\n  z-index: 1000;\n  visibility: hidden;\n  -webkit-transition: visibility 0s .3s;\n  transition: visibility 0s .3s;\n}\n\n.tap-target-wrapper.open {\n  visibility: visible;\n  -webkit-transition: visibility 0s;\n  transition: visibility 0s;\n}\n\n.tap-target-wrapper.open .tap-target {\n  -webkit-transform: scale(1);\n          transform: scale(1);\n  opacity: .95;\n  -webkit-transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);\n  transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);\n  transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1);\n  transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);\n}\n\n.tap-target-wrapper.open .tap-target-wave::before {\n  -webkit-transform: scale(1);\n          transform: scale(1);\n}\n\n.tap-target-wrapper.open .tap-target-wave::after {\n  visibility: visible;\n  -webkit-animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;\n          animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;\n  -webkit-transition: opacity .3s,\r visibility 0s 1s,\r -webkit-transform .3s;\n  transition: opacity .3s,\r visibility 0s 1s,\r -webkit-transform .3s;\n  transition: opacity .3s,\r transform .3s,\r visibility 0s 1s;\n  transition: opacity .3s,\r transform .3s,\r visibility 0s 1s,\r -webkit-transform .3s;\n}\n\n.tap-target {\n  position: absolute;\n  font-size: 1rem;\n  border-radius: 50%;\n  background-color: #ee6e73;\n  -webkit-box-shadow: 0 20px 20px 0 rgba(0, 0, 0, 0.14), 0 10px 50px 0 rgba(0, 0, 0, 0.12), 0 30px 10px -20px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 20px 20px 0 rgba(0, 0, 0, 0.14), 0 10px 50px 0 rgba(0, 0, 0, 0.12), 0 30px 10px -20px rgba(0, 0, 0, 0.2);\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  -webkit-transform: scale(0);\n          transform: scale(0);\n  -webkit-transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);\n  transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);\n  transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1);\n  transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);\n}\n\n.tap-target-content {\n  position: relative;\n  display: table-cell;\n}\n\n.tap-target-wave {\n  position: absolute;\n  border-radius: 50%;\n  z-index: 10001;\n}\n\n.tap-target-wave::before, .tap-target-wave::after {\n  content: '';\n  display: block;\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  border-radius: 50%;\n  background-color: #ffffff;\n}\n\n.tap-target-wave::before {\n  -webkit-transform: scale(0);\n          transform: scale(0);\n  -webkit-transition: -webkit-transform .3s;\n  transition: -webkit-transform .3s;\n  transition: transform .3s;\n  transition: transform .3s, -webkit-transform .3s;\n}\n\n.tap-target-wave::after {\n  visibility: hidden;\n  -webkit-transition: opacity .3s,\r visibility 0s,\r -webkit-transform .3s;\n  transition: opacity .3s,\r visibility 0s,\r -webkit-transform .3s;\n  transition: opacity .3s,\r transform .3s,\r visibility 0s;\n  transition: opacity .3s,\r transform .3s,\r visibility 0s,\r -webkit-transform .3s;\n  z-index: -1;\n}\n\n.tap-target-origin {\n  top: 50%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n          transform: translate(-50%, -50%);\n  z-index: 10002;\n  position: absolute !important;\n}\n\n.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small), .tap-target-origin:not(.btn):not(.btn-large):not(.btn-small):hover {\n  background: none;\n}\n\n@media only screen and (max-width: 600px) {\n  .tap-target, .tap-target-wrapper {\n    width: 600px;\n    height: 600px;\n  }\n}\n\n.pulse {\n  overflow: visible;\n  position: relative;\n}\n\n.pulse::before {\n  content: '';\n  display: block;\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  top: 0;\n  left: 0;\n  background-color: inherit;\n  border-radius: inherit;\n  -webkit-transition: opacity .3s, -webkit-transform .3s;\n  transition: opacity .3s, -webkit-transform .3s;\n  transition: opacity .3s, transform .3s;\n  transition: opacity .3s, transform .3s, -webkit-transform .3s;\n  -webkit-animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;\n          animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;\n  z-index: -1;\n}\n\n@-webkit-keyframes pulse-animation {\n  0% {\n    opacity: 1;\n    -webkit-transform: scale(1);\n            transform: scale(1);\n  }\n  50% {\n    opacity: 0;\n    -webkit-transform: scale(1.5);\n            transform: scale(1.5);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(1.5);\n            transform: scale(1.5);\n  }\n}\n\n@keyframes pulse-animation {\n  0% {\n    opacity: 1;\n    -webkit-transform: scale(1);\n            transform: scale(1);\n  }\n  50% {\n    opacity: 0;\n    -webkit-transform: scale(1.5);\n            transform: scale(1.5);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(1.5);\n            transform: scale(1.5);\n  }\n}\n\n/* Modal */\n.datepicker-modal {\n  max-width: 325px;\n  min-width: 300px;\n  max-height: none;\n}\n\n.datepicker-container.modal-content {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  padding: 0;\n}\n\n.datepicker-controls {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-pack: justify;\n  -webkit-justify-content: space-between;\n      -ms-flex-pack: justify;\n          justify-content: space-between;\n  width: 280px;\n  margin: 0 auto;\n}\n\n.datepicker-controls .selects-container {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n}\n\n.datepicker-controls .select-wrapper input {\n  border-bottom: none;\n  text-align: center;\n  margin: 0;\n}\n\n.datepicker-controls .select-wrapper input:focus {\n  border-bottom: none;\n}\n\n.datepicker-controls .select-wrapper .caret {\n  display: none;\n}\n\n.datepicker-controls .select-year input {\n  width: 50px;\n}\n\n.datepicker-controls .select-month input {\n  width: 70px;\n}\n\n.month-prev, .month-next {\n  margin-top: 4px;\n  cursor: pointer;\n  background-color: transparent;\n  border: none;\n}\n\n/* Date Display */\n.datepicker-date-display {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1 auto;\n      -ms-flex: 1 auto;\n          flex: 1 auto;\n  background-color: #26a69a;\n  color: #fff;\n  padding: 20px 22px;\n  font-weight: 500;\n}\n\n.datepicker-date-display .year-text {\n  display: block;\n  font-size: 1.5rem;\n  line-height: 25px;\n  color: rgba(255, 255, 255, 0.7);\n}\n\n.datepicker-date-display .date-text {\n  display: block;\n  font-size: 2.8rem;\n  line-height: 47px;\n  font-weight: 500;\n}\n\n/* Calendar */\n.datepicker-calendar-container {\n  -webkit-box-flex: 2.5;\n  -webkit-flex: 2.5 auto;\n      -ms-flex: 2.5 auto;\n          flex: 2.5 auto;\n}\n\n.datepicker-table {\n  width: 280px;\n  font-size: 1rem;\n  margin: 0 auto;\n}\n\n.datepicker-table thead {\n  border-bottom: none;\n}\n\n.datepicker-table th {\n  padding: 10px 5px;\n  text-align: center;\n}\n\n.datepicker-table tr {\n  border: none;\n}\n\n.datepicker-table abbr {\n  text-decoration: none;\n  color: #999;\n}\n\n.datepicker-table td {\n  border-radius: 50%;\n  padding: 0;\n}\n\n.datepicker-table td.is-today {\n  color: #26a69a;\n}\n\n.datepicker-table td.is-selected {\n  background-color: #26a69a;\n  color: #fff;\n}\n\n.datepicker-table td.is-outside-current-month, .datepicker-table td.is-disabled {\n  color: rgba(0, 0, 0, 0.3);\n  pointer-events: none;\n}\n\n.datepicker-day-button {\n  background-color: transparent;\n  border: none;\n  line-height: 38px;\n  display: block;\n  width: 100%;\n  border-radius: 50%;\n  padding: 0 5px;\n  cursor: pointer;\n  color: inherit;\n}\n\n.datepicker-day-button:focus {\n  background-color: rgba(43, 161, 150, 0.25);\n}\n\n/* Footer */\n.datepicker-footer {\n  width: 280px;\n  margin: 0 auto;\n  padding-bottom: 5px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-pack: justify;\n  -webkit-justify-content: space-between;\n      -ms-flex-pack: justify;\n          justify-content: space-between;\n}\n\n.datepicker-cancel,\n.datepicker-clear,\n.datepicker-today,\n.datepicker-done {\n  color: #26a69a;\n  padding: 0 1rem;\n}\n\n.datepicker-clear {\n  color: #F44336;\n}\n\n/* Media Queries */\n@media only screen and (min-width: 601px) {\n  .datepicker-modal {\n    max-width: 625px;\n  }\n  .datepicker-container.modal-content {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row;\n  }\n  .datepicker-date-display {\n    -webkit-box-flex: 0;\n    -webkit-flex: 0 1 270px;\n        -ms-flex: 0 1 270px;\n            flex: 0 1 270px;\n  }\n  .datepicker-controls,\n  .datepicker-table,\n  .datepicker-footer {\n    width: 320px;\n  }\n  .datepicker-day-button {\n    line-height: 44px;\n  }\n}\n\n/* Timepicker Containers */\n.timepicker-modal {\n  max-width: 325px;\n  max-height: none;\n}\n\n.timepicker-container.modal-content {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  padding: 0;\n}\n\n.text-primary {\n  color: white;\n}\n\n/* Clock Digital Display */\n.timepicker-digital-display {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1 auto;\n      -ms-flex: 1 auto;\n          flex: 1 auto;\n  background-color: #26a69a;\n  padding: 10px;\n  font-weight: 300;\n}\n\n.timepicker-text-container {\n  font-size: 4rem;\n  font-weight: bold;\n  text-align: center;\n  color: rgba(255, 255, 255, 0.6);\n  font-weight: 400;\n  position: relative;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n\n.timepicker-span-hours,\n.timepicker-span-minutes,\n.timepicker-span-am-pm div {\n  cursor: pointer;\n}\n\n.timepicker-span-hours {\n  margin-right: 3px;\n}\n\n.timepicker-span-minutes {\n  margin-left: 3px;\n}\n\n.timepicker-display-am-pm {\n  font-size: 1.3rem;\n  position: absolute;\n  right: 1rem;\n  bottom: 1rem;\n  font-weight: 400;\n}\n\n/* Analog Clock Display */\n.timepicker-analog-display {\n  -webkit-box-flex: 2.5;\n  -webkit-flex: 2.5 auto;\n      -ms-flex: 2.5 auto;\n          flex: 2.5 auto;\n}\n\n.timepicker-plate {\n  background-color: #eee;\n  border-radius: 50%;\n  width: 270px;\n  height: 270px;\n  overflow: visible;\n  position: relative;\n  margin: auto;\n  margin-top: 25px;\n  margin-bottom: 5px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n\n.timepicker-canvas,\n.timepicker-dial {\n  position: absolute;\n  left: 0;\n  right: 0;\n  top: 0;\n  bottom: 0;\n}\n\n.timepicker-minutes {\n  visibility: hidden;\n}\n\n.timepicker-tick {\n  border-radius: 50%;\n  color: rgba(0, 0, 0, 0.87);\n  line-height: 40px;\n  text-align: center;\n  width: 40px;\n  height: 40px;\n  position: absolute;\n  cursor: pointer;\n  font-size: 15px;\n}\n\n.timepicker-tick.active,\n.timepicker-tick:hover {\n  background-color: rgba(38, 166, 154, 0.25);\n}\n\n.timepicker-dial {\n  -webkit-transition: opacity 350ms, -webkit-transform 350ms;\n  transition: opacity 350ms, -webkit-transform 350ms;\n  transition: transform 350ms, opacity 350ms;\n  transition: transform 350ms, opacity 350ms, -webkit-transform 350ms;\n}\n\n.timepicker-dial-out {\n  opacity: 0;\n}\n\n.timepicker-dial-out.timepicker-hours {\n  -webkit-transform: scale(1.1, 1.1);\n          transform: scale(1.1, 1.1);\n}\n\n.timepicker-dial-out.timepicker-minutes {\n  -webkit-transform: scale(0.8, 0.8);\n          transform: scale(0.8, 0.8);\n}\n\n.timepicker-canvas {\n  -webkit-transition: opacity 175ms;\n  transition: opacity 175ms;\n}\n\n.timepicker-canvas line {\n  stroke: #26a69a;\n  stroke-width: 4;\n  stroke-linecap: round;\n}\n\n.timepicker-canvas-out {\n  opacity: 0.25;\n}\n\n.timepicker-canvas-bearing {\n  stroke: none;\n  fill: #26a69a;\n}\n\n.timepicker-canvas-bg {\n  stroke: none;\n  fill: #26a69a;\n}\n\n/* Footer */\n.timepicker-footer {\n  margin: 0 auto;\n  padding: 5px 1rem;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-pack: justify;\n  -webkit-justify-content: space-between;\n      -ms-flex-pack: justify;\n          justify-content: space-between;\n}\n\n.timepicker-clear {\n  color: #F44336;\n}\n\n.timepicker-close {\n  color: #26a69a;\n}\n\n.timepicker-clear,\n.timepicker-close {\n  padding: 0 20px;\n}\n\n/* Media Queries */\n@media only screen and (min-width: 601px) {\n  .timepicker-modal {\n    max-width: 600px;\n  }\n  .timepicker-container.modal-content {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -webkit-flex-direction: row;\n        -ms-flex-direction: row;\n            flex-direction: row;\n  }\n  .timepicker-text-container {\n    top: 32%;\n  }\n  .timepicker-display-am-pm {\n    position: relative;\n    right: auto;\n    bottom: auto;\n    text-align: center;\n    margin-top: 1.2rem;\n  }\n}\n"
  },
  {
    "path": "public/css/seat-base.css",
    "content": "a,.dropdown-content li>a {\n    color: #44A729;\n}\n\na:hover {\n    color: #55544B;\n    text-decoration: underline;\n}\n\n/* begin: Pour le menu \"user\" en haut à gauche*/\n.dropdown-content li>a:hover,\n.dropdown-content li>span:hover{\n    color: #44A729;\n    text-decoration: none;\n}\n\n.dropdown-content li>a, .dropdown-content li>span {\n    color: #44A729;\n}\n/* end: Pour le menu \"user\" en haut à gauche*/\n\n.important {\n    color: #44A729;\n}\n\n.seat-green {\n    background-color: #44A729;\n}\n\n.seat-green2 {\n    background-color: #91BD10;\n}\n\n.seat-orange {\n    background-color: #eaad00;\n}\n\n.seat-orange2 {\n    background-color: #fecc00;\n}\n\n\n.seat-text-green {\n    color: #44A729;\n}\n\n.seat-text-green2 {\n    color: #91BD10;\n}\n\n.seat-text-orange {\n    color: #eaad00;\n}\n\n.seat-text-orange2 {\n    color: #fecc00;\n}\n\n.btn {\n    background-color: #eaad00;\n}\n\n.btn:hover {\n    background-color: #fecc00;\n}\n\n.btn:focus {\n    background-color: #eaad00;\n}\n\nbody {\n    background-color: transparent;\n    /*font-family: Calibri, \"Helvetica Neue\", Arial, Helvetica, sans-serif;*/\n}\n\n.btn-full {\n    display: block;\n    width: 100%;\n}\n\n.seat-main-container {\n    width: 100%;\n}\n\n@media only screen and (max-width: 600px) {\n    .menu .card .card-content {\n        padding: 0;\n    }\n\n    .row .col.menu {\n        padding: 0;\n    }\n}\n\n\n/* begin: Panier sur la droite */\n\n.panier-item {\n    margin-bottom: 10px;\n}\n\n.panier-item .divider {\n    margin-top: 5px;\n}\n\n.inline-icon {\n    vertical-align: bottom;\n    font-size: 18px !important;\n}\n\n.panier-total {\n    margin-bottom: 10px;\n}\n\n.panier-total-price {\n    display: flex;\n    justify-content: space-between;\n}\n\n.panier-total-price-label {\n    font-weight: bold;\n}\n\n.panier-total .divider {\n    margin-top: 15px;\n}\n\n.remove-from-basket {\n    font-size: 80%;\n}\n\n/* end: Panier sur la droite */\n\n\n/* begin: carte take away */\n.products {\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n    flex-wrap: wrap;\n    list-style-type: none;\n}\n\n.product {\n    position: relative;\n    justify-content: space-between;\n    margin-bottom: 16px;\n    padding: 16px;\n    border: 1px solid transparent;\n    border-radius: 2px;\n    background-color: #f9f9f9;\n    box-shadow: none;\n    outline: none;\n    transition: box-shadow 0.2s ease-in-out;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n    flex: 0 1 46%;\n    flex-direction: row;\n}\n\n.category {\n    text-align: center;\n    font-size: 2.28rem;\n    line-height: 110%;\n    margin: 1.52rem 0 .912rem 0;\n}\n\n.product-info {\n    display: flex;\n    justify-content: space-between;\n}\n\n.product-name {\n    font-weight: bold;\n}\n\n#product-modal .modal-content {\n    padding: 0;\n}\n\n#product-modal .title {\n    padding: 10px;\n}\n\n#product-modal .sector {\n    background-color: #e8ebeb;\n    padding: 8px 24px;\n}\n\n#product-modal .supplements {\n    padding: 0 10px;\n}\n\n#product-modal .options {\n    padding: 10px 10px;\n}\n\n#product-modal .comments {\n    padding: 10px 10px;\n}\n\n#product-modal .modal-sub-footer {\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n    align-items: flex-start;\n    flex-wrap: wrap;\n}\n\n#product-modal .modal-sub-footer .quantity-zone {\n    margin: auto;\n}\n\n#product-modal .modal-sub-footer .quantity-zone .quantity {\n    text-align: center;\n    width: 50px;\n    display: inline-block;\n}\n\n#product-modal .modal-sub-footer .add {\n    position: absolute;\n    right: 5px;\n}\n\n@media only screen and (max-width: 600px) {\n    #product-modal {\n        width: 100%;\n        max-height: 100%;\n        height: 100%;\n        top: 0 !important;\n    }\n\n    .product {\n        flex: 1 1 100%;\n        margin: 0;\n        border: none;\n        border-radius: 0;\n        border-left: none;\n        border-right: none;\n        border-top: 1px solid #e8ebeb;\n        border-bottom: none;\n    }\n\n    .product:last-child {\n        border-bottom: 1px solid #e8ebeb;\n    }\n}\n\n/* end: carte take away */\n\n.footer-to-order-on-mobile {\n    position: fixed;\n    bottom: 0;\n    width: 100%;\n    z-index: 1;\n    background-color: white;\n    padding: 5px 10%\n}\n"
  },
  {
    "path": "public/css/seat.css",
    "content": "html {\n    background: url('/images/background1.jpg') no-repeat center center fixed;\n    -webkit-background-size: cover;\n    -moz-background-size: cover;\n    -o-background-size: cover;\n    background-size: cover;\n}\n"
  },
  {
    "path": "public/ico/browserconfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<browserconfig><msapplication><tile><square70x70logo src=\"/ms-icon-70x70.png\"/><square150x150logo src=\"/ms-icon-150x150.png\"/><square310x310logo src=\"/ms-icon-310x310.png\"/><TileColor>#ffffff</TileColor></tile></msapplication></browserconfig>"
  },
  {
    "path": "public/ico/manifest.json",
    "content": "{\n \"name\": \"App\",\n \"icons\": [\n  {\n   \"src\": \"\\/android-icon-36x36.png\",\n   \"sizes\": \"36x36\",\n   \"type\": \"image\\/png\",\n   \"density\": \"0.75\"\n  },\n  {\n   \"src\": \"\\/android-icon-48x48.png\",\n   \"sizes\": \"48x48\",\n   \"type\": \"image\\/png\",\n   \"density\": \"1.0\"\n  },\n  {\n   \"src\": \"\\/android-icon-72x72.png\",\n   \"sizes\": \"72x72\",\n   \"type\": \"image\\/png\",\n   \"density\": \"1.5\"\n  },\n  {\n   \"src\": \"\\/android-icon-96x96.png\",\n   \"sizes\": \"96x96\",\n   \"type\": \"image\\/png\",\n   \"density\": \"2.0\"\n  },\n  {\n   \"src\": \"\\/android-icon-144x144.png\",\n   \"sizes\": \"144x144\",\n   \"type\": \"image\\/png\",\n   \"density\": \"3.0\"\n  },\n  {\n   \"src\": \"\\/android-icon-192x192.png\",\n   \"sizes\": \"192x192\",\n   \"type\": \"image\\/png\",\n   \"density\": \"4.0\"\n  }\n ]\n}"
  },
  {
    "path": "public/index.php",
    "content": "<?php\n\nuse Symfony4\\Kernel;\nuse Symfony\\Component\\Debug\\Debug;\nuse Symfony\\Component\\HttpFoundation\\Request;\n\nrequire dirname(__DIR__).'/config/bootstrap.php';\n\nif ($_SERVER['APP_DEBUG']) {\n    umask(0000);\n\n    Debug::enable();\n}\n\nif ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? $_ENV['TRUSTED_PROXIES'] ?? false) {\n    Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST);\n}\n\nif ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? $_ENV['TRUSTED_HOSTS'] ?? false) {\n    Request::setTrustedHosts([$trustedHosts]);\n}\n\n$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);\n$request = Request::createFromGlobals();\n$response = $kernel->handle($request);\n$response->send();\n$kernel->terminate($request, $response);\n"
  },
  {
    "path": "public/js/materialize.js",
    "content": "/*!\r\n * Materialize v1.0.0 (http://materializecss.com)\r\n * Copyright 2014-2017 Materialize\r\n * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE)\r\n */\r\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/*! cash-dom 1.3.5, https://github.com/kenwheeler/cash @license MIT */\n(function (factory) {\n  window.cash = factory();\n})(function () {\n  var doc = document,\n      win = window,\n      ArrayProto = Array.prototype,\n      slice = ArrayProto.slice,\n      filter = ArrayProto.filter,\n      push = ArrayProto.push;\n\n  var noop = function () {},\n      isFunction = function (item) {\n    // @see https://crbug.com/568448\n    return typeof item === typeof noop && item.call;\n  },\n      isString = function (item) {\n    return typeof item === typeof \"\";\n  };\n\n  var idMatch = /^#[\\w-]*$/,\n      classMatch = /^\\.[\\w-]*$/,\n      htmlMatch = /<.+>/,\n      singlet = /^\\w+$/;\n\n  function find(selector, context) {\n    context = context || doc;\n    var elems = classMatch.test(selector) ? context.getElementsByClassName(selector.slice(1)) : singlet.test(selector) ? context.getElementsByTagName(selector) : context.querySelectorAll(selector);\n    return elems;\n  }\n\n  var frag;\n  function parseHTML(str) {\n    if (!frag) {\n      frag = doc.implementation.createHTMLDocument(null);\n      var base = frag.createElement(\"base\");\n      base.href = doc.location.href;\n      frag.head.appendChild(base);\n    }\n\n    frag.body.innerHTML = str;\n\n    return frag.body.childNodes;\n  }\n\n  function onReady(fn) {\n    if (doc.readyState !== \"loading\") {\n      fn();\n    } else {\n      doc.addEventListener(\"DOMContentLoaded\", fn);\n    }\n  }\n\n  function Init(selector, context) {\n    if (!selector) {\n      return this;\n    }\n\n    // If already a cash collection, don't do any further processing\n    if (selector.cash && selector !== win) {\n      return selector;\n    }\n\n    var elems = selector,\n        i = 0,\n        length;\n\n    if (isString(selector)) {\n      elems = idMatch.test(selector) ?\n      // If an ID use the faster getElementById check\n      doc.getElementById(selector.slice(1)) : htmlMatch.test(selector) ?\n      // If HTML, parse it into real elements\n      parseHTML(selector) :\n      // else use `find`\n      find(selector, context);\n\n      // If function, use as shortcut for DOM ready\n    } else if (isFunction(selector)) {\n      onReady(selector);return this;\n    }\n\n    if (!elems) {\n      return this;\n    }\n\n    // If a single DOM element is passed in or received via ID, return the single element\n    if (elems.nodeType || elems === win) {\n      this[0] = elems;\n      this.length = 1;\n    } else {\n      // Treat like an array and loop through each item.\n      length = this.length = elems.length;\n      for (; i < length; i++) {\n        this[i] = elems[i];\n      }\n    }\n\n    return this;\n  }\n\n  function cash(selector, context) {\n    return new Init(selector, context);\n  }\n\n  var fn = cash.fn = cash.prototype = Init.prototype = { // jshint ignore:line\n    cash: true,\n    length: 0,\n    push: push,\n    splice: ArrayProto.splice,\n    map: ArrayProto.map,\n    init: Init\n  };\n\n  Object.defineProperty(fn, \"constructor\", { value: cash });\n\n  cash.parseHTML = parseHTML;\n  cash.noop = noop;\n  cash.isFunction = isFunction;\n  cash.isString = isString;\n\n  cash.extend = fn.extend = function (target) {\n    target = target || {};\n\n    var args = slice.call(arguments),\n        length = args.length,\n        i = 1;\n\n    if (args.length === 1) {\n      target = this;\n      i = 0;\n    }\n\n    for (; i < length; i++) {\n      if (!args[i]) {\n        continue;\n      }\n      for (var key in args[i]) {\n        if (args[i].hasOwnProperty(key)) {\n          target[key] = args[i][key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  function each(collection, callback) {\n    var l = collection.length,\n        i = 0;\n\n    for (; i < l; i++) {\n      if (callback.call(collection[i], collection[i], i, collection) === false) {\n        break;\n      }\n    }\n  }\n\n  function matches(el, selector) {\n    var m = el && (el.matches || el.webkitMatchesSelector || el.mozMatchesSelector || el.msMatchesSelector || el.oMatchesSelector);\n    return !!m && m.call(el, selector);\n  }\n\n  function getCompareFunction(selector) {\n    return (\n      /* Use browser's `matches` function if string */\n      isString(selector) ? matches :\n      /* Match a cash element */\n      selector.cash ? function (el) {\n        return selector.is(el);\n      } :\n      /* Direct comparison */\n      function (el, selector) {\n        return el === selector;\n      }\n    );\n  }\n\n  function unique(collection) {\n    return cash(slice.call(collection).filter(function (item, index, self) {\n      return self.indexOf(item) === index;\n    }));\n  }\n\n  cash.extend({\n    merge: function (first, second) {\n      var len = +second.length,\n          i = first.length,\n          j = 0;\n\n      for (; j < len; i++, j++) {\n        first[i] = second[j];\n      }\n\n      first.length = i;\n      return first;\n    },\n\n    each: each,\n    matches: matches,\n    unique: unique,\n    isArray: Array.isArray,\n    isNumeric: function (n) {\n      return !isNaN(parseFloat(n)) && isFinite(n);\n    }\n\n  });\n\n  var uid = cash.uid = \"_cash\" + Date.now();\n\n  function getDataCache(node) {\n    return node[uid] = node[uid] || {};\n  }\n\n  function setData(node, key, value) {\n    return getDataCache(node)[key] = value;\n  }\n\n  function getData(node, key) {\n    var c = getDataCache(node);\n    if (c[key] === undefined) {\n      c[key] = node.dataset ? node.dataset[key] : cash(node).attr(\"data-\" + key);\n    }\n    return c[key];\n  }\n\n  function removeData(node, key) {\n    var c = getDataCache(node);\n    if (c) {\n      delete c[key];\n    } else if (node.dataset) {\n      delete node.dataset[key];\n    } else {\n      cash(node).removeAttr(\"data-\" + name);\n    }\n  }\n\n  fn.extend({\n    data: function (name, value) {\n      if (isString(name)) {\n        return value === undefined ? getData(this[0], name) : this.each(function (v) {\n          return setData(v, name, value);\n        });\n      }\n\n      for (var key in name) {\n        this.data(key, name[key]);\n      }\n\n      return this;\n    },\n\n    removeData: function (key) {\n      return this.each(function (v) {\n        return removeData(v, key);\n      });\n    }\n\n  });\n\n  var notWhiteMatch = /\\S+/g;\n\n  function getClasses(c) {\n    return isString(c) && c.match(notWhiteMatch);\n  }\n\n  function hasClass(v, c) {\n    return v.classList ? v.classList.contains(c) : new RegExp(\"(^| )\" + c + \"( |$)\", \"gi\").test(v.className);\n  }\n\n  function addClass(v, c, spacedName) {\n    if (v.classList) {\n      v.classList.add(c);\n    } else if (spacedName.indexOf(\" \" + c + \" \")) {\n      v.className += \" \" + c;\n    }\n  }\n\n  function removeClass(v, c) {\n    if (v.classList) {\n      v.classList.remove(c);\n    } else {\n      v.className = v.className.replace(c, \"\");\n    }\n  }\n\n  fn.extend({\n    addClass: function (c) {\n      var classes = getClasses(c);\n\n      return classes ? this.each(function (v) {\n        var spacedName = \" \" + v.className + \" \";\n        each(classes, function (c) {\n          addClass(v, c, spacedName);\n        });\n      }) : this;\n    },\n\n    attr: function (name, value) {\n      if (!name) {\n        return undefined;\n      }\n\n      if (isString(name)) {\n        if (value === undefined) {\n          return this[0] ? this[0].getAttribute ? this[0].getAttribute(name) : this[0][name] : undefined;\n        }\n\n        return this.each(function (v) {\n          if (v.setAttribute) {\n            v.setAttribute(name, value);\n          } else {\n            v[name] = value;\n          }\n        });\n      }\n\n      for (var key in name) {\n        this.attr(key, name[key]);\n      }\n\n      return this;\n    },\n\n    hasClass: function (c) {\n      var check = false,\n          classes = getClasses(c);\n      if (classes && classes.length) {\n        this.each(function (v) {\n          check = hasClass(v, classes[0]);\n          return !check;\n        });\n      }\n      return check;\n    },\n\n    prop: function (name, value) {\n      if (isString(name)) {\n        return value === undefined ? this[0][name] : this.each(function (v) {\n          v[name] = value;\n        });\n      }\n\n      for (var key in name) {\n        this.prop(key, name[key]);\n      }\n\n      return this;\n    },\n\n    removeAttr: function (name) {\n      return this.each(function (v) {\n        if (v.removeAttribute) {\n          v.removeAttribute(name);\n        } else {\n          delete v[name];\n        }\n      });\n    },\n\n    removeClass: function (c) {\n      if (!arguments.length) {\n        return this.attr(\"class\", \"\");\n      }\n      var classes = getClasses(c);\n      return classes ? this.each(function (v) {\n        each(classes, function (c) {\n          removeClass(v, c);\n        });\n      }) : this;\n    },\n\n    removeProp: function (name) {\n      return this.each(function (v) {\n        delete v[name];\n      });\n    },\n\n    toggleClass: function (c, state) {\n      if (state !== undefined) {\n        return this[state ? \"addClass\" : \"removeClass\"](c);\n      }\n      var classes = getClasses(c);\n      return classes ? this.each(function (v) {\n        var spacedName = \" \" + v.className + \" \";\n        each(classes, function (c) {\n          if (hasClass(v, c)) {\n            removeClass(v, c);\n          } else {\n            addClass(v, c, spacedName);\n          }\n        });\n      }) : this;\n    } });\n\n  fn.extend({\n    add: function (selector, context) {\n      return unique(cash.merge(this, cash(selector, context)));\n    },\n\n    each: function (callback) {\n      each(this, callback);\n      return this;\n    },\n\n    eq: function (index) {\n      return cash(this.get(index));\n    },\n\n    filter: function (selector) {\n      if (!selector) {\n        return this;\n      }\n\n      var comparator = isFunction(selector) ? selector : getCompareFunction(selector);\n\n      return cash(filter.call(this, function (e) {\n        return comparator(e, selector);\n      }));\n    },\n\n    first: function () {\n      return this.eq(0);\n    },\n\n    get: function (index) {\n      if (index === undefined) {\n        return slice.call(this);\n      }\n      return index < 0 ? this[index + this.length] : this[index];\n    },\n\n    index: function (elem) {\n      var child = elem ? cash(elem)[0] : this[0],\n          collection = elem ? this : cash(child).parent().children();\n      return slice.call(collection).indexOf(child);\n    },\n\n    last: function () {\n      return this.eq(-1);\n    }\n\n  });\n\n  var camelCase = function () {\n    var camelRegex = /(?:^\\w|[A-Z]|\\b\\w)/g,\n        whiteSpace = /[\\s-_]+/g;\n    return function (str) {\n      return str.replace(camelRegex, function (letter, index) {\n        return letter[index === 0 ? \"toLowerCase\" : \"toUpperCase\"]();\n      }).replace(whiteSpace, \"\");\n    };\n  }();\n\n  var getPrefixedProp = function () {\n    var cache = {},\n        doc = document,\n        div = doc.createElement(\"div\"),\n        style = div.style;\n\n    return function (prop) {\n      prop = camelCase(prop);\n      if (cache[prop]) {\n        return cache[prop];\n      }\n\n      var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),\n          prefixes = [\"webkit\", \"moz\", \"ms\", \"o\"],\n          props = (prop + \" \" + prefixes.join(ucProp + \" \") + ucProp).split(\" \");\n\n      each(props, function (p) {\n        if (p in style) {\n          cache[p] = prop = cache[prop] = p;\n          return false;\n        }\n      });\n\n      return cache[prop];\n    };\n  }();\n\n  cash.prefixedProp = getPrefixedProp;\n  cash.camelCase = camelCase;\n\n  fn.extend({\n    css: function (prop, value) {\n      if (isString(prop)) {\n        prop = getPrefixedProp(prop);\n        return arguments.length > 1 ? this.each(function (v) {\n          return v.style[prop] = value;\n        }) : win.getComputedStyle(this[0])[prop];\n      }\n\n      for (var key in prop) {\n        this.css(key, prop[key]);\n      }\n\n      return this;\n    }\n\n  });\n\n  function compute(el, prop) {\n    return parseInt(win.getComputedStyle(el[0], null)[prop], 10) || 0;\n  }\n\n  each([\"Width\", \"Height\"], function (v) {\n    var lower = v.toLowerCase();\n\n    fn[lower] = function () {\n      return this[0].getBoundingClientRect()[lower];\n    };\n\n    fn[\"inner\" + v] = function () {\n      return this[0][\"client\" + v];\n    };\n\n    fn[\"outer\" + v] = function (margins) {\n      return this[0][\"offset\" + v] + (margins ? compute(this, \"margin\" + (v === \"Width\" ? \"Left\" : \"Top\")) + compute(this, \"margin\" + (v === \"Width\" ? \"Right\" : \"Bottom\")) : 0);\n    };\n  });\n\n  function registerEvent(node, eventName, callback) {\n    var eventCache = getData(node, \"_cashEvents\") || setData(node, \"_cashEvents\", {});\n    eventCache[eventName] = eventCache[eventName] || [];\n    eventCache[eventName].push(callback);\n    node.addEventListener(eventName, callback);\n  }\n\n  function removeEvent(node, eventName, callback) {\n    var events = getData(node, \"_cashEvents\"),\n        eventCache = events && events[eventName],\n        index;\n\n    if (!eventCache) {\n      return;\n    }\n\n    if (callback) {\n      node.removeEventListener(eventName, callback);\n      index = eventCache.indexOf(callback);\n      if (index >= 0) {\n        eventCache.splice(index, 1);\n      }\n    } else {\n      each(eventCache, function (event) {\n        node.removeEventListener(eventName, event);\n      });\n      eventCache = [];\n    }\n  }\n\n  fn.extend({\n    off: function (eventName, callback) {\n      return this.each(function (v) {\n        return removeEvent(v, eventName, callback);\n      });\n    },\n\n    on: function (eventName, delegate, callback, runOnce) {\n      // jshint ignore:line\n      var originalCallback;\n      if (!isString(eventName)) {\n        for (var key in eventName) {\n          this.on(key, delegate, eventName[key]);\n        }\n        return this;\n      }\n\n      if (isFunction(delegate)) {\n        callback = delegate;\n        delegate = null;\n      }\n\n      if (eventName === \"ready\") {\n        onReady(callback);\n        return this;\n      }\n\n      if (delegate) {\n        originalCallback = callback;\n        callback = function (e) {\n          var t = e.target;\n          while (!matches(t, delegate)) {\n            if (t === this || t === null) {\n              return t = false;\n            }\n\n            t = t.parentNode;\n          }\n\n          if (t) {\n            originalCallback.call(t, e);\n          }\n        };\n      }\n\n      return this.each(function (v) {\n        var finalCallback = callback;\n        if (runOnce) {\n          finalCallback = function () {\n            callback.apply(this, arguments);\n            removeEvent(v, eventName, finalCallback);\n          };\n        }\n        registerEvent(v, eventName, finalCallback);\n      });\n    },\n\n    one: function (eventName, delegate, callback) {\n      return this.on(eventName, delegate, callback, true);\n    },\n\n    ready: onReady,\n\n    /**\n     * Modified\n     * Triggers browser event\n     * @param String eventName\n     * @param Object data - Add properties to event object\n     */\n    trigger: function (eventName, data) {\n      if (document.createEvent) {\n        var evt = document.createEvent('HTMLEvents');\n        evt.initEvent(eventName, true, false);\n        evt = this.extend(evt, data);\n        return this.each(function (v) {\n          return v.dispatchEvent(evt);\n        });\n      }\n    }\n\n  });\n\n  function encode(name, value) {\n    return \"&\" + encodeURIComponent(name) + \"=\" + encodeURIComponent(value).replace(/%20/g, \"+\");\n  }\n\n  function getSelectMultiple_(el) {\n    var values = [];\n    each(el.options, function (o) {\n      if (o.selected) {\n        values.push(o.value);\n      }\n    });\n    return values.length ? values : null;\n  }\n\n  function getSelectSingle_(el) {\n    var selectedIndex = el.selectedIndex;\n    return selectedIndex >= 0 ? el.options[selectedIndex].value : null;\n  }\n\n  function getValue(el) {\n    var type = el.type;\n    if (!type) {\n      return null;\n    }\n    switch (type.toLowerCase()) {\n      case \"select-one\":\n        return getSelectSingle_(el);\n      case \"select-multiple\":\n        return getSelectMultiple_(el);\n      case \"radio\":\n        return el.checked ? el.value : null;\n      case \"checkbox\":\n        return el.checked ? el.value : null;\n      default:\n        return el.value ? el.value : null;\n    }\n  }\n\n  fn.extend({\n    serialize: function () {\n      var query = \"\";\n\n      each(this[0].elements || this, function (el) {\n        if (el.disabled || el.tagName === \"FIELDSET\") {\n          return;\n        }\n        var name = el.name;\n        switch (el.type.toLowerCase()) {\n          case \"file\":\n          case \"reset\":\n          case \"submit\":\n          case \"button\":\n            break;\n          case \"select-multiple\":\n            var values = getValue(el);\n            if (values !== null) {\n              each(values, function (value) {\n                query += encode(name, value);\n              });\n            }\n            break;\n          default:\n            var value = getValue(el);\n            if (value !== null) {\n              query += encode(name, value);\n            }\n        }\n      });\n\n      return query.substr(1);\n    },\n\n    val: function (value) {\n      if (value === undefined) {\n        return getValue(this[0]);\n      }\n\n      return this.each(function (v) {\n        return v.value = value;\n      });\n    }\n\n  });\n\n  function insertElement(el, child, prepend) {\n    if (prepend) {\n      var first = el.childNodes[0];\n      el.insertBefore(child, first);\n    } else {\n      el.appendChild(child);\n    }\n  }\n\n  function insertContent(parent, child, prepend) {\n    var str = isString(child);\n\n    if (!str && child.length) {\n      each(child, function (v) {\n        return insertContent(parent, v, prepend);\n      });\n      return;\n    }\n\n    each(parent, str ? function (v) {\n      return v.insertAdjacentHTML(prepend ? \"afterbegin\" : \"beforeend\", child);\n    } : function (v, i) {\n      return insertElement(v, i === 0 ? child : child.cloneNode(true), prepend);\n    });\n  }\n\n  fn.extend({\n    after: function (selector) {\n      cash(selector).insertAfter(this);\n      return this;\n    },\n\n    append: function (content) {\n      insertContent(this, content);\n      return this;\n    },\n\n    appendTo: function (parent) {\n      insertContent(cash(parent), this);\n      return this;\n    },\n\n    before: function (selector) {\n      cash(selector).insertBefore(this);\n      return this;\n    },\n\n    clone: function () {\n      return cash(this.map(function (v) {\n        return v.cloneNode(true);\n      }));\n    },\n\n    empty: function () {\n      this.html(\"\");\n      return this;\n    },\n\n    html: function (content) {\n      if (content === undefined) {\n        return this[0].innerHTML;\n      }\n      var source = content.nodeType ? content[0].outerHTML : content;\n      return this.each(function (v) {\n        return v.innerHTML = source;\n      });\n    },\n\n    insertAfter: function (selector) {\n      var _this = this;\n\n      cash(selector).each(function (el, i) {\n        var parent = el.parentNode,\n            sibling = el.nextSibling;\n        _this.each(function (v) {\n          parent.insertBefore(i === 0 ? v : v.cloneNode(true), sibling);\n        });\n      });\n\n      return this;\n    },\n\n    insertBefore: function (selector) {\n      var _this2 = this;\n      cash(selector).each(function (el, i) {\n        var parent = el.parentNode;\n        _this2.each(function (v) {\n          parent.insertBefore(i === 0 ? v : v.cloneNode(true), el);\n        });\n      });\n      return this;\n    },\n\n    prepend: function (content) {\n      insertContent(this, content, true);\n      return this;\n    },\n\n    prependTo: function (parent) {\n      insertContent(cash(parent), this, true);\n      return this;\n    },\n\n    remove: function () {\n      return this.each(function (v) {\n        if (!!v.parentNode) {\n          return v.parentNode.removeChild(v);\n        }\n      });\n    },\n\n    text: function (content) {\n      if (content === undefined) {\n        return this[0].textContent;\n      }\n      return this.each(function (v) {\n        return v.textContent = content;\n      });\n    }\n\n  });\n\n  var docEl = doc.documentElement;\n\n  fn.extend({\n    position: function () {\n      var el = this[0];\n      return {\n        left: el.offsetLeft,\n        top: el.offsetTop\n      };\n    },\n\n    offset: function () {\n      var rect = this[0].getBoundingClientRect();\n      return {\n        top: rect.top + win.pageYOffset - docEl.clientTop,\n        left: rect.left + win.pageXOffset - docEl.clientLeft\n      };\n    },\n\n    offsetParent: function () {\n      return cash(this[0].offsetParent);\n    }\n\n  });\n\n  fn.extend({\n    children: function (selector) {\n      var elems = [];\n      this.each(function (el) {\n        push.apply(elems, el.children);\n      });\n      elems = unique(elems);\n\n      return !selector ? elems : elems.filter(function (v) {\n        return matches(v, selector);\n      });\n    },\n\n    closest: function (selector) {\n      if (!selector || this.length < 1) {\n        return cash();\n      }\n      if (this.is(selector)) {\n        return this.filter(selector);\n      }\n      return this.parent().closest(selector);\n    },\n\n    is: function (selector) {\n      if (!selector) {\n        return false;\n      }\n\n      var match = false,\n          comparator = getCompareFunction(selector);\n\n      this.each(function (el) {\n        match = comparator(el, selector);\n        return !match;\n      });\n\n      return match;\n    },\n\n    find: function (selector) {\n      if (!selector || selector.nodeType) {\n        return cash(selector && this.has(selector).length ? selector : null);\n      }\n\n      var elems = [];\n      this.each(function (el) {\n        push.apply(elems, find(selector, el));\n      });\n\n      return unique(elems);\n    },\n\n    has: function (selector) {\n      var comparator = isString(selector) ? function (el) {\n        return find(selector, el).length !== 0;\n      } : function (el) {\n        return el.contains(selector);\n      };\n\n      return this.filter(comparator);\n    },\n\n    next: function () {\n      return cash(this[0].nextElementSibling);\n    },\n\n    not: function (selector) {\n      if (!selector) {\n        return this;\n      }\n\n      var comparator = getCompareFunction(selector);\n\n      return this.filter(function (el) {\n        return !comparator(el, selector);\n      });\n    },\n\n    parent: function () {\n      var result = [];\n\n      this.each(function (item) {\n        if (item && item.parentNode) {\n          result.push(item.parentNode);\n        }\n      });\n\n      return unique(result);\n    },\n\n    parents: function (selector) {\n      var last,\n          result = [];\n\n      this.each(function (item) {\n        last = item;\n\n        while (last && last.parentNode && last !== doc.body.parentNode) {\n          last = last.parentNode;\n\n          if (!selector || selector && matches(last, selector)) {\n            result.push(last);\n          }\n        }\n      });\n\n      return unique(result);\n    },\n\n    prev: function () {\n      return cash(this[0].previousElementSibling);\n    },\n\n    siblings: function (selector) {\n      var collection = this.parent().children(selector),\n          el = this[0];\n\n      return collection.filter(function (i) {\n        return i !== el;\n      });\n    }\n\n  });\n\n  return cash;\n});\n;\nvar Component = function () {\n  /**\n   * Generic constructor for all components\n   * @constructor\n   * @param {Element} el\n   * @param {Object} options\n   */\n  function Component(classDef, el, options) {\n    _classCallCheck(this, Component);\n\n    // Display error if el is valid HTML Element\n    if (!(el instanceof Element)) {\n      console.error(Error(el + ' is not an HTML Element'));\n    }\n\n    // If exists, destroy and reinitialize in child\n    var ins = classDef.getInstance(el);\n    if (!!ins) {\n      ins.destroy();\n    }\n\n    this.el = el;\n    this.$el = cash(el);\n  }\n\n  /**\n   * Initializes components\n   * @param {class} classDef\n   * @param {Element | NodeList | jQuery} els\n   * @param {Object} options\n   */\n\n\n  _createClass(Component, null, [{\n    key: \"init\",\n    value: function init(classDef, els, options) {\n      var instances = null;\n      if (els instanceof Element) {\n        instances = new classDef(els, options);\n      } else if (!!els && (els.jquery || els.cash || els instanceof NodeList)) {\n        var instancesArr = [];\n        for (var i = 0; i < els.length; i++) {\n          instancesArr.push(new classDef(els[i], options));\n        }\n        instances = instancesArr;\n      }\n\n      return instances;\n    }\n  }]);\n\n  return Component;\n}();\n\n; // Required for Meteor package, the use of window prevents export by Meteor\n(function (window) {\n  if (window.Package) {\n    M = {};\n  } else {\n    window.M = {};\n  }\n\n  // Check for jQuery\n  M.jQueryLoaded = !!window.jQuery;\n})(window);\n\n// AMD\nif (typeof define === 'function' && define.amd) {\n  define('M', [], function () {\n    return M;\n  });\n\n  // Common JS\n} else if (typeof exports !== 'undefined' && !exports.nodeType) {\n  if (typeof module !== 'undefined' && !module.nodeType && module.exports) {\n    exports = module.exports = M;\n  }\n  exports.default = M;\n}\n\nM.version = '1.0.0';\n\nM.keys = {\n  TAB: 9,\n  ENTER: 13,\n  ESC: 27,\n  ARROW_UP: 38,\n  ARROW_DOWN: 40\n};\n\n/**\n * TabPress Keydown handler\n */\nM.tabPressed = false;\nM.keyDown = false;\nvar docHandleKeydown = function (e) {\n  M.keyDown = true;\n  if (e.which === M.keys.TAB || e.which === M.keys.ARROW_DOWN || e.which === M.keys.ARROW_UP) {\n    M.tabPressed = true;\n  }\n};\nvar docHandleKeyup = function (e) {\n  M.keyDown = false;\n  if (e.which === M.keys.TAB || e.which === M.keys.ARROW_DOWN || e.which === M.keys.ARROW_UP) {\n    M.tabPressed = false;\n  }\n};\nvar docHandleFocus = function (e) {\n  if (M.keyDown) {\n    document.body.classList.add('keyboard-focused');\n  }\n};\nvar docHandleBlur = function (e) {\n  document.body.classList.remove('keyboard-focused');\n};\ndocument.addEventListener('keydown', docHandleKeydown, true);\ndocument.addEventListener('keyup', docHandleKeyup, true);\ndocument.addEventListener('focus', docHandleFocus, true);\ndocument.addEventListener('blur', docHandleBlur, true);\n\n/**\n * Initialize jQuery wrapper for plugin\n * @param {Class} plugin  javascript class\n * @param {string} pluginName  jQuery plugin name\n * @param {string} classRef  Class reference name\n */\nM.initializeJqueryWrapper = function (plugin, pluginName, classRef) {\n  jQuery.fn[pluginName] = function (methodOrOptions) {\n    // Call plugin method if valid method name is passed in\n    if (plugin.prototype[methodOrOptions]) {\n      var params = Array.prototype.slice.call(arguments, 1);\n\n      // Getter methods\n      if (methodOrOptions.slice(0, 3) === 'get') {\n        var instance = this.first()[0][classRef];\n        return instance[methodOrOptions].apply(instance, params);\n      }\n\n      // Void methods\n      return this.each(function () {\n        var instance = this[classRef];\n        instance[methodOrOptions].apply(instance, params);\n      });\n\n      // Initialize plugin if options or no argument is passed in\n    } else if (typeof methodOrOptions === 'object' || !methodOrOptions) {\n      plugin.init(this, arguments[0]);\n      return this;\n    }\n\n    // Return error if an unrecognized  method name is passed in\n    jQuery.error(\"Method \" + methodOrOptions + \" does not exist on jQuery.\" + pluginName);\n  };\n};\n\n/**\n * Automatically initialize components\n * @param {Element} context  DOM Element to search within for components\n */\nM.AutoInit = function (context) {\n  // Use document.body if no context is given\n  var root = !!context ? context : document.body;\n\n  var registry = {\n    Autocomplete: root.querySelectorAll('.autocomplete:not(.no-autoinit)'),\n    Carousel: root.querySelectorAll('.carousel:not(.no-autoinit)'),\n    Chips: root.querySelectorAll('.chips:not(.no-autoinit)'),\n    Collapsible: root.querySelectorAll('.collapsible:not(.no-autoinit)'),\n    Datepicker: root.querySelectorAll('.datepicker:not(.no-autoinit)'),\n    Dropdown: root.querySelectorAll('.dropdown-trigger:not(.no-autoinit)'),\n    Materialbox: root.querySelectorAll('.materialboxed:not(.no-autoinit)'),\n    Modal: root.querySelectorAll('.modal:not(.no-autoinit)'),\n    Parallax: root.querySelectorAll('.parallax:not(.no-autoinit)'),\n    Pushpin: root.querySelectorAll('.pushpin:not(.no-autoinit)'),\n    ScrollSpy: root.querySelectorAll('.scrollspy:not(.no-autoinit)'),\n    FormSelect: root.querySelectorAll('select:not(.no-autoinit)'),\n    Sidenav: root.querySelectorAll('.sidenav:not(.no-autoinit)'),\n    Tabs: root.querySelectorAll('.tabs:not(.no-autoinit)'),\n    TapTarget: root.querySelectorAll('.tap-target:not(.no-autoinit)'),\n    Timepicker: root.querySelectorAll('.timepicker:not(.no-autoinit)'),\n    Tooltip: root.querySelectorAll('.tooltipped:not(.no-autoinit)'),\n    FloatingActionButton: root.querySelectorAll('.fixed-action-btn:not(.no-autoinit)')\n  };\n\n  for (var pluginName in registry) {\n    var plugin = M[pluginName];\n    plugin.init(registry[pluginName]);\n  }\n};\n\n/**\n * Generate approximated selector string for a jQuery object\n * @param {jQuery} obj  jQuery object to be parsed\n * @returns {string}\n */\nM.objectSelectorString = function (obj) {\n  var tagStr = obj.prop('tagName') || '';\n  var idStr = obj.attr('id') || '';\n  var classStr = obj.attr('class') || '';\n  return (tagStr + idStr + classStr).replace(/\\s/g, '');\n};\n\n// Unique Random ID\nM.guid = function () {\n  function s4() {\n    return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n  }\n  return function () {\n    return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n  };\n}();\n\n/**\n * Escapes hash from special characters\n * @param {string} hash  String returned from this.hash\n * @returns {string}\n */\nM.escapeHash = function (hash) {\n  return hash.replace(/(:|\\.|\\[|\\]|,|=|\\/)/g, '\\\\$1');\n};\n\nM.elementOrParentIsFixed = function (element) {\n  var $element = $(element);\n  var $checkElements = $element.add($element.parents());\n  var isFixed = false;\n  $checkElements.each(function () {\n    if ($(this).css('position') === 'fixed') {\n      isFixed = true;\n      return false;\n    }\n  });\n  return isFixed;\n};\n\n/**\n * @typedef {Object} Edges\n * @property {Boolean} top  If the top edge was exceeded\n * @property {Boolean} right  If the right edge was exceeded\n * @property {Boolean} bottom  If the bottom edge was exceeded\n * @property {Boolean} left  If the left edge was exceeded\n */\n\n/**\n * @typedef {Object} Bounding\n * @property {Number} left  left offset coordinate\n * @property {Number} top  top offset coordinate\n * @property {Number} width\n * @property {Number} height\n */\n\n/**\n * Escapes hash from special characters\n * @param {Element} container  Container element that acts as the boundary\n * @param {Bounding} bounding  element bounding that is being checked\n * @param {Number} offset  offset from edge that counts as exceeding\n * @returns {Edges}\n */\nM.checkWithinContainer = function (container, bounding, offset) {\n  var edges = {\n    top: false,\n    right: false,\n    bottom: false,\n    left: false\n  };\n\n  var containerRect = container.getBoundingClientRect();\n  // If body element is smaller than viewport, use viewport height instead.\n  var containerBottom = container === document.body ? Math.max(containerRect.bottom, window.innerHeight) : containerRect.bottom;\n\n  var scrollLeft = container.scrollLeft;\n  var scrollTop = container.scrollTop;\n\n  var scrolledX = bounding.left - scrollLeft;\n  var scrolledY = bounding.top - scrollTop;\n\n  // Check for container and viewport for each edge\n  if (scrolledX < containerRect.left + offset || scrolledX < offset) {\n    edges.left = true;\n  }\n\n  if (scrolledX + bounding.width > containerRect.right - offset || scrolledX + bounding.width > window.innerWidth - offset) {\n    edges.right = true;\n  }\n\n  if (scrolledY < containerRect.top + offset || scrolledY < offset) {\n    edges.top = true;\n  }\n\n  if (scrolledY + bounding.height > containerBottom - offset || scrolledY + bounding.height > window.innerHeight - offset) {\n    edges.bottom = true;\n  }\n\n  return edges;\n};\n\nM.checkPossibleAlignments = function (el, container, bounding, offset) {\n  var canAlign = {\n    top: true,\n    right: true,\n    bottom: true,\n    left: true,\n    spaceOnTop: null,\n    spaceOnRight: null,\n    spaceOnBottom: null,\n    spaceOnLeft: null\n  };\n\n  var containerAllowsOverflow = getComputedStyle(container).overflow === 'visible';\n  var containerRect = container.getBoundingClientRect();\n  var containerHeight = Math.min(containerRect.height, window.innerHeight);\n  var containerWidth = Math.min(containerRect.width, window.innerWidth);\n  var elOffsetRect = el.getBoundingClientRect();\n\n  var scrollLeft = container.scrollLeft;\n  var scrollTop = container.scrollTop;\n\n  var scrolledX = bounding.left - scrollLeft;\n  var scrolledYTopEdge = bounding.top - scrollTop;\n  var scrolledYBottomEdge = bounding.top + elOffsetRect.height - scrollTop;\n\n  // Check for container and viewport for left\n  canAlign.spaceOnRight = !containerAllowsOverflow ? containerWidth - (scrolledX + bounding.width) : window.innerWidth - (elOffsetRect.left + bounding.width);\n  if (canAlign.spaceOnRight < 0) {\n    canAlign.left = false;\n  }\n\n  // Check for container and viewport for Right\n  canAlign.spaceOnLeft = !containerAllowsOverflow ? scrolledX - bounding.width + elOffsetRect.width : elOffsetRect.right - bounding.width;\n  if (canAlign.spaceOnLeft < 0) {\n    canAlign.right = false;\n  }\n\n  // Check for container and viewport for Top\n  canAlign.spaceOnBottom = !containerAllowsOverflow ? containerHeight - (scrolledYTopEdge + bounding.height + offset) : window.innerHeight - (elOffsetRect.top + bounding.height + offset);\n  if (canAlign.spaceOnBottom < 0) {\n    canAlign.top = false;\n  }\n\n  // Check for container and viewport for Bottom\n  canAlign.spaceOnTop = !containerAllowsOverflow ? scrolledYBottomEdge - (bounding.height - offset) : elOffsetRect.bottom - (bounding.height + offset);\n  if (canAlign.spaceOnTop < 0) {\n    canAlign.bottom = false;\n  }\n\n  return canAlign;\n};\n\nM.getOverflowParent = function (element) {\n  if (element == null) {\n    return null;\n  }\n\n  if (element === document.body || getComputedStyle(element).overflow !== 'visible') {\n    return element;\n  }\n\n  return M.getOverflowParent(element.parentElement);\n};\n\n/**\n * Gets id of component from a trigger\n * @param {Element} trigger  trigger\n * @returns {string}\n */\nM.getIdFromTrigger = function (trigger) {\n  var id = trigger.getAttribute('data-target');\n  if (!id) {\n    id = trigger.getAttribute('href');\n    if (id) {\n      id = id.slice(1);\n    } else {\n      id = '';\n    }\n  }\n  return id;\n};\n\n/**\n * Multi browser support for document scroll top\n * @returns {Number}\n */\nM.getDocumentScrollTop = function () {\n  return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n};\n\n/**\n * Multi browser support for document scroll left\n * @returns {Number}\n */\nM.getDocumentScrollLeft = function () {\n  return window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;\n};\n\n/**\n * @typedef {Object} Edges\n * @property {Boolean} top  If the top edge was exceeded\n * @property {Boolean} right  If the right edge was exceeded\n * @property {Boolean} bottom  If the bottom edge was exceeded\n * @property {Boolean} left  If the left edge was exceeded\n */\n\n/**\n * @typedef {Object} Bounding\n * @property {Number} left  left offset coordinate\n * @property {Number} top  top offset coordinate\n * @property {Number} width\n * @property {Number} height\n */\n\n/**\n * Get time in ms\n * @license https://raw.github.com/jashkenas/underscore/master/LICENSE\n * @type {function}\n * @return {number}\n */\nvar getTime = Date.now || function () {\n  return new Date().getTime();\n};\n\n/**\n * Returns a function, that, when invoked, will only be triggered at most once\n * during a given window of time. Normally, the throttled function will run\n * as much as it can, without ever going more than once per `wait` duration;\n * but if you'd like to disable the execution on the leading edge, pass\n * `{leading: false}`. To disable execution on the trailing edge, ditto.\n * @license https://raw.github.com/jashkenas/underscore/master/LICENSE\n * @param {function} func\n * @param {number} wait\n * @param {Object=} options\n * @returns {Function}\n */\nM.throttle = function (func, wait, options) {\n  var context = void 0,\n      args = void 0,\n      result = void 0;\n  var timeout = null;\n  var previous = 0;\n  options || (options = {});\n  var later = function () {\n    previous = options.leading === false ? 0 : getTime();\n    timeout = null;\n    result = func.apply(context, args);\n    context = args = null;\n  };\n  return function () {\n    var now = getTime();\n    if (!previous && options.leading === false) previous = now;\n    var remaining = wait - (now - previous);\n    context = this;\n    args = arguments;\n    if (remaining <= 0) {\n      clearTimeout(timeout);\n      timeout = null;\n      previous = now;\n      result = func.apply(context, args);\n      context = args = null;\n    } else if (!timeout && options.trailing !== false) {\n      timeout = setTimeout(later, remaining);\n    }\n    return result;\n  };\n};\n; /*\n  v2.2.0\n  2017 Julian Garnier\n  Released under the MIT license\n  */\nvar $jscomp = { scope: {} };$jscomp.defineProperty = \"function\" == typeof Object.defineProperties ? Object.defineProperty : function (e, r, p) {\n  if (p.get || p.set) throw new TypeError(\"ES3 does not support getters and setters.\");e != Array.prototype && e != Object.prototype && (e[r] = p.value);\n};$jscomp.getGlobal = function (e) {\n  return \"undefined\" != typeof window && window === e ? e : \"undefined\" != typeof global && null != global ? global : e;\n};$jscomp.global = $jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX = \"jscomp_symbol_\";\n$jscomp.initSymbol = function () {\n  $jscomp.initSymbol = function () {};$jscomp.global.Symbol || ($jscomp.global.Symbol = $jscomp.Symbol);\n};$jscomp.symbolCounter_ = 0;$jscomp.Symbol = function (e) {\n  return $jscomp.SYMBOL_PREFIX + (e || \"\") + $jscomp.symbolCounter_++;\n};\n$jscomp.initSymbolIterator = function () {\n  $jscomp.initSymbol();var e = $jscomp.global.Symbol.iterator;e || (e = $jscomp.global.Symbol.iterator = $jscomp.global.Symbol(\"iterator\"));\"function\" != typeof Array.prototype[e] && $jscomp.defineProperty(Array.prototype, e, { configurable: !0, writable: !0, value: function () {\n      return $jscomp.arrayIterator(this);\n    } });$jscomp.initSymbolIterator = function () {};\n};$jscomp.arrayIterator = function (e) {\n  var r = 0;return $jscomp.iteratorPrototype(function () {\n    return r < e.length ? { done: !1, value: e[r++] } : { done: !0 };\n  });\n};\n$jscomp.iteratorPrototype = function (e) {\n  $jscomp.initSymbolIterator();e = { next: e };e[$jscomp.global.Symbol.iterator] = function () {\n    return this;\n  };return e;\n};$jscomp.array = $jscomp.array || {};$jscomp.iteratorFromArray = function (e, r) {\n  $jscomp.initSymbolIterator();e instanceof String && (e += \"\");var p = 0,\n      m = { next: function () {\n      if (p < e.length) {\n        var u = p++;return { value: r(u, e[u]), done: !1 };\n      }m.next = function () {\n        return { done: !0, value: void 0 };\n      };return m.next();\n    } };m[Symbol.iterator] = function () {\n    return m;\n  };return m;\n};\n$jscomp.polyfill = function (e, r, p, m) {\n  if (r) {\n    p = $jscomp.global;e = e.split(\".\");for (m = 0; m < e.length - 1; m++) {\n      var u = e[m];u in p || (p[u] = {});p = p[u];\n    }e = e[e.length - 1];m = p[e];r = r(m);r != m && null != r && $jscomp.defineProperty(p, e, { configurable: !0, writable: !0, value: r });\n  }\n};$jscomp.polyfill(\"Array.prototype.keys\", function (e) {\n  return e ? e : function () {\n    return $jscomp.iteratorFromArray(this, function (e) {\n      return e;\n    });\n  };\n}, \"es6-impl\", \"es3\");var $jscomp$this = this;\n(function (r) {\n  M.anime = r();\n})(function () {\n  function e(a) {\n    if (!h.col(a)) try {\n      return document.querySelectorAll(a);\n    } catch (c) {}\n  }function r(a, c) {\n    for (var d = a.length, b = 2 <= arguments.length ? arguments[1] : void 0, f = [], n = 0; n < d; n++) {\n      if (n in a) {\n        var k = a[n];c.call(b, k, n, a) && f.push(k);\n      }\n    }return f;\n  }function p(a) {\n    return a.reduce(function (a, d) {\n      return a.concat(h.arr(d) ? p(d) : d);\n    }, []);\n  }function m(a) {\n    if (h.arr(a)) return a;\n    h.str(a) && (a = e(a) || a);return a instanceof NodeList || a instanceof HTMLCollection ? [].slice.call(a) : [a];\n  }function u(a, c) {\n    return a.some(function (a) {\n      return a === c;\n    });\n  }function C(a) {\n    var c = {},\n        d;for (d in a) {\n      c[d] = a[d];\n    }return c;\n  }function D(a, c) {\n    var d = C(a),\n        b;for (b in a) {\n      d[b] = c.hasOwnProperty(b) ? c[b] : a[b];\n    }return d;\n  }function z(a, c) {\n    var d = C(a),\n        b;for (b in c) {\n      d[b] = h.und(a[b]) ? c[b] : a[b];\n    }return d;\n  }function T(a) {\n    a = a.replace(/^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i, function (a, c, d, k) {\n      return c + c + d + d + k + k;\n    });var c = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(a);\n    a = parseInt(c[1], 16);var d = parseInt(c[2], 16),\n        c = parseInt(c[3], 16);return \"rgba(\" + a + \",\" + d + \",\" + c + \",1)\";\n  }function U(a) {\n    function c(a, c, b) {\n      0 > b && (b += 1);1 < b && --b;return b < 1 / 6 ? a + 6 * (c - a) * b : .5 > b ? c : b < 2 / 3 ? a + (c - a) * (2 / 3 - b) * 6 : a;\n    }var d = /hsl\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%\\)/g.exec(a) || /hsla\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%,\\s*([\\d.]+)\\)/g.exec(a);a = parseInt(d[1]) / 360;var b = parseInt(d[2]) / 100,\n        f = parseInt(d[3]) / 100,\n        d = d[4] || 1;if (0 == b) f = b = a = f;else {\n      var n = .5 > f ? f * (1 + b) : f + b - f * b,\n          k = 2 * f - n,\n          f = c(k, n, a + 1 / 3),\n          b = c(k, n, a);a = c(k, n, a - 1 / 3);\n    }return \"rgba(\" + 255 * f + \",\" + 255 * b + \",\" + 255 * a + \",\" + d + \")\";\n  }function y(a) {\n    if (a = /([\\+\\-]?[0-9#\\.]+)(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(a)) return a[2];\n  }function V(a) {\n    if (-1 < a.indexOf(\"translate\") || \"perspective\" === a) return \"px\";if (-1 < a.indexOf(\"rotate\") || -1 < a.indexOf(\"skew\")) return \"deg\";\n  }function I(a, c) {\n    return h.fnc(a) ? a(c.target, c.id, c.total) : a;\n  }function E(a, c) {\n    if (c in a.style) return getComputedStyle(a).getPropertyValue(c.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase()) || \"0\";\n  }function J(a, c) {\n    if (h.dom(a) && u(W, c)) return \"transform\";if (h.dom(a) && (a.getAttribute(c) || h.svg(a) && a[c])) return \"attribute\";if (h.dom(a) && \"transform\" !== c && E(a, c)) return \"css\";if (null != a[c]) return \"object\";\n  }function X(a, c) {\n    var d = V(c),\n        d = -1 < c.indexOf(\"scale\") ? 1 : 0 + d;a = a.style.transform;if (!a) return d;for (var b = [], f = [], n = [], k = /(\\w+)\\((.+?)\\)/g; b = k.exec(a);) {\n      f.push(b[1]), n.push(b[2]);\n    }a = r(n, function (a, b) {\n      return f[b] === c;\n    });return a.length ? a[0] : d;\n  }function K(a, c) {\n    switch (J(a, c)) {case \"transform\":\n        return X(a, c);case \"css\":\n        return E(a, c);case \"attribute\":\n        return a.getAttribute(c);}return a[c] || 0;\n  }function L(a, c) {\n    var d = /^(\\*=|\\+=|-=)/.exec(a);if (!d) return a;var b = y(a) || 0;c = parseFloat(c);a = parseFloat(a.replace(d[0], \"\"));switch (d[0][0]) {case \"+\":\n        return c + a + b;case \"-\":\n        return c - a + b;case \"*\":\n        return c * a + b;}\n  }function F(a, c) {\n    return Math.sqrt(Math.pow(c.x - a.x, 2) + Math.pow(c.y - a.y, 2));\n  }function M(a) {\n    a = a.points;for (var c = 0, d, b = 0; b < a.numberOfItems; b++) {\n      var f = a.getItem(b);0 < b && (c += F(d, f));d = f;\n    }return c;\n  }function N(a) {\n    if (a.getTotalLength) return a.getTotalLength();switch (a.tagName.toLowerCase()) {case \"circle\":\n        return 2 * Math.PI * a.getAttribute(\"r\");case \"rect\":\n        return 2 * a.getAttribute(\"width\") + 2 * a.getAttribute(\"height\");case \"line\":\n        return F({ x: a.getAttribute(\"x1\"), y: a.getAttribute(\"y1\") }, { x: a.getAttribute(\"x2\"), y: a.getAttribute(\"y2\") });case \"polyline\":\n        return M(a);case \"polygon\":\n        var c = a.points;return M(a) + F(c.getItem(c.numberOfItems - 1), c.getItem(0));}\n  }function Y(a, c) {\n    function d(b) {\n      b = void 0 === b ? 0 : b;return a.el.getPointAtLength(1 <= c + b ? c + b : 0);\n    }var b = d(),\n        f = d(-1),\n        n = d(1);switch (a.property) {case \"x\":\n        return b.x;case \"y\":\n        return b.y;\n      case \"angle\":\n        return 180 * Math.atan2(n.y - f.y, n.x - f.x) / Math.PI;}\n  }function O(a, c) {\n    var d = /-?\\d*\\.?\\d+/g,\n        b;b = h.pth(a) ? a.totalLength : a;if (h.col(b)) {\n      if (h.rgb(b)) {\n        var f = /rgb\\((\\d+,\\s*[\\d]+,\\s*[\\d]+)\\)/g.exec(b);b = f ? \"rgba(\" + f[1] + \",1)\" : b;\n      } else b = h.hex(b) ? T(b) : h.hsl(b) ? U(b) : void 0;\n    } else f = (f = y(b)) ? b.substr(0, b.length - f.length) : b, b = c && !/\\s/g.test(b) ? f + c : f;b += \"\";return { original: b, numbers: b.match(d) ? b.match(d).map(Number) : [0], strings: h.str(a) || c ? b.split(d) : [] };\n  }function P(a) {\n    a = a ? p(h.arr(a) ? a.map(m) : m(a)) : [];return r(a, function (a, d, b) {\n      return b.indexOf(a) === d;\n    });\n  }function Z(a) {\n    var c = P(a);return c.map(function (a, b) {\n      return { target: a, id: b, total: c.length };\n    });\n  }function aa(a, c) {\n    var d = C(c);if (h.arr(a)) {\n      var b = a.length;2 !== b || h.obj(a[0]) ? h.fnc(c.duration) || (d.duration = c.duration / b) : a = { value: a };\n    }return m(a).map(function (a, b) {\n      b = b ? 0 : c.delay;a = h.obj(a) && !h.pth(a) ? a : { value: a };h.und(a.delay) && (a.delay = b);return a;\n    }).map(function (a) {\n      return z(a, d);\n    });\n  }function ba(a, c) {\n    var d = {},\n        b;for (b in a) {\n      var f = I(a[b], c);h.arr(f) && (f = f.map(function (a) {\n        return I(a, c);\n      }), 1 === f.length && (f = f[0]));d[b] = f;\n    }d.duration = parseFloat(d.duration);d.delay = parseFloat(d.delay);return d;\n  }function ca(a) {\n    return h.arr(a) ? A.apply(this, a) : Q[a];\n  }function da(a, c) {\n    var d;return a.tweens.map(function (b) {\n      b = ba(b, c);var f = b.value,\n          e = K(c.target, a.name),\n          k = d ? d.to.original : e,\n          k = h.arr(f) ? f[0] : k,\n          w = L(h.arr(f) ? f[1] : f, k),\n          e = y(w) || y(k) || y(e);b.from = O(k, e);b.to = O(w, e);b.start = d ? d.end : a.offset;b.end = b.start + b.delay + b.duration;b.easing = ca(b.easing);b.elasticity = (1E3 - Math.min(Math.max(b.elasticity, 1), 999)) / 1E3;b.isPath = h.pth(f);b.isColor = h.col(b.from.original);b.isColor && (b.round = 1);return d = b;\n    });\n  }function ea(a, c) {\n    return r(p(a.map(function (a) {\n      return c.map(function (b) {\n        var c = J(a.target, b.name);if (c) {\n          var d = da(b, a);b = { type: c, property: b.name, animatable: a, tweens: d, duration: d[d.length - 1].end, delay: d[0].delay };\n        } else b = void 0;return b;\n      });\n    })), function (a) {\n      return !h.und(a);\n    });\n  }function R(a, c, d, b) {\n    var f = \"delay\" === a;return c.length ? (f ? Math.min : Math.max).apply(Math, c.map(function (b) {\n      return b[a];\n    })) : f ? b.delay : d.offset + b.delay + b.duration;\n  }function fa(a) {\n    var c = D(ga, a),\n        d = D(S, a),\n        b = Z(a.targets),\n        f = [],\n        e = z(c, d),\n        k;for (k in a) {\n      e.hasOwnProperty(k) || \"targets\" === k || f.push({ name: k, offset: e.offset, tweens: aa(a[k], d) });\n    }a = ea(b, f);return z(c, { children: [], animatables: b, animations: a, duration: R(\"duration\", a, c, d), delay: R(\"delay\", a, c, d) });\n  }function q(a) {\n    function c() {\n      return window.Promise && new Promise(function (a) {\n        return p = a;\n      });\n    }function d(a) {\n      return g.reversed ? g.duration - a : a;\n    }function b(a) {\n      for (var b = 0, c = {}, d = g.animations, f = d.length; b < f;) {\n        var e = d[b],\n            k = e.animatable,\n            h = e.tweens,\n            n = h.length - 1,\n            l = h[n];n && (l = r(h, function (b) {\n          return a < b.end;\n        })[0] || l);for (var h = Math.min(Math.max(a - l.start - l.delay, 0), l.duration) / l.duration, w = isNaN(h) ? 1 : l.easing(h, l.elasticity), h = l.to.strings, p = l.round, n = [], m = void 0, m = l.to.numbers.length, t = 0; t < m; t++) {\n          var x = void 0,\n              x = l.to.numbers[t],\n              q = l.from.numbers[t],\n              x = l.isPath ? Y(l.value, w * x) : q + w * (x - q);p && (l.isColor && 2 < t || (x = Math.round(x * p) / p));n.push(x);\n        }if (l = h.length) for (m = h[0], w = 0; w < l; w++) {\n          p = h[w + 1], t = n[w], isNaN(t) || (m = p ? m + (t + p) : m + (t + \" \"));\n        } else m = n[0];ha[e.type](k.target, e.property, m, c, k.id);e.currentValue = m;b++;\n      }if (b = Object.keys(c).length) for (d = 0; d < b; d++) {\n        H || (H = E(document.body, \"transform\") ? \"transform\" : \"-webkit-transform\"), g.animatables[d].target.style[H] = c[d].join(\" \");\n      }g.currentTime = a;g.progress = a / g.duration * 100;\n    }function f(a) {\n      if (g[a]) g[a](g);\n    }function e() {\n      g.remaining && !0 !== g.remaining && g.remaining--;\n    }function k(a) {\n      var k = g.duration,\n          n = g.offset,\n          w = n + g.delay,\n          r = g.currentTime,\n          x = g.reversed,\n          q = d(a);if (g.children.length) {\n        var u = g.children,\n            v = u.length;\n        if (q >= g.currentTime) for (var G = 0; G < v; G++) {\n          u[G].seek(q);\n        } else for (; v--;) {\n          u[v].seek(q);\n        }\n      }if (q >= w || !k) g.began || (g.began = !0, f(\"begin\")), f(\"run\");if (q > n && q < k) b(q);else if (q <= n && 0 !== r && (b(0), x && e()), q >= k && r !== k || !k) b(k), x || e();f(\"update\");a >= k && (g.remaining ? (t = h, \"alternate\" === g.direction && (g.reversed = !g.reversed)) : (g.pause(), g.completed || (g.completed = !0, f(\"complete\"), \"Promise\" in window && (p(), m = c()))), l = 0);\n    }a = void 0 === a ? {} : a;var h,\n        t,\n        l = 0,\n        p = null,\n        m = c(),\n        g = fa(a);g.reset = function () {\n      var a = g.direction,\n          c = g.loop;g.currentTime = 0;g.progress = 0;g.paused = !0;g.began = !1;g.completed = !1;g.reversed = \"reverse\" === a;g.remaining = \"alternate\" === a && 1 === c ? 2 : c;b(0);for (a = g.children.length; a--;) {\n        g.children[a].reset();\n      }\n    };g.tick = function (a) {\n      h = a;t || (t = h);k((l + h - t) * q.speed);\n    };g.seek = function (a) {\n      k(d(a));\n    };g.pause = function () {\n      var a = v.indexOf(g);-1 < a && v.splice(a, 1);g.paused = !0;\n    };g.play = function () {\n      g.paused && (g.paused = !1, t = 0, l = d(g.currentTime), v.push(g), B || ia());\n    };g.reverse = function () {\n      g.reversed = !g.reversed;t = 0;l = d(g.currentTime);\n    };g.restart = function () {\n      g.pause();\n      g.reset();g.play();\n    };g.finished = m;g.reset();g.autoplay && g.play();return g;\n  }var ga = { update: void 0, begin: void 0, run: void 0, complete: void 0, loop: 1, direction: \"normal\", autoplay: !0, offset: 0 },\n      S = { duration: 1E3, delay: 0, easing: \"easeOutElastic\", elasticity: 500, round: 0 },\n      W = \"translateX translateY translateZ rotate rotateX rotateY rotateZ scale scaleX scaleY scaleZ skewX skewY perspective\".split(\" \"),\n      H,\n      h = { arr: function (a) {\n      return Array.isArray(a);\n    }, obj: function (a) {\n      return -1 < Object.prototype.toString.call(a).indexOf(\"Object\");\n    },\n    pth: function (a) {\n      return h.obj(a) && a.hasOwnProperty(\"totalLength\");\n    }, svg: function (a) {\n      return a instanceof SVGElement;\n    }, dom: function (a) {\n      return a.nodeType || h.svg(a);\n    }, str: function (a) {\n      return \"string\" === typeof a;\n    }, fnc: function (a) {\n      return \"function\" === typeof a;\n    }, und: function (a) {\n      return \"undefined\" === typeof a;\n    }, hex: function (a) {\n      return (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(a)\n      );\n    }, rgb: function (a) {\n      return (/^rgb/.test(a)\n      );\n    }, hsl: function (a) {\n      return (/^hsl/.test(a)\n      );\n    }, col: function (a) {\n      return h.hex(a) || h.rgb(a) || h.hsl(a);\n    } },\n      A = function () {\n    function a(a, d, b) {\n      return (((1 - 3 * b + 3 * d) * a + (3 * b - 6 * d)) * a + 3 * d) * a;\n    }return function (c, d, b, f) {\n      if (0 <= c && 1 >= c && 0 <= b && 1 >= b) {\n        var e = new Float32Array(11);if (c !== d || b !== f) for (var k = 0; 11 > k; ++k) {\n          e[k] = a(.1 * k, c, b);\n        }return function (k) {\n          if (c === d && b === f) return k;if (0 === k) return 0;if (1 === k) return 1;for (var h = 0, l = 1; 10 !== l && e[l] <= k; ++l) {\n            h += .1;\n          }--l;var l = h + (k - e[l]) / (e[l + 1] - e[l]) * .1,\n              n = 3 * (1 - 3 * b + 3 * c) * l * l + 2 * (3 * b - 6 * c) * l + 3 * c;if (.001 <= n) {\n            for (h = 0; 4 > h; ++h) {\n              n = 3 * (1 - 3 * b + 3 * c) * l * l + 2 * (3 * b - 6 * c) * l + 3 * c;if (0 === n) break;var m = a(l, c, b) - k,\n                  l = l - m / n;\n            }k = l;\n          } else if (0 === n) k = l;else {\n            var l = h,\n                h = h + .1,\n                g = 0;do {\n              m = l + (h - l) / 2, n = a(m, c, b) - k, 0 < n ? h = m : l = m;\n            } while (1e-7 < Math.abs(n) && 10 > ++g);k = m;\n          }return a(k, d, f);\n        };\n      }\n    };\n  }(),\n      Q = function () {\n    function a(a, b) {\n      return 0 === a || 1 === a ? a : -Math.pow(2, 10 * (a - 1)) * Math.sin(2 * (a - 1 - b / (2 * Math.PI) * Math.asin(1)) * Math.PI / b);\n    }var c = \"Quad Cubic Quart Quint Sine Expo Circ Back Elastic\".split(\" \"),\n        d = { In: [[.55, .085, .68, .53], [.55, .055, .675, .19], [.895, .03, .685, .22], [.755, .05, .855, .06], [.47, 0, .745, .715], [.95, .05, .795, .035], [.6, .04, .98, .335], [.6, -.28, .735, .045], a], Out: [[.25, .46, .45, .94], [.215, .61, .355, 1], [.165, .84, .44, 1], [.23, 1, .32, 1], [.39, .575, .565, 1], [.19, 1, .22, 1], [.075, .82, .165, 1], [.175, .885, .32, 1.275], function (b, c) {\n        return 1 - a(1 - b, c);\n      }], InOut: [[.455, .03, .515, .955], [.645, .045, .355, 1], [.77, 0, .175, 1], [.86, 0, .07, 1], [.445, .05, .55, .95], [1, 0, 0, 1], [.785, .135, .15, .86], [.68, -.55, .265, 1.55], function (b, c) {\n        return .5 > b ? a(2 * b, c) / 2 : 1 - a(-2 * b + 2, c) / 2;\n      }] },\n        b = { linear: A(.25, .25, .75, .75) },\n        f = {},\n        e;for (e in d) {\n      f.type = e, d[f.type].forEach(function (a) {\n        return function (d, f) {\n          b[\"ease\" + a.type + c[f]] = h.fnc(d) ? d : A.apply($jscomp$this, d);\n        };\n      }(f)), f = { type: f.type };\n    }return b;\n  }(),\n      ha = { css: function (a, c, d) {\n      return a.style[c] = d;\n    }, attribute: function (a, c, d) {\n      return a.setAttribute(c, d);\n    }, object: function (a, c, d) {\n      return a[c] = d;\n    }, transform: function (a, c, d, b, f) {\n      b[f] || (b[f] = []);b[f].push(c + \"(\" + d + \")\");\n    } },\n      v = [],\n      B = 0,\n      ia = function () {\n    function a() {\n      B = requestAnimationFrame(c);\n    }function c(c) {\n      var b = v.length;if (b) {\n        for (var d = 0; d < b;) {\n          v[d] && v[d].tick(c), d++;\n        }a();\n      } else cancelAnimationFrame(B), B = 0;\n    }return a;\n  }();q.version = \"2.2.0\";q.speed = 1;q.running = v;q.remove = function (a) {\n    a = P(a);for (var c = v.length; c--;) {\n      for (var d = v[c], b = d.animations, f = b.length; f--;) {\n        u(a, b[f].animatable.target) && (b.splice(f, 1), b.length || d.pause());\n      }\n    }\n  };q.getValue = K;q.path = function (a, c) {\n    var d = h.str(a) ? e(a)[0] : a,\n        b = c || 100;return function (a) {\n      return { el: d, property: a, totalLength: N(d) * (b / 100) };\n    };\n  };q.setDashoffset = function (a) {\n    var c = N(a);a.setAttribute(\"stroke-dasharray\", c);return c;\n  };q.bezier = A;q.easings = Q;q.timeline = function (a) {\n    var c = q(a);c.pause();c.duration = 0;c.add = function (d) {\n      c.children.forEach(function (a) {\n        a.began = !0;a.completed = !0;\n      });m(d).forEach(function (b) {\n        var d = z(b, D(S, a || {}));d.targets = d.targets || a.targets;b = c.duration;var e = d.offset;d.autoplay = !1;d.direction = c.direction;d.offset = h.und(e) ? b : L(e, b);c.began = !0;c.completed = !0;c.seek(d.offset);d = q(d);d.began = !0;d.completed = !0;d.duration > b && (c.duration = d.duration);c.children.push(d);\n      });c.seek(0);c.reset();c.autoplay && c.restart();return c;\n    };return c;\n  };q.random = function (a, c) {\n    return Math.floor(Math.random() * (c - a + 1)) + a;\n  };return q;\n});\n;(function ($, anim) {\n  'use strict';\n\n  var _defaults = {\n    accordion: true,\n    onOpenStart: undefined,\n    onOpenEnd: undefined,\n    onCloseStart: undefined,\n    onCloseEnd: undefined,\n    inDuration: 300,\n    outDuration: 300\n  };\n\n  /**\n   * @class\n   *\n   */\n\n  var Collapsible = function (_Component) {\n    _inherits(Collapsible, _Component);\n\n    /**\n     * Construct Collapsible instance\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function Collapsible(el, options) {\n      _classCallCheck(this, Collapsible);\n\n      var _this3 = _possibleConstructorReturn(this, (Collapsible.__proto__ || Object.getPrototypeOf(Collapsible)).call(this, Collapsible, el, options));\n\n      _this3.el.M_Collapsible = _this3;\n\n      /**\n       * Options for the collapsible\n       * @member Collapsible#options\n       * @prop {Boolean} [accordion=false] - Type of the collapsible\n       * @prop {Function} onOpenStart - Callback function called before collapsible is opened\n       * @prop {Function} onOpenEnd - Callback function called after collapsible is opened\n       * @prop {Function} onCloseStart - Callback function called before collapsible is closed\n       * @prop {Function} onCloseEnd - Callback function called after collapsible is closed\n       * @prop {Number} inDuration - Transition in duration in milliseconds.\n       * @prop {Number} outDuration - Transition duration in milliseconds.\n       */\n      _this3.options = $.extend({}, Collapsible.defaults, options);\n\n      // Setup tab indices\n      _this3.$headers = _this3.$el.children('li').children('.collapsible-header');\n      _this3.$headers.attr('tabindex', 0);\n\n      _this3._setupEventHandlers();\n\n      // Open first active\n      var $activeBodies = _this3.$el.children('li.active').children('.collapsible-body');\n      if (_this3.options.accordion) {\n        // Handle Accordion\n        $activeBodies.first().css('display', 'block');\n      } else {\n        // Handle Expandables\n        $activeBodies.css('display', 'block');\n      }\n      return _this3;\n    }\n\n    _createClass(Collapsible, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this._removeEventHandlers();\n        this.el.M_Collapsible = undefined;\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        var _this4 = this;\n\n        this._handleCollapsibleClickBound = this._handleCollapsibleClick.bind(this);\n        this._handleCollapsibleKeydownBound = this._handleCollapsibleKeydown.bind(this);\n        this.el.addEventListener('click', this._handleCollapsibleClickBound);\n        this.$headers.each(function (header) {\n          header.addEventListener('keydown', _this4._handleCollapsibleKeydownBound);\n        });\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        var _this5 = this;\n\n        this.el.removeEventListener('click', this._handleCollapsibleClickBound);\n        this.$headers.each(function (header) {\n          header.removeEventListener('keydown', _this5._handleCollapsibleKeydownBound);\n        });\n      }\n\n      /**\n       * Handle Collapsible Click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleCollapsibleClick\",\n      value: function _handleCollapsibleClick(e) {\n        var $header = $(e.target).closest('.collapsible-header');\n        if (e.target && $header.length) {\n          var $collapsible = $header.closest('.collapsible');\n          if ($collapsible[0] === this.el) {\n            var $collapsibleLi = $header.closest('li');\n            var $collapsibleLis = $collapsible.children('li');\n            var isActive = $collapsibleLi[0].classList.contains('active');\n            var index = $collapsibleLis.index($collapsibleLi);\n\n            if (isActive) {\n              this.close(index);\n            } else {\n              this.open(index);\n            }\n          }\n        }\n      }\n\n      /**\n       * Handle Collapsible Keydown\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleCollapsibleKeydown\",\n      value: function _handleCollapsibleKeydown(e) {\n        if (e.keyCode === 13) {\n          this._handleCollapsibleClickBound(e);\n        }\n      }\n\n      /**\n       * Animate in collapsible slide\n       * @param {Number} index - 0th index of slide\n       */\n\n    }, {\n      key: \"_animateIn\",\n      value: function _animateIn(index) {\n        var _this6 = this;\n\n        var $collapsibleLi = this.$el.children('li').eq(index);\n        if ($collapsibleLi.length) {\n          var $body = $collapsibleLi.children('.collapsible-body');\n\n          anim.remove($body[0]);\n          $body.css({\n            display: 'block',\n            overflow: 'hidden',\n            height: 0,\n            paddingTop: '',\n            paddingBottom: ''\n          });\n\n          var pTop = $body.css('padding-top');\n          var pBottom = $body.css('padding-bottom');\n          var finalHeight = $body[0].scrollHeight;\n          $body.css({\n            paddingTop: 0,\n            paddingBottom: 0\n          });\n\n          anim({\n            targets: $body[0],\n            height: finalHeight,\n            paddingTop: pTop,\n            paddingBottom: pBottom,\n            duration: this.options.inDuration,\n            easing: 'easeInOutCubic',\n            complete: function (anim) {\n              $body.css({\n                overflow: '',\n                paddingTop: '',\n                paddingBottom: '',\n                height: ''\n              });\n\n              // onOpenEnd callback\n              if (typeof _this6.options.onOpenEnd === 'function') {\n                _this6.options.onOpenEnd.call(_this6, $collapsibleLi[0]);\n              }\n            }\n          });\n        }\n      }\n\n      /**\n       * Animate out collapsible slide\n       * @param {Number} index - 0th index of slide to open\n       */\n\n    }, {\n      key: \"_animateOut\",\n      value: function _animateOut(index) {\n        var _this7 = this;\n\n        var $collapsibleLi = this.$el.children('li').eq(index);\n        if ($collapsibleLi.length) {\n          var $body = $collapsibleLi.children('.collapsible-body');\n          anim.remove($body[0]);\n          $body.css('overflow', 'hidden');\n          anim({\n            targets: $body[0],\n            height: 0,\n            paddingTop: 0,\n            paddingBottom: 0,\n            duration: this.options.outDuration,\n            easing: 'easeInOutCubic',\n            complete: function () {\n              $body.css({\n                height: '',\n                overflow: '',\n                padding: '',\n                display: ''\n              });\n\n              // onCloseEnd callback\n              if (typeof _this7.options.onCloseEnd === 'function') {\n                _this7.options.onCloseEnd.call(_this7, $collapsibleLi[0]);\n              }\n            }\n          });\n        }\n      }\n\n      /**\n       * Open Collapsible\n       * @param {Number} index - 0th index of slide\n       */\n\n    }, {\n      key: \"open\",\n      value: function open(index) {\n        var _this8 = this;\n\n        var $collapsibleLi = this.$el.children('li').eq(index);\n        if ($collapsibleLi.length && !$collapsibleLi[0].classList.contains('active')) {\n          // onOpenStart callback\n          if (typeof this.options.onOpenStart === 'function') {\n            this.options.onOpenStart.call(this, $collapsibleLi[0]);\n          }\n\n          // Handle accordion behavior\n          if (this.options.accordion) {\n            var $collapsibleLis = this.$el.children('li');\n            var $activeLis = this.$el.children('li.active');\n            $activeLis.each(function (el) {\n              var index = $collapsibleLis.index($(el));\n              _this8.close(index);\n            });\n          }\n\n          // Animate in\n          $collapsibleLi[0].classList.add('active');\n          this._animateIn(index);\n        }\n      }\n\n      /**\n       * Close Collapsible\n       * @param {Number} index - 0th index of slide\n       */\n\n    }, {\n      key: \"close\",\n      value: function close(index) {\n        var $collapsibleLi = this.$el.children('li').eq(index);\n        if ($collapsibleLi.length && $collapsibleLi[0].classList.contains('active')) {\n          // onCloseStart callback\n          if (typeof this.options.onCloseStart === 'function') {\n            this.options.onCloseStart.call(this, $collapsibleLi[0]);\n          }\n\n          // Animate out\n          $collapsibleLi[0].classList.remove('active');\n          this._animateOut(index);\n        }\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Collapsible.__proto__ || Object.getPrototypeOf(Collapsible), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Collapsible;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Collapsible;\n  }(Component);\n\n  M.Collapsible = Collapsible;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Collapsible, 'collapsible', 'M_Collapsible');\n  }\n})(cash, M.anime);\n;(function ($, anim) {\n  'use strict';\n\n  var _defaults = {\n    alignment: 'left',\n    autoFocus: true,\n    constrainWidth: true,\n    container: null,\n    coverTrigger: true,\n    closeOnClick: true,\n    hover: false,\n    inDuration: 150,\n    outDuration: 250,\n    onOpenStart: null,\n    onOpenEnd: null,\n    onCloseStart: null,\n    onCloseEnd: null,\n    onItemClick: null\n  };\n\n  /**\n   * @class\n   */\n\n  var Dropdown = function (_Component2) {\n    _inherits(Dropdown, _Component2);\n\n    function Dropdown(el, options) {\n      _classCallCheck(this, Dropdown);\n\n      var _this9 = _possibleConstructorReturn(this, (Dropdown.__proto__ || Object.getPrototypeOf(Dropdown)).call(this, Dropdown, el, options));\n\n      _this9.el.M_Dropdown = _this9;\n      Dropdown._dropdowns.push(_this9);\n\n      _this9.id = M.getIdFromTrigger(el);\n      _this9.dropdownEl = document.getElementById(_this9.id);\n      _this9.$dropdownEl = $(_this9.dropdownEl);\n\n      /**\n       * Options for the dropdown\n       * @member Dropdown#options\n       * @prop {String} [alignment='left'] - Edge which the dropdown is aligned to\n       * @prop {Boolean} [autoFocus=true] - Automatically focus dropdown el for keyboard\n       * @prop {Boolean} [constrainWidth=true] - Constrain width to width of the button\n       * @prop {Element} container - Container element to attach dropdown to (optional)\n       * @prop {Boolean} [coverTrigger=true] - Place dropdown over trigger\n       * @prop {Boolean} [closeOnClick=true] - Close on click of dropdown item\n       * @prop {Boolean} [hover=false] - Open dropdown on hover\n       * @prop {Number} [inDuration=150] - Duration of open animation in ms\n       * @prop {Number} [outDuration=250] - Duration of close animation in ms\n       * @prop {Function} onOpenStart - Function called when dropdown starts opening\n       * @prop {Function} onOpenEnd - Function called when dropdown finishes opening\n       * @prop {Function} onCloseStart - Function called when dropdown starts closing\n       * @prop {Function} onCloseEnd - Function called when dropdown finishes closing\n       */\n      _this9.options = $.extend({}, Dropdown.defaults, options);\n\n      /**\n       * Describes open/close state of dropdown\n       * @type {Boolean}\n       */\n      _this9.isOpen = false;\n\n      /**\n       * Describes if dropdown content is scrollable\n       * @type {Boolean}\n       */\n      _this9.isScrollable = false;\n\n      /**\n       * Describes if touch moving on dropdown content\n       * @type {Boolean}\n       */\n      _this9.isTouchMoving = false;\n\n      _this9.focusedIndex = -1;\n      _this9.filterQuery = [];\n\n      // Move dropdown-content after dropdown-trigger\n      if (!!_this9.options.container) {\n        $(_this9.options.container).append(_this9.dropdownEl);\n      } else {\n        _this9.$el.after(_this9.dropdownEl);\n      }\n\n      _this9._makeDropdownFocusable();\n      _this9._resetFilterQueryBound = _this9._resetFilterQuery.bind(_this9);\n      _this9._handleDocumentClickBound = _this9._handleDocumentClick.bind(_this9);\n      _this9._handleDocumentTouchmoveBound = _this9._handleDocumentTouchmove.bind(_this9);\n      _this9._handleDropdownClickBound = _this9._handleDropdownClick.bind(_this9);\n      _this9._handleDropdownKeydownBound = _this9._handleDropdownKeydown.bind(_this9);\n      _this9._handleTriggerKeydownBound = _this9._handleTriggerKeydown.bind(_this9);\n      _this9._setupEventHandlers();\n      return _this9;\n    }\n\n    _createClass(Dropdown, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this._resetDropdownStyles();\n        this._removeEventHandlers();\n        Dropdown._dropdowns.splice(Dropdown._dropdowns.indexOf(this), 1);\n        this.el.M_Dropdown = undefined;\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        // Trigger keydown handler\n        this.el.addEventListener('keydown', this._handleTriggerKeydownBound);\n\n        // Item click handler\n        this.dropdownEl.addEventListener('click', this._handleDropdownClickBound);\n\n        // Hover event handlers\n        if (this.options.hover) {\n          this._handleMouseEnterBound = this._handleMouseEnter.bind(this);\n          this.el.addEventListener('mouseenter', this._handleMouseEnterBound);\n          this._handleMouseLeaveBound = this._handleMouseLeave.bind(this);\n          this.el.addEventListener('mouseleave', this._handleMouseLeaveBound);\n          this.dropdownEl.addEventListener('mouseleave', this._handleMouseLeaveBound);\n\n          // Click event handlers\n        } else {\n          this._handleClickBound = this._handleClick.bind(this);\n          this.el.addEventListener('click', this._handleClickBound);\n        }\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        this.el.removeEventListener('keydown', this._handleTriggerKeydownBound);\n        this.dropdownEl.removeEventListener('click', this._handleDropdownClickBound);\n\n        if (this.options.hover) {\n          this.el.removeEventListener('mouseenter', this._handleMouseEnterBound);\n          this.el.removeEventListener('mouseleave', this._handleMouseLeaveBound);\n          this.dropdownEl.removeEventListener('mouseleave', this._handleMouseLeaveBound);\n        } else {\n          this.el.removeEventListener('click', this._handleClickBound);\n        }\n      }\n    }, {\n      key: \"_setupTemporaryEventHandlers\",\n      value: function _setupTemporaryEventHandlers() {\n        // Use capture phase event handler to prevent click\n        document.body.addEventListener('click', this._handleDocumentClickBound, true);\n        document.body.addEventListener('touchend', this._handleDocumentClickBound);\n        document.body.addEventListener('touchmove', this._handleDocumentTouchmoveBound);\n        this.dropdownEl.addEventListener('keydown', this._handleDropdownKeydownBound);\n      }\n    }, {\n      key: \"_removeTemporaryEventHandlers\",\n      value: function _removeTemporaryEventHandlers() {\n        // Use capture phase event handler to prevent click\n        document.body.removeEventListener('click', this._handleDocumentClickBound, true);\n        document.body.removeEventListener('touchend', this._handleDocumentClickBound);\n        document.body.removeEventListener('touchmove', this._handleDocumentTouchmoveBound);\n        this.dropdownEl.removeEventListener('keydown', this._handleDropdownKeydownBound);\n      }\n    }, {\n      key: \"_handleClick\",\n      value: function _handleClick(e) {\n        e.preventDefault();\n        this.open();\n      }\n    }, {\n      key: \"_handleMouseEnter\",\n      value: function _handleMouseEnter() {\n        this.open();\n      }\n    }, {\n      key: \"_handleMouseLeave\",\n      value: function _handleMouseLeave(e) {\n        var toEl = e.toElement || e.relatedTarget;\n        var leaveToDropdownContent = !!$(toEl).closest('.dropdown-content').length;\n        var leaveToActiveDropdownTrigger = false;\n\n        var $closestTrigger = $(toEl).closest('.dropdown-trigger');\n        if ($closestTrigger.length && !!$closestTrigger[0].M_Dropdown && $closestTrigger[0].M_Dropdown.isOpen) {\n          leaveToActiveDropdownTrigger = true;\n        }\n\n        // Close hover dropdown if mouse did not leave to either active dropdown-trigger or dropdown-content\n        if (!leaveToActiveDropdownTrigger && !leaveToDropdownContent) {\n          this.close();\n        }\n      }\n    }, {\n      key: \"_handleDocumentClick\",\n      value: function _handleDocumentClick(e) {\n        var _this10 = this;\n\n        var $target = $(e.target);\n        if (this.options.closeOnClick && $target.closest('.dropdown-content').length && !this.isTouchMoving) {\n          // isTouchMoving to check if scrolling on mobile.\n          setTimeout(function () {\n            _this10.close();\n          }, 0);\n        } else if ($target.closest('.dropdown-trigger').length || !$target.closest('.dropdown-content').length) {\n          setTimeout(function () {\n            _this10.close();\n          }, 0);\n        }\n        this.isTouchMoving = false;\n      }\n    }, {\n      key: \"_handleTriggerKeydown\",\n      value: function _handleTriggerKeydown(e) {\n        // ARROW DOWN OR ENTER WHEN SELECT IS CLOSED - open Dropdown\n        if ((e.which === M.keys.ARROW_DOWN || e.which === M.keys.ENTER) && !this.isOpen) {\n          e.preventDefault();\n          this.open();\n        }\n      }\n\n      /**\n       * Handle Document Touchmove\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleDocumentTouchmove\",\n      value: function _handleDocumentTouchmove(e) {\n        var $target = $(e.target);\n        if ($target.closest('.dropdown-content').length) {\n          this.isTouchMoving = true;\n        }\n      }\n\n      /**\n       * Handle Dropdown Click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleDropdownClick\",\n      value: function _handleDropdownClick(e) {\n        // onItemClick callback\n        if (typeof this.options.onItemClick === 'function') {\n          var itemEl = $(e.target).closest('li')[0];\n          this.options.onItemClick.call(this, itemEl);\n        }\n      }\n\n      /**\n       * Handle Dropdown Keydown\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleDropdownKeydown\",\n      value: function _handleDropdownKeydown(e) {\n        if (e.which === M.keys.TAB) {\n          e.preventDefault();\n          this.close();\n\n          // Navigate down dropdown list\n        } else if ((e.which === M.keys.ARROW_DOWN || e.which === M.keys.ARROW_UP) && this.isOpen) {\n          e.preventDefault();\n          var direction = e.which === M.keys.ARROW_DOWN ? 1 : -1;\n          var newFocusedIndex = this.focusedIndex;\n          var foundNewIndex = false;\n          do {\n            newFocusedIndex = newFocusedIndex + direction;\n\n            if (!!this.dropdownEl.children[newFocusedIndex] && this.dropdownEl.children[newFocusedIndex].tabIndex !== -1) {\n              foundNewIndex = true;\n              break;\n            }\n          } while (newFocusedIndex < this.dropdownEl.children.length && newFocusedIndex >= 0);\n\n          if (foundNewIndex) {\n            this.focusedIndex = newFocusedIndex;\n            this._focusFocusedItem();\n          }\n\n          // ENTER selects choice on focused item\n        } else if (e.which === M.keys.ENTER && this.isOpen) {\n          // Search for <a> and <button>\n          var focusedElement = this.dropdownEl.children[this.focusedIndex];\n          var $activatableElement = $(focusedElement).find('a, button').first();\n\n          // Click a or button tag if exists, otherwise click li tag\n          if (!!$activatableElement.length) {\n            $activatableElement[0].click();\n          } else if (!!focusedElement) {\n            focusedElement.click();\n          }\n\n          // Close dropdown on ESC\n        } else if (e.which === M.keys.ESC && this.isOpen) {\n          e.preventDefault();\n          this.close();\n        }\n\n        // CASE WHEN USER TYPE LETTERS\n        var letter = String.fromCharCode(e.which).toLowerCase(),\n            nonLetters = [9, 13, 27, 38, 40];\n        if (letter && nonLetters.indexOf(e.which) === -1) {\n          this.filterQuery.push(letter);\n\n          var string = this.filterQuery.join(''),\n              newOptionEl = $(this.dropdownEl).find('li').filter(function (el) {\n            return $(el).text().toLowerCase().indexOf(string) === 0;\n          })[0];\n\n          if (newOptionEl) {\n            this.focusedIndex = $(newOptionEl).index();\n            this._focusFocusedItem();\n          }\n        }\n\n        this.filterTimeout = setTimeout(this._resetFilterQueryBound, 1000);\n      }\n\n      /**\n       * Setup dropdown\n       */\n\n    }, {\n      key: \"_resetFilterQuery\",\n      value: function _resetFilterQuery() {\n        this.filterQuery = [];\n      }\n    }, {\n      key: \"_resetDropdownStyles\",\n      value: function _resetDropdownStyles() {\n        this.$dropdownEl.css({\n          display: '',\n          width: '',\n          height: '',\n          left: '',\n          top: '',\n          'transform-origin': '',\n          transform: '',\n          opacity: ''\n        });\n      }\n    }, {\n      key: \"_makeDropdownFocusable\",\n      value: function _makeDropdownFocusable() {\n        // Needed for arrow key navigation\n        this.dropdownEl.tabIndex = 0;\n\n        // Only set tabindex if it hasn't been set by user\n        $(this.dropdownEl).children().each(function (el) {\n          if (!el.getAttribute('tabindex')) {\n            el.setAttribute('tabindex', 0);\n          }\n        });\n      }\n    }, {\n      key: \"_focusFocusedItem\",\n      value: function _focusFocusedItem() {\n        if (this.focusedIndex >= 0 && this.focusedIndex < this.dropdownEl.children.length && this.options.autoFocus) {\n          this.dropdownEl.children[this.focusedIndex].focus();\n        }\n      }\n    }, {\n      key: \"_getDropdownPosition\",\n      value: function _getDropdownPosition() {\n        var offsetParentBRect = this.el.offsetParent.getBoundingClientRect();\n        var triggerBRect = this.el.getBoundingClientRect();\n        var dropdownBRect = this.dropdownEl.getBoundingClientRect();\n\n        var idealHeight = dropdownBRect.height;\n        var idealWidth = dropdownBRect.width;\n        var idealXPos = triggerBRect.left - dropdownBRect.left;\n        var idealYPos = triggerBRect.top - dropdownBRect.top;\n\n        var dropdownBounds = {\n          left: idealXPos,\n          top: idealYPos,\n          height: idealHeight,\n          width: idealWidth\n        };\n\n        // Countainer here will be closest ancestor with overflow: hidden\n        var closestOverflowParent = !!this.dropdownEl.offsetParent ? this.dropdownEl.offsetParent : this.dropdownEl.parentNode;\n\n        var alignments = M.checkPossibleAlignments(this.el, closestOverflowParent, dropdownBounds, this.options.coverTrigger ? 0 : triggerBRect.height);\n\n        var verticalAlignment = 'top';\n        var horizontalAlignment = this.options.alignment;\n        idealYPos += this.options.coverTrigger ? 0 : triggerBRect.height;\n\n        // Reset isScrollable\n        this.isScrollable = false;\n\n        if (!alignments.top) {\n          if (alignments.bottom) {\n            verticalAlignment = 'bottom';\n          } else {\n            this.isScrollable = true;\n\n            // Determine which side has most space and cutoff at correct height\n            if (alignments.spaceOnTop > alignments.spaceOnBottom) {\n              verticalAlignment = 'bottom';\n              idealHeight += alignments.spaceOnTop;\n              idealYPos -= alignments.spaceOnTop;\n            } else {\n              idealHeight += alignments.spaceOnBottom;\n            }\n          }\n        }\n\n        // If preferred horizontal alignment is possible\n        if (!alignments[horizontalAlignment]) {\n          var oppositeAlignment = horizontalAlignment === 'left' ? 'right' : 'left';\n          if (alignments[oppositeAlignment]) {\n            horizontalAlignment = oppositeAlignment;\n          } else {\n            // Determine which side has most space and cutoff at correct height\n            if (alignments.spaceOnLeft > alignments.spaceOnRight) {\n              horizontalAlignment = 'right';\n              idealWidth += alignments.spaceOnLeft;\n              idealXPos -= alignments.spaceOnLeft;\n            } else {\n              horizontalAlignment = 'left';\n              idealWidth += alignments.spaceOnRight;\n            }\n          }\n        }\n\n        if (verticalAlignment === 'bottom') {\n          idealYPos = idealYPos - dropdownBRect.height + (this.options.coverTrigger ? triggerBRect.height : 0);\n        }\n        if (horizontalAlignment === 'right') {\n          idealXPos = idealXPos - dropdownBRect.width + triggerBRect.width;\n        }\n        return {\n          x: idealXPos,\n          y: idealYPos,\n          verticalAlignment: verticalAlignment,\n          horizontalAlignment: horizontalAlignment,\n          height: idealHeight,\n          width: idealWidth\n        };\n      }\n\n      /**\n       * Animate in dropdown\n       */\n\n    }, {\n      key: \"_animateIn\",\n      value: function _animateIn() {\n        var _this11 = this;\n\n        anim.remove(this.dropdownEl);\n        anim({\n          targets: this.dropdownEl,\n          opacity: {\n            value: [0, 1],\n            easing: 'easeOutQuad'\n          },\n          scaleX: [0.3, 1],\n          scaleY: [0.3, 1],\n          duration: this.options.inDuration,\n          easing: 'easeOutQuint',\n          complete: function (anim) {\n            if (_this11.options.autoFocus) {\n              _this11.dropdownEl.focus();\n            }\n\n            // onOpenEnd callback\n            if (typeof _this11.options.onOpenEnd === 'function') {\n              _this11.options.onOpenEnd.call(_this11, _this11.el);\n            }\n          }\n        });\n      }\n\n      /**\n       * Animate out dropdown\n       */\n\n    }, {\n      key: \"_animateOut\",\n      value: function _animateOut() {\n        var _this12 = this;\n\n        anim.remove(this.dropdownEl);\n        anim({\n          targets: this.dropdownEl,\n          opacity: {\n            value: 0,\n            easing: 'easeOutQuint'\n          },\n          scaleX: 0.3,\n          scaleY: 0.3,\n          duration: this.options.outDuration,\n          easing: 'easeOutQuint',\n          complete: function (anim) {\n            _this12._resetDropdownStyles();\n\n            // onCloseEnd callback\n            if (typeof _this12.options.onCloseEnd === 'function') {\n              _this12.options.onCloseEnd.call(_this12, _this12.el);\n            }\n          }\n        });\n      }\n\n      /**\n       * Place dropdown\n       */\n\n    }, {\n      key: \"_placeDropdown\",\n      value: function _placeDropdown() {\n        // Set width before calculating positionInfo\n        var idealWidth = this.options.constrainWidth ? this.el.getBoundingClientRect().width : this.dropdownEl.getBoundingClientRect().width;\n        this.dropdownEl.style.width = idealWidth + 'px';\n\n        var positionInfo = this._getDropdownPosition();\n        this.dropdownEl.style.left = positionInfo.x + 'px';\n        this.dropdownEl.style.top = positionInfo.y + 'px';\n        this.dropdownEl.style.height = positionInfo.height + 'px';\n        this.dropdownEl.style.width = positionInfo.width + 'px';\n        this.dropdownEl.style.transformOrigin = (positionInfo.horizontalAlignment === 'left' ? '0' : '100%') + \" \" + (positionInfo.verticalAlignment === 'top' ? '0' : '100%');\n      }\n\n      /**\n       * Open Dropdown\n       */\n\n    }, {\n      key: \"open\",\n      value: function open() {\n        if (this.isOpen) {\n          return;\n        }\n        this.isOpen = true;\n\n        // onOpenStart callback\n        if (typeof this.options.onOpenStart === 'function') {\n          this.options.onOpenStart.call(this, this.el);\n        }\n\n        // Reset styles\n        this._resetDropdownStyles();\n        this.dropdownEl.style.display = 'block';\n\n        this._placeDropdown();\n        this._animateIn();\n        this._setupTemporaryEventHandlers();\n      }\n\n      /**\n       * Close Dropdown\n       */\n\n    }, {\n      key: \"close\",\n      value: function close() {\n        if (!this.isOpen) {\n          return;\n        }\n        this.isOpen = false;\n        this.focusedIndex = -1;\n\n        // onCloseStart callback\n        if (typeof this.options.onCloseStart === 'function') {\n          this.options.onCloseStart.call(this, this.el);\n        }\n\n        this._animateOut();\n        this._removeTemporaryEventHandlers();\n\n        if (this.options.autoFocus) {\n          this.el.focus();\n        }\n      }\n\n      /**\n       * Recalculate dimensions\n       */\n\n    }, {\n      key: \"recalculateDimensions\",\n      value: function recalculateDimensions() {\n        if (this.isOpen) {\n          this.$dropdownEl.css({\n            width: '',\n            height: '',\n            left: '',\n            top: '',\n            'transform-origin': ''\n          });\n          this._placeDropdown();\n        }\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Dropdown.__proto__ || Object.getPrototypeOf(Dropdown), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Dropdown;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Dropdown;\n  }(Component);\n\n  /**\n   * @static\n   * @memberof Dropdown\n   */\n\n\n  Dropdown._dropdowns = [];\n\n  M.Dropdown = Dropdown;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Dropdown, 'dropdown', 'M_Dropdown');\n  }\n})(cash, M.anime);\n;(function ($, anim) {\n  'use strict';\n\n  var _defaults = {\n    opacity: 0.5,\n    inDuration: 250,\n    outDuration: 250,\n    onOpenStart: null,\n    onOpenEnd: null,\n    onCloseStart: null,\n    onCloseEnd: null,\n    preventScrolling: true,\n    dismissible: true,\n    startingTop: '4%',\n    endingTop: '10%'\n  };\n\n  /**\n   * @class\n   *\n   */\n\n  var Modal = function (_Component3) {\n    _inherits(Modal, _Component3);\n\n    /**\n     * Construct Modal instance and set up overlay\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function Modal(el, options) {\n      _classCallCheck(this, Modal);\n\n      var _this13 = _possibleConstructorReturn(this, (Modal.__proto__ || Object.getPrototypeOf(Modal)).call(this, Modal, el, options));\n\n      _this13.el.M_Modal = _this13;\n\n      /**\n       * Options for the modal\n       * @member Modal#options\n       * @prop {Number} [opacity=0.5] - Opacity of the modal overlay\n       * @prop {Number} [inDuration=250] - Length in ms of enter transition\n       * @prop {Number} [outDuration=250] - Length in ms of exit transition\n       * @prop {Function} onOpenStart - Callback function called before modal is opened\n       * @prop {Function} onOpenEnd - Callback function called after modal is opened\n       * @prop {Function} onCloseStart - Callback function called before modal is closed\n       * @prop {Function} onCloseEnd - Callback function called after modal is closed\n       * @prop {Boolean} [dismissible=true] - Allow modal to be dismissed by keyboard or overlay click\n       * @prop {String} [startingTop='4%'] - startingTop\n       * @prop {String} [endingTop='10%'] - endingTop\n       */\n      _this13.options = $.extend({}, Modal.defaults, options);\n\n      /**\n       * Describes open/close state of modal\n       * @type {Boolean}\n       */\n      _this13.isOpen = false;\n\n      _this13.id = _this13.$el.attr('id');\n      _this13._openingTrigger = undefined;\n      _this13.$overlay = $('<div class=\"modal-overlay\"></div>');\n      _this13.el.tabIndex = 0;\n      _this13._nthModalOpened = 0;\n\n      Modal._count++;\n      _this13._setupEventHandlers();\n      return _this13;\n    }\n\n    _createClass(Modal, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        Modal._count--;\n        this._removeEventHandlers();\n        this.el.removeAttribute('style');\n        this.$overlay.remove();\n        this.el.M_Modal = undefined;\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        this._handleOverlayClickBound = this._handleOverlayClick.bind(this);\n        this._handleModalCloseClickBound = this._handleModalCloseClick.bind(this);\n\n        if (Modal._count === 1) {\n          document.body.addEventListener('click', this._handleTriggerClick);\n        }\n        this.$overlay[0].addEventListener('click', this._handleOverlayClickBound);\n        this.el.addEventListener('click', this._handleModalCloseClickBound);\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        if (Modal._count === 0) {\n          document.body.removeEventListener('click', this._handleTriggerClick);\n        }\n        this.$overlay[0].removeEventListener('click', this._handleOverlayClickBound);\n        this.el.removeEventListener('click', this._handleModalCloseClickBound);\n      }\n\n      /**\n       * Handle Trigger Click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleTriggerClick\",\n      value: function _handleTriggerClick(e) {\n        var $trigger = $(e.target).closest('.modal-trigger');\n        if ($trigger.length) {\n          var modalId = M.getIdFromTrigger($trigger[0]);\n          var modalInstance = document.getElementById(modalId).M_Modal;\n          if (modalInstance) {\n            modalInstance.open($trigger);\n          }\n          e.preventDefault();\n        }\n      }\n\n      /**\n       * Handle Overlay Click\n       */\n\n    }, {\n      key: \"_handleOverlayClick\",\n      value: function _handleOverlayClick() {\n        if (this.options.dismissible) {\n          this.close();\n        }\n      }\n\n      /**\n       * Handle Modal Close Click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleModalCloseClick\",\n      value: function _handleModalCloseClick(e) {\n        var $closeTrigger = $(e.target).closest('.modal-close');\n        if ($closeTrigger.length) {\n          this.close();\n        }\n      }\n\n      /**\n       * Handle Keydown\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleKeydown\",\n      value: function _handleKeydown(e) {\n        // ESC key\n        if (e.keyCode === 27 && this.options.dismissible) {\n          this.close();\n        }\n      }\n\n      /**\n       * Handle Focus\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleFocus\",\n      value: function _handleFocus(e) {\n        // Only trap focus if this modal is the last model opened (prevents loops in nested modals).\n        if (!this.el.contains(e.target) && this._nthModalOpened === Modal._modalsOpen) {\n          this.el.focus();\n        }\n      }\n\n      /**\n       * Animate in modal\n       */\n\n    }, {\n      key: \"_animateIn\",\n      value: function _animateIn() {\n        var _this14 = this;\n\n        // Set initial styles\n        $.extend(this.el.style, {\n          display: 'block',\n          opacity: 0\n        });\n        $.extend(this.$overlay[0].style, {\n          display: 'block',\n          opacity: 0\n        });\n\n        // Animate overlay\n        anim({\n          targets: this.$overlay[0],\n          opacity: this.options.opacity,\n          duration: this.options.inDuration,\n          easing: 'easeOutQuad'\n        });\n\n        // Define modal animation options\n        var enterAnimOptions = {\n          targets: this.el,\n          duration: this.options.inDuration,\n          easing: 'easeOutCubic',\n          // Handle modal onOpenEnd callback\n          complete: function () {\n            if (typeof _this14.options.onOpenEnd === 'function') {\n              _this14.options.onOpenEnd.call(_this14, _this14.el, _this14._openingTrigger);\n            }\n          }\n        };\n\n        // Bottom sheet animation\n        if (this.el.classList.contains('bottom-sheet')) {\n          $.extend(enterAnimOptions, {\n            bottom: 0,\n            opacity: 1\n          });\n          anim(enterAnimOptions);\n\n          // Normal modal animation\n        } else {\n          $.extend(enterAnimOptions, {\n            top: [this.options.startingTop, this.options.endingTop],\n            opacity: 1,\n            scaleX: [0.8, 1],\n            scaleY: [0.8, 1]\n          });\n          anim(enterAnimOptions);\n        }\n      }\n\n      /**\n       * Animate out modal\n       */\n\n    }, {\n      key: \"_animateOut\",\n      value: function _animateOut() {\n        var _this15 = this;\n\n        // Animate overlay\n        anim({\n          targets: this.$overlay[0],\n          opacity: 0,\n          duration: this.options.outDuration,\n          easing: 'easeOutQuart'\n        });\n\n        // Define modal animation options\n        var exitAnimOptions = {\n          targets: this.el,\n          duration: this.options.outDuration,\n          easing: 'easeOutCubic',\n          // Handle modal ready callback\n          complete: function () {\n            _this15.el.style.display = 'none';\n            _this15.$overlay.remove();\n\n            // Call onCloseEnd callback\n            if (typeof _this15.options.onCloseEnd === 'function') {\n              _this15.options.onCloseEnd.call(_this15, _this15.el);\n            }\n          }\n        };\n\n        // Bottom sheet animation\n        if (this.el.classList.contains('bottom-sheet')) {\n          $.extend(exitAnimOptions, {\n            bottom: '-100%',\n            opacity: 0\n          });\n          anim(exitAnimOptions);\n\n          // Normal modal animation\n        } else {\n          $.extend(exitAnimOptions, {\n            top: [this.options.endingTop, this.options.startingTop],\n            opacity: 0,\n            scaleX: 0.8,\n            scaleY: 0.8\n          });\n          anim(exitAnimOptions);\n        }\n      }\n\n      /**\n       * Open Modal\n       * @param {cash} [$trigger]\n       */\n\n    }, {\n      key: \"open\",\n      value: function open($trigger) {\n        if (this.isOpen) {\n          return;\n        }\n\n        this.isOpen = true;\n        Modal._modalsOpen++;\n        this._nthModalOpened = Modal._modalsOpen;\n\n        // Set Z-Index based on number of currently open modals\n        this.$overlay[0].style.zIndex = 1000 + Modal._modalsOpen * 2;\n        this.el.style.zIndex = 1000 + Modal._modalsOpen * 2 + 1;\n\n        // Set opening trigger, undefined indicates modal was opened by javascript\n        this._openingTrigger = !!$trigger ? $trigger[0] : undefined;\n\n        // onOpenStart callback\n        if (typeof this.options.onOpenStart === 'function') {\n          this.options.onOpenStart.call(this, this.el, this._openingTrigger);\n        }\n\n        if (this.options.preventScrolling) {\n          document.body.style.overflow = 'hidden';\n        }\n\n        this.el.classList.add('open');\n        this.el.insertAdjacentElement('afterend', this.$overlay[0]);\n\n        if (this.options.dismissible) {\n          this._handleKeydownBound = this._handleKeydown.bind(this);\n          this._handleFocusBound = this._handleFocus.bind(this);\n          document.addEventListener('keydown', this._handleKeydownBound);\n          document.addEventListener('focus', this._handleFocusBound, true);\n        }\n\n        anim.remove(this.el);\n        anim.remove(this.$overlay[0]);\n        this._animateIn();\n\n        // Focus modal\n        this.el.focus();\n\n        return this;\n      }\n\n      /**\n       * Close Modal\n       */\n\n    }, {\n      key: \"close\",\n      value: function close() {\n        if (!this.isOpen) {\n          return;\n        }\n\n        this.isOpen = false;\n        Modal._modalsOpen--;\n        this._nthModalOpened = 0;\n\n        // Call onCloseStart callback\n        if (typeof this.options.onCloseStart === 'function') {\n          this.options.onCloseStart.call(this, this.el);\n        }\n\n        this.el.classList.remove('open');\n\n        // Enable body scrolling only if there are no more modals open.\n        if (Modal._modalsOpen === 0) {\n          document.body.style.overflow = '';\n        }\n\n        if (this.options.dismissible) {\n          document.removeEventListener('keydown', this._handleKeydownBound);\n          document.removeEventListener('focus', this._handleFocusBound, true);\n        }\n\n        anim.remove(this.el);\n        anim.remove(this.$overlay[0]);\n        this._animateOut();\n        return this;\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Modal.__proto__ || Object.getPrototypeOf(Modal), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Modal;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Modal;\n  }(Component);\n\n  /**\n   * @static\n   * @memberof Modal\n   */\n\n\n  Modal._modalsOpen = 0;\n\n  /**\n   * @static\n   * @memberof Modal\n   */\n  Modal._count = 0;\n\n  M.Modal = Modal;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Modal, 'modal', 'M_Modal');\n  }\n})(cash, M.anime);\n;(function ($, anim) {\n  'use strict';\n\n  var _defaults = {\n    inDuration: 275,\n    outDuration: 200,\n    onOpenStart: null,\n    onOpenEnd: null,\n    onCloseStart: null,\n    onCloseEnd: null\n  };\n\n  /**\n   * @class\n   *\n   */\n\n  var Materialbox = function (_Component4) {\n    _inherits(Materialbox, _Component4);\n\n    /**\n     * Construct Materialbox instance\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function Materialbox(el, options) {\n      _classCallCheck(this, Materialbox);\n\n      var _this16 = _possibleConstructorReturn(this, (Materialbox.__proto__ || Object.getPrototypeOf(Materialbox)).call(this, Materialbox, el, options));\n\n      _this16.el.M_Materialbox = _this16;\n\n      /**\n       * Options for the modal\n       * @member Materialbox#options\n       * @prop {Number} [inDuration=275] - Length in ms of enter transition\n       * @prop {Number} [outDuration=200] - Length in ms of exit transition\n       * @prop {Function} onOpenStart - Callback function called before materialbox is opened\n       * @prop {Function} onOpenEnd - Callback function called after materialbox is opened\n       * @prop {Function} onCloseStart - Callback function called before materialbox is closed\n       * @prop {Function} onCloseEnd - Callback function called after materialbox is closed\n       */\n      _this16.options = $.extend({}, Materialbox.defaults, options);\n\n      _this16.overlayActive = false;\n      _this16.doneAnimating = true;\n      _this16.placeholder = $('<div></div>').addClass('material-placeholder');\n      _this16.originalWidth = 0;\n      _this16.originalHeight = 0;\n      _this16.originInlineStyles = _this16.$el.attr('style');\n      _this16.caption = _this16.el.getAttribute('data-caption') || '';\n\n      // Wrap\n      _this16.$el.before(_this16.placeholder);\n      _this16.placeholder.append(_this16.$el);\n\n      _this16._setupEventHandlers();\n      return _this16;\n    }\n\n    _createClass(Materialbox, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this._removeEventHandlers();\n        this.el.M_Materialbox = undefined;\n\n        // Unwrap image\n        $(this.placeholder).after(this.el).remove();\n\n        this.$el.removeAttr('style');\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        this._handleMaterialboxClickBound = this._handleMaterialboxClick.bind(this);\n        this.el.addEventListener('click', this._handleMaterialboxClickBound);\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        this.el.removeEventListener('click', this._handleMaterialboxClickBound);\n      }\n\n      /**\n       * Handle Materialbox Click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleMaterialboxClick\",\n      value: function _handleMaterialboxClick(e) {\n        // If already modal, return to original\n        if (this.doneAnimating === false || this.overlayActive && this.doneAnimating) {\n          this.close();\n        } else {\n          this.open();\n        }\n      }\n\n      /**\n       * Handle Window Scroll\n       */\n\n    }, {\n      key: \"_handleWindowScroll\",\n      value: function _handleWindowScroll() {\n        if (this.overlayActive) {\n          this.close();\n        }\n      }\n\n      /**\n       * Handle Window Resize\n       */\n\n    }, {\n      key: \"_handleWindowResize\",\n      value: function _handleWindowResize() {\n        if (this.overlayActive) {\n          this.close();\n        }\n      }\n\n      /**\n       * Handle Window Resize\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleWindowEscape\",\n      value: function _handleWindowEscape(e) {\n        // ESC key\n        if (e.keyCode === 27 && this.doneAnimating && this.overlayActive) {\n          this.close();\n        }\n      }\n\n      /**\n       * Find ancestors with overflow: hidden; and make visible\n       */\n\n    }, {\n      key: \"_makeAncestorsOverflowVisible\",\n      value: function _makeAncestorsOverflowVisible() {\n        this.ancestorsChanged = $();\n        var ancestor = this.placeholder[0].parentNode;\n        while (ancestor !== null && !$(ancestor).is(document)) {\n          var curr = $(ancestor);\n          if (curr.css('overflow') !== 'visible') {\n            curr.css('overflow', 'visible');\n            if (this.ancestorsChanged === undefined) {\n              this.ancestorsChanged = curr;\n            } else {\n              this.ancestorsChanged = this.ancestorsChanged.add(curr);\n            }\n          }\n          ancestor = ancestor.parentNode;\n        }\n      }\n\n      /**\n       * Animate image in\n       */\n\n    }, {\n      key: \"_animateImageIn\",\n      value: function _animateImageIn() {\n        var _this17 = this;\n\n        var animOptions = {\n          targets: this.el,\n          height: [this.originalHeight, this.newHeight],\n          width: [this.originalWidth, this.newWidth],\n          left: M.getDocumentScrollLeft() + this.windowWidth / 2 - this.placeholder.offset().left - this.newWidth / 2,\n          top: M.getDocumentScrollTop() + this.windowHeight / 2 - this.placeholder.offset().top - this.newHeight / 2,\n          duration: this.options.inDuration,\n          easing: 'easeOutQuad',\n          complete: function () {\n            _this17.doneAnimating = true;\n\n            // onOpenEnd callback\n            if (typeof _this17.options.onOpenEnd === 'function') {\n              _this17.options.onOpenEnd.call(_this17, _this17.el);\n            }\n          }\n        };\n\n        // Override max-width or max-height if needed\n        this.maxWidth = this.$el.css('max-width');\n        this.maxHeight = this.$el.css('max-height');\n        if (this.maxWidth !== 'none') {\n          animOptions.maxWidth = this.newWidth;\n        }\n        if (this.maxHeight !== 'none') {\n          animOptions.maxHeight = this.newHeight;\n        }\n\n        anim(animOptions);\n      }\n\n      /**\n       * Animate image out\n       */\n\n    }, {\n      key: \"_animateImageOut\",\n      value: function _animateImageOut() {\n        var _this18 = this;\n\n        var animOptions = {\n          targets: this.el,\n          width: this.originalWidth,\n          height: this.originalHeight,\n          left: 0,\n          top: 0,\n          duration: this.options.outDuration,\n          easing: 'easeOutQuad',\n          complete: function () {\n            _this18.placeholder.css({\n              height: '',\n              width: '',\n              position: '',\n              top: '',\n              left: ''\n            });\n\n            // Revert to width or height attribute\n            if (_this18.attrWidth) {\n              _this18.$el.attr('width', _this18.attrWidth);\n            }\n            if (_this18.attrHeight) {\n              _this18.$el.attr('height', _this18.attrHeight);\n            }\n\n            _this18.$el.removeAttr('style');\n            _this18.originInlineStyles && _this18.$el.attr('style', _this18.originInlineStyles);\n\n            // Remove class\n            _this18.$el.removeClass('active');\n            _this18.doneAnimating = true;\n\n            // Remove overflow overrides on ancestors\n            if (_this18.ancestorsChanged.length) {\n              _this18.ancestorsChanged.css('overflow', '');\n            }\n\n            // onCloseEnd callback\n            if (typeof _this18.options.onCloseEnd === 'function') {\n              _this18.options.onCloseEnd.call(_this18, _this18.el);\n            }\n          }\n        };\n\n        anim(animOptions);\n      }\n\n      /**\n       * Update open and close vars\n       */\n\n    }, {\n      key: \"_updateVars\",\n      value: function _updateVars() {\n        this.windowWidth = window.innerWidth;\n        this.windowHeight = window.innerHeight;\n        this.caption = this.el.getAttribute('data-caption') || '';\n      }\n\n      /**\n       * Open Materialbox\n       */\n\n    }, {\n      key: \"open\",\n      value: function open() {\n        var _this19 = this;\n\n        this._updateVars();\n        this.originalWidth = this.el.getBoundingClientRect().width;\n        this.originalHeight = this.el.getBoundingClientRect().height;\n\n        // Set states\n        this.doneAnimating = false;\n        this.$el.addClass('active');\n        this.overlayActive = true;\n\n        // onOpenStart callback\n        if (typeof this.options.onOpenStart === 'function') {\n          this.options.onOpenStart.call(this, this.el);\n        }\n\n        // Set positioning for placeholder\n        this.placeholder.css({\n          width: this.placeholder[0].getBoundingClientRect().width + 'px',\n          height: this.placeholder[0].getBoundingClientRect().height + 'px',\n          position: 'relative',\n          top: 0,\n          left: 0\n        });\n\n        this._makeAncestorsOverflowVisible();\n\n        // Set css on origin\n        this.$el.css({\n          position: 'absolute',\n          'z-index': 1000,\n          'will-change': 'left, top, width, height'\n        });\n\n        // Change from width or height attribute to css\n        this.attrWidth = this.$el.attr('width');\n        this.attrHeight = this.$el.attr('height');\n        if (this.attrWidth) {\n          this.$el.css('width', this.attrWidth + 'px');\n          this.$el.removeAttr('width');\n        }\n        if (this.attrHeight) {\n          this.$el.css('width', this.attrHeight + 'px');\n          this.$el.removeAttr('height');\n        }\n\n        // Add overlay\n        this.$overlay = $('<div id=\"materialbox-overlay\"></div>').css({\n          opacity: 0\n        }).one('click', function () {\n          if (_this19.doneAnimating) {\n            _this19.close();\n          }\n        });\n\n        // Put before in origin image to preserve z-index layering.\n        this.$el.before(this.$overlay);\n\n        // Set dimensions if needed\n        var overlayOffset = this.$overlay[0].getBoundingClientRect();\n        this.$overlay.css({\n          width: this.windowWidth + 'px',\n          height: this.windowHeight + 'px',\n          left: -1 * overlayOffset.left + 'px',\n          top: -1 * overlayOffset.top + 'px'\n        });\n\n        anim.remove(this.el);\n        anim.remove(this.$overlay[0]);\n\n        // Animate Overlay\n        anim({\n          targets: this.$overlay[0],\n          opacity: 1,\n          duration: this.options.inDuration,\n          easing: 'easeOutQuad'\n        });\n\n        // Add and animate caption if it exists\n        if (this.caption !== '') {\n          if (this.$photocaption) {\n            anim.remove(this.$photoCaption[0]);\n          }\n          this.$photoCaption = $('<div class=\"materialbox-caption\"></div>');\n          this.$photoCaption.text(this.caption);\n          $('body').append(this.$photoCaption);\n          this.$photoCaption.css({ display: 'inline' });\n\n          anim({\n            targets: this.$photoCaption[0],\n            opacity: 1,\n            duration: this.options.inDuration,\n            easing: 'easeOutQuad'\n          });\n        }\n\n        // Resize Image\n        var ratio = 0;\n        var widthPercent = this.originalWidth / this.windowWidth;\n        var heightPercent = this.originalHeight / this.windowHeight;\n        this.newWidth = 0;\n        this.newHeight = 0;\n\n        if (widthPercent > heightPercent) {\n          ratio = this.originalHeight / this.originalWidth;\n          this.newWidth = this.windowWidth * 0.9;\n          this.newHeight = this.windowWidth * 0.9 * ratio;\n        } else {\n          ratio = this.originalWidth / this.originalHeight;\n          this.newWidth = this.windowHeight * 0.9 * ratio;\n          this.newHeight = this.windowHeight * 0.9;\n        }\n\n        this._animateImageIn();\n\n        // Handle Exit triggers\n        this._handleWindowScrollBound = this._handleWindowScroll.bind(this);\n        this._handleWindowResizeBound = this._handleWindowResize.bind(this);\n        this._handleWindowEscapeBound = this._handleWindowEscape.bind(this);\n\n        window.addEventListener('scroll', this._handleWindowScrollBound);\n        window.addEventListener('resize', this._handleWindowResizeBound);\n        window.addEventListener('keyup', this._handleWindowEscapeBound);\n      }\n\n      /**\n       * Close Materialbox\n       */\n\n    }, {\n      key: \"close\",\n      value: function close() {\n        var _this20 = this;\n\n        this._updateVars();\n        this.doneAnimating = false;\n\n        // onCloseStart callback\n        if (typeof this.options.onCloseStart === 'function') {\n          this.options.onCloseStart.call(this, this.el);\n        }\n\n        anim.remove(this.el);\n        anim.remove(this.$overlay[0]);\n\n        if (this.caption !== '') {\n          anim.remove(this.$photoCaption[0]);\n        }\n\n        // disable exit handlers\n        window.removeEventListener('scroll', this._handleWindowScrollBound);\n        window.removeEventListener('resize', this._handleWindowResizeBound);\n        window.removeEventListener('keyup', this._handleWindowEscapeBound);\n\n        anim({\n          targets: this.$overlay[0],\n          opacity: 0,\n          duration: this.options.outDuration,\n          easing: 'easeOutQuad',\n          complete: function () {\n            _this20.overlayActive = false;\n            _this20.$overlay.remove();\n          }\n        });\n\n        this._animateImageOut();\n\n        // Remove Caption + reset css settings on image\n        if (this.caption !== '') {\n          anim({\n            targets: this.$photoCaption[0],\n            opacity: 0,\n            duration: this.options.outDuration,\n            easing: 'easeOutQuad',\n            complete: function () {\n              _this20.$photoCaption.remove();\n            }\n          });\n        }\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Materialbox.__proto__ || Object.getPrototypeOf(Materialbox), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Materialbox;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Materialbox;\n  }(Component);\n\n  M.Materialbox = Materialbox;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Materialbox, 'materialbox', 'M_Materialbox');\n  }\n})(cash, M.anime);\n;(function ($) {\n  'use strict';\n\n  var _defaults = {\n    responsiveThreshold: 0 // breakpoint for swipeable\n  };\n\n  var Parallax = function (_Component5) {\n    _inherits(Parallax, _Component5);\n\n    function Parallax(el, options) {\n      _classCallCheck(this, Parallax);\n\n      var _this21 = _possibleConstructorReturn(this, (Parallax.__proto__ || Object.getPrototypeOf(Parallax)).call(this, Parallax, el, options));\n\n      _this21.el.M_Parallax = _this21;\n\n      /**\n       * Options for the Parallax\n       * @member Parallax#options\n       * @prop {Number} responsiveThreshold\n       */\n      _this21.options = $.extend({}, Parallax.defaults, options);\n      _this21._enabled = window.innerWidth > _this21.options.responsiveThreshold;\n\n      _this21.$img = _this21.$el.find('img').first();\n      _this21.$img.each(function () {\n        var el = this;\n        if (el.complete) $(el).trigger('load');\n      });\n\n      _this21._updateParallax();\n      _this21._setupEventHandlers();\n      _this21._setupStyles();\n\n      Parallax._parallaxes.push(_this21);\n      return _this21;\n    }\n\n    _createClass(Parallax, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        Parallax._parallaxes.splice(Parallax._parallaxes.indexOf(this), 1);\n        this.$img[0].style.transform = '';\n        this._removeEventHandlers();\n\n        this.$el[0].M_Parallax = undefined;\n      }\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        this._handleImageLoadBound = this._handleImageLoad.bind(this);\n        this.$img[0].addEventListener('load', this._handleImageLoadBound);\n\n        if (Parallax._parallaxes.length === 0) {\n          Parallax._handleScrollThrottled = M.throttle(Parallax._handleScroll, 5);\n          window.addEventListener('scroll', Parallax._handleScrollThrottled);\n\n          Parallax._handleWindowResizeThrottled = M.throttle(Parallax._handleWindowResize, 5);\n          window.addEventListener('resize', Parallax._handleWindowResizeThrottled);\n        }\n      }\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        this.$img[0].removeEventListener('load', this._handleImageLoadBound);\n\n        if (Parallax._parallaxes.length === 0) {\n          window.removeEventListener('scroll', Parallax._handleScrollThrottled);\n          window.removeEventListener('resize', Parallax._handleWindowResizeThrottled);\n        }\n      }\n    }, {\n      key: \"_setupStyles\",\n      value: function _setupStyles() {\n        this.$img[0].style.opacity = 1;\n      }\n    }, {\n      key: \"_handleImageLoad\",\n      value: function _handleImageLoad() {\n        this._updateParallax();\n      }\n    }, {\n      key: \"_updateParallax\",\n      value: function _updateParallax() {\n        var containerHeight = this.$el.height() > 0 ? this.el.parentNode.offsetHeight : 500;\n        var imgHeight = this.$img[0].offsetHeight;\n        var parallaxDist = imgHeight - containerHeight;\n        var bottom = this.$el.offset().top + containerHeight;\n        var top = this.$el.offset().top;\n        var scrollTop = M.getDocumentScrollTop();\n        var windowHeight = window.innerHeight;\n        var windowBottom = scrollTop + windowHeight;\n        var percentScrolled = (windowBottom - top) / (containerHeight + windowHeight);\n        var parallax = parallaxDist * percentScrolled;\n\n        if (!this._enabled) {\n          this.$img[0].style.transform = '';\n        } else if (bottom > scrollTop && top < scrollTop + windowHeight) {\n          this.$img[0].style.transform = \"translate3D(-50%, \" + parallax + \"px, 0)\";\n        }\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Parallax.__proto__ || Object.getPrototypeOf(Parallax), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Parallax;\n      }\n    }, {\n      key: \"_handleScroll\",\n      value: function _handleScroll() {\n        for (var i = 0; i < Parallax._parallaxes.length; i++) {\n          var parallaxInstance = Parallax._parallaxes[i];\n          parallaxInstance._updateParallax.call(parallaxInstance);\n        }\n      }\n    }, {\n      key: \"_handleWindowResize\",\n      value: function _handleWindowResize() {\n        for (var i = 0; i < Parallax._parallaxes.length; i++) {\n          var parallaxInstance = Parallax._parallaxes[i];\n          parallaxInstance._enabled = window.innerWidth > parallaxInstance.options.responsiveThreshold;\n        }\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Parallax;\n  }(Component);\n\n  /**\n   * @static\n   * @memberof Parallax\n   */\n\n\n  Parallax._parallaxes = [];\n\n  M.Parallax = Parallax;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Parallax, 'parallax', 'M_Parallax');\n  }\n})(cash);\n;(function ($, anim) {\n  'use strict';\n\n  var _defaults = {\n    duration: 300,\n    onShow: null,\n    swipeable: false,\n    responsiveThreshold: Infinity // breakpoint for swipeable\n  };\n\n  /**\n   * @class\n   *\n   */\n\n  var Tabs = function (_Component6) {\n    _inherits(Tabs, _Component6);\n\n    /**\n     * Construct Tabs instance\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function Tabs(el, options) {\n      _classCallCheck(this, Tabs);\n\n      var _this22 = _possibleConstructorReturn(this, (Tabs.__proto__ || Object.getPrototypeOf(Tabs)).call(this, Tabs, el, options));\n\n      _this22.el.M_Tabs = _this22;\n\n      /**\n       * Options for the Tabs\n       * @member Tabs#options\n       * @prop {Number} duration\n       * @prop {Function} onShow\n       * @prop {Boolean} swipeable\n       * @prop {Number} responsiveThreshold\n       */\n      _this22.options = $.extend({}, Tabs.defaults, options);\n\n      // Setup\n      _this22.$tabLinks = _this22.$el.children('li.tab').children('a');\n      _this22.index = 0;\n      _this22._setupActiveTabLink();\n\n      // Setup tabs content\n      if (_this22.options.swipeable) {\n        _this22._setupSwipeableTabs();\n      } else {\n        _this22._setupNormalTabs();\n      }\n\n      // Setup tabs indicator after content to ensure accurate widths\n      _this22._setTabsAndTabWidth();\n      _this22._createIndicator();\n\n      _this22._setupEventHandlers();\n      return _this22;\n    }\n\n    _createClass(Tabs, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this._removeEventHandlers();\n        this._indicator.parentNode.removeChild(this._indicator);\n\n        if (this.options.swipeable) {\n          this._teardownSwipeableTabs();\n        } else {\n          this._teardownNormalTabs();\n        }\n\n        this.$el[0].M_Tabs = undefined;\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        this._handleWindowResizeBound = this._handleWindowResize.bind(this);\n        window.addEventListener('resize', this._handleWindowResizeBound);\n\n        this._handleTabClickBound = this._handleTabClick.bind(this);\n        this.el.addEventListener('click', this._handleTabClickBound);\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        window.removeEventListener('resize', this._handleWindowResizeBound);\n        this.el.removeEventListener('click', this._handleTabClickBound);\n      }\n\n      /**\n       * Handle window Resize\n       */\n\n    }, {\n      key: \"_handleWindowResize\",\n      value: function _handleWindowResize() {\n        this._setTabsAndTabWidth();\n\n        if (this.tabWidth !== 0 && this.tabsWidth !== 0) {\n          this._indicator.style.left = this._calcLeftPos(this.$activeTabLink) + 'px';\n          this._indicator.style.right = this._calcRightPos(this.$activeTabLink) + 'px';\n        }\n      }\n\n      /**\n       * Handle tab click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleTabClick\",\n      value: function _handleTabClick(e) {\n        var _this23 = this;\n\n        var tab = $(e.target).closest('li.tab');\n        var tabLink = $(e.target).closest('a');\n\n        // Handle click on tab link only\n        if (!tabLink.length || !tabLink.parent().hasClass('tab')) {\n          return;\n        }\n\n        if (tab.hasClass('disabled')) {\n          e.preventDefault();\n          return;\n        }\n\n        // Act as regular link if target attribute is specified.\n        if (!!tabLink.attr('target')) {\n          return;\n        }\n\n        // Make the old tab inactive.\n        this.$activeTabLink.removeClass('active');\n        var $oldContent = this.$content;\n\n        // Update the variables with the new link and content\n        this.$activeTabLink = tabLink;\n        this.$content = $(M.escapeHash(tabLink[0].hash));\n        this.$tabLinks = this.$el.children('li.tab').children('a');\n\n        // Make the tab active.\n        this.$activeTabLink.addClass('active');\n        var prevIndex = this.index;\n        this.index = Math.max(this.$tabLinks.index(tabLink), 0);\n\n        // Swap content\n        if (this.options.swipeable) {\n          if (this._tabsCarousel) {\n            this._tabsCarousel.set(this.index, function () {\n              if (typeof _this23.options.onShow === 'function') {\n                _this23.options.onShow.call(_this23, _this23.$content[0]);\n              }\n            });\n          }\n        } else {\n          if (this.$content.length) {\n            this.$content[0].style.display = 'block';\n            this.$content.addClass('active');\n            if (typeof this.options.onShow === 'function') {\n              this.options.onShow.call(this, this.$content[0]);\n            }\n\n            if ($oldContent.length && !$oldContent.is(this.$content)) {\n              $oldContent[0].style.display = 'none';\n              $oldContent.removeClass('active');\n            }\n          }\n        }\n\n        // Update widths after content is swapped (scrollbar bugfix)\n        this._setTabsAndTabWidth();\n\n        // Update indicator\n        this._animateIndicator(prevIndex);\n\n        // Prevent the anchor's default click action\n        e.preventDefault();\n      }\n\n      /**\n       * Generate elements for tab indicator.\n       */\n\n    }, {\n      key: \"_createIndicator\",\n      value: function _createIndicator() {\n        var _this24 = this;\n\n        var indicator = document.createElement('li');\n        indicator.classList.add('indicator');\n\n        this.el.appendChild(indicator);\n        this._indicator = indicator;\n\n        setTimeout(function () {\n          _this24._indicator.style.left = _this24._calcLeftPos(_this24.$activeTabLink) + 'px';\n          _this24._indicator.style.right = _this24._calcRightPos(_this24.$activeTabLink) + 'px';\n        }, 0);\n      }\n\n      /**\n       * Setup first active tab link.\n       */\n\n    }, {\n      key: \"_setupActiveTabLink\",\n      value: function _setupActiveTabLink() {\n        // If the location.hash matches one of the links, use that as the active tab.\n        this.$activeTabLink = $(this.$tabLinks.filter('[href=\"' + location.hash + '\"]'));\n\n        // If no match is found, use the first link or any with class 'active' as the initial active tab.\n        if (this.$activeTabLink.length === 0) {\n          this.$activeTabLink = this.$el.children('li.tab').children('a.active').first();\n        }\n        if (this.$activeTabLink.length === 0) {\n          this.$activeTabLink = this.$el.children('li.tab').children('a').first();\n        }\n\n        this.$tabLinks.removeClass('active');\n        this.$activeTabLink[0].classList.add('active');\n\n        this.index = Math.max(this.$tabLinks.index(this.$activeTabLink), 0);\n\n        if (this.$activeTabLink.length) {\n          this.$content = $(M.escapeHash(this.$activeTabLink[0].hash));\n          this.$content.addClass('active');\n        }\n      }\n\n      /**\n       * Setup swipeable tabs\n       */\n\n    }, {\n      key: \"_setupSwipeableTabs\",\n      value: function _setupSwipeableTabs() {\n        var _this25 = this;\n\n        // Change swipeable according to responsive threshold\n        if (window.innerWidth > this.options.responsiveThreshold) {\n          this.options.swipeable = false;\n        }\n\n        var $tabsContent = $();\n        this.$tabLinks.each(function (link) {\n          var $currContent = $(M.escapeHash(link.hash));\n          $currContent.addClass('carousel-item');\n          $tabsContent = $tabsContent.add($currContent);\n        });\n\n        var $tabsWrapper = $('<div class=\"tabs-content carousel carousel-slider\"></div>');\n        $tabsContent.first().before($tabsWrapper);\n        $tabsWrapper.append($tabsContent);\n        $tabsContent[0].style.display = '';\n\n        // Keep active tab index to set initial carousel slide\n        var activeTabIndex = this.$activeTabLink.closest('.tab').index();\n\n        this._tabsCarousel = M.Carousel.init($tabsWrapper[0], {\n          fullWidth: true,\n          noWrap: true,\n          onCycleTo: function (item) {\n            var prevIndex = _this25.index;\n            _this25.index = $(item).index();\n            _this25.$activeTabLink.removeClass('active');\n            _this25.$activeTabLink = _this25.$tabLinks.eq(_this25.index);\n            _this25.$activeTabLink.addClass('active');\n            _this25._animateIndicator(prevIndex);\n            if (typeof _this25.options.onShow === 'function') {\n              _this25.options.onShow.call(_this25, _this25.$content[0]);\n            }\n          }\n        });\n\n        // Set initial carousel slide to active tab\n        this._tabsCarousel.set(activeTabIndex);\n      }\n\n      /**\n       * Teardown normal tabs.\n       */\n\n    }, {\n      key: \"_teardownSwipeableTabs\",\n      value: function _teardownSwipeableTabs() {\n        var $tabsWrapper = this._tabsCarousel.$el;\n        this._tabsCarousel.destroy();\n\n        // Unwrap\n        $tabsWrapper.after($tabsWrapper.children());\n        $tabsWrapper.remove();\n      }\n\n      /**\n       * Setup normal tabs.\n       */\n\n    }, {\n      key: \"_setupNormalTabs\",\n      value: function _setupNormalTabs() {\n        // Hide Tabs Content\n        this.$tabLinks.not(this.$activeTabLink).each(function (link) {\n          if (!!link.hash) {\n            var $currContent = $(M.escapeHash(link.hash));\n            if ($currContent.length) {\n              $currContent[0].style.display = 'none';\n            }\n          }\n        });\n      }\n\n      /**\n       * Teardown normal tabs.\n       */\n\n    }, {\n      key: \"_teardownNormalTabs\",\n      value: function _teardownNormalTabs() {\n        // show Tabs Content\n        this.$tabLinks.each(function (link) {\n          if (!!link.hash) {\n            var $currContent = $(M.escapeHash(link.hash));\n            if ($currContent.length) {\n              $currContent[0].style.display = '';\n            }\n          }\n        });\n      }\n\n      /**\n       * set tabs and tab width\n       */\n\n    }, {\n      key: \"_setTabsAndTabWidth\",\n      value: function _setTabsAndTabWidth() {\n        this.tabsWidth = this.$el.width();\n        this.tabWidth = Math.max(this.tabsWidth, this.el.scrollWidth) / this.$tabLinks.length;\n      }\n\n      /**\n       * Finds right attribute for indicator based on active tab.\n       * @param {cash} el\n       */\n\n    }, {\n      key: \"_calcRightPos\",\n      value: function _calcRightPos(el) {\n        return Math.ceil(this.tabsWidth - el.position().left - el[0].getBoundingClientRect().width);\n      }\n\n      /**\n       * Finds left attribute for indicator based on active tab.\n       * @param {cash} el\n       */\n\n    }, {\n      key: \"_calcLeftPos\",\n      value: function _calcLeftPos(el) {\n        return Math.floor(el.position().left);\n      }\n    }, {\n      key: \"updateTabIndicator\",\n      value: function updateTabIndicator() {\n        this._setTabsAndTabWidth();\n        this._animateIndicator(this.index);\n      }\n\n      /**\n       * Animates Indicator to active tab.\n       * @param {Number} prevIndex\n       */\n\n    }, {\n      key: \"_animateIndicator\",\n      value: function _animateIndicator(prevIndex) {\n        var leftDelay = 0,\n            rightDelay = 0;\n\n        if (this.index - prevIndex >= 0) {\n          leftDelay = 90;\n        } else {\n          rightDelay = 90;\n        }\n\n        // Animate\n        var animOptions = {\n          targets: this._indicator,\n          left: {\n            value: this._calcLeftPos(this.$activeTabLink),\n            delay: leftDelay\n          },\n          right: {\n            value: this._calcRightPos(this.$activeTabLink),\n            delay: rightDelay\n          },\n          duration: this.options.duration,\n          easing: 'easeOutQuad'\n        };\n        anim.remove(this._indicator);\n        anim(animOptions);\n      }\n\n      /**\n       * Select tab.\n       * @param {String} tabId\n       */\n\n    }, {\n      key: \"select\",\n      value: function select(tabId) {\n        var tab = this.$tabLinks.filter('[href=\"#' + tabId + '\"]');\n        if (tab.length) {\n          tab.trigger('click');\n        }\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Tabs.__proto__ || Object.getPrototypeOf(Tabs), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Tabs;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Tabs;\n  }(Component);\n\n  M.Tabs = Tabs;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Tabs, 'tabs', 'M_Tabs');\n  }\n})(cash, M.anime);\n;(function ($, anim) {\n  'use strict';\n\n  var _defaults = {\n    exitDelay: 200,\n    enterDelay: 0,\n    html: null,\n    margin: 5,\n    inDuration: 250,\n    outDuration: 200,\n    position: 'bottom',\n    transitionMovement: 10\n  };\n\n  /**\n   * @class\n   *\n   */\n\n  var Tooltip = function (_Component7) {\n    _inherits(Tooltip, _Component7);\n\n    /**\n     * Construct Tooltip instance\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function Tooltip(el, options) {\n      _classCallCheck(this, Tooltip);\n\n      var _this26 = _possibleConstructorReturn(this, (Tooltip.__proto__ || Object.getPrototypeOf(Tooltip)).call(this, Tooltip, el, options));\n\n      _this26.el.M_Tooltip = _this26;\n      _this26.options = $.extend({}, Tooltip.defaults, options);\n\n      _this26.isOpen = false;\n      _this26.isHovered = false;\n      _this26.isFocused = false;\n      _this26._appendTooltipEl();\n      _this26._setupEventHandlers();\n      return _this26;\n    }\n\n    _createClass(Tooltip, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        $(this.tooltipEl).remove();\n        this._removeEventHandlers();\n        this.el.M_Tooltip = undefined;\n      }\n    }, {\n      key: \"_appendTooltipEl\",\n      value: function _appendTooltipEl() {\n        var tooltipEl = document.createElement('div');\n        tooltipEl.classList.add('material-tooltip');\n        this.tooltipEl = tooltipEl;\n\n        var tooltipContentEl = document.createElement('div');\n        tooltipContentEl.classList.add('tooltip-content');\n        tooltipContentEl.innerHTML = this.options.html;\n        tooltipEl.appendChild(tooltipContentEl);\n        document.body.appendChild(tooltipEl);\n      }\n    }, {\n      key: \"_updateTooltipContent\",\n      value: function _updateTooltipContent() {\n        this.tooltipEl.querySelector('.tooltip-content').innerHTML = this.options.html;\n      }\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        this._handleMouseEnterBound = this._handleMouseEnter.bind(this);\n        this._handleMouseLeaveBound = this._handleMouseLeave.bind(this);\n        this._handleFocusBound = this._handleFocus.bind(this);\n        this._handleBlurBound = this._handleBlur.bind(this);\n        this.el.addEventListener('mouseenter', this._handleMouseEnterBound);\n        this.el.addEventListener('mouseleave', this._handleMouseLeaveBound);\n        this.el.addEventListener('focus', this._handleFocusBound, true);\n        this.el.addEventListener('blur', this._handleBlurBound, true);\n      }\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        this.el.removeEventListener('mouseenter', this._handleMouseEnterBound);\n        this.el.removeEventListener('mouseleave', this._handleMouseLeaveBound);\n        this.el.removeEventListener('focus', this._handleFocusBound, true);\n        this.el.removeEventListener('blur', this._handleBlurBound, true);\n      }\n    }, {\n      key: \"open\",\n      value: function open(isManual) {\n        if (this.isOpen) {\n          return;\n        }\n        isManual = isManual === undefined ? true : undefined; // Default value true\n        this.isOpen = true;\n        // Update tooltip content with HTML attribute options\n        this.options = $.extend({}, this.options, this._getAttributeOptions());\n        this._updateTooltipContent();\n        this._setEnterDelayTimeout(isManual);\n      }\n    }, {\n      key: \"close\",\n      value: function close() {\n        if (!this.isOpen) {\n          return;\n        }\n\n        this.isHovered = false;\n        this.isFocused = false;\n        this.isOpen = false;\n        this._setExitDelayTimeout();\n      }\n\n      /**\n       * Create timeout which delays when the tooltip closes\n       */\n\n    }, {\n      key: \"_setExitDelayTimeout\",\n      value: function _setExitDelayTimeout() {\n        var _this27 = this;\n\n        clearTimeout(this._exitDelayTimeout);\n\n        this._exitDelayTimeout = setTimeout(function () {\n          if (_this27.isHovered || _this27.isFocused) {\n            return;\n          }\n\n          _this27._animateOut();\n        }, this.options.exitDelay);\n      }\n\n      /**\n       * Create timeout which delays when the toast closes\n       */\n\n    }, {\n      key: \"_setEnterDelayTimeout\",\n      value: function _setEnterDelayTimeout(isManual) {\n        var _this28 = this;\n\n        clearTimeout(this._enterDelayTimeout);\n\n        this._enterDelayTimeout = setTimeout(function () {\n          if (!_this28.isHovered && !_this28.isFocused && !isManual) {\n            return;\n          }\n\n          _this28._animateIn();\n        }, this.options.enterDelay);\n      }\n    }, {\n      key: \"_positionTooltip\",\n      value: function _positionTooltip() {\n        var origin = this.el,\n            tooltip = this.tooltipEl,\n            originHeight = origin.offsetHeight,\n            originWidth = origin.offsetWidth,\n            tooltipHeight = tooltip.offsetHeight,\n            tooltipWidth = tooltip.offsetWidth,\n            newCoordinates = void 0,\n            margin = this.options.margin,\n            targetTop = void 0,\n            targetLeft = void 0;\n\n        this.xMovement = 0, this.yMovement = 0;\n\n        targetTop = origin.getBoundingClientRect().top + M.getDocumentScrollTop();\n        targetLeft = origin.getBoundingClientRect().left + M.getDocumentScrollLeft();\n\n        if (this.options.position === 'top') {\n          targetTop += -tooltipHeight - margin;\n          targetLeft += originWidth / 2 - tooltipWidth / 2;\n          this.yMovement = -this.options.transitionMovement;\n        } else if (this.options.position === 'right') {\n          targetTop += originHeight / 2 - tooltipHeight / 2;\n          targetLeft += originWidth + margin;\n          this.xMovement = this.options.transitionMovement;\n        } else if (this.options.position === 'left') {\n          targetTop += originHeight / 2 - tooltipHeight / 2;\n          targetLeft += -tooltipWidth - margin;\n          this.xMovement = -this.options.transitionMovement;\n        } else {\n          targetTop += originHeight + margin;\n          targetLeft += originWidth / 2 - tooltipWidth / 2;\n          this.yMovement = this.options.transitionMovement;\n        }\n\n        newCoordinates = this._repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);\n        $(tooltip).css({\n          top: newCoordinates.y + 'px',\n          left: newCoordinates.x + 'px'\n        });\n      }\n    }, {\n      key: \"_repositionWithinScreen\",\n      value: function _repositionWithinScreen(x, y, width, height) {\n        var scrollLeft = M.getDocumentScrollLeft();\n        var scrollTop = M.getDocumentScrollTop();\n        var newX = x - scrollLeft;\n        var newY = y - scrollTop;\n\n        var bounding = {\n          left: newX,\n          top: newY,\n          width: width,\n          height: height\n        };\n\n        var offset = this.options.margin + this.options.transitionMovement;\n        var edges = M.checkWithinContainer(document.body, bounding, offset);\n\n        if (edges.left) {\n          newX = offset;\n        } else if (edges.right) {\n          newX -= newX + width - window.innerWidth;\n        }\n\n        if (edges.top) {\n          newY = offset;\n        } else if (edges.bottom) {\n          newY -= newY + height - window.innerHeight;\n        }\n\n        return {\n          x: newX + scrollLeft,\n          y: newY + scrollTop\n        };\n      }\n    }, {\n      key: \"_animateIn\",\n      value: function _animateIn() {\n        this._positionTooltip();\n        this.tooltipEl.style.visibility = 'visible';\n        anim.remove(this.tooltipEl);\n        anim({\n          targets: this.tooltipEl,\n          opacity: 1,\n          translateX: this.xMovement,\n          translateY: this.yMovement,\n          duration: this.options.inDuration,\n          easing: 'easeOutCubic'\n        });\n      }\n    }, {\n      key: \"_animateOut\",\n      value: function _animateOut() {\n        anim.remove(this.tooltipEl);\n        anim({\n          targets: this.tooltipEl,\n          opacity: 0,\n          translateX: 0,\n          translateY: 0,\n          duration: this.options.outDuration,\n          easing: 'easeOutCubic'\n        });\n      }\n    }, {\n      key: \"_handleMouseEnter\",\n      value: function _handleMouseEnter() {\n        this.isHovered = true;\n        this.isFocused = false; // Allows close of tooltip when opened by focus.\n        this.open(false);\n      }\n    }, {\n      key: \"_handleMouseLeave\",\n      value: function _handleMouseLeave() {\n        this.isHovered = false;\n        this.isFocused = false; // Allows close of tooltip when opened by focus.\n        this.close();\n      }\n    }, {\n      key: \"_handleFocus\",\n      value: function _handleFocus() {\n        if (M.tabPressed) {\n          this.isFocused = true;\n          this.open(false);\n        }\n      }\n    }, {\n      key: \"_handleBlur\",\n      value: function _handleBlur() {\n        this.isFocused = false;\n        this.close();\n      }\n    }, {\n      key: \"_getAttributeOptions\",\n      value: function _getAttributeOptions() {\n        var attributeOptions = {};\n        var tooltipTextOption = this.el.getAttribute('data-tooltip');\n        var positionOption = this.el.getAttribute('data-position');\n\n        if (tooltipTextOption) {\n          attributeOptions.html = tooltipTextOption;\n        }\n\n        if (positionOption) {\n          attributeOptions.position = positionOption;\n        }\n        return attributeOptions;\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Tooltip.__proto__ || Object.getPrototypeOf(Tooltip), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Tooltip;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Tooltip;\n  }(Component);\n\n  M.Tooltip = Tooltip;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Tooltip, 'tooltip', 'M_Tooltip');\n  }\n})(cash, M.anime);\n; /*!\r\n  * Waves v0.6.4\r\n  * http://fian.my.id/Waves\r\n  *\r\n  * Copyright 2014 Alfiana E. Sibuea and other contributors\r\n  * Released under the MIT license\r\n  * https://github.com/fians/Waves/blob/master/LICENSE\r\n  */\n\n;(function (window) {\n  'use strict';\n\n  var Waves = Waves || {};\n  var $$ = document.querySelectorAll.bind(document);\n\n  // Find exact position of element\n  function isWindow(obj) {\n    return obj !== null && obj === obj.window;\n  }\n\n  function getWindow(elem) {\n    return isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;\n  }\n\n  function offset(elem) {\n    var docElem,\n        win,\n        box = { top: 0, left: 0 },\n        doc = elem && elem.ownerDocument;\n\n    docElem = doc.documentElement;\n\n    if (typeof elem.getBoundingClientRect !== typeof undefined) {\n      box = elem.getBoundingClientRect();\n    }\n    win = getWindow(doc);\n    return {\n      top: box.top + win.pageYOffset - docElem.clientTop,\n      left: box.left + win.pageXOffset - docElem.clientLeft\n    };\n  }\n\n  function convertStyle(obj) {\n    var style = '';\n\n    for (var a in obj) {\n      if (obj.hasOwnProperty(a)) {\n        style += a + ':' + obj[a] + ';';\n      }\n    }\n\n    return style;\n  }\n\n  var Effect = {\n\n    // Effect delay\n    duration: 750,\n\n    show: function (e, element) {\n\n      // Disable right click\n      if (e.button === 2) {\n        return false;\n      }\n\n      var el = element || this;\n\n      // Create ripple\n      var ripple = document.createElement('div');\n      ripple.className = 'waves-ripple';\n      el.appendChild(ripple);\n\n      // Get click coordinate and element witdh\n      var pos = offset(el);\n      var relativeY = e.pageY - pos.top;\n      var relativeX = e.pageX - pos.left;\n      var scale = 'scale(' + el.clientWidth / 100 * 10 + ')';\n\n      // Support for touch devices\n      if ('touches' in e) {\n        relativeY = e.touches[0].pageY - pos.top;\n        relativeX = e.touches[0].pageX - pos.left;\n      }\n\n      // Attach data to element\n      ripple.setAttribute('data-hold', Date.now());\n      ripple.setAttribute('data-scale', scale);\n      ripple.setAttribute('data-x', relativeX);\n      ripple.setAttribute('data-y', relativeY);\n\n      // Set ripple position\n      var rippleStyle = {\n        'top': relativeY + 'px',\n        'left': relativeX + 'px'\n      };\n\n      ripple.className = ripple.className + ' waves-notransition';\n      ripple.setAttribute('style', convertStyle(rippleStyle));\n      ripple.className = ripple.className.replace('waves-notransition', '');\n\n      // Scale the ripple\n      rippleStyle['-webkit-transform'] = scale;\n      rippleStyle['-moz-transform'] = scale;\n      rippleStyle['-ms-transform'] = scale;\n      rippleStyle['-o-transform'] = scale;\n      rippleStyle.transform = scale;\n      rippleStyle.opacity = '1';\n\n      rippleStyle['-webkit-transition-duration'] = Effect.duration + 'ms';\n      rippleStyle['-moz-transition-duration'] = Effect.duration + 'ms';\n      rippleStyle['-o-transition-duration'] = Effect.duration + 'ms';\n      rippleStyle['transition-duration'] = Effect.duration + 'ms';\n\n      rippleStyle['-webkit-transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\n      rippleStyle['-moz-transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\n      rippleStyle['-o-transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\n      rippleStyle['transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';\n\n      ripple.setAttribute('style', convertStyle(rippleStyle));\n    },\n\n    hide: function (e) {\n      TouchHandler.touchup(e);\n\n      var el = this;\n      var width = el.clientWidth * 1.4;\n\n      // Get first ripple\n      var ripple = null;\n      var ripples = el.getElementsByClassName('waves-ripple');\n      if (ripples.length > 0) {\n        ripple = ripples[ripples.length - 1];\n      } else {\n        return false;\n      }\n\n      var relativeX = ripple.getAttribute('data-x');\n      var relativeY = ripple.getAttribute('data-y');\n      var scale = ripple.getAttribute('data-scale');\n\n      // Get delay beetween mousedown and mouse leave\n      var diff = Date.now() - Number(ripple.getAttribute('data-hold'));\n      var delay = 350 - diff;\n\n      if (delay < 0) {\n        delay = 0;\n      }\n\n      // Fade out ripple after delay\n      setTimeout(function () {\n        var style = {\n          'top': relativeY + 'px',\n          'left': relativeX + 'px',\n          'opacity': '0',\n\n          // Duration\n          '-webkit-transition-duration': Effect.duration + 'ms',\n          '-moz-transition-duration': Effect.duration + 'ms',\n          '-o-transition-duration': Effect.duration + 'ms',\n          'transition-duration': Effect.duration + 'ms',\n          '-webkit-transform': scale,\n          '-moz-transform': scale,\n          '-ms-transform': scale,\n          '-o-transform': scale,\n          'transform': scale\n        };\n\n        ripple.setAttribute('style', convertStyle(style));\n\n        setTimeout(function () {\n          try {\n            el.removeChild(ripple);\n          } catch (e) {\n            return false;\n          }\n        }, Effect.duration);\n      }, delay);\n    },\n\n    // Little hack to make <input> can perform waves effect\n    wrapInput: function (elements) {\n      for (var a = 0; a < elements.length; a++) {\n        var el = elements[a];\n\n        if (el.tagName.toLowerCase() === 'input') {\n          var parent = el.parentNode;\n\n          // If input already have parent just pass through\n          if (parent.tagName.toLowerCase() === 'i' && parent.className.indexOf('waves-effect') !== -1) {\n            continue;\n          }\n\n          // Put element class and style to the specified parent\n          var wrapper = document.createElement('i');\n          wrapper.className = el.className + ' waves-input-wrapper';\n\n          var elementStyle = el.getAttribute('style');\n\n          if (!elementStyle) {\n            elementStyle = '';\n          }\n\n          wrapper.setAttribute('style', elementStyle);\n\n          el.className = 'waves-button-input';\n          el.removeAttribute('style');\n\n          // Put element as child\n          parent.replaceChild(wrapper, el);\n          wrapper.appendChild(el);\n        }\n      }\n    }\n  };\n\n  /**\r\n   * Disable mousedown event for 500ms during and after touch\r\n   */\n  var TouchHandler = {\n    /* uses an integer rather than bool so there's no issues with\r\n     * needing to clear timeouts if another touch event occurred\r\n     * within the 500ms. Cannot mouseup between touchstart and\r\n     * touchend, nor in the 500ms after touchend. */\n    touches: 0,\n    allowEvent: function (e) {\n      var allow = true;\n\n      if (e.type === 'touchstart') {\n        TouchHandler.touches += 1; //push\n      } else if (e.type === 'touchend' || e.type === 'touchcancel') {\n        setTimeout(function () {\n          if (TouchHandler.touches > 0) {\n            TouchHandler.touches -= 1; //pop after 500ms\n          }\n        }, 500);\n      } else if (e.type === 'mousedown' && TouchHandler.touches > 0) {\n        allow = false;\n      }\n\n      return allow;\n    },\n    touchup: function (e) {\n      TouchHandler.allowEvent(e);\n    }\n  };\n\n  /**\r\n   * Delegated click handler for .waves-effect element.\r\n   * returns null when .waves-effect element not in \"click tree\"\r\n   */\n  function getWavesEffectElement(e) {\n    if (TouchHandler.allowEvent(e) === false) {\n      return null;\n    }\n\n    var element = null;\n    var target = e.target || e.srcElement;\n\n    while (target.parentNode !== null) {\n      if (!(target instanceof SVGElement) && target.className.indexOf('waves-effect') !== -1) {\n        element = target;\n        break;\n      }\n      target = target.parentNode;\n    }\n    return element;\n  }\n\n  /**\r\n   * Bubble the click and show effect if .waves-effect elem was found\r\n   */\n  function showEffect(e) {\n    var element = getWavesEffectElement(e);\n\n    if (element !== null) {\n      Effect.show(e, element);\n\n      if ('ontouchstart' in window) {\n        element.addEventListener('touchend', Effect.hide, false);\n        element.addEventListener('touchcancel', Effect.hide, false);\n      }\n\n      element.addEventListener('mouseup', Effect.hide, false);\n      element.addEventListener('mouseleave', Effect.hide, false);\n      element.addEventListener('dragend', Effect.hide, false);\n    }\n  }\n\n  Waves.displayEffect = function (options) {\n    options = options || {};\n\n    if ('duration' in options) {\n      Effect.duration = options.duration;\n    }\n\n    //Wrap input inside <i> tag\n    Effect.wrapInput($$('.waves-effect'));\n\n    if ('ontouchstart' in window) {\n      document.body.addEventListener('touchstart', showEffect, false);\n    }\n\n    document.body.addEventListener('mousedown', showEffect, false);\n  };\n\n  /**\r\n   * Attach Waves to an input element (or any element which doesn't\r\n   * bubble mouseup/mousedown events).\r\n   *   Intended to be used with dynamically loaded forms/inputs, or\r\n   * where the user doesn't want a delegated click handler.\r\n   */\n  Waves.attach = function (element) {\n    //FUTURE: automatically add waves classes and allow users\n    // to specify them with an options param? Eg. light/classic/button\n    if (element.tagName.toLowerCase() === 'input') {\n      Effect.wrapInput([element]);\n      element = element.parentNode;\n    }\n\n    if ('ontouchstart' in window) {\n      element.addEventListener('touchstart', showEffect, false);\n    }\n\n    element.addEventListener('mousedown', showEffect, false);\n  };\n\n  window.Waves = Waves;\n\n  document.addEventListener('DOMContentLoaded', function () {\n    Waves.displayEffect();\n  }, false);\n})(window);\n;(function ($, anim) {\n  'use strict';\n\n  var _defaults = {\n    html: '',\n    displayLength: 4000,\n    inDuration: 300,\n    outDuration: 375,\n    classes: '',\n    completeCallback: null,\n    activationPercent: 0.8\n  };\n\n  var Toast = function () {\n    function Toast(options) {\n      _classCallCheck(this, Toast);\n\n      /**\n       * Options for the toast\n       * @member Toast#options\n       */\n      this.options = $.extend({}, Toast.defaults, options);\n      this.message = this.options.html;\n\n      /**\n       * Describes current pan state toast\n       * @type {Boolean}\n       */\n      this.panning = false;\n\n      /**\n       * Time remaining until toast is removed\n       */\n      this.timeRemaining = this.options.displayLength;\n\n      if (Toast._toasts.length === 0) {\n        Toast._createContainer();\n      }\n\n      // Create new toast\n      Toast._toasts.push(this);\n      var toastElement = this._createToast();\n      toastElement.M_Toast = this;\n      this.el = toastElement;\n      this.$el = $(toastElement);\n      this._animateIn();\n      this._setTimer();\n    }\n\n    _createClass(Toast, [{\n      key: \"_createToast\",\n\n\n      /**\n       * Create toast and append it to toast container\n       */\n      value: function _createToast() {\n        var toast = document.createElement('div');\n        toast.classList.add('toast');\n\n        // Add custom classes onto toast\n        if (!!this.options.classes.length) {\n          $(toast).addClass(this.options.classes);\n        }\n\n        // Set content\n        if (typeof HTMLElement === 'object' ? this.message instanceof HTMLElement : this.message && typeof this.message === 'object' && this.message !== null && this.message.nodeType === 1 && typeof this.message.nodeName === 'string') {\n          toast.appendChild(this.message);\n\n          // Check if it is jQuery object\n        } else if (!!this.message.jquery) {\n          $(toast).append(this.message[0]);\n\n          // Insert as html;\n        } else {\n          toast.innerHTML = this.message;\n        }\n\n        // Append toasft\n        Toast._container.appendChild(toast);\n        return toast;\n      }\n\n      /**\n       * Animate in toast\n       */\n\n    }, {\n      key: \"_animateIn\",\n      value: function _animateIn() {\n        // Animate toast in\n        anim({\n          targets: this.el,\n          top: 0,\n          opacity: 1,\n          duration: this.options.inDuration,\n          easing: 'easeOutCubic'\n        });\n      }\n\n      /**\n       * Create setInterval which automatically removes toast when timeRemaining >= 0\n       * has been reached\n       */\n\n    }, {\n      key: \"_setTimer\",\n      value: function _setTimer() {\n        var _this29 = this;\n\n        if (this.timeRemaining !== Infinity) {\n          this.counterInterval = setInterval(function () {\n            // If toast is not being dragged, decrease its time remaining\n            if (!_this29.panning) {\n              _this29.timeRemaining -= 20;\n            }\n\n            // Animate toast out\n            if (_this29.timeRemaining <= 0) {\n              _this29.dismiss();\n            }\n          }, 20);\n        }\n      }\n\n      /**\n       * Dismiss toast with animation\n       */\n\n    }, {\n      key: \"dismiss\",\n      value: function dismiss() {\n        var _this30 = this;\n\n        window.clearInterval(this.counterInterval);\n        var activationDistance = this.el.offsetWidth * this.options.activationPercent;\n\n        if (this.wasSwiped) {\n          this.el.style.transition = 'transform .05s, opacity .05s';\n          this.el.style.transform = \"translateX(\" + activationDistance + \"px)\";\n          this.el.style.opacity = 0;\n        }\n\n        anim({\n          targets: this.el,\n          opacity: 0,\n          marginTop: -40,\n          duration: this.options.outDuration,\n          easing: 'easeOutExpo',\n          complete: function () {\n            // Call the optional callback\n            if (typeof _this30.options.completeCallback === 'function') {\n              _this30.options.completeCallback();\n            }\n            // Remove toast from DOM\n            _this30.$el.remove();\n            Toast._toasts.splice(Toast._toasts.indexOf(_this30), 1);\n            if (Toast._toasts.length === 0) {\n              Toast._removeContainer();\n            }\n          }\n        });\n      }\n    }], [{\n      key: \"getInstance\",\n\n\n      /**\n       * Get Instance\n       */\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Toast;\n      }\n\n      /**\n       * Append toast container and add event handlers\n       */\n\n    }, {\n      key: \"_createContainer\",\n      value: function _createContainer() {\n        var container = document.createElement('div');\n        container.setAttribute('id', 'toast-container');\n\n        // Add event handler\n        container.addEventListener('touchstart', Toast._onDragStart);\n        container.addEventListener('touchmove', Toast._onDragMove);\n        container.addEventListener('touchend', Toast._onDragEnd);\n\n        container.addEventListener('mousedown', Toast._onDragStart);\n        document.addEventListener('mousemove', Toast._onDragMove);\n        document.addEventListener('mouseup', Toast._onDragEnd);\n\n        document.body.appendChild(container);\n        Toast._container = container;\n      }\n\n      /**\n       * Remove toast container and event handlers\n       */\n\n    }, {\n      key: \"_removeContainer\",\n      value: function _removeContainer() {\n        // Add event handler\n        document.removeEventListener('mousemove', Toast._onDragMove);\n        document.removeEventListener('mouseup', Toast._onDragEnd);\n\n        $(Toast._container).remove();\n        Toast._container = null;\n      }\n\n      /**\n       * Begin drag handler\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_onDragStart\",\n      value: function _onDragStart(e) {\n        if (e.target && $(e.target).closest('.toast').length) {\n          var $toast = $(e.target).closest('.toast');\n          var toast = $toast[0].M_Toast;\n          toast.panning = true;\n          Toast._draggedToast = toast;\n          toast.el.classList.add('panning');\n          toast.el.style.transition = '';\n          toast.startingXPos = Toast._xPos(e);\n          toast.time = Date.now();\n          toast.xPos = Toast._xPos(e);\n        }\n      }\n\n      /**\n       * Drag move handler\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_onDragMove\",\n      value: function _onDragMove(e) {\n        if (!!Toast._draggedToast) {\n          e.preventDefault();\n          var toast = Toast._draggedToast;\n          toast.deltaX = Math.abs(toast.xPos - Toast._xPos(e));\n          toast.xPos = Toast._xPos(e);\n          toast.velocityX = toast.deltaX / (Date.now() - toast.time);\n          toast.time = Date.now();\n\n          var totalDeltaX = toast.xPos - toast.startingXPos;\n          var activationDistance = toast.el.offsetWidth * toast.options.activationPercent;\n          toast.el.style.transform = \"translateX(\" + totalDeltaX + \"px)\";\n          toast.el.style.opacity = 1 - Math.abs(totalDeltaX / activationDistance);\n        }\n      }\n\n      /**\n       * End drag handler\n       */\n\n    }, {\n      key: \"_onDragEnd\",\n      value: function _onDragEnd() {\n        if (!!Toast._draggedToast) {\n          var toast = Toast._draggedToast;\n          toast.panning = false;\n          toast.el.classList.remove('panning');\n\n          var totalDeltaX = toast.xPos - toast.startingXPos;\n          var activationDistance = toast.el.offsetWidth * toast.options.activationPercent;\n          var shouldBeDismissed = Math.abs(totalDeltaX) > activationDistance || toast.velocityX > 1;\n\n          // Remove toast\n          if (shouldBeDismissed) {\n            toast.wasSwiped = true;\n            toast.dismiss();\n\n            // Animate toast back to original position\n          } else {\n            toast.el.style.transition = 'transform .2s, opacity .2s';\n            toast.el.style.transform = '';\n            toast.el.style.opacity = '';\n          }\n          Toast._draggedToast = null;\n        }\n      }\n\n      /**\n       * Get x position of mouse or touch event\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_xPos\",\n      value: function _xPos(e) {\n        if (e.targetTouches && e.targetTouches.length >= 1) {\n          return e.targetTouches[0].clientX;\n        }\n        // mouse event\n        return e.clientX;\n      }\n\n      /**\n       * Remove all toasts\n       */\n\n    }, {\n      key: \"dismissAll\",\n      value: function dismissAll() {\n        for (var toastIndex in Toast._toasts) {\n          Toast._toasts[toastIndex].dismiss();\n        }\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Toast;\n  }();\n\n  /**\n   * @static\n   * @memberof Toast\n   * @type {Array.<Toast>}\n   */\n\n\n  Toast._toasts = [];\n\n  /**\n   * @static\n   * @memberof Toast\n   */\n  Toast._container = null;\n\n  /**\n   * @static\n   * @memberof Toast\n   * @type {Toast}\n   */\n  Toast._draggedToast = null;\n\n  M.Toast = Toast;\n  M.toast = function (options) {\n    return new Toast(options);\n  };\n})(cash, M.anime);\n;(function ($, anim) {\n  'use strict';\n\n  var _defaults = {\n    edge: 'left',\n    draggable: true,\n    inDuration: 250,\n    outDuration: 200,\n    onOpenStart: null,\n    onOpenEnd: null,\n    onCloseStart: null,\n    onCloseEnd: null,\n    preventScrolling: true\n  };\n\n  /**\n   * @class\n   */\n\n  var Sidenav = function (_Component8) {\n    _inherits(Sidenav, _Component8);\n\n    /**\n     * Construct Sidenav instance and set up overlay\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function Sidenav(el, options) {\n      _classCallCheck(this, Sidenav);\n\n      var _this31 = _possibleConstructorReturn(this, (Sidenav.__proto__ || Object.getPrototypeOf(Sidenav)).call(this, Sidenav, el, options));\n\n      _this31.el.M_Sidenav = _this31;\n      _this31.id = _this31.$el.attr('id');\n\n      /**\n       * Options for the Sidenav\n       * @member Sidenav#options\n       * @prop {String} [edge='left'] - Side of screen on which Sidenav appears\n       * @prop {Boolean} [draggable=true] - Allow swipe gestures to open/close Sidenav\n       * @prop {Number} [inDuration=250] - Length in ms of enter transition\n       * @prop {Number} [outDuration=200] - Length in ms of exit transition\n       * @prop {Function} onOpenStart - Function called when sidenav starts entering\n       * @prop {Function} onOpenEnd - Function called when sidenav finishes entering\n       * @prop {Function} onCloseStart - Function called when sidenav starts exiting\n       * @prop {Function} onCloseEnd - Function called when sidenav finishes exiting\n       */\n      _this31.options = $.extend({}, Sidenav.defaults, options);\n\n      /**\n       * Describes open/close state of Sidenav\n       * @type {Boolean}\n       */\n      _this31.isOpen = false;\n\n      /**\n       * Describes if Sidenav is fixed\n       * @type {Boolean}\n       */\n      _this31.isFixed = _this31.el.classList.contains('sidenav-fixed');\n\n      /**\n       * Describes if Sidenav is being draggeed\n       * @type {Boolean}\n       */\n      _this31.isDragged = false;\n\n      // Window size variables for window resize checks\n      _this31.lastWindowWidth = window.innerWidth;\n      _this31.lastWindowHeight = window.innerHeight;\n\n      _this31._createOverlay();\n      _this31._createDragTarget();\n      _this31._setupEventHandlers();\n      _this31._setupClasses();\n      _this31._setupFixed();\n\n      Sidenav._sidenavs.push(_this31);\n      return _this31;\n    }\n\n    _createClass(Sidenav, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this._removeEventHandlers();\n        this._enableBodyScrolling();\n        this._overlay.parentNode.removeChild(this._overlay);\n        this.dragTarget.parentNode.removeChild(this.dragTarget);\n        this.el.M_Sidenav = undefined;\n        this.el.style.transform = '';\n\n        var index = Sidenav._sidenavs.indexOf(this);\n        if (index >= 0) {\n          Sidenav._sidenavs.splice(index, 1);\n        }\n      }\n    }, {\n      key: \"_createOverlay\",\n      value: function _createOverlay() {\n        var overlay = document.createElement('div');\n        this._closeBound = this.close.bind(this);\n        overlay.classList.add('sidenav-overlay');\n\n        overlay.addEventListener('click', this._closeBound);\n\n        document.body.appendChild(overlay);\n        this._overlay = overlay;\n      }\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        if (Sidenav._sidenavs.length === 0) {\n          document.body.addEventListener('click', this._handleTriggerClick);\n        }\n\n        this._handleDragTargetDragBound = this._handleDragTargetDrag.bind(this);\n        this._handleDragTargetReleaseBound = this._handleDragTargetRelease.bind(this);\n        this._handleCloseDragBound = this._handleCloseDrag.bind(this);\n        this._handleCloseReleaseBound = this._handleCloseRelease.bind(this);\n        this._handleCloseTriggerClickBound = this._handleCloseTriggerClick.bind(this);\n\n        this.dragTarget.addEventListener('touchmove', this._handleDragTargetDragBound);\n        this.dragTarget.addEventListener('touchend', this._handleDragTargetReleaseBound);\n        this._overlay.addEventListener('touchmove', this._handleCloseDragBound);\n        this._overlay.addEventListener('touchend', this._handleCloseReleaseBound);\n        this.el.addEventListener('touchmove', this._handleCloseDragBound);\n        this.el.addEventListener('touchend', this._handleCloseReleaseBound);\n        this.el.addEventListener('click', this._handleCloseTriggerClickBound);\n\n        // Add resize for side nav fixed\n        if (this.isFixed) {\n          this._handleWindowResizeBound = this._handleWindowResize.bind(this);\n          window.addEventListener('resize', this._handleWindowResizeBound);\n        }\n      }\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        if (Sidenav._sidenavs.length === 1) {\n          document.body.removeEventListener('click', this._handleTriggerClick);\n        }\n\n        this.dragTarget.removeEventListener('touchmove', this._handleDragTargetDragBound);\n        this.dragTarget.removeEventListener('touchend', this._handleDragTargetReleaseBound);\n        this._overlay.removeEventListener('touchmove', this._handleCloseDragBound);\n        this._overlay.removeEventListener('touchend', this._handleCloseReleaseBound);\n        this.el.removeEventListener('touchmove', this._handleCloseDragBound);\n        this.el.removeEventListener('touchend', this._handleCloseReleaseBound);\n        this.el.removeEventListener('click', this._handleCloseTriggerClickBound);\n\n        // Remove resize for side nav fixed\n        if (this.isFixed) {\n          window.removeEventListener('resize', this._handleWindowResizeBound);\n        }\n      }\n\n      /**\n       * Handle Trigger Click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleTriggerClick\",\n      value: function _handleTriggerClick(e) {\n        var $trigger = $(e.target).closest('.sidenav-trigger');\n        if (e.target && $trigger.length) {\n          var sidenavId = M.getIdFromTrigger($trigger[0]);\n\n          var sidenavInstance = document.getElementById(sidenavId).M_Sidenav;\n          if (sidenavInstance) {\n            sidenavInstance.open($trigger);\n          }\n          e.preventDefault();\n        }\n      }\n\n      /**\n       * Set variables needed at the beggining of drag\n       * and stop any current transition.\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_startDrag\",\n      value: function _startDrag(e) {\n        var clientX = e.targetTouches[0].clientX;\n        this.isDragged = true;\n        this._startingXpos = clientX;\n        this._xPos = this._startingXpos;\n        this._time = Date.now();\n        this._width = this.el.getBoundingClientRect().width;\n        this._overlay.style.display = 'block';\n        this._initialScrollTop = this.isOpen ? this.el.scrollTop : M.getDocumentScrollTop();\n        this._verticallyScrolling = false;\n        anim.remove(this.el);\n        anim.remove(this._overlay);\n      }\n\n      /**\n       * Set variables needed at each drag move update tick\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_dragMoveUpdate\",\n      value: function _dragMoveUpdate(e) {\n        var clientX = e.targetTouches[0].clientX;\n        var currentScrollTop = this.isOpen ? this.el.scrollTop : M.getDocumentScrollTop();\n        this.deltaX = Math.abs(this._xPos - clientX);\n        this._xPos = clientX;\n        this.velocityX = this.deltaX / (Date.now() - this._time);\n        this._time = Date.now();\n        if (this._initialScrollTop !== currentScrollTop) {\n          this._verticallyScrolling = true;\n        }\n      }\n\n      /**\n       * Handles Dragging of Sidenav\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleDragTargetDrag\",\n      value: function _handleDragTargetDrag(e) {\n        // Check if draggable\n        if (!this.options.draggable || this._isCurrentlyFixed() || this._verticallyScrolling) {\n          return;\n        }\n\n        // If not being dragged, set initial drag start variables\n        if (!this.isDragged) {\n          this._startDrag(e);\n        }\n\n        // Run touchmove updates\n        this._dragMoveUpdate(e);\n\n        // Calculate raw deltaX\n        var totalDeltaX = this._xPos - this._startingXpos;\n\n        // dragDirection is the attempted user drag direction\n        var dragDirection = totalDeltaX > 0 ? 'right' : 'left';\n\n        // Don't allow totalDeltaX to exceed Sidenav width or be dragged in the opposite direction\n        totalDeltaX = Math.min(this._width, Math.abs(totalDeltaX));\n        if (this.options.edge === dragDirection) {\n          totalDeltaX = 0;\n        }\n\n        /**\n         * transformX is the drag displacement\n         * transformPrefix is the initial transform placement\n         * Invert values if Sidenav is right edge\n         */\n        var transformX = totalDeltaX;\n        var transformPrefix = 'translateX(-100%)';\n        if (this.options.edge === 'right') {\n          transformPrefix = 'translateX(100%)';\n          transformX = -transformX;\n        }\n\n        // Calculate open/close percentage of sidenav, with open = 1 and close = 0\n        this.percentOpen = Math.min(1, totalDeltaX / this._width);\n\n        // Set transform and opacity styles\n        this.el.style.transform = transformPrefix + \" translateX(\" + transformX + \"px)\";\n        this._overlay.style.opacity = this.percentOpen;\n      }\n\n      /**\n       * Handle Drag Target Release\n       */\n\n    }, {\n      key: \"_handleDragTargetRelease\",\n      value: function _handleDragTargetRelease() {\n        if (this.isDragged) {\n          if (this.percentOpen > 0.2) {\n            this.open();\n          } else {\n            this._animateOut();\n          }\n\n          this.isDragged = false;\n          this._verticallyScrolling = false;\n        }\n      }\n\n      /**\n       * Handle Close Drag\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleCloseDrag\",\n      value: function _handleCloseDrag(e) {\n        if (this.isOpen) {\n          // Check if draggable\n          if (!this.options.draggable || this._isCurrentlyFixed() || this._verticallyScrolling) {\n            return;\n          }\n\n          // If not being dragged, set initial drag start variables\n          if (!this.isDragged) {\n            this._startDrag(e);\n          }\n\n          // Run touchmove updates\n          this._dragMoveUpdate(e);\n\n          // Calculate raw deltaX\n          var totalDeltaX = this._xPos - this._startingXpos;\n\n          // dragDirection is the attempted user drag direction\n          var dragDirection = totalDeltaX > 0 ? 'right' : 'left';\n\n          // Don't allow totalDeltaX to exceed Sidenav width or be dragged in the opposite direction\n          totalDeltaX = Math.min(this._width, Math.abs(totalDeltaX));\n          if (this.options.edge !== dragDirection) {\n            totalDeltaX = 0;\n          }\n\n          var transformX = -totalDeltaX;\n          if (this.options.edge === 'right') {\n            transformX = -transformX;\n          }\n\n          // Calculate open/close percentage of sidenav, with open = 1 and close = 0\n          this.percentOpen = Math.min(1, 1 - totalDeltaX / this._width);\n\n          // Set transform and opacity styles\n          this.el.style.transform = \"translateX(\" + transformX + \"px)\";\n          this._overlay.style.opacity = this.percentOpen;\n        }\n      }\n\n      /**\n       * Handle Close Release\n       */\n\n    }, {\n      key: \"_handleCloseRelease\",\n      value: function _handleCloseRelease() {\n        if (this.isOpen && this.isDragged) {\n          if (this.percentOpen > 0.8) {\n            this._animateIn();\n          } else {\n            this.close();\n          }\n\n          this.isDragged = false;\n          this._verticallyScrolling = false;\n        }\n      }\n\n      /**\n       * Handles closing of Sidenav when element with class .sidenav-close\n       */\n\n    }, {\n      key: \"_handleCloseTriggerClick\",\n      value: function _handleCloseTriggerClick(e) {\n        var $closeTrigger = $(e.target).closest('.sidenav-close');\n        if ($closeTrigger.length && !this._isCurrentlyFixed()) {\n          this.close();\n        }\n      }\n\n      /**\n       * Handle Window Resize\n       */\n\n    }, {\n      key: \"_handleWindowResize\",\n      value: function _handleWindowResize() {\n        // Only handle horizontal resizes\n        if (this.lastWindowWidth !== window.innerWidth) {\n          if (window.innerWidth > 992) {\n            this.open();\n          } else {\n            this.close();\n          }\n        }\n\n        this.lastWindowWidth = window.innerWidth;\n        this.lastWindowHeight = window.innerHeight;\n      }\n    }, {\n      key: \"_setupClasses\",\n      value: function _setupClasses() {\n        if (this.options.edge === 'right') {\n          this.el.classList.add('right-aligned');\n          this.dragTarget.classList.add('right-aligned');\n        }\n      }\n    }, {\n      key: \"_removeClasses\",\n      value: function _removeClasses() {\n        this.el.classList.remove('right-aligned');\n        this.dragTarget.classList.remove('right-aligned');\n      }\n    }, {\n      key: \"_setupFixed\",\n      value: function _setupFixed() {\n        if (this._isCurrentlyFixed()) {\n          this.open();\n        }\n      }\n    }, {\n      key: \"_isCurrentlyFixed\",\n      value: function _isCurrentlyFixed() {\n        return this.isFixed && window.innerWidth > 992;\n      }\n    }, {\n      key: \"_createDragTarget\",\n      value: function _createDragTarget() {\n        var dragTarget = document.createElement('div');\n        dragTarget.classList.add('drag-target');\n        document.body.appendChild(dragTarget);\n        this.dragTarget = dragTarget;\n      }\n    }, {\n      key: \"_preventBodyScrolling\",\n      value: function _preventBodyScrolling() {\n        var body = document.body;\n        body.style.overflow = 'hidden';\n      }\n    }, {\n      key: \"_enableBodyScrolling\",\n      value: function _enableBodyScrolling() {\n        var body = document.body;\n        body.style.overflow = '';\n      }\n    }, {\n      key: \"open\",\n      value: function open() {\n        if (this.isOpen === true) {\n          return;\n        }\n\n        this.isOpen = true;\n\n        // Run onOpenStart callback\n        if (typeof this.options.onOpenStart === 'function') {\n          this.options.onOpenStart.call(this, this.el);\n        }\n\n        // Handle fixed Sidenav\n        if (this._isCurrentlyFixed()) {\n          anim.remove(this.el);\n          anim({\n            targets: this.el,\n            translateX: 0,\n            duration: 0,\n            easing: 'easeOutQuad'\n          });\n          this._enableBodyScrolling();\n          this._overlay.style.display = 'none';\n\n          // Handle non-fixed Sidenav\n        } else {\n          if (this.options.preventScrolling) {\n            this._preventBodyScrolling();\n          }\n\n          if (!this.isDragged || this.percentOpen != 1) {\n            this._animateIn();\n          }\n        }\n      }\n    }, {\n      key: \"close\",\n      value: function close() {\n        if (this.isOpen === false) {\n          return;\n        }\n\n        this.isOpen = false;\n\n        // Run onCloseStart callback\n        if (typeof this.options.onCloseStart === 'function') {\n          this.options.onCloseStart.call(this, this.el);\n        }\n\n        // Handle fixed Sidenav\n        if (this._isCurrentlyFixed()) {\n          var transformX = this.options.edge === 'left' ? '-105%' : '105%';\n          this.el.style.transform = \"translateX(\" + transformX + \")\";\n\n          // Handle non-fixed Sidenav\n        } else {\n          this._enableBodyScrolling();\n\n          if (!this.isDragged || this.percentOpen != 0) {\n            this._animateOut();\n          } else {\n            this._overlay.style.display = 'none';\n          }\n        }\n      }\n    }, {\n      key: \"_animateIn\",\n      value: function _animateIn() {\n        this._animateSidenavIn();\n        this._animateOverlayIn();\n      }\n    }, {\n      key: \"_animateSidenavIn\",\n      value: function _animateSidenavIn() {\n        var _this32 = this;\n\n        var slideOutPercent = this.options.edge === 'left' ? -1 : 1;\n        if (this.isDragged) {\n          slideOutPercent = this.options.edge === 'left' ? slideOutPercent + this.percentOpen : slideOutPercent - this.percentOpen;\n        }\n\n        anim.remove(this.el);\n        anim({\n          targets: this.el,\n          translateX: [slideOutPercent * 100 + \"%\", 0],\n          duration: this.options.inDuration,\n          easing: 'easeOutQuad',\n          complete: function () {\n            // Run onOpenEnd callback\n            if (typeof _this32.options.onOpenEnd === 'function') {\n              _this32.options.onOpenEnd.call(_this32, _this32.el);\n            }\n          }\n        });\n      }\n    }, {\n      key: \"_animateOverlayIn\",\n      value: function _animateOverlayIn() {\n        var start = 0;\n        if (this.isDragged) {\n          start = this.percentOpen;\n        } else {\n          $(this._overlay).css({\n            display: 'block'\n          });\n        }\n\n        anim.remove(this._overlay);\n        anim({\n          targets: this._overlay,\n          opacity: [start, 1],\n          duration: this.options.inDuration,\n          easing: 'easeOutQuad'\n        });\n      }\n    }, {\n      key: \"_animateOut\",\n      value: function _animateOut() {\n        this._animateSidenavOut();\n        this._animateOverlayOut();\n      }\n    }, {\n      key: \"_animateSidenavOut\",\n      value: function _animateSidenavOut() {\n        var _this33 = this;\n\n        var endPercent = this.options.edge === 'left' ? -1 : 1;\n        var slideOutPercent = 0;\n        if (this.isDragged) {\n          slideOutPercent = this.options.edge === 'left' ? endPercent + this.percentOpen : endPercent - this.percentOpen;\n        }\n\n        anim.remove(this.el);\n        anim({\n          targets: this.el,\n          translateX: [slideOutPercent * 100 + \"%\", endPercent * 105 + \"%\"],\n          duration: this.options.outDuration,\n          easing: 'easeOutQuad',\n          complete: function () {\n            // Run onOpenEnd callback\n            if (typeof _this33.options.onCloseEnd === 'function') {\n              _this33.options.onCloseEnd.call(_this33, _this33.el);\n            }\n          }\n        });\n      }\n    }, {\n      key: \"_animateOverlayOut\",\n      value: function _animateOverlayOut() {\n        var _this34 = this;\n\n        anim.remove(this._overlay);\n        anim({\n          targets: this._overlay,\n          opacity: 0,\n          duration: this.options.outDuration,\n          easing: 'easeOutQuad',\n          complete: function () {\n            $(_this34._overlay).css('display', 'none');\n          }\n        });\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Sidenav.__proto__ || Object.getPrototypeOf(Sidenav), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Sidenav;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Sidenav;\n  }(Component);\n\n  /**\n   * @static\n   * @memberof Sidenav\n   * @type {Array.<Sidenav>}\n   */\n\n\n  Sidenav._sidenavs = [];\n\n  M.Sidenav = Sidenav;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Sidenav, 'sidenav', 'M_Sidenav');\n  }\n})(cash, M.anime);\n;(function ($, anim) {\n  'use strict';\n\n  var _defaults = {\n    throttle: 100,\n    scrollOffset: 200, // offset - 200 allows elements near bottom of page to scroll\n    activeClass: 'active',\n    getActiveElement: function (id) {\n      return 'a[href=\"#' + id + '\"]';\n    }\n  };\n\n  /**\n   * @class\n   *\n   */\n\n  var ScrollSpy = function (_Component9) {\n    _inherits(ScrollSpy, _Component9);\n\n    /**\n     * Construct ScrollSpy instance\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function ScrollSpy(el, options) {\n      _classCallCheck(this, ScrollSpy);\n\n      var _this35 = _possibleConstructorReturn(this, (ScrollSpy.__proto__ || Object.getPrototypeOf(ScrollSpy)).call(this, ScrollSpy, el, options));\n\n      _this35.el.M_ScrollSpy = _this35;\n\n      /**\n       * Options for the modal\n       * @member Modal#options\n       * @prop {Number} [throttle=100] - Throttle of scroll handler\n       * @prop {Number} [scrollOffset=200] - Offset for centering element when scrolled to\n       * @prop {String} [activeClass='active'] - Class applied to active elements\n       * @prop {Function} [getActiveElement] - Used to find active element\n       */\n      _this35.options = $.extend({}, ScrollSpy.defaults, options);\n\n      // setup\n      ScrollSpy._elements.push(_this35);\n      ScrollSpy._count++;\n      ScrollSpy._increment++;\n      _this35.tickId = -1;\n      _this35.id = ScrollSpy._increment;\n      _this35._setupEventHandlers();\n      _this35._handleWindowScroll();\n      return _this35;\n    }\n\n    _createClass(ScrollSpy, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        ScrollSpy._elements.splice(ScrollSpy._elements.indexOf(this), 1);\n        ScrollSpy._elementsInView.splice(ScrollSpy._elementsInView.indexOf(this), 1);\n        ScrollSpy._visibleElements.splice(ScrollSpy._visibleElements.indexOf(this.$el), 1);\n        ScrollSpy._count--;\n        this._removeEventHandlers();\n        $(this.options.getActiveElement(this.$el.attr('id'))).removeClass(this.options.activeClass);\n        this.el.M_ScrollSpy = undefined;\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        var throttledResize = M.throttle(this._handleWindowScroll, 200);\n        this._handleThrottledResizeBound = throttledResize.bind(this);\n        this._handleWindowScrollBound = this._handleWindowScroll.bind(this);\n        if (ScrollSpy._count === 1) {\n          window.addEventListener('scroll', this._handleWindowScrollBound);\n          window.addEventListener('resize', this._handleThrottledResizeBound);\n          document.body.addEventListener('click', this._handleTriggerClick);\n        }\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        if (ScrollSpy._count === 0) {\n          window.removeEventListener('scroll', this._handleWindowScrollBound);\n          window.removeEventListener('resize', this._handleThrottledResizeBound);\n          document.body.removeEventListener('click', this._handleTriggerClick);\n        }\n      }\n\n      /**\n       * Handle Trigger Click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleTriggerClick\",\n      value: function _handleTriggerClick(e) {\n        var $trigger = $(e.target);\n        for (var i = ScrollSpy._elements.length - 1; i >= 0; i--) {\n          var scrollspy = ScrollSpy._elements[i];\n          if ($trigger.is('a[href=\"#' + scrollspy.$el.attr('id') + '\"]')) {\n            e.preventDefault();\n            var offset = scrollspy.$el.offset().top + 1;\n\n            anim({\n              targets: [document.documentElement, document.body],\n              scrollTop: offset - scrollspy.options.scrollOffset,\n              duration: 400,\n              easing: 'easeOutCubic'\n            });\n            break;\n          }\n        }\n      }\n\n      /**\n       * Handle Window Scroll\n       */\n\n    }, {\n      key: \"_handleWindowScroll\",\n      value: function _handleWindowScroll() {\n        // unique tick id\n        ScrollSpy._ticks++;\n\n        // viewport rectangle\n        var top = M.getDocumentScrollTop(),\n            left = M.getDocumentScrollLeft(),\n            right = left + window.innerWidth,\n            bottom = top + window.innerHeight;\n\n        // determine which elements are in view\n        var intersections = ScrollSpy._findElements(top, right, bottom, left);\n        for (var i = 0; i < intersections.length; i++) {\n          var scrollspy = intersections[i];\n          var lastTick = scrollspy.tickId;\n          if (lastTick < 0) {\n            // entered into view\n            scrollspy._enter();\n          }\n\n          // update tick id\n          scrollspy.tickId = ScrollSpy._ticks;\n        }\n\n        for (var _i = 0; _i < ScrollSpy._elementsInView.length; _i++) {\n          var _scrollspy = ScrollSpy._elementsInView[_i];\n          var _lastTick = _scrollspy.tickId;\n          if (_lastTick >= 0 && _lastTick !== ScrollSpy._ticks) {\n            // exited from view\n            _scrollspy._exit();\n            _scrollspy.tickId = -1;\n          }\n        }\n\n        // remember elements in view for next tick\n        ScrollSpy._elementsInView = intersections;\n      }\n\n      /**\n       * Find elements that are within the boundary\n       * @param {number} top\n       * @param {number} right\n       * @param {number} bottom\n       * @param {number} left\n       * @return {Array.<ScrollSpy>}   A collection of elements\n       */\n\n    }, {\n      key: \"_enter\",\n      value: function _enter() {\n        ScrollSpy._visibleElements = ScrollSpy._visibleElements.filter(function (value) {\n          return value.height() != 0;\n        });\n\n        if (ScrollSpy._visibleElements[0]) {\n          $(this.options.getActiveElement(ScrollSpy._visibleElements[0].attr('id'))).removeClass(this.options.activeClass);\n          if (ScrollSpy._visibleElements[0][0].M_ScrollSpy && this.id < ScrollSpy._visibleElements[0][0].M_ScrollSpy.id) {\n            ScrollSpy._visibleElements.unshift(this.$el);\n          } else {\n            ScrollSpy._visibleElements.push(this.$el);\n          }\n        } else {\n          ScrollSpy._visibleElements.push(this.$el);\n        }\n\n        $(this.options.getActiveElement(ScrollSpy._visibleElements[0].attr('id'))).addClass(this.options.activeClass);\n      }\n    }, {\n      key: \"_exit\",\n      value: function _exit() {\n        var _this36 = this;\n\n        ScrollSpy._visibleElements = ScrollSpy._visibleElements.filter(function (value) {\n          return value.height() != 0;\n        });\n\n        if (ScrollSpy._visibleElements[0]) {\n          $(this.options.getActiveElement(ScrollSpy._visibleElements[0].attr('id'))).removeClass(this.options.activeClass);\n\n          ScrollSpy._visibleElements = ScrollSpy._visibleElements.filter(function (el) {\n            return el.attr('id') != _this36.$el.attr('id');\n          });\n          if (ScrollSpy._visibleElements[0]) {\n            // Check if empty\n            $(this.options.getActiveElement(ScrollSpy._visibleElements[0].attr('id'))).addClass(this.options.activeClass);\n          }\n        }\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(ScrollSpy.__proto__ || Object.getPrototypeOf(ScrollSpy), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_ScrollSpy;\n      }\n    }, {\n      key: \"_findElements\",\n      value: function _findElements(top, right, bottom, left) {\n        var hits = [];\n        for (var i = 0; i < ScrollSpy._elements.length; i++) {\n          var scrollspy = ScrollSpy._elements[i];\n          var currTop = top + scrollspy.options.scrollOffset || 200;\n\n          if (scrollspy.$el.height() > 0) {\n            var elTop = scrollspy.$el.offset().top,\n                elLeft = scrollspy.$el.offset().left,\n                elRight = elLeft + scrollspy.$el.width(),\n                elBottom = elTop + scrollspy.$el.height();\n\n            var isIntersect = !(elLeft > right || elRight < left || elTop > bottom || elBottom < currTop);\n\n            if (isIntersect) {\n              hits.push(scrollspy);\n            }\n          }\n        }\n        return hits;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return ScrollSpy;\n  }(Component);\n\n  /**\n   * @static\n   * @memberof ScrollSpy\n   * @type {Array.<ScrollSpy>}\n   */\n\n\n  ScrollSpy._elements = [];\n\n  /**\n   * @static\n   * @memberof ScrollSpy\n   * @type {Array.<ScrollSpy>}\n   */\n  ScrollSpy._elementsInView = [];\n\n  /**\n   * @static\n   * @memberof ScrollSpy\n   * @type {Array.<cash>}\n   */\n  ScrollSpy._visibleElements = [];\n\n  /**\n   * @static\n   * @memberof ScrollSpy\n   */\n  ScrollSpy._count = 0;\n\n  /**\n   * @static\n   * @memberof ScrollSpy\n   */\n  ScrollSpy._increment = 0;\n\n  /**\n   * @static\n   * @memberof ScrollSpy\n   */\n  ScrollSpy._ticks = 0;\n\n  M.ScrollSpy = ScrollSpy;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(ScrollSpy, 'scrollSpy', 'M_ScrollSpy');\n  }\n})(cash, M.anime);\n;(function ($) {\n  'use strict';\n\n  var _defaults = {\n    data: {}, // Autocomplete data set\n    limit: Infinity, // Limit of results the autocomplete shows\n    onAutocomplete: null, // Callback for when autocompleted\n    minLength: 1, // Min characters before autocomplete starts\n    sortFunction: function (a, b, inputString) {\n      // Sort function for sorting autocomplete results\n      return a.indexOf(inputString) - b.indexOf(inputString);\n    }\n  };\n\n  /**\n   * @class\n   *\n   */\n\n  var Autocomplete = function (_Component10) {\n    _inherits(Autocomplete, _Component10);\n\n    /**\n     * Construct Autocomplete instance\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function Autocomplete(el, options) {\n      _classCallCheck(this, Autocomplete);\n\n      var _this37 = _possibleConstructorReturn(this, (Autocomplete.__proto__ || Object.getPrototypeOf(Autocomplete)).call(this, Autocomplete, el, options));\n\n      _this37.el.M_Autocomplete = _this37;\n\n      /**\n       * Options for the autocomplete\n       * @member Autocomplete#options\n       * @prop {Number} duration\n       * @prop {Number} dist\n       * @prop {number} shift\n       * @prop {number} padding\n       * @prop {Boolean} fullWidth\n       * @prop {Boolean} indicators\n       * @prop {Boolean} noWrap\n       * @prop {Function} onCycleTo\n       */\n      _this37.options = $.extend({}, Autocomplete.defaults, options);\n\n      // Setup\n      _this37.isOpen = false;\n      _this37.count = 0;\n      _this37.activeIndex = -1;\n      _this37.oldVal;\n      _this37.$inputField = _this37.$el.closest('.input-field');\n      _this37.$active = $();\n      _this37._mousedown = false;\n      _this37._setupDropdown();\n\n      _this37._setupEventHandlers();\n      return _this37;\n    }\n\n    _createClass(Autocomplete, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this._removeEventHandlers();\n        this._removeDropdown();\n        this.el.M_Autocomplete = undefined;\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        this._handleInputBlurBound = this._handleInputBlur.bind(this);\n        this._handleInputKeyupAndFocusBound = this._handleInputKeyupAndFocus.bind(this);\n        this._handleInputKeydownBound = this._handleInputKeydown.bind(this);\n        this._handleInputClickBound = this._handleInputClick.bind(this);\n        this._handleContainerMousedownAndTouchstartBound = this._handleContainerMousedownAndTouchstart.bind(this);\n        this._handleContainerMouseupAndTouchendBound = this._handleContainerMouseupAndTouchend.bind(this);\n\n        this.el.addEventListener('blur', this._handleInputBlurBound);\n        this.el.addEventListener('keyup', this._handleInputKeyupAndFocusBound);\n        this.el.addEventListener('focus', this._handleInputKeyupAndFocusBound);\n        this.el.addEventListener('keydown', this._handleInputKeydownBound);\n        this.el.addEventListener('click', this._handleInputClickBound);\n        this.container.addEventListener('mousedown', this._handleContainerMousedownAndTouchstartBound);\n        this.container.addEventListener('mouseup', this._handleContainerMouseupAndTouchendBound);\n\n        if (typeof window.ontouchstart !== 'undefined') {\n          this.container.addEventListener('touchstart', this._handleContainerMousedownAndTouchstartBound);\n          this.container.addEventListener('touchend', this._handleContainerMouseupAndTouchendBound);\n        }\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        this.el.removeEventListener('blur', this._handleInputBlurBound);\n        this.el.removeEventListener('keyup', this._handleInputKeyupAndFocusBound);\n        this.el.removeEventListener('focus', this._handleInputKeyupAndFocusBound);\n        this.el.removeEventListener('keydown', this._handleInputKeydownBound);\n        this.el.removeEventListener('click', this._handleInputClickBound);\n        this.container.removeEventListener('mousedown', this._handleContainerMousedownAndTouchstartBound);\n        this.container.removeEventListener('mouseup', this._handleContainerMouseupAndTouchendBound);\n\n        if (typeof window.ontouchstart !== 'undefined') {\n          this.container.removeEventListener('touchstart', this._handleContainerMousedownAndTouchstartBound);\n          this.container.removeEventListener('touchend', this._handleContainerMouseupAndTouchendBound);\n        }\n      }\n\n      /**\n       * Setup dropdown\n       */\n\n    }, {\n      key: \"_setupDropdown\",\n      value: function _setupDropdown() {\n        var _this38 = this;\n\n        this.container = document.createElement('ul');\n        this.container.id = \"autocomplete-options-\" + M.guid();\n        $(this.container).addClass('autocomplete-content dropdown-content');\n        this.$inputField.append(this.container);\n        this.el.setAttribute('data-target', this.container.id);\n\n        this.dropdown = M.Dropdown.init(this.el, {\n          autoFocus: false,\n          closeOnClick: false,\n          coverTrigger: false,\n          onItemClick: function (itemEl) {\n            _this38.selectOption($(itemEl));\n          }\n        });\n\n        // Sketchy removal of dropdown click handler\n        this.el.removeEventListener('click', this.dropdown._handleClickBound);\n      }\n\n      /**\n       * Remove dropdown\n       */\n\n    }, {\n      key: \"_removeDropdown\",\n      value: function _removeDropdown() {\n        this.container.parentNode.removeChild(this.container);\n      }\n\n      /**\n       * Handle Input Blur\n       */\n\n    }, {\n      key: \"_handleInputBlur\",\n      value: function _handleInputBlur() {\n        if (!this._mousedown) {\n          this.close();\n          this._resetAutocomplete();\n        }\n      }\n\n      /**\n       * Handle Input Keyup and Focus\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleInputKeyupAndFocus\",\n      value: function _handleInputKeyupAndFocus(e) {\n        if (e.type === 'keyup') {\n          Autocomplete._keydown = false;\n        }\n\n        this.count = 0;\n        var val = this.el.value.toLowerCase();\n\n        // Don't capture enter or arrow key usage.\n        if (e.keyCode === 13 || e.keyCode === 38 || e.keyCode === 40) {\n          return;\n        }\n\n        // Check if the input isn't empty\n        // Check if focus triggered by tab\n        if (this.oldVal !== val && (M.tabPressed || e.type !== 'focus')) {\n          this.open();\n        }\n\n        // Update oldVal\n        this.oldVal = val;\n      }\n\n      /**\n       * Handle Input Keydown\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleInputKeydown\",\n      value: function _handleInputKeydown(e) {\n        Autocomplete._keydown = true;\n\n        // Arrow keys and enter key usage\n        var keyCode = e.keyCode,\n            liElement = void 0,\n            numItems = $(this.container).children('li').length;\n\n        // select element on Enter\n        if (keyCode === M.keys.ENTER && this.activeIndex >= 0) {\n          liElement = $(this.container).children('li').eq(this.activeIndex);\n          if (liElement.length) {\n            this.selectOption(liElement);\n            e.preventDefault();\n          }\n          return;\n        }\n\n        // Capture up and down key\n        if (keyCode === M.keys.ARROW_UP || keyCode === M.keys.ARROW_DOWN) {\n          e.preventDefault();\n\n          if (keyCode === M.keys.ARROW_UP && this.activeIndex > 0) {\n            this.activeIndex--;\n          }\n\n          if (keyCode === M.keys.ARROW_DOWN && this.activeIndex < numItems - 1) {\n            this.activeIndex++;\n          }\n\n          this.$active.removeClass('active');\n          if (this.activeIndex >= 0) {\n            this.$active = $(this.container).children('li').eq(this.activeIndex);\n            this.$active.addClass('active');\n          }\n        }\n      }\n\n      /**\n       * Handle Input Click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleInputClick\",\n      value: function _handleInputClick(e) {\n        this.open();\n      }\n\n      /**\n       * Handle Container Mousedown and Touchstart\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleContainerMousedownAndTouchstart\",\n      value: function _handleContainerMousedownAndTouchstart(e) {\n        this._mousedown = true;\n      }\n\n      /**\n       * Handle Container Mouseup and Touchend\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleContainerMouseupAndTouchend\",\n      value: function _handleContainerMouseupAndTouchend(e) {\n        this._mousedown = false;\n      }\n\n      /**\n       * Highlight partial match\n       */\n\n    }, {\n      key: \"_highlight\",\n      value: function _highlight(string, $el) {\n        var img = $el.find('img');\n        var matchStart = $el.text().toLowerCase().indexOf('' + string.toLowerCase() + ''),\n            matchEnd = matchStart + string.length - 1,\n            beforeMatch = $el.text().slice(0, matchStart),\n            matchText = $el.text().slice(matchStart, matchEnd + 1),\n            afterMatch = $el.text().slice(matchEnd + 1);\n        $el.html(\"<span>\" + beforeMatch + \"<span class='highlight'>\" + matchText + \"</span>\" + afterMatch + \"</span>\");\n        if (img.length) {\n          $el.prepend(img);\n        }\n      }\n\n      /**\n       * Reset current element position\n       */\n\n    }, {\n      key: \"_resetCurrentElement\",\n      value: function _resetCurrentElement() {\n        this.activeIndex = -1;\n        this.$active.removeClass('active');\n      }\n\n      /**\n       * Reset autocomplete elements\n       */\n\n    }, {\n      key: \"_resetAutocomplete\",\n      value: function _resetAutocomplete() {\n        $(this.container).empty();\n        this._resetCurrentElement();\n        this.oldVal = null;\n        this.isOpen = false;\n        this._mousedown = false;\n      }\n\n      /**\n       * Select autocomplete option\n       * @param {Element} el  Autocomplete option list item element\n       */\n\n    }, {\n      key: \"selectOption\",\n      value: function selectOption(el) {\n        var text = el.text().trim();\n        this.el.value = text;\n        this.$el.trigger('change');\n        this._resetAutocomplete();\n        this.close();\n\n        // Handle onAutocomplete callback.\n        if (typeof this.options.onAutocomplete === 'function') {\n          this.options.onAutocomplete.call(this, text);\n        }\n      }\n\n      /**\n       * Render dropdown content\n       * @param {Object} data  data set\n       * @param {String} val  current input value\n       */\n\n    }, {\n      key: \"_renderDropdown\",\n      value: function _renderDropdown(data, val) {\n        var _this39 = this;\n\n        this._resetAutocomplete();\n\n        var matchingData = [];\n\n        // Gather all matching data\n        for (var key in data) {\n          if (data.hasOwnProperty(key) && key.toLowerCase().indexOf(val) !== -1) {\n            // Break if past limit\n            if (this.count >= this.options.limit) {\n              break;\n            }\n\n            var entry = {\n              data: data[key],\n              key: key\n            };\n            matchingData.push(entry);\n\n            this.count++;\n          }\n        }\n\n        // Sort\n        if (this.options.sortFunction) {\n          var sortFunctionBound = function (a, b) {\n            return _this39.options.sortFunction(a.key.toLowerCase(), b.key.toLowerCase(), val.toLowerCase());\n          };\n          matchingData.sort(sortFunctionBound);\n        }\n\n        // Render\n        for (var i = 0; i < matchingData.length; i++) {\n          var _entry = matchingData[i];\n          var $autocompleteOption = $('<li></li>');\n          if (!!_entry.data) {\n            $autocompleteOption.append(\"<img src=\\\"\" + _entry.data + \"\\\" class=\\\"right circle\\\"><span>\" + _entry.key + \"</span>\");\n          } else {\n            $autocompleteOption.append('<span>' + _entry.key + '</span>');\n          }\n\n          $(this.container).append($autocompleteOption);\n          this._highlight(val, $autocompleteOption);\n        }\n      }\n\n      /**\n       * Open Autocomplete Dropdown\n       */\n\n    }, {\n      key: \"open\",\n      value: function open() {\n        var val = this.el.value.toLowerCase();\n\n        this._resetAutocomplete();\n\n        if (val.length >= this.options.minLength) {\n          this.isOpen = true;\n          this._renderDropdown(this.options.data, val);\n        }\n\n        // Open dropdown\n        if (!this.dropdown.isOpen) {\n          this.dropdown.open();\n        } else {\n          // Recalculate dropdown when its already open\n          this.dropdown.recalculateDimensions();\n        }\n      }\n\n      /**\n       * Close Autocomplete Dropdown\n       */\n\n    }, {\n      key: \"close\",\n      value: function close() {\n        this.dropdown.close();\n      }\n\n      /**\n       * Update Data\n       * @param {Object} data\n       */\n\n    }, {\n      key: \"updateData\",\n      value: function updateData(data) {\n        var val = this.el.value.toLowerCase();\n        this.options.data = data;\n\n        if (this.isOpen) {\n          this._renderDropdown(data, val);\n        }\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Autocomplete.__proto__ || Object.getPrototypeOf(Autocomplete), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Autocomplete;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Autocomplete;\n  }(Component);\n\n  /**\n   * @static\n   * @memberof Autocomplete\n   */\n\n\n  Autocomplete._keydown = false;\n\n  M.Autocomplete = Autocomplete;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Autocomplete, 'autocomplete', 'M_Autocomplete');\n  }\n})(cash);\n;(function ($) {\n  // Function to update labels of text fields\n  M.updateTextFields = function () {\n    var input_selector = 'input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], input[type=date], input[type=time], textarea';\n    $(input_selector).each(function (element, index) {\n      var $this = $(this);\n      if (element.value.length > 0 || $(element).is(':focus') || element.autofocus || $this.attr('placeholder') !== null) {\n        $this.siblings('label').addClass('active');\n      } else if (element.validity) {\n        $this.siblings('label').toggleClass('active', element.validity.badInput === true);\n      } else {\n        $this.siblings('label').removeClass('active');\n      }\n    });\n  };\n\n  M.validate_field = function (object) {\n    var hasLength = object.attr('data-length') !== null;\n    var lenAttr = parseInt(object.attr('data-length'));\n    var len = object[0].value.length;\n\n    if (len === 0 && object[0].validity.badInput === false && !object.is(':required')) {\n      if (object.hasClass('validate')) {\n        object.removeClass('valid');\n        object.removeClass('invalid');\n      }\n    } else {\n      if (object.hasClass('validate')) {\n        // Check for character counter attributes\n        if (object.is(':valid') && hasLength && len <= lenAttr || object.is(':valid') && !hasLength) {\n          object.removeClass('invalid');\n          object.addClass('valid');\n        } else {\n          object.removeClass('valid');\n          object.addClass('invalid');\n        }\n      }\n    }\n  };\n\n  M.textareaAutoResize = function ($textarea) {\n    // Wrap if native element\n    if ($textarea instanceof Element) {\n      $textarea = $($textarea);\n    }\n\n    if (!$textarea.length) {\n      console.error('No textarea element found');\n      return;\n    }\n\n    // Textarea Auto Resize\n    var hiddenDiv = $('.hiddendiv').first();\n    if (!hiddenDiv.length) {\n      hiddenDiv = $('<div class=\"hiddendiv common\"></div>');\n      $('body').append(hiddenDiv);\n    }\n\n    // Set font properties of hiddenDiv\n    var fontFamily = $textarea.css('font-family');\n    var fontSize = $textarea.css('font-size');\n    var lineHeight = $textarea.css('line-height');\n\n    // Firefox can't handle padding shorthand.\n    var paddingTop = $textarea.css('padding-top');\n    var paddingRight = $textarea.css('padding-right');\n    var paddingBottom = $textarea.css('padding-bottom');\n    var paddingLeft = $textarea.css('padding-left');\n\n    if (fontSize) {\n      hiddenDiv.css('font-size', fontSize);\n    }\n    if (fontFamily) {\n      hiddenDiv.css('font-family', fontFamily);\n    }\n    if (lineHeight) {\n      hiddenDiv.css('line-height', lineHeight);\n    }\n    if (paddingTop) {\n      hiddenDiv.css('padding-top', paddingTop);\n    }\n    if (paddingRight) {\n      hiddenDiv.css('padding-right', paddingRight);\n    }\n    if (paddingBottom) {\n      hiddenDiv.css('padding-bottom', paddingBottom);\n    }\n    if (paddingLeft) {\n      hiddenDiv.css('padding-left', paddingLeft);\n    }\n\n    // Set original-height, if none\n    if (!$textarea.data('original-height')) {\n      $textarea.data('original-height', $textarea.height());\n    }\n\n    if ($textarea.attr('wrap') === 'off') {\n      hiddenDiv.css('overflow-wrap', 'normal').css('white-space', 'pre');\n    }\n\n    hiddenDiv.text($textarea[0].value + '\\n');\n    var content = hiddenDiv.html().replace(/\\n/g, '<br>');\n    hiddenDiv.html(content);\n\n    // When textarea is hidden, width goes crazy.\n    // Approximate with half of window size\n\n    if ($textarea[0].offsetWidth > 0 && $textarea[0].offsetHeight > 0) {\n      hiddenDiv.css('width', $textarea.width() + 'px');\n    } else {\n      hiddenDiv.css('width', window.innerWidth / 2 + 'px');\n    }\n\n    /**\n     * Resize if the new height is greater than the\n     * original height of the textarea\n     */\n    if ($textarea.data('original-height') <= hiddenDiv.innerHeight()) {\n      $textarea.css('height', hiddenDiv.innerHeight() + 'px');\n    } else if ($textarea[0].value.length < $textarea.data('previous-length')) {\n      /**\n       * In case the new height is less than original height, it\n       * means the textarea has less text than before\n       * So we set the height to the original one\n       */\n      $textarea.css('height', $textarea.data('original-height') + 'px');\n    }\n    $textarea.data('previous-length', $textarea[0].value.length);\n  };\n\n  $(document).ready(function () {\n    // Text based inputs\n    var input_selector = 'input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], input[type=date], input[type=time], textarea';\n\n    // Add active if form auto complete\n    $(document).on('change', input_selector, function () {\n      if (this.value.length !== 0 || $(this).attr('placeholder') !== null) {\n        $(this).siblings('label').addClass('active');\n      }\n      M.validate_field($(this));\n    });\n\n    // Add active if input element has been pre-populated on document ready\n    $(document).ready(function () {\n      M.updateTextFields();\n    });\n\n    // HTML DOM FORM RESET handling\n    $(document).on('reset', function (e) {\n      var formReset = $(e.target);\n      if (formReset.is('form')) {\n        formReset.find(input_selector).removeClass('valid').removeClass('invalid');\n        formReset.find(input_selector).each(function (e) {\n          if (this.value.length) {\n            $(this).siblings('label').removeClass('active');\n          }\n        });\n\n        // Reset select (after native reset)\n        setTimeout(function () {\n          formReset.find('select').each(function () {\n            // check if initialized\n            if (this.M_FormSelect) {\n              $(this).trigger('change');\n            }\n          });\n        }, 0);\n      }\n    });\n\n    /**\n     * Add active when element has focus\n     * @param {Event} e\n     */\n    document.addEventListener('focus', function (e) {\n      if ($(e.target).is(input_selector)) {\n        $(e.target).siblings('label, .prefix').addClass('active');\n      }\n    }, true);\n\n    /**\n     * Remove active when element is blurred\n     * @param {Event} e\n     */\n    document.addEventListener('blur', function (e) {\n      var $inputElement = $(e.target);\n      if ($inputElement.is(input_selector)) {\n        var selector = '.prefix';\n\n        if ($inputElement[0].value.length === 0 && $inputElement[0].validity.badInput !== true && $inputElement.attr('placeholder') === null) {\n          selector += ', label';\n        }\n        $inputElement.siblings(selector).removeClass('active');\n        M.validate_field($inputElement);\n      }\n    }, true);\n\n    // Radio and Checkbox focus class\n    var radio_checkbox = 'input[type=radio], input[type=checkbox]';\n    $(document).on('keyup', radio_checkbox, function (e) {\n      // TAB, check if tabbing to radio or checkbox.\n      if (e.which === M.keys.TAB) {\n        $(this).addClass('tabbed');\n        var $this = $(this);\n        $this.one('blur', function (e) {\n          $(this).removeClass('tabbed');\n        });\n        return;\n      }\n    });\n\n    var text_area_selector = '.materialize-textarea';\n    $(text_area_selector).each(function () {\n      var $textarea = $(this);\n      /**\n       * Resize textarea on document load after storing\n       * the original height and the original length\n       */\n      $textarea.data('original-height', $textarea.height());\n      $textarea.data('previous-length', this.value.length);\n      M.textareaAutoResize($textarea);\n    });\n\n    $(document).on('keyup', text_area_selector, function () {\n      M.textareaAutoResize($(this));\n    });\n    $(document).on('keydown', text_area_selector, function () {\n      M.textareaAutoResize($(this));\n    });\n\n    // File Input Path\n    $(document).on('change', '.file-field input[type=\"file\"]', function () {\n      var file_field = $(this).closest('.file-field');\n      var path_input = file_field.find('input.file-path');\n      var files = $(this)[0].files;\n      var file_names = [];\n      for (var i = 0; i < files.length; i++) {\n        file_names.push(files[i].name);\n      }\n      path_input[0].value = file_names.join(', ');\n      path_input.trigger('change');\n    });\n  }); // End of $(document).ready\n})(cash);\n;(function ($, anim) {\n  'use strict';\n\n  var _defaults = {\n    indicators: true,\n    height: 400,\n    duration: 500,\n    interval: 6000\n  };\n\n  /**\n   * @class\n   *\n   */\n\n  var Slider = function (_Component11) {\n    _inherits(Slider, _Component11);\n\n    /**\n     * Construct Slider instance and set up overlay\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function Slider(el, options) {\n      _classCallCheck(this, Slider);\n\n      var _this40 = _possibleConstructorReturn(this, (Slider.__proto__ || Object.getPrototypeOf(Slider)).call(this, Slider, el, options));\n\n      _this40.el.M_Slider = _this40;\n\n      /**\n       * Options for the modal\n       * @member Slider#options\n       * @prop {Boolean} [indicators=true] - Show indicators\n       * @prop {Number} [height=400] - height of slider\n       * @prop {Number} [duration=500] - Length in ms of slide transition\n       * @prop {Number} [interval=6000] - Length in ms of slide interval\n       */\n      _this40.options = $.extend({}, Slider.defaults, options);\n\n      // setup\n      _this40.$slider = _this40.$el.find('.slides');\n      _this40.$slides = _this40.$slider.children('li');\n      _this40.activeIndex = _this40.$slides.filter(function (item) {\n        return $(item).hasClass('active');\n      }).first().index();\n      if (_this40.activeIndex != -1) {\n        _this40.$active = _this40.$slides.eq(_this40.activeIndex);\n      }\n\n      _this40._setSliderHeight();\n\n      // Set initial positions of captions\n      _this40.$slides.find('.caption').each(function (el) {\n        _this40._animateCaptionIn(el, 0);\n      });\n\n      // Move img src into background-image\n      _this40.$slides.find('img').each(function (el) {\n        var placeholderBase64 = 'data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n        if ($(el).attr('src') !== placeholderBase64) {\n          $(el).css('background-image', 'url(\"' + $(el).attr('src') + '\")');\n          $(el).attr('src', placeholderBase64);\n        }\n      });\n\n      _this40._setupIndicators();\n\n      // Show active slide\n      if (_this40.$active) {\n        _this40.$active.css('display', 'block');\n      } else {\n        _this40.$slides.first().addClass('active');\n        anim({\n          targets: _this40.$slides.first()[0],\n          opacity: 1,\n          duration: _this40.options.duration,\n          easing: 'easeOutQuad'\n        });\n\n        _this40.activeIndex = 0;\n        _this40.$active = _this40.$slides.eq(_this40.activeIndex);\n\n        // Update indicators\n        if (_this40.options.indicators) {\n          _this40.$indicators.eq(_this40.activeIndex).addClass('active');\n        }\n      }\n\n      // Adjust height to current slide\n      _this40.$active.find('img').each(function (el) {\n        anim({\n          targets: _this40.$active.find('.caption')[0],\n          opacity: 1,\n          translateX: 0,\n          translateY: 0,\n          duration: _this40.options.duration,\n          easing: 'easeOutQuad'\n        });\n      });\n\n      _this40._setupEventHandlers();\n\n      // auto scroll\n      _this40.start();\n      return _this40;\n    }\n\n    _createClass(Slider, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this.pause();\n        this._removeIndicators();\n        this._removeEventHandlers();\n        this.el.M_Slider = undefined;\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        var _this41 = this;\n\n        this._handleIntervalBound = this._handleInterval.bind(this);\n        this._handleIndicatorClickBound = this._handleIndicatorClick.bind(this);\n\n        if (this.options.indicators) {\n          this.$indicators.each(function (el) {\n            el.addEventListener('click', _this41._handleIndicatorClickBound);\n          });\n        }\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        var _this42 = this;\n\n        if (this.options.indicators) {\n          this.$indicators.each(function (el) {\n            el.removeEventListener('click', _this42._handleIndicatorClickBound);\n          });\n        }\n      }\n\n      /**\n       * Handle indicator click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleIndicatorClick\",\n      value: function _handleIndicatorClick(e) {\n        var currIndex = $(e.target).index();\n        this.set(currIndex);\n      }\n\n      /**\n       * Handle Interval\n       */\n\n    }, {\n      key: \"_handleInterval\",\n      value: function _handleInterval() {\n        var newActiveIndex = this.$slider.find('.active').index();\n        if (this.$slides.length === newActiveIndex + 1) newActiveIndex = 0;\n        // loop to start\n        else newActiveIndex += 1;\n\n        this.set(newActiveIndex);\n      }\n\n      /**\n       * Animate in caption\n       * @param {Element} caption\n       * @param {Number} duration\n       */\n\n    }, {\n      key: \"_animateCaptionIn\",\n      value: function _animateCaptionIn(caption, duration) {\n        var animOptions = {\n          targets: caption,\n          opacity: 0,\n          duration: duration,\n          easing: 'easeOutQuad'\n        };\n\n        if ($(caption).hasClass('center-align')) {\n          animOptions.translateY = -100;\n        } else if ($(caption).hasClass('right-align')) {\n          animOptions.translateX = 100;\n        } else if ($(caption).hasClass('left-align')) {\n          animOptions.translateX = -100;\n        }\n\n        anim(animOptions);\n      }\n\n      /**\n       * Set height of slider\n       */\n\n    }, {\n      key: \"_setSliderHeight\",\n      value: function _setSliderHeight() {\n        // If fullscreen, do nothing\n        if (!this.$el.hasClass('fullscreen')) {\n          if (this.options.indicators) {\n            // Add height if indicators are present\n            this.$el.css('height', this.options.height + 40 + 'px');\n          } else {\n            this.$el.css('height', this.options.height + 'px');\n          }\n          this.$slider.css('height', this.options.height + 'px');\n        }\n      }\n\n      /**\n       * Setup indicators\n       */\n\n    }, {\n      key: \"_setupIndicators\",\n      value: function _setupIndicators() {\n        var _this43 = this;\n\n        if (this.options.indicators) {\n          this.$indicators = $('<ul class=\"indicators\"></ul>');\n          this.$slides.each(function (el, index) {\n            var $indicator = $('<li class=\"indicator-item\"></li>');\n            _this43.$indicators.append($indicator[0]);\n          });\n          this.$el.append(this.$indicators[0]);\n          this.$indicators = this.$indicators.children('li.indicator-item');\n        }\n      }\n\n      /**\n       * Remove indicators\n       */\n\n    }, {\n      key: \"_removeIndicators\",\n      value: function _removeIndicators() {\n        this.$el.find('ul.indicators').remove();\n      }\n\n      /**\n       * Cycle to nth item\n       * @param {Number} index\n       */\n\n    }, {\n      key: \"set\",\n      value: function set(index) {\n        var _this44 = this;\n\n        // Wrap around indices.\n        if (index >= this.$slides.length) index = 0;else if (index < 0) index = this.$slides.length - 1;\n\n        // Only do if index changes\n        if (this.activeIndex != index) {\n          this.$active = this.$slides.eq(this.activeIndex);\n          var $caption = this.$active.find('.caption');\n          this.$active.removeClass('active');\n\n          anim({\n            targets: this.$active[0],\n            opacity: 0,\n            duration: this.options.duration,\n            easing: 'easeOutQuad',\n            complete: function () {\n              _this44.$slides.not('.active').each(function (el) {\n                anim({\n                  targets: el,\n                  opacity: 0,\n                  translateX: 0,\n                  translateY: 0,\n                  duration: 0,\n                  easing: 'easeOutQuad'\n                });\n              });\n            }\n          });\n\n          this._animateCaptionIn($caption[0], this.options.duration);\n\n          // Update indicators\n          if (this.options.indicators) {\n            this.$indicators.eq(this.activeIndex).removeClass('active');\n            this.$indicators.eq(index).addClass('active');\n          }\n\n          anim({\n            targets: this.$slides.eq(index)[0],\n            opacity: 1,\n            duration: this.options.duration,\n            easing: 'easeOutQuad'\n          });\n\n          anim({\n            targets: this.$slides.eq(index).find('.caption')[0],\n            opacity: 1,\n            translateX: 0,\n            translateY: 0,\n            duration: this.options.duration,\n            delay: this.options.duration,\n            easing: 'easeOutQuad'\n          });\n\n          this.$slides.eq(index).addClass('active');\n          this.activeIndex = index;\n\n          // Reset interval\n          this.start();\n        }\n      }\n\n      /**\n       * Pause slider interval\n       */\n\n    }, {\n      key: \"pause\",\n      value: function pause() {\n        clearInterval(this.interval);\n      }\n\n      /**\n       * Start slider interval\n       */\n\n    }, {\n      key: \"start\",\n      value: function start() {\n        clearInterval(this.interval);\n        this.interval = setInterval(this._handleIntervalBound, this.options.duration + this.options.interval);\n      }\n\n      /**\n       * Move to next slide\n       */\n\n    }, {\n      key: \"next\",\n      value: function next() {\n        var newIndex = this.activeIndex + 1;\n\n        // Wrap around indices.\n        if (newIndex >= this.$slides.length) newIndex = 0;else if (newIndex < 0) newIndex = this.$slides.length - 1;\n\n        this.set(newIndex);\n      }\n\n      /**\n       * Move to previous slide\n       */\n\n    }, {\n      key: \"prev\",\n      value: function prev() {\n        var newIndex = this.activeIndex - 1;\n\n        // Wrap around indices.\n        if (newIndex >= this.$slides.length) newIndex = 0;else if (newIndex < 0) newIndex = this.$slides.length - 1;\n\n        this.set(newIndex);\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Slider.__proto__ || Object.getPrototypeOf(Slider), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Slider;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Slider;\n  }(Component);\n\n  M.Slider = Slider;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Slider, 'slider', 'M_Slider');\n  }\n})(cash, M.anime);\n;(function ($, anim) {\n  $(document).on('click', '.card', function (e) {\n    if ($(this).children('.card-reveal').length) {\n      var $card = $(e.target).closest('.card');\n      if ($card.data('initialOverflow') === undefined) {\n        $card.data('initialOverflow', $card.css('overflow') === undefined ? '' : $card.css('overflow'));\n      }\n      var $cardReveal = $(this).find('.card-reveal');\n      if ($(e.target).is($('.card-reveal .card-title')) || $(e.target).is($('.card-reveal .card-title i'))) {\n        // Make Reveal animate down and display none\n        anim({\n          targets: $cardReveal[0],\n          translateY: 0,\n          duration: 225,\n          easing: 'easeInOutQuad',\n          complete: function (anim) {\n            var el = anim.animatables[0].target;\n            $(el).css({ display: 'none' });\n            $card.css('overflow', $card.data('initialOverflow'));\n          }\n        });\n      } else if ($(e.target).is($('.card .activator')) || $(e.target).is($('.card .activator i'))) {\n        $card.css('overflow', 'hidden');\n        $cardReveal.css({ display: 'block' });\n        anim({\n          targets: $cardReveal[0],\n          translateY: '-100%',\n          duration: 300,\n          easing: 'easeInOutQuad'\n        });\n      }\n    }\n  });\n})(cash, M.anime);\n;(function ($) {\n  'use strict';\n\n  var _defaults = {\n    data: [],\n    placeholder: '',\n    secondaryPlaceholder: '',\n    autocompleteOptions: {},\n    limit: Infinity,\n    onChipAdd: null,\n    onChipSelect: null,\n    onChipDelete: null\n  };\n\n  /**\n   * @typedef {Object} chip\n   * @property {String} tag  chip tag string\n   * @property {String} [image]  chip avatar image string\n   */\n\n  /**\n   * @class\n   *\n   */\n\n  var Chips = function (_Component12) {\n    _inherits(Chips, _Component12);\n\n    /**\n     * Construct Chips instance and set up overlay\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function Chips(el, options) {\n      _classCallCheck(this, Chips);\n\n      var _this45 = _possibleConstructorReturn(this, (Chips.__proto__ || Object.getPrototypeOf(Chips)).call(this, Chips, el, options));\n\n      _this45.el.M_Chips = _this45;\n\n      /**\n       * Options for the modal\n       * @member Chips#options\n       * @prop {Array} data\n       * @prop {String} placeholder\n       * @prop {String} secondaryPlaceholder\n       * @prop {Object} autocompleteOptions\n       */\n      _this45.options = $.extend({}, Chips.defaults, options);\n\n      _this45.$el.addClass('chips input-field');\n      _this45.chipsData = [];\n      _this45.$chips = $();\n      _this45._setupInput();\n      _this45.hasAutocomplete = Object.keys(_this45.options.autocompleteOptions).length > 0;\n\n      // Set input id\n      if (!_this45.$input.attr('id')) {\n        _this45.$input.attr('id', M.guid());\n      }\n\n      // Render initial chips\n      if (_this45.options.data.length) {\n        _this45.chipsData = _this45.options.data;\n        _this45._renderChips(_this45.chipsData);\n      }\n\n      // Setup autocomplete if needed\n      if (_this45.hasAutocomplete) {\n        _this45._setupAutocomplete();\n      }\n\n      _this45._setPlaceholder();\n      _this45._setupLabel();\n      _this45._setupEventHandlers();\n      return _this45;\n    }\n\n    _createClass(Chips, [{\n      key: \"getData\",\n\n\n      /**\n       * Get Chips Data\n       */\n      value: function getData() {\n        return this.chipsData;\n      }\n\n      /**\n       * Teardown component\n       */\n\n    }, {\n      key: \"destroy\",\n      value: function destroy() {\n        this._removeEventHandlers();\n        this.$chips.remove();\n        this.el.M_Chips = undefined;\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        this._handleChipClickBound = this._handleChipClick.bind(this);\n        this._handleInputKeydownBound = this._handleInputKeydown.bind(this);\n        this._handleInputFocusBound = this._handleInputFocus.bind(this);\n        this._handleInputBlurBound = this._handleInputBlur.bind(this);\n\n        this.el.addEventListener('click', this._handleChipClickBound);\n        document.addEventListener('keydown', Chips._handleChipsKeydown);\n        document.addEventListener('keyup', Chips._handleChipsKeyup);\n        this.el.addEventListener('blur', Chips._handleChipsBlur, true);\n        this.$input[0].addEventListener('focus', this._handleInputFocusBound);\n        this.$input[0].addEventListener('blur', this._handleInputBlurBound);\n        this.$input[0].addEventListener('keydown', this._handleInputKeydownBound);\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        this.el.removeEventListener('click', this._handleChipClickBound);\n        document.removeEventListener('keydown', Chips._handleChipsKeydown);\n        document.removeEventListener('keyup', Chips._handleChipsKeyup);\n        this.el.removeEventListener('blur', Chips._handleChipsBlur, true);\n        this.$input[0].removeEventListener('focus', this._handleInputFocusBound);\n        this.$input[0].removeEventListener('blur', this._handleInputBlurBound);\n        this.$input[0].removeEventListener('keydown', this._handleInputKeydownBound);\n      }\n\n      /**\n       * Handle Chip Click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleChipClick\",\n      value: function _handleChipClick(e) {\n        var $chip = $(e.target).closest('.chip');\n        var clickedClose = $(e.target).is('.close');\n        if ($chip.length) {\n          var index = $chip.index();\n          if (clickedClose) {\n            // delete chip\n            this.deleteChip(index);\n            this.$input[0].focus();\n          } else {\n            // select chip\n            this.selectChip(index);\n          }\n\n          // Default handle click to focus on input\n        } else {\n          this.$input[0].focus();\n        }\n      }\n\n      /**\n       * Handle Chips Keydown\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleInputFocus\",\n\n\n      /**\n       * Handle Input Focus\n       */\n      value: function _handleInputFocus() {\n        this.$el.addClass('focus');\n      }\n\n      /**\n       * Handle Input Blur\n       */\n\n    }, {\n      key: \"_handleInputBlur\",\n      value: function _handleInputBlur() {\n        this.$el.removeClass('focus');\n      }\n\n      /**\n       * Handle Input Keydown\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleInputKeydown\",\n      value: function _handleInputKeydown(e) {\n        Chips._keydown = true;\n\n        // enter\n        if (e.keyCode === 13) {\n          // Override enter if autocompleting.\n          if (this.hasAutocomplete && this.autocomplete && this.autocomplete.isOpen) {\n            return;\n          }\n\n          e.preventDefault();\n          this.addChip({\n            tag: this.$input[0].value\n          });\n          this.$input[0].value = '';\n\n          // delete or left\n        } else if ((e.keyCode === 8 || e.keyCode === 37) && this.$input[0].value === '' && this.chipsData.length) {\n          e.preventDefault();\n          this.selectChip(this.chipsData.length - 1);\n        }\n      }\n\n      /**\n       * Render Chip\n       * @param {chip} chip\n       * @return {Element}\n       */\n\n    }, {\n      key: \"_renderChip\",\n      value: function _renderChip(chip) {\n        if (!chip.tag) {\n          return;\n        }\n\n        var renderedChip = document.createElement('div');\n        var closeIcon = document.createElement('i');\n        renderedChip.classList.add('chip');\n        renderedChip.textContent = chip.tag;\n        renderedChip.setAttribute('tabindex', 0);\n        $(closeIcon).addClass('material-icons close');\n        closeIcon.textContent = 'close';\n\n        // attach image if needed\n        if (chip.image) {\n          var img = document.createElement('img');\n          img.setAttribute('src', chip.image);\n          renderedChip.insertBefore(img, renderedChip.firstChild);\n        }\n\n        renderedChip.appendChild(closeIcon);\n        return renderedChip;\n      }\n\n      /**\n       * Render Chips\n       */\n\n    }, {\n      key: \"_renderChips\",\n      value: function _renderChips() {\n        this.$chips.remove();\n        for (var i = 0; i < this.chipsData.length; i++) {\n          var chipEl = this._renderChip(this.chipsData[i]);\n          this.$el.append(chipEl);\n          this.$chips.add(chipEl);\n        }\n\n        // move input to end\n        this.$el.append(this.$input[0]);\n      }\n\n      /**\n       * Setup Autocomplete\n       */\n\n    }, {\n      key: \"_setupAutocomplete\",\n      value: function _setupAutocomplete() {\n        var _this46 = this;\n\n        this.options.autocompleteOptions.onAutocomplete = function (val) {\n          _this46.addChip({\n            tag: val\n          });\n          _this46.$input[0].value = '';\n          _this46.$input[0].focus();\n        };\n\n        this.autocomplete = M.Autocomplete.init(this.$input[0], this.options.autocompleteOptions);\n      }\n\n      /**\n       * Setup Input\n       */\n\n    }, {\n      key: \"_setupInput\",\n      value: function _setupInput() {\n        this.$input = this.$el.find('input');\n        if (!this.$input.length) {\n          this.$input = $('<input></input>');\n          this.$el.append(this.$input);\n        }\n\n        this.$input.addClass('input');\n      }\n\n      /**\n       * Setup Label\n       */\n\n    }, {\n      key: \"_setupLabel\",\n      value: function _setupLabel() {\n        this.$label = this.$el.find('label');\n        if (this.$label.length) {\n          this.$label.setAttribute('for', this.$input.attr('id'));\n        }\n      }\n\n      /**\n       * Set placeholder\n       */\n\n    }, {\n      key: \"_setPlaceholder\",\n      value: function _setPlaceholder() {\n        if (this.chipsData !== undefined && !this.chipsData.length && this.options.placeholder) {\n          $(this.$input).prop('placeholder', this.options.placeholder);\n        } else if ((this.chipsData === undefined || !!this.chipsData.length) && this.options.secondaryPlaceholder) {\n          $(this.$input).prop('placeholder', this.options.secondaryPlaceholder);\n        }\n      }\n\n      /**\n       * Check if chip is valid\n       * @param {chip} chip\n       */\n\n    }, {\n      key: \"_isValid\",\n      value: function _isValid(chip) {\n        if (chip.hasOwnProperty('tag') && chip.tag !== '') {\n          var exists = false;\n          for (var i = 0; i < this.chipsData.length; i++) {\n            if (this.chipsData[i].tag === chip.tag) {\n              exists = true;\n              break;\n            }\n          }\n          return !exists;\n        }\n\n        return false;\n      }\n\n      /**\n       * Add chip\n       * @param {chip} chip\n       */\n\n    }, {\n      key: \"addChip\",\n      value: function addChip(chip) {\n        if (!this._isValid(chip) || this.chipsData.length >= this.options.limit) {\n          return;\n        }\n\n        var renderedChip = this._renderChip(chip);\n        this.$chips.add(renderedChip);\n        this.chipsData.push(chip);\n        $(this.$input).before(renderedChip);\n        this._setPlaceholder();\n\n        // fire chipAdd callback\n        if (typeof this.options.onChipAdd === 'function') {\n          this.options.onChipAdd.call(this, this.$el, renderedChip);\n        }\n      }\n\n      /**\n       * Delete chip\n       * @param {Number} chip\n       */\n\n    }, {\n      key: \"deleteChip\",\n      value: function deleteChip(chipIndex) {\n        var $chip = this.$chips.eq(chipIndex);\n        this.$chips.eq(chipIndex).remove();\n        this.$chips = this.$chips.filter(function (el) {\n          return $(el).index() >= 0;\n        });\n        this.chipsData.splice(chipIndex, 1);\n        this._setPlaceholder();\n\n        // fire chipDelete callback\n        if (typeof this.options.onChipDelete === 'function') {\n          this.options.onChipDelete.call(this, this.$el, $chip[0]);\n        }\n      }\n\n      /**\n       * Select chip\n       * @param {Number} chip\n       */\n\n    }, {\n      key: \"selectChip\",\n      value: function selectChip(chipIndex) {\n        var $chip = this.$chips.eq(chipIndex);\n        this._selectedChip = $chip;\n        $chip[0].focus();\n\n        // fire chipSelect callback\n        if (typeof this.options.onChipSelect === 'function') {\n          this.options.onChipSelect.call(this, this.$el, $chip[0]);\n        }\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Chips.__proto__ || Object.getPrototypeOf(Chips), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Chips;\n      }\n    }, {\n      key: \"_handleChipsKeydown\",\n      value: function _handleChipsKeydown(e) {\n        Chips._keydown = true;\n\n        var $chips = $(e.target).closest('.chips');\n        var chipsKeydown = e.target && $chips.length;\n\n        // Don't handle keydown inputs on input and textarea\n        if ($(e.target).is('input, textarea') || !chipsKeydown) {\n          return;\n        }\n\n        var currChips = $chips[0].M_Chips;\n\n        // backspace and delete\n        if (e.keyCode === 8 || e.keyCode === 46) {\n          e.preventDefault();\n\n          var selectIndex = currChips.chipsData.length;\n          if (currChips._selectedChip) {\n            var index = currChips._selectedChip.index();\n            currChips.deleteChip(index);\n            currChips._selectedChip = null;\n\n            // Make sure selectIndex doesn't go negative\n            selectIndex = Math.max(index - 1, 0);\n          }\n\n          if (currChips.chipsData.length) {\n            currChips.selectChip(selectIndex);\n          }\n\n          // left arrow key\n        } else if (e.keyCode === 37) {\n          if (currChips._selectedChip) {\n            var _selectIndex = currChips._selectedChip.index() - 1;\n            if (_selectIndex < 0) {\n              return;\n            }\n            currChips.selectChip(_selectIndex);\n          }\n\n          // right arrow key\n        } else if (e.keyCode === 39) {\n          if (currChips._selectedChip) {\n            var _selectIndex2 = currChips._selectedChip.index() + 1;\n\n            if (_selectIndex2 >= currChips.chipsData.length) {\n              currChips.$input[0].focus();\n            } else {\n              currChips.selectChip(_selectIndex2);\n            }\n          }\n        }\n      }\n\n      /**\n       * Handle Chips Keyup\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleChipsKeyup\",\n      value: function _handleChipsKeyup(e) {\n        Chips._keydown = false;\n      }\n\n      /**\n       * Handle Chips Blur\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleChipsBlur\",\n      value: function _handleChipsBlur(e) {\n        if (!Chips._keydown) {\n          var $chips = $(e.target).closest('.chips');\n          var currChips = $chips[0].M_Chips;\n\n          currChips._selectedChip = null;\n        }\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Chips;\n  }(Component);\n\n  /**\n   * @static\n   * @memberof Chips\n   */\n\n\n  Chips._keydown = false;\n\n  M.Chips = Chips;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Chips, 'chips', 'M_Chips');\n  }\n\n  $(document).ready(function () {\n    // Handle removal of static chips.\n    $(document.body).on('click', '.chip .close', function () {\n      var $chips = $(this).closest('.chips');\n      if ($chips.length && $chips[0].M_Chips) {\n        return;\n      }\n      $(this).closest('.chip').remove();\n    });\n  });\n})(cash);\n;(function ($) {\n  'use strict';\n\n  var _defaults = {\n    top: 0,\n    bottom: Infinity,\n    offset: 0,\n    onPositionChange: null\n  };\n\n  /**\n   * @class\n   *\n   */\n\n  var Pushpin = function (_Component13) {\n    _inherits(Pushpin, _Component13);\n\n    /**\n     * Construct Pushpin instance\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function Pushpin(el, options) {\n      _classCallCheck(this, Pushpin);\n\n      var _this47 = _possibleConstructorReturn(this, (Pushpin.__proto__ || Object.getPrototypeOf(Pushpin)).call(this, Pushpin, el, options));\n\n      _this47.el.M_Pushpin = _this47;\n\n      /**\n       * Options for the modal\n       * @member Pushpin#options\n       */\n      _this47.options = $.extend({}, Pushpin.defaults, options);\n\n      _this47.originalOffset = _this47.el.offsetTop;\n      Pushpin._pushpins.push(_this47);\n      _this47._setupEventHandlers();\n      _this47._updatePosition();\n      return _this47;\n    }\n\n    _createClass(Pushpin, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this.el.style.top = null;\n        this._removePinClasses();\n        this._removeEventHandlers();\n\n        // Remove pushpin Inst\n        var index = Pushpin._pushpins.indexOf(this);\n        Pushpin._pushpins.splice(index, 1);\n      }\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        document.addEventListener('scroll', Pushpin._updateElements);\n      }\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        document.removeEventListener('scroll', Pushpin._updateElements);\n      }\n    }, {\n      key: \"_updatePosition\",\n      value: function _updatePosition() {\n        var scrolled = M.getDocumentScrollTop() + this.options.offset;\n\n        if (this.options.top <= scrolled && this.options.bottom >= scrolled && !this.el.classList.contains('pinned')) {\n          this._removePinClasses();\n          this.el.style.top = this.options.offset + \"px\";\n          this.el.classList.add('pinned');\n\n          // onPositionChange callback\n          if (typeof this.options.onPositionChange === 'function') {\n            this.options.onPositionChange.call(this, 'pinned');\n          }\n        }\n\n        // Add pin-top (when scrolled position is above top)\n        if (scrolled < this.options.top && !this.el.classList.contains('pin-top')) {\n          this._removePinClasses();\n          this.el.style.top = 0;\n          this.el.classList.add('pin-top');\n\n          // onPositionChange callback\n          if (typeof this.options.onPositionChange === 'function') {\n            this.options.onPositionChange.call(this, 'pin-top');\n          }\n        }\n\n        // Add pin-bottom (when scrolled position is below bottom)\n        if (scrolled > this.options.bottom && !this.el.classList.contains('pin-bottom')) {\n          this._removePinClasses();\n          this.el.classList.add('pin-bottom');\n          this.el.style.top = this.options.bottom - this.originalOffset + \"px\";\n\n          // onPositionChange callback\n          if (typeof this.options.onPositionChange === 'function') {\n            this.options.onPositionChange.call(this, 'pin-bottom');\n          }\n        }\n      }\n    }, {\n      key: \"_removePinClasses\",\n      value: function _removePinClasses() {\n        // IE 11 bug (can't remove multiple classes in one line)\n        this.el.classList.remove('pin-top');\n        this.el.classList.remove('pinned');\n        this.el.classList.remove('pin-bottom');\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Pushpin.__proto__ || Object.getPrototypeOf(Pushpin), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Pushpin;\n      }\n    }, {\n      key: \"_updateElements\",\n      value: function _updateElements() {\n        for (var elIndex in Pushpin._pushpins) {\n          var pInstance = Pushpin._pushpins[elIndex];\n          pInstance._updatePosition();\n        }\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Pushpin;\n  }(Component);\n\n  /**\n   * @static\n   * @memberof Pushpin\n   */\n\n\n  Pushpin._pushpins = [];\n\n  M.Pushpin = Pushpin;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Pushpin, 'pushpin', 'M_Pushpin');\n  }\n})(cash);\n;(function ($, anim) {\n  'use strict';\n\n  var _defaults = {\n    direction: 'top',\n    hoverEnabled: true,\n    toolbarEnabled: false\n  };\n\n  $.fn.reverse = [].reverse;\n\n  /**\n   * @class\n   *\n   */\n\n  var FloatingActionButton = function (_Component14) {\n    _inherits(FloatingActionButton, _Component14);\n\n    /**\n     * Construct FloatingActionButton instance\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function FloatingActionButton(el, options) {\n      _classCallCheck(this, FloatingActionButton);\n\n      var _this48 = _possibleConstructorReturn(this, (FloatingActionButton.__proto__ || Object.getPrototypeOf(FloatingActionButton)).call(this, FloatingActionButton, el, options));\n\n      _this48.el.M_FloatingActionButton = _this48;\n\n      /**\n       * Options for the fab\n       * @member FloatingActionButton#options\n       * @prop {Boolean} [direction] - Direction fab menu opens\n       * @prop {Boolean} [hoverEnabled=true] - Enable hover vs click\n       * @prop {Boolean} [toolbarEnabled=false] - Enable toolbar transition\n       */\n      _this48.options = $.extend({}, FloatingActionButton.defaults, options);\n\n      _this48.isOpen = false;\n      _this48.$anchor = _this48.$el.children('a').first();\n      _this48.$menu = _this48.$el.children('ul').first();\n      _this48.$floatingBtns = _this48.$el.find('ul .btn-floating');\n      _this48.$floatingBtnsReverse = _this48.$el.find('ul .btn-floating').reverse();\n      _this48.offsetY = 0;\n      _this48.offsetX = 0;\n\n      _this48.$el.addClass(\"direction-\" + _this48.options.direction);\n      if (_this48.options.direction === 'top') {\n        _this48.offsetY = 40;\n      } else if (_this48.options.direction === 'right') {\n        _this48.offsetX = -40;\n      } else if (_this48.options.direction === 'bottom') {\n        _this48.offsetY = -40;\n      } else {\n        _this48.offsetX = 40;\n      }\n      _this48._setupEventHandlers();\n      return _this48;\n    }\n\n    _createClass(FloatingActionButton, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this._removeEventHandlers();\n        this.el.M_FloatingActionButton = undefined;\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        this._handleFABClickBound = this._handleFABClick.bind(this);\n        this._handleOpenBound = this.open.bind(this);\n        this._handleCloseBound = this.close.bind(this);\n\n        if (this.options.hoverEnabled && !this.options.toolbarEnabled) {\n          this.el.addEventListener('mouseenter', this._handleOpenBound);\n          this.el.addEventListener('mouseleave', this._handleCloseBound);\n        } else {\n          this.el.addEventListener('click', this._handleFABClickBound);\n        }\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        if (this.options.hoverEnabled && !this.options.toolbarEnabled) {\n          this.el.removeEventListener('mouseenter', this._handleOpenBound);\n          this.el.removeEventListener('mouseleave', this._handleCloseBound);\n        } else {\n          this.el.removeEventListener('click', this._handleFABClickBound);\n        }\n      }\n\n      /**\n       * Handle FAB Click\n       */\n\n    }, {\n      key: \"_handleFABClick\",\n      value: function _handleFABClick() {\n        if (this.isOpen) {\n          this.close();\n        } else {\n          this.open();\n        }\n      }\n\n      /**\n       * Handle Document Click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleDocumentClick\",\n      value: function _handleDocumentClick(e) {\n        if (!$(e.target).closest(this.$menu).length) {\n          this.close();\n        }\n      }\n\n      /**\n       * Open FAB\n       */\n\n    }, {\n      key: \"open\",\n      value: function open() {\n        if (this.isOpen) {\n          return;\n        }\n\n        if (this.options.toolbarEnabled) {\n          this._animateInToolbar();\n        } else {\n          this._animateInFAB();\n        }\n        this.isOpen = true;\n      }\n\n      /**\n       * Close FAB\n       */\n\n    }, {\n      key: \"close\",\n      value: function close() {\n        if (!this.isOpen) {\n          return;\n        }\n\n        if (this.options.toolbarEnabled) {\n          window.removeEventListener('scroll', this._handleCloseBound, true);\n          document.body.removeEventListener('click', this._handleDocumentClickBound, true);\n          this._animateOutToolbar();\n        } else {\n          this._animateOutFAB();\n        }\n        this.isOpen = false;\n      }\n\n      /**\n       * Classic FAB Menu open\n       */\n\n    }, {\n      key: \"_animateInFAB\",\n      value: function _animateInFAB() {\n        var _this49 = this;\n\n        this.$el.addClass('active');\n\n        var time = 0;\n        this.$floatingBtnsReverse.each(function (el) {\n          anim({\n            targets: el,\n            opacity: 1,\n            scale: [0.4, 1],\n            translateY: [_this49.offsetY, 0],\n            translateX: [_this49.offsetX, 0],\n            duration: 275,\n            delay: time,\n            easing: 'easeInOutQuad'\n          });\n          time += 40;\n        });\n      }\n\n      /**\n       * Classic FAB Menu close\n       */\n\n    }, {\n      key: \"_animateOutFAB\",\n      value: function _animateOutFAB() {\n        var _this50 = this;\n\n        this.$floatingBtnsReverse.each(function (el) {\n          anim.remove(el);\n          anim({\n            targets: el,\n            opacity: 0,\n            scale: 0.4,\n            translateY: _this50.offsetY,\n            translateX: _this50.offsetX,\n            duration: 175,\n            easing: 'easeOutQuad',\n            complete: function () {\n              _this50.$el.removeClass('active');\n            }\n          });\n        });\n      }\n\n      /**\n       * Toolbar transition Menu open\n       */\n\n    }, {\n      key: \"_animateInToolbar\",\n      value: function _animateInToolbar() {\n        var _this51 = this;\n\n        var scaleFactor = void 0;\n        var windowWidth = window.innerWidth;\n        var windowHeight = window.innerHeight;\n        var btnRect = this.el.getBoundingClientRect();\n        var backdrop = $('<div class=\"fab-backdrop\"></div>');\n        var fabColor = this.$anchor.css('background-color');\n        this.$anchor.append(backdrop);\n\n        this.offsetX = btnRect.left - windowWidth / 2 + btnRect.width / 2;\n        this.offsetY = windowHeight - btnRect.bottom;\n        scaleFactor = windowWidth / backdrop[0].clientWidth;\n        this.btnBottom = btnRect.bottom;\n        this.btnLeft = btnRect.left;\n        this.btnWidth = btnRect.width;\n\n        // Set initial state\n        this.$el.addClass('active');\n        this.$el.css({\n          'text-align': 'center',\n          width: '100%',\n          bottom: 0,\n          left: 0,\n          transform: 'translateX(' + this.offsetX + 'px)',\n          transition: 'none'\n        });\n        this.$anchor.css({\n          transform: 'translateY(' + -this.offsetY + 'px)',\n          transition: 'none'\n        });\n        backdrop.css({\n          'background-color': fabColor\n        });\n\n        setTimeout(function () {\n          _this51.$el.css({\n            transform: '',\n            transition: 'transform .2s cubic-bezier(0.550, 0.085, 0.680, 0.530), background-color 0s linear .2s'\n          });\n          _this51.$anchor.css({\n            overflow: 'visible',\n            transform: '',\n            transition: 'transform .2s'\n          });\n\n          setTimeout(function () {\n            _this51.$el.css({\n              overflow: 'hidden',\n              'background-color': fabColor\n            });\n            backdrop.css({\n              transform: 'scale(' + scaleFactor + ')',\n              transition: 'transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)'\n            });\n            _this51.$menu.children('li').children('a').css({\n              opacity: 1\n            });\n\n            // Scroll to close.\n            _this51._handleDocumentClickBound = _this51._handleDocumentClick.bind(_this51);\n            window.addEventListener('scroll', _this51._handleCloseBound, true);\n            document.body.addEventListener('click', _this51._handleDocumentClickBound, true);\n          }, 100);\n        }, 0);\n      }\n\n      /**\n       * Toolbar transition Menu close\n       */\n\n    }, {\n      key: \"_animateOutToolbar\",\n      value: function _animateOutToolbar() {\n        var _this52 = this;\n\n        var windowWidth = window.innerWidth;\n        var windowHeight = window.innerHeight;\n        var backdrop = this.$el.find('.fab-backdrop');\n        var fabColor = this.$anchor.css('background-color');\n\n        this.offsetX = this.btnLeft - windowWidth / 2 + this.btnWidth / 2;\n        this.offsetY = windowHeight - this.btnBottom;\n\n        // Hide backdrop\n        this.$el.removeClass('active');\n        this.$el.css({\n          'background-color': 'transparent',\n          transition: 'none'\n        });\n        this.$anchor.css({\n          transition: 'none'\n        });\n        backdrop.css({\n          transform: 'scale(0)',\n          'background-color': fabColor\n        });\n        this.$menu.children('li').children('a').css({\n          opacity: ''\n        });\n\n        setTimeout(function () {\n          backdrop.remove();\n\n          // Set initial state.\n          _this52.$el.css({\n            'text-align': '',\n            width: '',\n            bottom: '',\n            left: '',\n            overflow: '',\n            'background-color': '',\n            transform: 'translate3d(' + -_this52.offsetX + 'px,0,0)'\n          });\n          _this52.$anchor.css({\n            overflow: '',\n            transform: 'translate3d(0,' + _this52.offsetY + 'px,0)'\n          });\n\n          setTimeout(function () {\n            _this52.$el.css({\n              transform: 'translate3d(0,0,0)',\n              transition: 'transform .2s'\n            });\n            _this52.$anchor.css({\n              transform: 'translate3d(0,0,0)',\n              transition: 'transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)'\n            });\n          }, 20);\n        }, 200);\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(FloatingActionButton.__proto__ || Object.getPrototypeOf(FloatingActionButton), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_FloatingActionButton;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return FloatingActionButton;\n  }(Component);\n\n  M.FloatingActionButton = FloatingActionButton;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(FloatingActionButton, 'floatingActionButton', 'M_FloatingActionButton');\n  }\n})(cash, M.anime);\n;(function ($) {\n  'use strict';\n\n  var _defaults = {\n    // Close when date is selected\n    autoClose: false,\n\n    // the default output format for the input field value\n    format: 'mmm dd, yyyy',\n\n    // Used to create date object from current input string\n    parse: null,\n\n    // The initial date to view when first opened\n    defaultDate: null,\n\n    // Make the `defaultDate` the initial selected value\n    setDefaultDate: false,\n\n    disableWeekends: false,\n\n    disableDayFn: null,\n\n    // First day of week (0: Sunday, 1: Monday etc)\n    firstDay: 0,\n\n    // The earliest date that can be selected\n    minDate: null,\n    // Thelatest date that can be selected\n    maxDate: null,\n\n    // Number of years either side, or array of upper/lower range\n    yearRange: 10,\n\n    // used internally (don't config outside)\n    minYear: 0,\n    maxYear: 9999,\n    minMonth: undefined,\n    maxMonth: undefined,\n\n    startRange: null,\n    endRange: null,\n\n    isRTL: false,\n\n    // Render the month after year in the calendar title\n    showMonthAfterYear: false,\n\n    // Render days of the calendar grid that fall in the next or previous month\n    showDaysInNextAndPreviousMonths: false,\n\n    // Specify a DOM element to render the calendar in\n    container: null,\n\n    // Show clear button\n    showClearBtn: false,\n\n    // internationalization\n    i18n: {\n      cancel: 'Cancel',\n      clear: 'Clear',\n      done: 'Ok',\n      previousMonth: '‹',\n      nextMonth: '›',\n      months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n      monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n      weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n      weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n      weekdaysAbbrev: ['S', 'M', 'T', 'W', 'T', 'F', 'S']\n    },\n\n    // events array\n    events: [],\n\n    // callback function\n    onSelect: null,\n    onOpen: null,\n    onClose: null,\n    onDraw: null\n  };\n\n  /**\n   * @class\n   *\n   */\n\n  var Datepicker = function (_Component15) {\n    _inherits(Datepicker, _Component15);\n\n    /**\n     * Construct Datepicker instance and set up overlay\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function Datepicker(el, options) {\n      _classCallCheck(this, Datepicker);\n\n      var _this53 = _possibleConstructorReturn(this, (Datepicker.__proto__ || Object.getPrototypeOf(Datepicker)).call(this, Datepicker, el, options));\n\n      _this53.el.M_Datepicker = _this53;\n\n      _this53.options = $.extend({}, Datepicker.defaults, options);\n\n      // make sure i18n defaults are not lost when only few i18n option properties are passed\n      if (!!options && options.hasOwnProperty('i18n') && typeof options.i18n === 'object') {\n        _this53.options.i18n = $.extend({}, Datepicker.defaults.i18n, options.i18n);\n      }\n\n      // Remove time component from minDate and maxDate options\n      if (_this53.options.minDate) _this53.options.minDate.setHours(0, 0, 0, 0);\n      if (_this53.options.maxDate) _this53.options.maxDate.setHours(0, 0, 0, 0);\n\n      _this53.id = M.guid();\n\n      _this53._setupVariables();\n      _this53._insertHTMLIntoDOM();\n      _this53._setupModal();\n\n      _this53._setupEventHandlers();\n\n      if (!_this53.options.defaultDate) {\n        _this53.options.defaultDate = new Date(Date.parse(_this53.el.value));\n      }\n\n      var defDate = _this53.options.defaultDate;\n      if (Datepicker._isDate(defDate)) {\n        if (_this53.options.setDefaultDate) {\n          _this53.setDate(defDate, true);\n          _this53.setInputValue();\n        } else {\n          _this53.gotoDate(defDate);\n        }\n      } else {\n        _this53.gotoDate(new Date());\n      }\n\n      /**\n       * Describes open/close state of datepicker\n       * @type {Boolean}\n       */\n      _this53.isOpen = false;\n      return _this53;\n    }\n\n    _createClass(Datepicker, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this._removeEventHandlers();\n        this.modal.destroy();\n        $(this.modalEl).remove();\n        this.destroySelects();\n        this.el.M_Datepicker = undefined;\n      }\n    }, {\n      key: \"destroySelects\",\n      value: function destroySelects() {\n        var oldYearSelect = this.calendarEl.querySelector('.orig-select-year');\n        if (oldYearSelect) {\n          M.FormSelect.getInstance(oldYearSelect).destroy();\n        }\n        var oldMonthSelect = this.calendarEl.querySelector('.orig-select-month');\n        if (oldMonthSelect) {\n          M.FormSelect.getInstance(oldMonthSelect).destroy();\n        }\n      }\n    }, {\n      key: \"_insertHTMLIntoDOM\",\n      value: function _insertHTMLIntoDOM() {\n        if (this.options.showClearBtn) {\n          $(this.clearBtn).css({ visibility: '' });\n          this.clearBtn.innerHTML = this.options.i18n.clear;\n        }\n\n        this.doneBtn.innerHTML = this.options.i18n.done;\n        this.cancelBtn.innerHTML = this.options.i18n.cancel;\n\n        if (this.options.container) {\n          this.$modalEl.appendTo(this.options.container);\n        } else {\n          this.$modalEl.insertBefore(this.el);\n        }\n      }\n    }, {\n      key: \"_setupModal\",\n      value: function _setupModal() {\n        var _this54 = this;\n\n        this.modalEl.id = 'modal-' + this.id;\n        this.modal = M.Modal.init(this.modalEl, {\n          onCloseEnd: function () {\n            _this54.isOpen = false;\n          }\n        });\n      }\n    }, {\n      key: \"toString\",\n      value: function toString(format) {\n        var _this55 = this;\n\n        format = format || this.options.format;\n        if (!Datepicker._isDate(this.date)) {\n          return '';\n        }\n\n        var formatArray = format.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g);\n        var formattedDate = formatArray.map(function (label) {\n          if (_this55.formats[label]) {\n            return _this55.formats[label]();\n          }\n\n          return label;\n        }).join('');\n        return formattedDate;\n      }\n    }, {\n      key: \"setDate\",\n      value: function setDate(date, preventOnSelect) {\n        if (!date) {\n          this.date = null;\n          this._renderDateDisplay();\n          return this.draw();\n        }\n        if (typeof date === 'string') {\n          date = new Date(Date.parse(date));\n        }\n        if (!Datepicker._isDate(date)) {\n          return;\n        }\n\n        var min = this.options.minDate,\n            max = this.options.maxDate;\n\n        if (Datepicker._isDate(min) && date < min) {\n          date = min;\n        } else if (Datepicker._isDate(max) && date > max) {\n          date = max;\n        }\n\n        this.date = new Date(date.getTime());\n\n        this._renderDateDisplay();\n\n        Datepicker._setToStartOfDay(this.date);\n        this.gotoDate(this.date);\n\n        if (!preventOnSelect && typeof this.options.onSelect === 'function') {\n          this.options.onSelect.call(this, this.date);\n        }\n      }\n    }, {\n      key: \"setInputValue\",\n      value: function setInputValue() {\n        this.el.value = this.toString();\n        this.$el.trigger('change', { firedBy: this });\n      }\n    }, {\n      key: \"_renderDateDisplay\",\n      value: function _renderDateDisplay() {\n        var displayDate = Datepicker._isDate(this.date) ? this.date : new Date();\n        var i18n = this.options.i18n;\n        var day = i18n.weekdaysShort[displayDate.getDay()];\n        var month = i18n.monthsShort[displayDate.getMonth()];\n        var date = displayDate.getDate();\n        this.yearTextEl.innerHTML = displayDate.getFullYear();\n        this.dateTextEl.innerHTML = day + \", \" + month + \" \" + date;\n      }\n\n      /**\n       * change view to a specific date\n       */\n\n    }, {\n      key: \"gotoDate\",\n      value: function gotoDate(date) {\n        var newCalendar = true;\n\n        if (!Datepicker._isDate(date)) {\n          return;\n        }\n\n        if (this.calendars) {\n          var firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),\n              lastVisibleDate = new Date(this.calendars[this.calendars.length - 1].year, this.calendars[this.calendars.length - 1].month, 1),\n              visibleDate = date.getTime();\n          // get the end of the month\n          lastVisibleDate.setMonth(lastVisibleDate.getMonth() + 1);\n          lastVisibleDate.setDate(lastVisibleDate.getDate() - 1);\n          newCalendar = visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate;\n        }\n\n        if (newCalendar) {\n          this.calendars = [{\n            month: date.getMonth(),\n            year: date.getFullYear()\n          }];\n        }\n\n        this.adjustCalendars();\n      }\n    }, {\n      key: \"adjustCalendars\",\n      value: function adjustCalendars() {\n        this.calendars[0] = this.adjustCalendar(this.calendars[0]);\n        this.draw();\n      }\n    }, {\n      key: \"adjustCalendar\",\n      value: function adjustCalendar(calendar) {\n        if (calendar.month < 0) {\n          calendar.year -= Math.ceil(Math.abs(calendar.month) / 12);\n          calendar.month += 12;\n        }\n        if (calendar.month > 11) {\n          calendar.year += Math.floor(Math.abs(calendar.month) / 12);\n          calendar.month -= 12;\n        }\n        return calendar;\n      }\n    }, {\n      key: \"nextMonth\",\n      value: function nextMonth() {\n        this.calendars[0].month++;\n        this.adjustCalendars();\n      }\n    }, {\n      key: \"prevMonth\",\n      value: function prevMonth() {\n        this.calendars[0].month--;\n        this.adjustCalendars();\n      }\n    }, {\n      key: \"render\",\n      value: function render(year, month, randId) {\n        var opts = this.options,\n            now = new Date(),\n            days = Datepicker._getDaysInMonth(year, month),\n            before = new Date(year, month, 1).getDay(),\n            data = [],\n            row = [];\n        Datepicker._setToStartOfDay(now);\n        if (opts.firstDay > 0) {\n          before -= opts.firstDay;\n          if (before < 0) {\n            before += 7;\n          }\n        }\n        var previousMonth = month === 0 ? 11 : month - 1,\n            nextMonth = month === 11 ? 0 : month + 1,\n            yearOfPreviousMonth = month === 0 ? year - 1 : year,\n            yearOfNextMonth = month === 11 ? year + 1 : year,\n            daysInPreviousMonth = Datepicker._getDaysInMonth(yearOfPreviousMonth, previousMonth);\n        var cells = days + before,\n            after = cells;\n        while (after > 7) {\n          after -= 7;\n        }\n        cells += 7 - after;\n        var isWeekSelected = false;\n        for (var i = 0, r = 0; i < cells; i++) {\n          var day = new Date(year, month, 1 + (i - before)),\n              isSelected = Datepicker._isDate(this.date) ? Datepicker._compareDates(day, this.date) : false,\n              isToday = Datepicker._compareDates(day, now),\n              hasEvent = opts.events.indexOf(day.toDateString()) !== -1 ? true : false,\n              isEmpty = i < before || i >= days + before,\n              dayNumber = 1 + (i - before),\n              monthNumber = month,\n              yearNumber = year,\n              isStartRange = opts.startRange && Datepicker._compareDates(opts.startRange, day),\n              isEndRange = opts.endRange && Datepicker._compareDates(opts.endRange, day),\n              isInRange = opts.startRange && opts.endRange && opts.startRange < day && day < opts.endRange,\n              isDisabled = opts.minDate && day < opts.minDate || opts.maxDate && day > opts.maxDate || opts.disableWeekends && Datepicker._isWeekend(day) || opts.disableDayFn && opts.disableDayFn(day);\n\n          if (isEmpty) {\n            if (i < before) {\n              dayNumber = daysInPreviousMonth + dayNumber;\n              monthNumber = previousMonth;\n              yearNumber = yearOfPreviousMonth;\n            } else {\n              dayNumber = dayNumber - days;\n              monthNumber = nextMonth;\n              yearNumber = yearOfNextMonth;\n            }\n          }\n\n          var dayConfig = {\n            day: dayNumber,\n            month: monthNumber,\n            year: yearNumber,\n            hasEvent: hasEvent,\n            isSelected: isSelected,\n            isToday: isToday,\n            isDisabled: isDisabled,\n            isEmpty: isEmpty,\n            isStartRange: isStartRange,\n            isEndRange: isEndRange,\n            isInRange: isInRange,\n            showDaysInNextAndPreviousMonths: opts.showDaysInNextAndPreviousMonths\n          };\n\n          row.push(this.renderDay(dayConfig));\n\n          if (++r === 7) {\n            data.push(this.renderRow(row, opts.isRTL, isWeekSelected));\n            row = [];\n            r = 0;\n            isWeekSelected = false;\n          }\n        }\n        return this.renderTable(opts, data, randId);\n      }\n    }, {\n      key: \"renderDay\",\n      value: function renderDay(opts) {\n        var arr = [];\n        var ariaSelected = 'false';\n        if (opts.isEmpty) {\n          if (opts.showDaysInNextAndPreviousMonths) {\n            arr.push('is-outside-current-month');\n            arr.push('is-selection-disabled');\n          } else {\n            return '<td class=\"is-empty\"></td>';\n          }\n        }\n        if (opts.isDisabled) {\n          arr.push('is-disabled');\n        }\n\n        if (opts.isToday) {\n          arr.push('is-today');\n        }\n        if (opts.isSelected) {\n          arr.push('is-selected');\n          ariaSelected = 'true';\n        }\n        if (opts.hasEvent) {\n          arr.push('has-event');\n        }\n        if (opts.isInRange) {\n          arr.push('is-inrange');\n        }\n        if (opts.isStartRange) {\n          arr.push('is-startrange');\n        }\n        if (opts.isEndRange) {\n          arr.push('is-endrange');\n        }\n        return \"<td data-day=\\\"\" + opts.day + \"\\\" class=\\\"\" + arr.join(' ') + \"\\\" aria-selected=\\\"\" + ariaSelected + \"\\\">\" + (\"<button class=\\\"datepicker-day-button\\\" type=\\\"button\\\" data-year=\\\"\" + opts.year + \"\\\" data-month=\\\"\" + opts.month + \"\\\" data-day=\\\"\" + opts.day + \"\\\">\" + opts.day + \"</button>\") + '</td>';\n      }\n    }, {\n      key: \"renderRow\",\n      value: function renderRow(days, isRTL, isRowSelected) {\n        return '<tr class=\"datepicker-row' + (isRowSelected ? ' is-selected' : '') + '\">' + (isRTL ? days.reverse() : days).join('') + '</tr>';\n      }\n    }, {\n      key: \"renderTable\",\n      value: function renderTable(opts, data, randId) {\n        return '<div class=\"datepicker-table-wrapper\"><table cellpadding=\"0\" cellspacing=\"0\" class=\"datepicker-table\" role=\"grid\" aria-labelledby=\"' + randId + '\">' + this.renderHead(opts) + this.renderBody(data) + '</table></div>';\n      }\n    }, {\n      key: \"renderHead\",\n      value: function renderHead(opts) {\n        var i = void 0,\n            arr = [];\n        for (i = 0; i < 7; i++) {\n          arr.push(\"<th scope=\\\"col\\\"><abbr title=\\\"\" + this.renderDayName(opts, i) + \"\\\">\" + this.renderDayName(opts, i, true) + \"</abbr></th>\");\n        }\n        return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';\n      }\n    }, {\n      key: \"renderBody\",\n      value: function renderBody(rows) {\n        return '<tbody>' + rows.join('') + '</tbody>';\n      }\n    }, {\n      key: \"renderTitle\",\n      value: function renderTitle(instance, c, year, month, refYear, randId) {\n        var i = void 0,\n            j = void 0,\n            arr = void 0,\n            opts = this.options,\n            isMinYear = year === opts.minYear,\n            isMaxYear = year === opts.maxYear,\n            html = '<div id=\"' + randId + '\" class=\"datepicker-controls\" role=\"heading\" aria-live=\"assertive\">',\n            monthHtml = void 0,\n            yearHtml = void 0,\n            prev = true,\n            next = true;\n\n        for (arr = [], i = 0; i < 12; i++) {\n          arr.push('<option value=\"' + (year === refYear ? i - c : 12 + i - c) + '\"' + (i === month ? ' selected=\"selected\"' : '') + (isMinYear && i < opts.minMonth || isMaxYear && i > opts.maxMonth ? 'disabled=\"disabled\"' : '') + '>' + opts.i18n.months[i] + '</option>');\n        }\n\n        monthHtml = '<select class=\"datepicker-select orig-select-month\" tabindex=\"-1\">' + arr.join('') + '</select>';\n\n        if ($.isArray(opts.yearRange)) {\n          i = opts.yearRange[0];\n          j = opts.yearRange[1] + 1;\n        } else {\n          i = year - opts.yearRange;\n          j = 1 + year + opts.yearRange;\n        }\n\n        for (arr = []; i < j && i <= opts.maxYear; i++) {\n          if (i >= opts.minYear) {\n            arr.push(\"<option value=\\\"\" + i + \"\\\" \" + (i === year ? 'selected=\"selected\"' : '') + \">\" + i + \"</option>\");\n          }\n        }\n\n        yearHtml = \"<select class=\\\"datepicker-select orig-select-year\\\" tabindex=\\\"-1\\\">\" + arr.join('') + \"</select>\";\n\n        var leftArrow = '<svg fill=\"#000000\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z\"/><path d=\"M0-.5h24v24H0z\" fill=\"none\"/></svg>';\n        html += \"<button class=\\\"month-prev\" + (prev ? '' : ' is-disabled') + \"\\\" type=\\\"button\\\">\" + leftArrow + \"</button>\";\n\n        html += '<div class=\"selects-container\">';\n        if (opts.showMonthAfterYear) {\n          html += yearHtml + monthHtml;\n        } else {\n          html += monthHtml + yearHtml;\n        }\n        html += '</div>';\n\n        if (isMinYear && (month === 0 || opts.minMonth >= month)) {\n          prev = false;\n        }\n\n        if (isMaxYear && (month === 11 || opts.maxMonth <= month)) {\n          next = false;\n        }\n\n        var rightArrow = '<svg fill=\"#000000\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z\"/><path d=\"M0-.25h24v24H0z\" fill=\"none\"/></svg>';\n        html += \"<button class=\\\"month-next\" + (next ? '' : ' is-disabled') + \"\\\" type=\\\"button\\\">\" + rightArrow + \"</button>\";\n\n        return html += '</div>';\n      }\n\n      /**\n       * refresh the HTML\n       */\n\n    }, {\n      key: \"draw\",\n      value: function draw(force) {\n        if (!this.isOpen && !force) {\n          return;\n        }\n        var opts = this.options,\n            minYear = opts.minYear,\n            maxYear = opts.maxYear,\n            minMonth = opts.minMonth,\n            maxMonth = opts.maxMonth,\n            html = '',\n            randId = void 0;\n\n        if (this._y <= minYear) {\n          this._y = minYear;\n          if (!isNaN(minMonth) && this._m < minMonth) {\n            this._m = minMonth;\n          }\n        }\n        if (this._y >= maxYear) {\n          this._y = maxYear;\n          if (!isNaN(maxMonth) && this._m > maxMonth) {\n            this._m = maxMonth;\n          }\n        }\n\n        randId = 'datepicker-title-' + Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 2);\n\n        for (var c = 0; c < 1; c++) {\n          this._renderDateDisplay();\n          html += this.renderTitle(this, c, this.calendars[c].year, this.calendars[c].month, this.calendars[0].year, randId) + this.render(this.calendars[c].year, this.calendars[c].month, randId);\n        }\n\n        this.destroySelects();\n\n        this.calendarEl.innerHTML = html;\n\n        // Init Materialize Select\n        var yearSelect = this.calendarEl.querySelector('.orig-select-year');\n        var monthSelect = this.calendarEl.querySelector('.orig-select-month');\n        M.FormSelect.init(yearSelect, {\n          classes: 'select-year',\n          dropdownOptions: { container: document.body, constrainWidth: false }\n        });\n        M.FormSelect.init(monthSelect, {\n          classes: 'select-month',\n          dropdownOptions: { container: document.body, constrainWidth: false }\n        });\n\n        // Add change handlers for select\n        yearSelect.addEventListener('change', this._handleYearChange.bind(this));\n        monthSelect.addEventListener('change', this._handleMonthChange.bind(this));\n\n        if (typeof this.options.onDraw === 'function') {\n          this.options.onDraw(this);\n        }\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        this._handleInputKeydownBound = this._handleInputKeydown.bind(this);\n        this._handleInputClickBound = this._handleInputClick.bind(this);\n        this._handleInputChangeBound = this._handleInputChange.bind(this);\n        this._handleCalendarClickBound = this._handleCalendarClick.bind(this);\n        this._finishSelectionBound = this._finishSelection.bind(this);\n        this._handleMonthChange = this._handleMonthChange.bind(this);\n        this._closeBound = this.close.bind(this);\n\n        this.el.addEventListener('click', this._handleInputClickBound);\n        this.el.addEventListener('keydown', this._handleInputKeydownBound);\n        this.el.addEventListener('change', this._handleInputChangeBound);\n        this.calendarEl.addEventListener('click', this._handleCalendarClickBound);\n        this.doneBtn.addEventListener('click', this._finishSelectionBound);\n        this.cancelBtn.addEventListener('click', this._closeBound);\n\n        if (this.options.showClearBtn) {\n          this._handleClearClickBound = this._handleClearClick.bind(this);\n          this.clearBtn.addEventListener('click', this._handleClearClickBound);\n        }\n      }\n    }, {\n      key: \"_setupVariables\",\n      value: function _setupVariables() {\n        var _this56 = this;\n\n        this.$modalEl = $(Datepicker._template);\n        this.modalEl = this.$modalEl[0];\n\n        this.calendarEl = this.modalEl.querySelector('.datepicker-calendar');\n\n        this.yearTextEl = this.modalEl.querySelector('.year-text');\n        this.dateTextEl = this.modalEl.querySelector('.date-text');\n        if (this.options.showClearBtn) {\n          this.clearBtn = this.modalEl.querySelector('.datepicker-clear');\n        }\n        this.doneBtn = this.modalEl.querySelector('.datepicker-done');\n        this.cancelBtn = this.modalEl.querySelector('.datepicker-cancel');\n\n        this.formats = {\n          d: function () {\n            return _this56.date.getDate();\n          },\n          dd: function () {\n            var d = _this56.date.getDate();\n            return (d < 10 ? '0' : '') + d;\n          },\n          ddd: function () {\n            return _this56.options.i18n.weekdaysShort[_this56.date.getDay()];\n          },\n          dddd: function () {\n            return _this56.options.i18n.weekdays[_this56.date.getDay()];\n          },\n          m: function () {\n            return _this56.date.getMonth() + 1;\n          },\n          mm: function () {\n            var m = _this56.date.getMonth() + 1;\n            return (m < 10 ? '0' : '') + m;\n          },\n          mmm: function () {\n            return _this56.options.i18n.monthsShort[_this56.date.getMonth()];\n          },\n          mmmm: function () {\n            return _this56.options.i18n.months[_this56.date.getMonth()];\n          },\n          yy: function () {\n            return ('' + _this56.date.getFullYear()).slice(2);\n          },\n          yyyy: function () {\n            return _this56.date.getFullYear();\n          }\n        };\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        this.el.removeEventListener('click', this._handleInputClickBound);\n        this.el.removeEventListener('keydown', this._handleInputKeydownBound);\n        this.el.removeEventListener('change', this._handleInputChangeBound);\n        this.calendarEl.removeEventListener('click', this._handleCalendarClickBound);\n      }\n    }, {\n      key: \"_handleInputClick\",\n      value: function _handleInputClick() {\n        this.open();\n      }\n    }, {\n      key: \"_handleInputKeydown\",\n      value: function _handleInputKeydown(e) {\n        if (e.which === M.keys.ENTER) {\n          e.preventDefault();\n          this.open();\n        }\n      }\n    }, {\n      key: \"_handleCalendarClick\",\n      value: function _handleCalendarClick(e) {\n        if (!this.isOpen) {\n          return;\n        }\n\n        var $target = $(e.target);\n        if (!$target.hasClass('is-disabled')) {\n          if ($target.hasClass('datepicker-day-button') && !$target.hasClass('is-empty') && !$target.parent().hasClass('is-disabled')) {\n            this.setDate(new Date(e.target.getAttribute('data-year'), e.target.getAttribute('data-month'), e.target.getAttribute('data-day')));\n            if (this.options.autoClose) {\n              this._finishSelection();\n            }\n          } else if ($target.closest('.month-prev').length) {\n            this.prevMonth();\n          } else if ($target.closest('.month-next').length) {\n            this.nextMonth();\n          }\n        }\n      }\n    }, {\n      key: \"_handleClearClick\",\n      value: function _handleClearClick() {\n        this.date = null;\n        this.setInputValue();\n        this.close();\n      }\n    }, {\n      key: \"_handleMonthChange\",\n      value: function _handleMonthChange(e) {\n        this.gotoMonth(e.target.value);\n      }\n    }, {\n      key: \"_handleYearChange\",\n      value: function _handleYearChange(e) {\n        this.gotoYear(e.target.value);\n      }\n\n      /**\n       * change view to a specific month (zero-index, e.g. 0: January)\n       */\n\n    }, {\n      key: \"gotoMonth\",\n      value: function gotoMonth(month) {\n        if (!isNaN(month)) {\n          this.calendars[0].month = parseInt(month, 10);\n          this.adjustCalendars();\n        }\n      }\n\n      /**\n       * change view to a specific full year (e.g. \"2012\")\n       */\n\n    }, {\n      key: \"gotoYear\",\n      value: function gotoYear(year) {\n        if (!isNaN(year)) {\n          this.calendars[0].year = parseInt(year, 10);\n          this.adjustCalendars();\n        }\n      }\n    }, {\n      key: \"_handleInputChange\",\n      value: function _handleInputChange(e) {\n        var date = void 0;\n\n        // Prevent change event from being fired when triggered by the plugin\n        if (e.firedBy === this) {\n          return;\n        }\n        if (this.options.parse) {\n          date = this.options.parse(this.el.value, this.options.format);\n        } else {\n          date = new Date(Date.parse(this.el.value));\n        }\n\n        if (Datepicker._isDate(date)) {\n          this.setDate(date);\n        }\n      }\n    }, {\n      key: \"renderDayName\",\n      value: function renderDayName(opts, day, abbr) {\n        day += opts.firstDay;\n        while (day >= 7) {\n          day -= 7;\n        }\n        return abbr ? opts.i18n.weekdaysAbbrev[day] : opts.i18n.weekdays[day];\n      }\n\n      /**\n       * Set input value to the selected date and close Datepicker\n       */\n\n    }, {\n      key: \"_finishSelection\",\n      value: function _finishSelection() {\n        this.setInputValue();\n        this.close();\n      }\n\n      /**\n       * Open Datepicker\n       */\n\n    }, {\n      key: \"open\",\n      value: function open() {\n        if (this.isOpen) {\n          return;\n        }\n\n        this.isOpen = true;\n        if (typeof this.options.onOpen === 'function') {\n          this.options.onOpen.call(this);\n        }\n        this.draw();\n        this.modal.open();\n        return this;\n      }\n\n      /**\n       * Close Datepicker\n       */\n\n    }, {\n      key: \"close\",\n      value: function close() {\n        if (!this.isOpen) {\n          return;\n        }\n\n        this.isOpen = false;\n        if (typeof this.options.onClose === 'function') {\n          this.options.onClose.call(this);\n        }\n        this.modal.close();\n        return this;\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Datepicker.__proto__ || Object.getPrototypeOf(Datepicker), \"init\", this).call(this, this, els, options);\n      }\n    }, {\n      key: \"_isDate\",\n      value: function _isDate(obj) {\n        return (/Date/.test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime())\n        );\n      }\n    }, {\n      key: \"_isWeekend\",\n      value: function _isWeekend(date) {\n        var day = date.getDay();\n        return day === 0 || day === 6;\n      }\n    }, {\n      key: \"_setToStartOfDay\",\n      value: function _setToStartOfDay(date) {\n        if (Datepicker._isDate(date)) date.setHours(0, 0, 0, 0);\n      }\n    }, {\n      key: \"_getDaysInMonth\",\n      value: function _getDaysInMonth(year, month) {\n        return [31, Datepicker._isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n      }\n    }, {\n      key: \"_isLeapYear\",\n      value: function _isLeapYear(year) {\n        // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951\n        return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;\n      }\n    }, {\n      key: \"_compareDates\",\n      value: function _compareDates(a, b) {\n        // weak date comparison (use setToStartOfDay(date) to ensure correct result)\n        return a.getTime() === b.getTime();\n      }\n    }, {\n      key: \"_setToStartOfDay\",\n      value: function _setToStartOfDay(date) {\n        if (Datepicker._isDate(date)) date.setHours(0, 0, 0, 0);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Datepicker;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Datepicker;\n  }(Component);\n\n  Datepicker._template = ['<div class= \"modal datepicker-modal\">', '<div class=\"modal-content datepicker-container\">', '<div class=\"datepicker-date-display\">', '<span class=\"year-text\"></span>', '<span class=\"date-text\"></span>', '</div>', '<div class=\"datepicker-calendar-container\">', '<div class=\"datepicker-calendar\"></div>', '<div class=\"datepicker-footer\">', '<button class=\"btn-flat datepicker-clear waves-effect\" style=\"visibility: hidden;\" type=\"button\"></button>', '<div class=\"confirmation-btns\">', '<button class=\"btn-flat datepicker-cancel waves-effect\" type=\"button\"></button>', '<button class=\"btn-flat datepicker-done waves-effect\" type=\"button\"></button>', '</div>', '</div>', '</div>', '</div>', '</div>'].join('');\n\n  M.Datepicker = Datepicker;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Datepicker, 'datepicker', 'M_Datepicker');\n  }\n})(cash);\n;(function ($) {\n  'use strict';\n\n  var _defaults = {\n    dialRadius: 135,\n    outerRadius: 105,\n    innerRadius: 70,\n    tickRadius: 20,\n    duration: 350,\n    container: null,\n    defaultTime: 'now', // default time, 'now' or '13:14' e.g.\n    fromNow: 0, // Millisecond offset from the defaultTime\n    showClearBtn: false,\n\n    // internationalization\n    i18n: {\n      cancel: 'Cancel',\n      clear: 'Clear',\n      done: 'Ok'\n    },\n\n    autoClose: false, // auto close when minute is selected\n    twelveHour: true, // change to 12 hour AM/PM clock from 24 hour\n    vibrate: true, // vibrate the device when dragging clock hand\n\n    // Callbacks\n    onOpenStart: null,\n    onOpenEnd: null,\n    onCloseStart: null,\n    onCloseEnd: null,\n    onSelect: null\n  };\n\n  /**\n   * @class\n   *\n   */\n\n  var Timepicker = function (_Component16) {\n    _inherits(Timepicker, _Component16);\n\n    function Timepicker(el, options) {\n      _classCallCheck(this, Timepicker);\n\n      var _this57 = _possibleConstructorReturn(this, (Timepicker.__proto__ || Object.getPrototypeOf(Timepicker)).call(this, Timepicker, el, options));\n\n      _this57.el.M_Timepicker = _this57;\n\n      _this57.options = $.extend({}, Timepicker.defaults, options);\n\n      _this57.id = M.guid();\n      _this57._insertHTMLIntoDOM();\n      _this57._setupModal();\n      _this57._setupVariables();\n      _this57._setupEventHandlers();\n\n      _this57._clockSetup();\n      _this57._pickerSetup();\n      return _this57;\n    }\n\n    _createClass(Timepicker, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this._removeEventHandlers();\n        this.modal.destroy();\n        $(this.modalEl).remove();\n        this.el.M_Timepicker = undefined;\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        this._handleInputKeydownBound = this._handleInputKeydown.bind(this);\n        this._handleInputClickBound = this._handleInputClick.bind(this);\n        this._handleClockClickStartBound = this._handleClockClickStart.bind(this);\n        this._handleDocumentClickMoveBound = this._handleDocumentClickMove.bind(this);\n        this._handleDocumentClickEndBound = this._handleDocumentClickEnd.bind(this);\n\n        this.el.addEventListener('click', this._handleInputClickBound);\n        this.el.addEventListener('keydown', this._handleInputKeydownBound);\n        this.plate.addEventListener('mousedown', this._handleClockClickStartBound);\n        this.plate.addEventListener('touchstart', this._handleClockClickStartBound);\n\n        $(this.spanHours).on('click', this.showView.bind(this, 'hours'));\n        $(this.spanMinutes).on('click', this.showView.bind(this, 'minutes'));\n      }\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        this.el.removeEventListener('click', this._handleInputClickBound);\n        this.el.removeEventListener('keydown', this._handleInputKeydownBound);\n      }\n    }, {\n      key: \"_handleInputClick\",\n      value: function _handleInputClick() {\n        this.open();\n      }\n    }, {\n      key: \"_handleInputKeydown\",\n      value: function _handleInputKeydown(e) {\n        if (e.which === M.keys.ENTER) {\n          e.preventDefault();\n          this.open();\n        }\n      }\n    }, {\n      key: \"_handleClockClickStart\",\n      value: function _handleClockClickStart(e) {\n        e.preventDefault();\n        var clockPlateBR = this.plate.getBoundingClientRect();\n        var offset = { x: clockPlateBR.left, y: clockPlateBR.top };\n\n        this.x0 = offset.x + this.options.dialRadius;\n        this.y0 = offset.y + this.options.dialRadius;\n        this.moved = false;\n        var clickPos = Timepicker._Pos(e);\n        this.dx = clickPos.x - this.x0;\n        this.dy = clickPos.y - this.y0;\n\n        // Set clock hands\n        this.setHand(this.dx, this.dy, false);\n\n        // Mousemove on document\n        document.addEventListener('mousemove', this._handleDocumentClickMoveBound);\n        document.addEventListener('touchmove', this._handleDocumentClickMoveBound);\n\n        // Mouseup on document\n        document.addEventListener('mouseup', this._handleDocumentClickEndBound);\n        document.addEventListener('touchend', this._handleDocumentClickEndBound);\n      }\n    }, {\n      key: \"_handleDocumentClickMove\",\n      value: function _handleDocumentClickMove(e) {\n        e.preventDefault();\n        var clickPos = Timepicker._Pos(e);\n        var x = clickPos.x - this.x0;\n        var y = clickPos.y - this.y0;\n        this.moved = true;\n        this.setHand(x, y, false, true);\n      }\n    }, {\n      key: \"_handleDocumentClickEnd\",\n      value: function _handleDocumentClickEnd(e) {\n        var _this58 = this;\n\n        e.preventDefault();\n        document.removeEventListener('mouseup', this._handleDocumentClickEndBound);\n        document.removeEventListener('touchend', this._handleDocumentClickEndBound);\n        var clickPos = Timepicker._Pos(e);\n        var x = clickPos.x - this.x0;\n        var y = clickPos.y - this.y0;\n        if (this.moved && x === this.dx && y === this.dy) {\n          this.setHand(x, y);\n        }\n\n        if (this.currentView === 'hours') {\n          this.showView('minutes', this.options.duration / 2);\n        } else if (this.options.autoClose) {\n          $(this.minutesView).addClass('timepicker-dial-out');\n          setTimeout(function () {\n            _this58.done();\n          }, this.options.duration / 2);\n        }\n\n        if (typeof this.options.onSelect === 'function') {\n          this.options.onSelect.call(this, this.hours, this.minutes);\n        }\n\n        // Unbind mousemove event\n        document.removeEventListener('mousemove', this._handleDocumentClickMoveBound);\n        document.removeEventListener('touchmove', this._handleDocumentClickMoveBound);\n      }\n    }, {\n      key: \"_insertHTMLIntoDOM\",\n      value: function _insertHTMLIntoDOM() {\n        this.$modalEl = $(Timepicker._template);\n        this.modalEl = this.$modalEl[0];\n        this.modalEl.id = 'modal-' + this.id;\n\n        // Append popover to input by default\n        var containerEl = document.querySelector(this.options.container);\n        if (this.options.container && !!containerEl) {\n          this.$modalEl.appendTo(containerEl);\n        } else {\n          this.$modalEl.insertBefore(this.el);\n        }\n      }\n    }, {\n      key: \"_setupModal\",\n      value: function _setupModal() {\n        var _this59 = this;\n\n        this.modal = M.Modal.init(this.modalEl, {\n          onOpenStart: this.options.onOpenStart,\n          onOpenEnd: this.options.onOpenEnd,\n          onCloseStart: this.options.onCloseStart,\n          onCloseEnd: function () {\n            if (typeof _this59.options.onCloseEnd === 'function') {\n              _this59.options.onCloseEnd.call(_this59);\n            }\n            _this59.isOpen = false;\n          }\n        });\n      }\n    }, {\n      key: \"_setupVariables\",\n      value: function _setupVariables() {\n        this.currentView = 'hours';\n        this.vibrate = navigator.vibrate ? 'vibrate' : navigator.webkitVibrate ? 'webkitVibrate' : null;\n\n        this._canvas = this.modalEl.querySelector('.timepicker-canvas');\n        this.plate = this.modalEl.querySelector('.timepicker-plate');\n\n        this.hoursView = this.modalEl.querySelector('.timepicker-hours');\n        this.minutesView = this.modalEl.querySelector('.timepicker-minutes');\n        this.spanHours = this.modalEl.querySelector('.timepicker-span-hours');\n        this.spanMinutes = this.modalEl.querySelector('.timepicker-span-minutes');\n        this.spanAmPm = this.modalEl.querySelector('.timepicker-span-am-pm');\n        this.footer = this.modalEl.querySelector('.timepicker-footer');\n        this.amOrPm = 'PM';\n      }\n    }, {\n      key: \"_pickerSetup\",\n      value: function _pickerSetup() {\n        var $clearBtn = $(\"<button class=\\\"btn-flat timepicker-clear waves-effect\\\" style=\\\"visibility: hidden;\\\" type=\\\"button\\\" tabindex=\\\"\" + (this.options.twelveHour ? '3' : '1') + \"\\\">\" + this.options.i18n.clear + \"</button>\").appendTo(this.footer).on('click', this.clear.bind(this));\n        if (this.options.showClearBtn) {\n          $clearBtn.css({ visibility: '' });\n        }\n\n        var confirmationBtnsContainer = $('<div class=\"confirmation-btns\"></div>');\n        $('<button class=\"btn-flat timepicker-close waves-effect\" type=\"button\" tabindex=\"' + (this.options.twelveHour ? '3' : '1') + '\">' + this.options.i18n.cancel + '</button>').appendTo(confirmationBtnsContainer).on('click', this.close.bind(this));\n        $('<button class=\"btn-flat timepicker-close waves-effect\" type=\"button\" tabindex=\"' + (this.options.twelveHour ? '3' : '1') + '\">' + this.options.i18n.done + '</button>').appendTo(confirmationBtnsContainer).on('click', this.done.bind(this));\n        confirmationBtnsContainer.appendTo(this.footer);\n      }\n    }, {\n      key: \"_clockSetup\",\n      value: function _clockSetup() {\n        if (this.options.twelveHour) {\n          this.$amBtn = $('<div class=\"am-btn\">AM</div>');\n          this.$pmBtn = $('<div class=\"pm-btn\">PM</div>');\n          this.$amBtn.on('click', this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm);\n          this.$pmBtn.on('click', this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm);\n        }\n\n        this._buildHoursView();\n        this._buildMinutesView();\n        this._buildSVGClock();\n      }\n    }, {\n      key: \"_buildSVGClock\",\n      value: function _buildSVGClock() {\n        // Draw clock hands and others\n        var dialRadius = this.options.dialRadius;\n        var tickRadius = this.options.tickRadius;\n        var diameter = dialRadius * 2;\n\n        var svg = Timepicker._createSVGEl('svg');\n        svg.setAttribute('class', 'timepicker-svg');\n        svg.setAttribute('width', diameter);\n        svg.setAttribute('height', diameter);\n        var g = Timepicker._createSVGEl('g');\n        g.setAttribute('transform', 'translate(' + dialRadius + ',' + dialRadius + ')');\n        var bearing = Timepicker._createSVGEl('circle');\n        bearing.setAttribute('class', 'timepicker-canvas-bearing');\n        bearing.setAttribute('cx', 0);\n        bearing.setAttribute('cy', 0);\n        bearing.setAttribute('r', 4);\n        var hand = Timepicker._createSVGEl('line');\n        hand.setAttribute('x1', 0);\n        hand.setAttribute('y1', 0);\n        var bg = Timepicker._createSVGEl('circle');\n        bg.setAttribute('class', 'timepicker-canvas-bg');\n        bg.setAttribute('r', tickRadius);\n        g.appendChild(hand);\n        g.appendChild(bg);\n        g.appendChild(bearing);\n        svg.appendChild(g);\n        this._canvas.appendChild(svg);\n\n        this.hand = hand;\n        this.bg = bg;\n        this.bearing = bearing;\n        this.g = g;\n      }\n    }, {\n      key: \"_buildHoursView\",\n      value: function _buildHoursView() {\n        var $tick = $('<div class=\"timepicker-tick\"></div>');\n        // Hours view\n        if (this.options.twelveHour) {\n          for (var i = 1; i < 13; i += 1) {\n            var tick = $tick.clone();\n            var radian = i / 6 * Math.PI;\n            var radius = this.options.outerRadius;\n            tick.css({\n              left: this.options.dialRadius + Math.sin(radian) * radius - this.options.tickRadius + 'px',\n              top: this.options.dialRadius - Math.cos(radian) * radius - this.options.tickRadius + 'px'\n            });\n            tick.html(i === 0 ? '00' : i);\n            this.hoursView.appendChild(tick[0]);\n            // tick.on(mousedownEvent, mousedown);\n          }\n        } else {\n          for (var _i2 = 0; _i2 < 24; _i2 += 1) {\n            var _tick = $tick.clone();\n            var _radian = _i2 / 6 * Math.PI;\n            var inner = _i2 > 0 && _i2 < 13;\n            var _radius = inner ? this.options.innerRadius : this.options.outerRadius;\n            _tick.css({\n              left: this.options.dialRadius + Math.sin(_radian) * _radius - this.options.tickRadius + 'px',\n              top: this.options.dialRadius - Math.cos(_radian) * _radius - this.options.tickRadius + 'px'\n            });\n            _tick.html(_i2 === 0 ? '00' : _i2);\n            this.hoursView.appendChild(_tick[0]);\n            // tick.on(mousedownEvent, mousedown);\n          }\n        }\n      }\n    }, {\n      key: \"_buildMinutesView\",\n      value: function _buildMinutesView() {\n        var $tick = $('<div class=\"timepicker-tick\"></div>');\n        // Minutes view\n        for (var i = 0; i < 60; i += 5) {\n          var tick = $tick.clone();\n          var radian = i / 30 * Math.PI;\n          tick.css({\n            left: this.options.dialRadius + Math.sin(radian) * this.options.outerRadius - this.options.tickRadius + 'px',\n            top: this.options.dialRadius - Math.cos(radian) * this.options.outerRadius - this.options.tickRadius + 'px'\n          });\n          tick.html(Timepicker._addLeadingZero(i));\n          this.minutesView.appendChild(tick[0]);\n        }\n      }\n    }, {\n      key: \"_handleAmPmClick\",\n      value: function _handleAmPmClick(e) {\n        var $btnClicked = $(e.target);\n        this.amOrPm = $btnClicked.hasClass('am-btn') ? 'AM' : 'PM';\n        this._updateAmPmView();\n      }\n    }, {\n      key: \"_updateAmPmView\",\n      value: function _updateAmPmView() {\n        if (this.options.twelveHour) {\n          this.$amBtn.toggleClass('text-primary', this.amOrPm === 'AM');\n          this.$pmBtn.toggleClass('text-primary', this.amOrPm === 'PM');\n        }\n      }\n    }, {\n      key: \"_updateTimeFromInput\",\n      value: function _updateTimeFromInput() {\n        // Get the time\n        var value = ((this.el.value || this.options.defaultTime || '') + '').split(':');\n        if (this.options.twelveHour && !(typeof value[1] === 'undefined')) {\n          if (value[1].toUpperCase().indexOf('AM') > 0) {\n            this.amOrPm = 'AM';\n          } else {\n            this.amOrPm = 'PM';\n          }\n          value[1] = value[1].replace('AM', '').replace('PM', '');\n        }\n        if (value[0] === 'now') {\n          var now = new Date(+new Date() + this.options.fromNow);\n          value = [now.getHours(), now.getMinutes()];\n          if (this.options.twelveHour) {\n            this.amOrPm = value[0] >= 12 && value[0] < 24 ? 'PM' : 'AM';\n          }\n        }\n        this.hours = +value[0] || 0;\n        this.minutes = +value[1] || 0;\n        this.spanHours.innerHTML = this.hours;\n        this.spanMinutes.innerHTML = Timepicker._addLeadingZero(this.minutes);\n\n        this._updateAmPmView();\n      }\n    }, {\n      key: \"showView\",\n      value: function showView(view, delay) {\n        if (view === 'minutes' && $(this.hoursView).css('visibility') === 'visible') {\n          // raiseCallback(this.options.beforeHourSelect);\n        }\n        var isHours = view === 'hours',\n            nextView = isHours ? this.hoursView : this.minutesView,\n            hideView = isHours ? this.minutesView : this.hoursView;\n        this.currentView = view;\n\n        $(this.spanHours).toggleClass('text-primary', isHours);\n        $(this.spanMinutes).toggleClass('text-primary', !isHours);\n\n        // Transition view\n        hideView.classList.add('timepicker-dial-out');\n        $(nextView).css('visibility', 'visible').removeClass('timepicker-dial-out');\n\n        // Reset clock hand\n        this.resetClock(delay);\n\n        // After transitions ended\n        clearTimeout(this.toggleViewTimer);\n        this.toggleViewTimer = setTimeout(function () {\n          $(hideView).css('visibility', 'hidden');\n        }, this.options.duration);\n      }\n    }, {\n      key: \"resetClock\",\n      value: function resetClock(delay) {\n        var view = this.currentView,\n            value = this[view],\n            isHours = view === 'hours',\n            unit = Math.PI / (isHours ? 6 : 30),\n            radian = value * unit,\n            radius = isHours && value > 0 && value < 13 ? this.options.innerRadius : this.options.outerRadius,\n            x = Math.sin(radian) * radius,\n            y = -Math.cos(radian) * radius,\n            self = this;\n\n        if (delay) {\n          $(this.canvas).addClass('timepicker-canvas-out');\n          setTimeout(function () {\n            $(self.canvas).removeClass('timepicker-canvas-out');\n            self.setHand(x, y);\n          }, delay);\n        } else {\n          this.setHand(x, y);\n        }\n      }\n    }, {\n      key: \"setHand\",\n      value: function setHand(x, y, roundBy5) {\n        var _this60 = this;\n\n        var radian = Math.atan2(x, -y),\n            isHours = this.currentView === 'hours',\n            unit = Math.PI / (isHours || roundBy5 ? 6 : 30),\n            z = Math.sqrt(x * x + y * y),\n            inner = isHours && z < (this.options.outerRadius + this.options.innerRadius) / 2,\n            radius = inner ? this.options.innerRadius : this.options.outerRadius;\n\n        if (this.options.twelveHour) {\n          radius = this.options.outerRadius;\n        }\n\n        // Radian should in range [0, 2PI]\n        if (radian < 0) {\n          radian = Math.PI * 2 + radian;\n        }\n\n        // Get the round value\n        var value = Math.round(radian / unit);\n\n        // Get the round radian\n        radian = value * unit;\n\n        // Correct the hours or minutes\n        if (this.options.twelveHour) {\n          if (isHours) {\n            if (value === 0) value = 12;\n          } else {\n            if (roundBy5) value *= 5;\n            if (value === 60) value = 0;\n          }\n        } else {\n          if (isHours) {\n            if (value === 12) {\n              value = 0;\n            }\n            value = inner ? value === 0 ? 12 : value : value === 0 ? 0 : value + 12;\n          } else {\n            if (roundBy5) {\n              value *= 5;\n            }\n            if (value === 60) {\n              value = 0;\n            }\n          }\n        }\n\n        // Once hours or minutes changed, vibrate the device\n        if (this[this.currentView] !== value) {\n          if (this.vibrate && this.options.vibrate) {\n            // Do not vibrate too frequently\n            if (!this.vibrateTimer) {\n              navigator[this.vibrate](10);\n              this.vibrateTimer = setTimeout(function () {\n                _this60.vibrateTimer = null;\n              }, 100);\n            }\n          }\n        }\n\n        this[this.currentView] = value;\n        if (isHours) {\n          this['spanHours'].innerHTML = value;\n        } else {\n          this['spanMinutes'].innerHTML = Timepicker._addLeadingZero(value);\n        }\n\n        // Set clock hand and others' position\n        var cx1 = Math.sin(radian) * (radius - this.options.tickRadius),\n            cy1 = -Math.cos(radian) * (radius - this.options.tickRadius),\n            cx2 = Math.sin(radian) * radius,\n            cy2 = -Math.cos(radian) * radius;\n        this.hand.setAttribute('x2', cx1);\n        this.hand.setAttribute('y2', cy1);\n        this.bg.setAttribute('cx', cx2);\n        this.bg.setAttribute('cy', cy2);\n      }\n    }, {\n      key: \"open\",\n      value: function open() {\n        if (this.isOpen) {\n          return;\n        }\n\n        this.isOpen = true;\n        this._updateTimeFromInput();\n        this.showView('hours');\n\n        this.modal.open();\n      }\n    }, {\n      key: \"close\",\n      value: function close() {\n        if (!this.isOpen) {\n          return;\n        }\n\n        this.isOpen = false;\n        this.modal.close();\n      }\n\n      /**\n       * Finish timepicker selection.\n       */\n\n    }, {\n      key: \"done\",\n      value: function done(e, clearValue) {\n        // Set input value\n        var last = this.el.value;\n        var value = clearValue ? '' : Timepicker._addLeadingZero(this.hours) + ':' + Timepicker._addLeadingZero(this.minutes);\n        this.time = value;\n        if (!clearValue && this.options.twelveHour) {\n          value = value + \" \" + this.amOrPm;\n        }\n        this.el.value = value;\n\n        // Trigger change event\n        if (value !== last) {\n          this.$el.trigger('change');\n        }\n\n        this.close();\n        this.el.focus();\n      }\n    }, {\n      key: \"clear\",\n      value: function clear() {\n        this.done(null, true);\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Timepicker.__proto__ || Object.getPrototypeOf(Timepicker), \"init\", this).call(this, this, els, options);\n      }\n    }, {\n      key: \"_addLeadingZero\",\n      value: function _addLeadingZero(num) {\n        return (num < 10 ? '0' : '') + num;\n      }\n    }, {\n      key: \"_createSVGEl\",\n      value: function _createSVGEl(name) {\n        var svgNS = 'http://www.w3.org/2000/svg';\n        return document.createElementNS(svgNS, name);\n      }\n\n      /**\n       * @typedef {Object} Point\n       * @property {number} x The X Coordinate\n       * @property {number} y The Y Coordinate\n       */\n\n      /**\n       * Get x position of mouse or touch event\n       * @param {Event} e\n       * @return {Point} x and y location\n       */\n\n    }, {\n      key: \"_Pos\",\n      value: function _Pos(e) {\n        if (e.targetTouches && e.targetTouches.length >= 1) {\n          return { x: e.targetTouches[0].clientX, y: e.targetTouches[0].clientY };\n        }\n        // mouse event\n        return { x: e.clientX, y: e.clientY };\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Timepicker;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Timepicker;\n  }(Component);\n\n  Timepicker._template = ['<div class= \"modal timepicker-modal\">', '<div class=\"modal-content timepicker-container\">', '<div class=\"timepicker-digital-display\">', '<div class=\"timepicker-text-container\">', '<div class=\"timepicker-display-column\">', '<span class=\"timepicker-span-hours text-primary\"></span>', ':', '<span class=\"timepicker-span-minutes\"></span>', '</div>', '<div class=\"timepicker-display-column timepicker-display-am-pm\">', '<div class=\"timepicker-span-am-pm\"></div>', '</div>', '</div>', '</div>', '<div class=\"timepicker-analog-display\">', '<div class=\"timepicker-plate\">', '<div class=\"timepicker-canvas\"></div>', '<div class=\"timepicker-dial timepicker-hours\"></div>', '<div class=\"timepicker-dial timepicker-minutes timepicker-dial-out\"></div>', '</div>', '<div class=\"timepicker-footer\"></div>', '</div>', '</div>', '</div>'].join('');\n\n  M.Timepicker = Timepicker;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Timepicker, 'timepicker', 'M_Timepicker');\n  }\n})(cash);\n;(function ($) {\n  'use strict';\n\n  var _defaults = {};\n\n  /**\n   * @class\n   *\n   */\n\n  var CharacterCounter = function (_Component17) {\n    _inherits(CharacterCounter, _Component17);\n\n    /**\n     * Construct CharacterCounter instance\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function CharacterCounter(el, options) {\n      _classCallCheck(this, CharacterCounter);\n\n      var _this61 = _possibleConstructorReturn(this, (CharacterCounter.__proto__ || Object.getPrototypeOf(CharacterCounter)).call(this, CharacterCounter, el, options));\n\n      _this61.el.M_CharacterCounter = _this61;\n\n      /**\n       * Options for the character counter\n       */\n      _this61.options = $.extend({}, CharacterCounter.defaults, options);\n\n      _this61.isInvalid = false;\n      _this61.isValidLength = false;\n      _this61._setupCounter();\n      _this61._setupEventHandlers();\n      return _this61;\n    }\n\n    _createClass(CharacterCounter, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this._removeEventHandlers();\n        this.el.CharacterCounter = undefined;\n        this._removeCounter();\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        this._handleUpdateCounterBound = this.updateCounter.bind(this);\n\n        this.el.addEventListener('focus', this._handleUpdateCounterBound, true);\n        this.el.addEventListener('input', this._handleUpdateCounterBound, true);\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        this.el.removeEventListener('focus', this._handleUpdateCounterBound, true);\n        this.el.removeEventListener('input', this._handleUpdateCounterBound, true);\n      }\n\n      /**\n       * Setup counter element\n       */\n\n    }, {\n      key: \"_setupCounter\",\n      value: function _setupCounter() {\n        this.counterEl = document.createElement('span');\n        $(this.counterEl).addClass('character-counter').css({\n          float: 'right',\n          'font-size': '12px',\n          height: 1\n        });\n\n        this.$el.parent().append(this.counterEl);\n      }\n\n      /**\n       * Remove counter element\n       */\n\n    }, {\n      key: \"_removeCounter\",\n      value: function _removeCounter() {\n        $(this.counterEl).remove();\n      }\n\n      /**\n       * Update counter\n       */\n\n    }, {\n      key: \"updateCounter\",\n      value: function updateCounter() {\n        var maxLength = +this.$el.attr('data-length'),\n            actualLength = this.el.value.length;\n        this.isValidLength = actualLength <= maxLength;\n        var counterString = actualLength;\n\n        if (maxLength) {\n          counterString += '/' + maxLength;\n          this._validateInput();\n        }\n\n        $(this.counterEl).html(counterString);\n      }\n\n      /**\n       * Add validation classes\n       */\n\n    }, {\n      key: \"_validateInput\",\n      value: function _validateInput() {\n        if (this.isValidLength && this.isInvalid) {\n          this.isInvalid = false;\n          this.$el.removeClass('invalid');\n        } else if (!this.isValidLength && !this.isInvalid) {\n          this.isInvalid = true;\n          this.$el.removeClass('valid');\n          this.$el.addClass('invalid');\n        }\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(CharacterCounter.__proto__ || Object.getPrototypeOf(CharacterCounter), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_CharacterCounter;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return CharacterCounter;\n  }(Component);\n\n  M.CharacterCounter = CharacterCounter;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(CharacterCounter, 'characterCounter', 'M_CharacterCounter');\n  }\n})(cash);\n;(function ($) {\n  'use strict';\n\n  var _defaults = {\n    duration: 200, // ms\n    dist: -100, // zoom scale TODO: make this more intuitive as an option\n    shift: 0, // spacing for center image\n    padding: 0, // Padding between non center items\n    numVisible: 5, // Number of visible items in carousel\n    fullWidth: false, // Change to full width styles\n    indicators: false, // Toggle indicators\n    noWrap: false, // Don't wrap around and cycle through items.\n    onCycleTo: null // Callback for when a new slide is cycled to.\n  };\n\n  /**\n   * @class\n   *\n   */\n\n  var Carousel = function (_Component18) {\n    _inherits(Carousel, _Component18);\n\n    /**\n     * Construct Carousel instance\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function Carousel(el, options) {\n      _classCallCheck(this, Carousel);\n\n      var _this62 = _possibleConstructorReturn(this, (Carousel.__proto__ || Object.getPrototypeOf(Carousel)).call(this, Carousel, el, options));\n\n      _this62.el.M_Carousel = _this62;\n\n      /**\n       * Options for the carousel\n       * @member Carousel#options\n       * @prop {Number} duration\n       * @prop {Number} dist\n       * @prop {Number} shift\n       * @prop {Number} padding\n       * @prop {Number} numVisible\n       * @prop {Boolean} fullWidth\n       * @prop {Boolean} indicators\n       * @prop {Boolean} noWrap\n       * @prop {Function} onCycleTo\n       */\n      _this62.options = $.extend({}, Carousel.defaults, options);\n\n      // Setup\n      _this62.hasMultipleSlides = _this62.$el.find('.carousel-item').length > 1;\n      _this62.showIndicators = _this62.options.indicators && _this62.hasMultipleSlides;\n      _this62.noWrap = _this62.options.noWrap || !_this62.hasMultipleSlides;\n      _this62.pressed = false;\n      _this62.dragged = false;\n      _this62.offset = _this62.target = 0;\n      _this62.images = [];\n      _this62.itemWidth = _this62.$el.find('.carousel-item').first().innerWidth();\n      _this62.itemHeight = _this62.$el.find('.carousel-item').first().innerHeight();\n      _this62.dim = _this62.itemWidth * 2 + _this62.options.padding || 1; // Make sure dim is non zero for divisions.\n      _this62._autoScrollBound = _this62._autoScroll.bind(_this62);\n      _this62._trackBound = _this62._track.bind(_this62);\n\n      // Full Width carousel setup\n      if (_this62.options.fullWidth) {\n        _this62.options.dist = 0;\n        _this62._setCarouselHeight();\n\n        // Offset fixed items when indicators.\n        if (_this62.showIndicators) {\n          _this62.$el.find('.carousel-fixed-item').addClass('with-indicators');\n        }\n      }\n\n      // Iterate through slides\n      _this62.$indicators = $('<ul class=\"indicators\"></ul>');\n      _this62.$el.find('.carousel-item').each(function (el, i) {\n        _this62.images.push(el);\n        if (_this62.showIndicators) {\n          var $indicator = $('<li class=\"indicator-item\"></li>');\n\n          // Add active to first by default.\n          if (i === 0) {\n            $indicator[0].classList.add('active');\n          }\n\n          _this62.$indicators.append($indicator);\n        }\n      });\n      if (_this62.showIndicators) {\n        _this62.$el.append(_this62.$indicators);\n      }\n      _this62.count = _this62.images.length;\n\n      // Cap numVisible at count\n      _this62.options.numVisible = Math.min(_this62.count, _this62.options.numVisible);\n\n      // Setup cross browser string\n      _this62.xform = 'transform';\n      ['webkit', 'Moz', 'O', 'ms'].every(function (prefix) {\n        var e = prefix + 'Transform';\n        if (typeof document.body.style[e] !== 'undefined') {\n          _this62.xform = e;\n          return false;\n        }\n        return true;\n      });\n\n      _this62._setupEventHandlers();\n      _this62._scroll(_this62.offset);\n      return _this62;\n    }\n\n    _createClass(Carousel, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this._removeEventHandlers();\n        this.el.M_Carousel = undefined;\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        var _this63 = this;\n\n        this._handleCarouselTapBound = this._handleCarouselTap.bind(this);\n        this._handleCarouselDragBound = this._handleCarouselDrag.bind(this);\n        this._handleCarouselReleaseBound = this._handleCarouselRelease.bind(this);\n        this._handleCarouselClickBound = this._handleCarouselClick.bind(this);\n\n        if (typeof window.ontouchstart !== 'undefined') {\n          this.el.addEventListener('touchstart', this._handleCarouselTapBound);\n          this.el.addEventListener('touchmove', this._handleCarouselDragBound);\n          this.el.addEventListener('touchend', this._handleCarouselReleaseBound);\n        }\n\n        this.el.addEventListener('mousedown', this._handleCarouselTapBound);\n        this.el.addEventListener('mousemove', this._handleCarouselDragBound);\n        this.el.addEventListener('mouseup', this._handleCarouselReleaseBound);\n        this.el.addEventListener('mouseleave', this._handleCarouselReleaseBound);\n        this.el.addEventListener('click', this._handleCarouselClickBound);\n\n        if (this.showIndicators && this.$indicators) {\n          this._handleIndicatorClickBound = this._handleIndicatorClick.bind(this);\n          this.$indicators.find('.indicator-item').each(function (el, i) {\n            el.addEventListener('click', _this63._handleIndicatorClickBound);\n          });\n        }\n\n        // Resize\n        var throttledResize = M.throttle(this._handleResize, 200);\n        this._handleThrottledResizeBound = throttledResize.bind(this);\n\n        window.addEventListener('resize', this._handleThrottledResizeBound);\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        var _this64 = this;\n\n        if (typeof window.ontouchstart !== 'undefined') {\n          this.el.removeEventListener('touchstart', this._handleCarouselTapBound);\n          this.el.removeEventListener('touchmove', this._handleCarouselDragBound);\n          this.el.removeEventListener('touchend', this._handleCarouselReleaseBound);\n        }\n        this.el.removeEventListener('mousedown', this._handleCarouselTapBound);\n        this.el.removeEventListener('mousemove', this._handleCarouselDragBound);\n        this.el.removeEventListener('mouseup', this._handleCarouselReleaseBound);\n        this.el.removeEventListener('mouseleave', this._handleCarouselReleaseBound);\n        this.el.removeEventListener('click', this._handleCarouselClickBound);\n\n        if (this.showIndicators && this.$indicators) {\n          this.$indicators.find('.indicator-item').each(function (el, i) {\n            el.removeEventListener('click', _this64._handleIndicatorClickBound);\n          });\n        }\n\n        window.removeEventListener('resize', this._handleThrottledResizeBound);\n      }\n\n      /**\n       * Handle Carousel Tap\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleCarouselTap\",\n      value: function _handleCarouselTap(e) {\n        // Fixes firefox draggable image bug\n        if (e.type === 'mousedown' && $(e.target).is('img')) {\n          e.preventDefault();\n        }\n        this.pressed = true;\n        this.dragged = false;\n        this.verticalDragged = false;\n        this.reference = this._xpos(e);\n        this.referenceY = this._ypos(e);\n\n        this.velocity = this.amplitude = 0;\n        this.frame = this.offset;\n        this.timestamp = Date.now();\n        clearInterval(this.ticker);\n        this.ticker = setInterval(this._trackBound, 100);\n      }\n\n      /**\n       * Handle Carousel Drag\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleCarouselDrag\",\n      value: function _handleCarouselDrag(e) {\n        var x = void 0,\n            y = void 0,\n            delta = void 0,\n            deltaY = void 0;\n        if (this.pressed) {\n          x = this._xpos(e);\n          y = this._ypos(e);\n          delta = this.reference - x;\n          deltaY = Math.abs(this.referenceY - y);\n          if (deltaY < 30 && !this.verticalDragged) {\n            // If vertical scrolling don't allow dragging.\n            if (delta > 2 || delta < -2) {\n              this.dragged = true;\n              this.reference = x;\n              this._scroll(this.offset + delta);\n            }\n          } else if (this.dragged) {\n            // If dragging don't allow vertical scroll.\n            e.preventDefault();\n            e.stopPropagation();\n            return false;\n          } else {\n            // Vertical scrolling.\n            this.verticalDragged = true;\n          }\n        }\n\n        if (this.dragged) {\n          // If dragging don't allow vertical scroll.\n          e.preventDefault();\n          e.stopPropagation();\n          return false;\n        }\n      }\n\n      /**\n       * Handle Carousel Release\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleCarouselRelease\",\n      value: function _handleCarouselRelease(e) {\n        if (this.pressed) {\n          this.pressed = false;\n        } else {\n          return;\n        }\n\n        clearInterval(this.ticker);\n        this.target = this.offset;\n        if (this.velocity > 10 || this.velocity < -10) {\n          this.amplitude = 0.9 * this.velocity;\n          this.target = this.offset + this.amplitude;\n        }\n        this.target = Math.round(this.target / this.dim) * this.dim;\n\n        // No wrap of items.\n        if (this.noWrap) {\n          if (this.target >= this.dim * (this.count - 1)) {\n            this.target = this.dim * (this.count - 1);\n          } else if (this.target < 0) {\n            this.target = 0;\n          }\n        }\n        this.amplitude = this.target - this.offset;\n        this.timestamp = Date.now();\n        requestAnimationFrame(this._autoScrollBound);\n\n        if (this.dragged) {\n          e.preventDefault();\n          e.stopPropagation();\n        }\n        return false;\n      }\n\n      /**\n       * Handle Carousel CLick\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleCarouselClick\",\n      value: function _handleCarouselClick(e) {\n        // Disable clicks if carousel was dragged.\n        if (this.dragged) {\n          e.preventDefault();\n          e.stopPropagation();\n          return false;\n        } else if (!this.options.fullWidth) {\n          var clickedIndex = $(e.target).closest('.carousel-item').index();\n          var diff = this._wrap(this.center) - clickedIndex;\n\n          // Disable clicks if carousel was shifted by click\n          if (diff !== 0) {\n            e.preventDefault();\n            e.stopPropagation();\n          }\n          this._cycleTo(clickedIndex);\n        }\n      }\n\n      /**\n       * Handle Indicator CLick\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleIndicatorClick\",\n      value: function _handleIndicatorClick(e) {\n        e.stopPropagation();\n\n        var indicator = $(e.target).closest('.indicator-item');\n        if (indicator.length) {\n          this._cycleTo(indicator.index());\n        }\n      }\n\n      /**\n       * Handle Throttle Resize\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleResize\",\n      value: function _handleResize(e) {\n        if (this.options.fullWidth) {\n          this.itemWidth = this.$el.find('.carousel-item').first().innerWidth();\n          this.imageHeight = this.$el.find('.carousel-item.active').height();\n          this.dim = this.itemWidth * 2 + this.options.padding;\n          this.offset = this.center * 2 * this.itemWidth;\n          this.target = this.offset;\n          this._setCarouselHeight(true);\n        } else {\n          this._scroll();\n        }\n      }\n\n      /**\n       * Set carousel height based on first slide\n       * @param {Booleam} imageOnly - true for image slides\n       */\n\n    }, {\n      key: \"_setCarouselHeight\",\n      value: function _setCarouselHeight(imageOnly) {\n        var _this65 = this;\n\n        var firstSlide = this.$el.find('.carousel-item.active').length ? this.$el.find('.carousel-item.active').first() : this.$el.find('.carousel-item').first();\n        var firstImage = firstSlide.find('img').first();\n        if (firstImage.length) {\n          if (firstImage[0].complete) {\n            // If image won't trigger the load event\n            var imageHeight = firstImage.height();\n            if (imageHeight > 0) {\n              this.$el.css('height', imageHeight + 'px');\n            } else {\n              // If image still has no height, use the natural dimensions to calculate\n              var naturalWidth = firstImage[0].naturalWidth;\n              var naturalHeight = firstImage[0].naturalHeight;\n              var adjustedHeight = this.$el.width() / naturalWidth * naturalHeight;\n              this.$el.css('height', adjustedHeight + 'px');\n            }\n          } else {\n            // Get height when image is loaded normally\n            firstImage.one('load', function (el, i) {\n              _this65.$el.css('height', el.offsetHeight + 'px');\n            });\n          }\n        } else if (!imageOnly) {\n          var slideHeight = firstSlide.height();\n          this.$el.css('height', slideHeight + 'px');\n        }\n      }\n\n      /**\n       * Get x position from event\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_xpos\",\n      value: function _xpos(e) {\n        // touch event\n        if (e.targetTouches && e.targetTouches.length >= 1) {\n          return e.targetTouches[0].clientX;\n        }\n\n        // mouse event\n        return e.clientX;\n      }\n\n      /**\n       * Get y position from event\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_ypos\",\n      value: function _ypos(e) {\n        // touch event\n        if (e.targetTouches && e.targetTouches.length >= 1) {\n          return e.targetTouches[0].clientY;\n        }\n\n        // mouse event\n        return e.clientY;\n      }\n\n      /**\n       * Wrap index\n       * @param {Number} x\n       */\n\n    }, {\n      key: \"_wrap\",\n      value: function _wrap(x) {\n        return x >= this.count ? x % this.count : x < 0 ? this._wrap(this.count + x % this.count) : x;\n      }\n\n      /**\n       * Tracks scrolling information\n       */\n\n    }, {\n      key: \"_track\",\n      value: function _track() {\n        var now = void 0,\n            elapsed = void 0,\n            delta = void 0,\n            v = void 0;\n\n        now = Date.now();\n        elapsed = now - this.timestamp;\n        this.timestamp = now;\n        delta = this.offset - this.frame;\n        this.frame = this.offset;\n\n        v = 1000 * delta / (1 + elapsed);\n        this.velocity = 0.8 * v + 0.2 * this.velocity;\n      }\n\n      /**\n       * Auto scrolls to nearest carousel item.\n       */\n\n    }, {\n      key: \"_autoScroll\",\n      value: function _autoScroll() {\n        var elapsed = void 0,\n            delta = void 0;\n\n        if (this.amplitude) {\n          elapsed = Date.now() - this.timestamp;\n          delta = this.amplitude * Math.exp(-elapsed / this.options.duration);\n          if (delta > 2 || delta < -2) {\n            this._scroll(this.target - delta);\n            requestAnimationFrame(this._autoScrollBound);\n          } else {\n            this._scroll(this.target);\n          }\n        }\n      }\n\n      /**\n       * Scroll to target\n       * @param {Number} x\n       */\n\n    }, {\n      key: \"_scroll\",\n      value: function _scroll(x) {\n        var _this66 = this;\n\n        // Track scrolling state\n        if (!this.$el.hasClass('scrolling')) {\n          this.el.classList.add('scrolling');\n        }\n        if (this.scrollingTimeout != null) {\n          window.clearTimeout(this.scrollingTimeout);\n        }\n        this.scrollingTimeout = window.setTimeout(function () {\n          _this66.$el.removeClass('scrolling');\n        }, this.options.duration);\n\n        // Start actual scroll\n        var i = void 0,\n            half = void 0,\n            delta = void 0,\n            dir = void 0,\n            tween = void 0,\n            el = void 0,\n            alignment = void 0,\n            zTranslation = void 0,\n            tweenedOpacity = void 0,\n            centerTweenedOpacity = void 0;\n        var lastCenter = this.center;\n        var numVisibleOffset = 1 / this.options.numVisible;\n\n        this.offset = typeof x === 'number' ? x : this.offset;\n        this.center = Math.floor((this.offset + this.dim / 2) / this.dim);\n        delta = this.offset - this.center * this.dim;\n        dir = delta < 0 ? 1 : -1;\n        tween = -dir * delta * 2 / this.dim;\n        half = this.count >> 1;\n\n        if (this.options.fullWidth) {\n          alignment = 'translateX(0)';\n          centerTweenedOpacity = 1;\n        } else {\n          alignment = 'translateX(' + (this.el.clientWidth - this.itemWidth) / 2 + 'px) ';\n          alignment += 'translateY(' + (this.el.clientHeight - this.itemHeight) / 2 + 'px)';\n          centerTweenedOpacity = 1 - numVisibleOffset * tween;\n        }\n\n        // Set indicator active\n        if (this.showIndicators) {\n          var diff = this.center % this.count;\n          var activeIndicator = this.$indicators.find('.indicator-item.active');\n          if (activeIndicator.index() !== diff) {\n            activeIndicator.removeClass('active');\n            this.$indicators.find('.indicator-item').eq(diff)[0].classList.add('active');\n          }\n        }\n\n        // center\n        // Don't show wrapped items.\n        if (!this.noWrap || this.center >= 0 && this.center < this.count) {\n          el = this.images[this._wrap(this.center)];\n\n          // Add active class to center item.\n          if (!$(el).hasClass('active')) {\n            this.$el.find('.carousel-item').removeClass('active');\n            el.classList.add('active');\n          }\n          var transformString = alignment + \" translateX(\" + -delta / 2 + \"px) translateX(\" + dir * this.options.shift * tween * i + \"px) translateZ(\" + this.options.dist * tween + \"px)\";\n          this._updateItemStyle(el, centerTweenedOpacity, 0, transformString);\n        }\n\n        for (i = 1; i <= half; ++i) {\n          // right side\n          if (this.options.fullWidth) {\n            zTranslation = this.options.dist;\n            tweenedOpacity = i === half && delta < 0 ? 1 - tween : 1;\n          } else {\n            zTranslation = this.options.dist * (i * 2 + tween * dir);\n            tweenedOpacity = 1 - numVisibleOffset * (i * 2 + tween * dir);\n          }\n          // Don't show wrapped items.\n          if (!this.noWrap || this.center + i < this.count) {\n            el = this.images[this._wrap(this.center + i)];\n            var _transformString = alignment + \" translateX(\" + (this.options.shift + (this.dim * i - delta) / 2) + \"px) translateZ(\" + zTranslation + \"px)\";\n            this._updateItemStyle(el, tweenedOpacity, -i, _transformString);\n          }\n\n          // left side\n          if (this.options.fullWidth) {\n            zTranslation = this.options.dist;\n            tweenedOpacity = i === half && delta > 0 ? 1 - tween : 1;\n          } else {\n            zTranslation = this.options.dist * (i * 2 - tween * dir);\n            tweenedOpacity = 1 - numVisibleOffset * (i * 2 - tween * dir);\n          }\n          // Don't show wrapped items.\n          if (!this.noWrap || this.center - i >= 0) {\n            el = this.images[this._wrap(this.center - i)];\n            var _transformString2 = alignment + \" translateX(\" + (-this.options.shift + (-this.dim * i - delta) / 2) + \"px) translateZ(\" + zTranslation + \"px)\";\n            this._updateItemStyle(el, tweenedOpacity, -i, _transformString2);\n          }\n        }\n\n        // center\n        // Don't show wrapped items.\n        if (!this.noWrap || this.center >= 0 && this.center < this.count) {\n          el = this.images[this._wrap(this.center)];\n          var _transformString3 = alignment + \" translateX(\" + -delta / 2 + \"px) translateX(\" + dir * this.options.shift * tween + \"px) translateZ(\" + this.options.dist * tween + \"px)\";\n          this._updateItemStyle(el, centerTweenedOpacity, 0, _transformString3);\n        }\n\n        // onCycleTo callback\n        var $currItem = this.$el.find('.carousel-item').eq(this._wrap(this.center));\n        if (lastCenter !== this.center && typeof this.options.onCycleTo === 'function') {\n          this.options.onCycleTo.call(this, $currItem[0], this.dragged);\n        }\n\n        // One time callback\n        if (typeof this.oneTimeCallback === 'function') {\n          this.oneTimeCallback.call(this, $currItem[0], this.dragged);\n          this.oneTimeCallback = null;\n        }\n      }\n\n      /**\n       * Cycle to target\n       * @param {Element} el\n       * @param {Number} opacity\n       * @param {Number} zIndex\n       * @param {String} transform\n       */\n\n    }, {\n      key: \"_updateItemStyle\",\n      value: function _updateItemStyle(el, opacity, zIndex, transform) {\n        el.style[this.xform] = transform;\n        el.style.zIndex = zIndex;\n        el.style.opacity = opacity;\n        el.style.visibility = 'visible';\n      }\n\n      /**\n       * Cycle to target\n       * @param {Number} n\n       * @param {Function} callback\n       */\n\n    }, {\n      key: \"_cycleTo\",\n      value: function _cycleTo(n, callback) {\n        var diff = this.center % this.count - n;\n\n        // Account for wraparound.\n        if (!this.noWrap) {\n          if (diff < 0) {\n            if (Math.abs(diff + this.count) < Math.abs(diff)) {\n              diff += this.count;\n            }\n          } else if (diff > 0) {\n            if (Math.abs(diff - this.count) < diff) {\n              diff -= this.count;\n            }\n          }\n        }\n\n        this.target = this.dim * Math.round(this.offset / this.dim);\n        // Next\n        if (diff < 0) {\n          this.target += this.dim * Math.abs(diff);\n\n          // Prev\n        } else if (diff > 0) {\n          this.target -= this.dim * diff;\n        }\n\n        // Set one time callback\n        if (typeof callback === 'function') {\n          this.oneTimeCallback = callback;\n        }\n\n        // Scroll\n        if (this.offset !== this.target) {\n          this.amplitude = this.target - this.offset;\n          this.timestamp = Date.now();\n          requestAnimationFrame(this._autoScrollBound);\n        }\n      }\n\n      /**\n       * Cycle to next item\n       * @param {Number} [n]\n       */\n\n    }, {\n      key: \"next\",\n      value: function next(n) {\n        if (n === undefined || isNaN(n)) {\n          n = 1;\n        }\n\n        var index = this.center + n;\n        if (index >= this.count || index < 0) {\n          if (this.noWrap) {\n            return;\n          }\n\n          index = this._wrap(index);\n        }\n        this._cycleTo(index);\n      }\n\n      /**\n       * Cycle to previous item\n       * @param {Number} [n]\n       */\n\n    }, {\n      key: \"prev\",\n      value: function prev(n) {\n        if (n === undefined || isNaN(n)) {\n          n = 1;\n        }\n\n        var index = this.center - n;\n        if (index >= this.count || index < 0) {\n          if (this.noWrap) {\n            return;\n          }\n\n          index = this._wrap(index);\n        }\n\n        this._cycleTo(index);\n      }\n\n      /**\n       * Cycle to nth item\n       * @param {Number} [n]\n       * @param {Function} callback\n       */\n\n    }, {\n      key: \"set\",\n      value: function set(n, callback) {\n        if (n === undefined || isNaN(n)) {\n          n = 0;\n        }\n\n        if (n > this.count || n < 0) {\n          if (this.noWrap) {\n            return;\n          }\n\n          n = this._wrap(n);\n        }\n\n        this._cycleTo(n, callback);\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Carousel.__proto__ || Object.getPrototypeOf(Carousel), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Carousel;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Carousel;\n  }(Component);\n\n  M.Carousel = Carousel;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Carousel, 'carousel', 'M_Carousel');\n  }\n})(cash);\n;(function ($) {\n  'use strict';\n\n  var _defaults = {\n    onOpen: undefined,\n    onClose: undefined\n  };\n\n  /**\n   * @class\n   *\n   */\n\n  var TapTarget = function (_Component19) {\n    _inherits(TapTarget, _Component19);\n\n    /**\n     * Construct TapTarget instance\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function TapTarget(el, options) {\n      _classCallCheck(this, TapTarget);\n\n      var _this67 = _possibleConstructorReturn(this, (TapTarget.__proto__ || Object.getPrototypeOf(TapTarget)).call(this, TapTarget, el, options));\n\n      _this67.el.M_TapTarget = _this67;\n\n      /**\n       * Options for the select\n       * @member TapTarget#options\n       * @prop {Function} onOpen - Callback function called when feature discovery is opened\n       * @prop {Function} onClose - Callback function called when feature discovery is closed\n       */\n      _this67.options = $.extend({}, TapTarget.defaults, options);\n\n      _this67.isOpen = false;\n\n      // setup\n      _this67.$origin = $('#' + _this67.$el.attr('data-target'));\n      _this67._setup();\n\n      _this67._calculatePositioning();\n      _this67._setupEventHandlers();\n      return _this67;\n    }\n\n    _createClass(TapTarget, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this._removeEventHandlers();\n        this.el.TapTarget = undefined;\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        this._handleDocumentClickBound = this._handleDocumentClick.bind(this);\n        this._handleTargetClickBound = this._handleTargetClick.bind(this);\n        this._handleOriginClickBound = this._handleOriginClick.bind(this);\n\n        this.el.addEventListener('click', this._handleTargetClickBound);\n        this.originEl.addEventListener('click', this._handleOriginClickBound);\n\n        // Resize\n        var throttledResize = M.throttle(this._handleResize, 200);\n        this._handleThrottledResizeBound = throttledResize.bind(this);\n\n        window.addEventListener('resize', this._handleThrottledResizeBound);\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        this.el.removeEventListener('click', this._handleTargetClickBound);\n        this.originEl.removeEventListener('click', this._handleOriginClickBound);\n        window.removeEventListener('resize', this._handleThrottledResizeBound);\n      }\n\n      /**\n       * Handle Target Click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleTargetClick\",\n      value: function _handleTargetClick(e) {\n        this.open();\n      }\n\n      /**\n       * Handle Origin Click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleOriginClick\",\n      value: function _handleOriginClick(e) {\n        this.close();\n      }\n\n      /**\n       * Handle Resize\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleResize\",\n      value: function _handleResize(e) {\n        this._calculatePositioning();\n      }\n\n      /**\n       * Handle Resize\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleDocumentClick\",\n      value: function _handleDocumentClick(e) {\n        if (!$(e.target).closest('.tap-target-wrapper').length) {\n          this.close();\n          e.preventDefault();\n          e.stopPropagation();\n        }\n      }\n\n      /**\n       * Setup Tap Target\n       */\n\n    }, {\n      key: \"_setup\",\n      value: function _setup() {\n        // Creating tap target\n        this.wrapper = this.$el.parent()[0];\n        this.waveEl = $(this.wrapper).find('.tap-target-wave')[0];\n        this.originEl = $(this.wrapper).find('.tap-target-origin')[0];\n        this.contentEl = this.$el.find('.tap-target-content')[0];\n\n        // Creating wrapper\n        if (!$(this.wrapper).hasClass('.tap-target-wrapper')) {\n          this.wrapper = document.createElement('div');\n          this.wrapper.classList.add('tap-target-wrapper');\n          this.$el.before($(this.wrapper));\n          this.wrapper.append(this.el);\n        }\n\n        // Creating content\n        if (!this.contentEl) {\n          this.contentEl = document.createElement('div');\n          this.contentEl.classList.add('tap-target-content');\n          this.$el.append(this.contentEl);\n        }\n\n        // Creating foreground wave\n        if (!this.waveEl) {\n          this.waveEl = document.createElement('div');\n          this.waveEl.classList.add('tap-target-wave');\n\n          // Creating origin\n          if (!this.originEl) {\n            this.originEl = this.$origin.clone(true, true);\n            this.originEl.addClass('tap-target-origin');\n            this.originEl.removeAttr('id');\n            this.originEl.removeAttr('style');\n            this.originEl = this.originEl[0];\n            this.waveEl.append(this.originEl);\n          }\n\n          this.wrapper.append(this.waveEl);\n        }\n      }\n\n      /**\n       * Calculate positioning\n       */\n\n    }, {\n      key: \"_calculatePositioning\",\n      value: function _calculatePositioning() {\n        // Element or parent is fixed position?\n        var isFixed = this.$origin.css('position') === 'fixed';\n        if (!isFixed) {\n          var parents = this.$origin.parents();\n          for (var i = 0; i < parents.length; i++) {\n            isFixed = $(parents[i]).css('position') == 'fixed';\n            if (isFixed) {\n              break;\n            }\n          }\n        }\n\n        // Calculating origin\n        var originWidth = this.$origin.outerWidth();\n        var originHeight = this.$origin.outerHeight();\n        var originTop = isFixed ? this.$origin.offset().top - M.getDocumentScrollTop() : this.$origin.offset().top;\n        var originLeft = isFixed ? this.$origin.offset().left - M.getDocumentScrollLeft() : this.$origin.offset().left;\n\n        // Calculating screen\n        var windowWidth = window.innerWidth;\n        var windowHeight = window.innerHeight;\n        var centerX = windowWidth / 2;\n        var centerY = windowHeight / 2;\n        var isLeft = originLeft <= centerX;\n        var isRight = originLeft > centerX;\n        var isTop = originTop <= centerY;\n        var isBottom = originTop > centerY;\n        var isCenterX = originLeft >= windowWidth * 0.25 && originLeft <= windowWidth * 0.75;\n\n        // Calculating tap target\n        var tapTargetWidth = this.$el.outerWidth();\n        var tapTargetHeight = this.$el.outerHeight();\n        var tapTargetTop = originTop + originHeight / 2 - tapTargetHeight / 2;\n        var tapTargetLeft = originLeft + originWidth / 2 - tapTargetWidth / 2;\n        var tapTargetPosition = isFixed ? 'fixed' : 'absolute';\n\n        // Calculating content\n        var tapTargetTextWidth = isCenterX ? tapTargetWidth : tapTargetWidth / 2 + originWidth;\n        var tapTargetTextHeight = tapTargetHeight / 2;\n        var tapTargetTextTop = isTop ? tapTargetHeight / 2 : 0;\n        var tapTargetTextBottom = 0;\n        var tapTargetTextLeft = isLeft && !isCenterX ? tapTargetWidth / 2 - originWidth : 0;\n        var tapTargetTextRight = 0;\n        var tapTargetTextPadding = originWidth;\n        var tapTargetTextAlign = isBottom ? 'bottom' : 'top';\n\n        // Calculating wave\n        var tapTargetWaveWidth = originWidth > originHeight ? originWidth * 2 : originWidth * 2;\n        var tapTargetWaveHeight = tapTargetWaveWidth;\n        var tapTargetWaveTop = tapTargetHeight / 2 - tapTargetWaveHeight / 2;\n        var tapTargetWaveLeft = tapTargetWidth / 2 - tapTargetWaveWidth / 2;\n\n        // Setting tap target\n        var tapTargetWrapperCssObj = {};\n        tapTargetWrapperCssObj.top = isTop ? tapTargetTop + 'px' : '';\n        tapTargetWrapperCssObj.right = isRight ? windowWidth - tapTargetLeft - tapTargetWidth + 'px' : '';\n        tapTargetWrapperCssObj.bottom = isBottom ? windowHeight - tapTargetTop - tapTargetHeight + 'px' : '';\n        tapTargetWrapperCssObj.left = isLeft ? tapTargetLeft + 'px' : '';\n        tapTargetWrapperCssObj.position = tapTargetPosition;\n        $(this.wrapper).css(tapTargetWrapperCssObj);\n\n        // Setting content\n        $(this.contentEl).css({\n          width: tapTargetTextWidth + 'px',\n          height: tapTargetTextHeight + 'px',\n          top: tapTargetTextTop + 'px',\n          right: tapTargetTextRight + 'px',\n          bottom: tapTargetTextBottom + 'px',\n          left: tapTargetTextLeft + 'px',\n          padding: tapTargetTextPadding + 'px',\n          verticalAlign: tapTargetTextAlign\n        });\n\n        // Setting wave\n        $(this.waveEl).css({\n          top: tapTargetWaveTop + 'px',\n          left: tapTargetWaveLeft + 'px',\n          width: tapTargetWaveWidth + 'px',\n          height: tapTargetWaveHeight + 'px'\n        });\n      }\n\n      /**\n       * Open TapTarget\n       */\n\n    }, {\n      key: \"open\",\n      value: function open() {\n        if (this.isOpen) {\n          return;\n        }\n\n        // onOpen callback\n        if (typeof this.options.onOpen === 'function') {\n          this.options.onOpen.call(this, this.$origin[0]);\n        }\n\n        this.isOpen = true;\n        this.wrapper.classList.add('open');\n\n        document.body.addEventListener('click', this._handleDocumentClickBound, true);\n        document.body.addEventListener('touchend', this._handleDocumentClickBound);\n      }\n\n      /**\n       * Close Tap Target\n       */\n\n    }, {\n      key: \"close\",\n      value: function close() {\n        if (!this.isOpen) {\n          return;\n        }\n\n        // onClose callback\n        if (typeof this.options.onClose === 'function') {\n          this.options.onClose.call(this, this.$origin[0]);\n        }\n\n        this.isOpen = false;\n        this.wrapper.classList.remove('open');\n\n        document.body.removeEventListener('click', this._handleDocumentClickBound, true);\n        document.body.removeEventListener('touchend', this._handleDocumentClickBound);\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(TapTarget.__proto__ || Object.getPrototypeOf(TapTarget), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_TapTarget;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return TapTarget;\n  }(Component);\n\n  M.TapTarget = TapTarget;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(TapTarget, 'tapTarget', 'M_TapTarget');\n  }\n})(cash);\n;(function ($) {\n  'use strict';\n\n  var _defaults = {\n    classes: '',\n    dropdownOptions: {}\n  };\n\n  /**\n   * @class\n   *\n   */\n\n  var FormSelect = function (_Component20) {\n    _inherits(FormSelect, _Component20);\n\n    /**\n     * Construct FormSelect instance\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function FormSelect(el, options) {\n      _classCallCheck(this, FormSelect);\n\n      // Don't init if browser default version\n      var _this68 = _possibleConstructorReturn(this, (FormSelect.__proto__ || Object.getPrototypeOf(FormSelect)).call(this, FormSelect, el, options));\n\n      if (_this68.$el.hasClass('browser-default')) {\n        return _possibleConstructorReturn(_this68);\n      }\n\n      _this68.el.M_FormSelect = _this68;\n\n      /**\n       * Options for the select\n       * @member FormSelect#options\n       */\n      _this68.options = $.extend({}, FormSelect.defaults, options);\n\n      _this68.isMultiple = _this68.$el.prop('multiple');\n\n      // Setup\n      _this68.el.tabIndex = -1;\n      _this68._keysSelected = {};\n      _this68._valueDict = {}; // Maps key to original and generated option element.\n      _this68._setupDropdown();\n\n      _this68._setupEventHandlers();\n      return _this68;\n    }\n\n    _createClass(FormSelect, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this._removeEventHandlers();\n        this._removeDropdown();\n        this.el.M_FormSelect = undefined;\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        var _this69 = this;\n\n        this._handleSelectChangeBound = this._handleSelectChange.bind(this);\n        this._handleOptionClickBound = this._handleOptionClick.bind(this);\n        this._handleInputClickBound = this._handleInputClick.bind(this);\n\n        $(this.dropdownOptions).find('li:not(.optgroup)').each(function (el) {\n          el.addEventListener('click', _this69._handleOptionClickBound);\n        });\n        this.el.addEventListener('change', this._handleSelectChangeBound);\n        this.input.addEventListener('click', this._handleInputClickBound);\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        var _this70 = this;\n\n        $(this.dropdownOptions).find('li:not(.optgroup)').each(function (el) {\n          el.removeEventListener('click', _this70._handleOptionClickBound);\n        });\n        this.el.removeEventListener('change', this._handleSelectChangeBound);\n        this.input.removeEventListener('click', this._handleInputClickBound);\n      }\n\n      /**\n       * Handle Select Change\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleSelectChange\",\n      value: function _handleSelectChange(e) {\n        this._setValueToInput();\n      }\n\n      /**\n       * Handle Option Click\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleOptionClick\",\n      value: function _handleOptionClick(e) {\n        e.preventDefault();\n        var option = $(e.target).closest('li')[0];\n        var key = option.id;\n        if (!$(option).hasClass('disabled') && !$(option).hasClass('optgroup') && key.length) {\n          var selected = true;\n\n          if (this.isMultiple) {\n            // Deselect placeholder option if still selected.\n            var placeholderOption = $(this.dropdownOptions).find('li.disabled.selected');\n            if (placeholderOption.length) {\n              placeholderOption.removeClass('selected');\n              placeholderOption.find('input[type=\"checkbox\"]').prop('checked', false);\n              this._toggleEntryFromArray(placeholderOption[0].id);\n            }\n            selected = this._toggleEntryFromArray(key);\n          } else {\n            $(this.dropdownOptions).find('li').removeClass('selected');\n            $(option).toggleClass('selected', selected);\n          }\n\n          // Set selected on original select option\n          // Only trigger if selected state changed\n          var prevSelected = $(this._valueDict[key].el).prop('selected');\n          if (prevSelected !== selected) {\n            $(this._valueDict[key].el).prop('selected', selected);\n            this.$el.trigger('change');\n          }\n        }\n\n        e.stopPropagation();\n      }\n\n      /**\n       * Handle Input Click\n       */\n\n    }, {\n      key: \"_handleInputClick\",\n      value: function _handleInputClick() {\n        if (this.dropdown && this.dropdown.isOpen) {\n          this._setValueToInput();\n          this._setSelectedStates();\n        }\n      }\n\n      /**\n       * Setup dropdown\n       */\n\n    }, {\n      key: \"_setupDropdown\",\n      value: function _setupDropdown() {\n        var _this71 = this;\n\n        this.wrapper = document.createElement('div');\n        $(this.wrapper).addClass('select-wrapper ' + this.options.classes);\n        this.$el.before($(this.wrapper));\n        this.wrapper.appendChild(this.el);\n\n        if (this.el.disabled) {\n          this.wrapper.classList.add('disabled');\n        }\n\n        // Create dropdown\n        this.$selectOptions = this.$el.children('option, optgroup');\n        this.dropdownOptions = document.createElement('ul');\n        this.dropdownOptions.id = \"select-options-\" + M.guid();\n        $(this.dropdownOptions).addClass('dropdown-content select-dropdown ' + (this.isMultiple ? 'multiple-select-dropdown' : ''));\n\n        // Create dropdown structure.\n        if (this.$selectOptions.length) {\n          this.$selectOptions.each(function (el) {\n            if ($(el).is('option')) {\n              // Direct descendant option.\n              var optionEl = void 0;\n              if (_this71.isMultiple) {\n                optionEl = _this71._appendOptionWithIcon(_this71.$el, el, 'multiple');\n              } else {\n                optionEl = _this71._appendOptionWithIcon(_this71.$el, el);\n              }\n\n              _this71._addOptionToValueDict(el, optionEl);\n            } else if ($(el).is('optgroup')) {\n              // Optgroup.\n              var selectOptions = $(el).children('option');\n              $(_this71.dropdownOptions).append($('<li class=\"optgroup\"><span>' + el.getAttribute('label') + '</span></li>')[0]);\n\n              selectOptions.each(function (el) {\n                var optionEl = _this71._appendOptionWithIcon(_this71.$el, el, 'optgroup-option');\n                _this71._addOptionToValueDict(el, optionEl);\n              });\n            }\n          });\n        }\n\n        this.$el.after(this.dropdownOptions);\n\n        // Add input dropdown\n        this.input = document.createElement('input');\n        $(this.input).addClass('select-dropdown dropdown-trigger');\n        this.input.setAttribute('type', 'text');\n        this.input.setAttribute('readonly', 'true');\n        this.input.setAttribute('data-target', this.dropdownOptions.id);\n        if (this.el.disabled) {\n          $(this.input).prop('disabled', 'true');\n        }\n\n        this.$el.before(this.input);\n        this._setValueToInput();\n\n        // Add caret\n        var dropdownIcon = $('<svg class=\"caret\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7 10l5 5 5-5z\"/><path d=\"M0 0h24v24H0z\" fill=\"none\"/></svg>');\n        this.$el.before(dropdownIcon[0]);\n\n        // Initialize dropdown\n        if (!this.el.disabled) {\n          var dropdownOptions = $.extend({}, this.options.dropdownOptions);\n\n          // Add callback for centering selected option when dropdown content is scrollable\n          dropdownOptions.onOpenEnd = function (el) {\n            var selectedOption = $(_this71.dropdownOptions).find('.selected').first();\n\n            if (selectedOption.length) {\n              // Focus selected option in dropdown\n              M.keyDown = true;\n              _this71.dropdown.focusedIndex = selectedOption.index();\n              _this71.dropdown._focusFocusedItem();\n              M.keyDown = false;\n\n              // Handle scrolling to selected option\n              if (_this71.dropdown.isScrollable) {\n                var scrollOffset = selectedOption[0].getBoundingClientRect().top - _this71.dropdownOptions.getBoundingClientRect().top; // scroll to selected option\n                scrollOffset -= _this71.dropdownOptions.clientHeight / 2; // center in dropdown\n                _this71.dropdownOptions.scrollTop = scrollOffset;\n              }\n            }\n          };\n\n          if (this.isMultiple) {\n            dropdownOptions.closeOnClick = false;\n          }\n          this.dropdown = M.Dropdown.init(this.input, dropdownOptions);\n        }\n\n        // Add initial selections\n        this._setSelectedStates();\n      }\n\n      /**\n       * Add option to value dict\n       * @param {Element} el  original option element\n       * @param {Element} optionEl  generated option element\n       */\n\n    }, {\n      key: \"_addOptionToValueDict\",\n      value: function _addOptionToValueDict(el, optionEl) {\n        var index = Object.keys(this._valueDict).length;\n        var key = this.dropdownOptions.id + index;\n        var obj = {};\n        optionEl.id = key;\n\n        obj.el = el;\n        obj.optionEl = optionEl;\n        this._valueDict[key] = obj;\n      }\n\n      /**\n       * Remove dropdown\n       */\n\n    }, {\n      key: \"_removeDropdown\",\n      value: function _removeDropdown() {\n        $(this.wrapper).find('.caret').remove();\n        $(this.input).remove();\n        $(this.dropdownOptions).remove();\n        $(this.wrapper).before(this.$el);\n        $(this.wrapper).remove();\n      }\n\n      /**\n       * Setup dropdown\n       * @param {Element} select  select element\n       * @param {Element} option  option element from select\n       * @param {String} type\n       * @return {Element}  option element added\n       */\n\n    }, {\n      key: \"_appendOptionWithIcon\",\n      value: function _appendOptionWithIcon(select, option, type) {\n        // Add disabled attr if disabled\n        var disabledClass = option.disabled ? 'disabled ' : '';\n        var optgroupClass = type === 'optgroup-option' ? 'optgroup-option ' : '';\n        var multipleCheckbox = this.isMultiple ? \"<label><input type=\\\"checkbox\\\"\" + disabledClass + \"\\\"/><span>\" + option.innerHTML + \"</span></label>\" : option.innerHTML;\n        var liEl = $('<li></li>');\n        var spanEl = $('<span></span>');\n        spanEl.html(multipleCheckbox);\n        liEl.addClass(disabledClass + \" \" + optgroupClass);\n        liEl.append(spanEl);\n\n        // add icons\n        var iconUrl = option.getAttribute('data-icon');\n        if (!!iconUrl) {\n          var imgEl = $(\"<img alt=\\\"\\\" src=\\\"\" + iconUrl + \"\\\">\");\n          liEl.prepend(imgEl);\n        }\n\n        // Check for multiple type.\n        $(this.dropdownOptions).append(liEl[0]);\n        return liEl[0];\n      }\n\n      /**\n       * Toggle entry from option\n       * @param {String} key  Option key\n       * @return {Boolean}  if entry was added or removed\n       */\n\n    }, {\n      key: \"_toggleEntryFromArray\",\n      value: function _toggleEntryFromArray(key) {\n        var notAdded = !this._keysSelected.hasOwnProperty(key);\n        var $optionLi = $(this._valueDict[key].optionEl);\n\n        if (notAdded) {\n          this._keysSelected[key] = true;\n        } else {\n          delete this._keysSelected[key];\n        }\n\n        $optionLi.toggleClass('selected', notAdded);\n\n        // Set checkbox checked value\n        $optionLi.find('input[type=\"checkbox\"]').prop('checked', notAdded);\n\n        // use notAdded instead of true (to detect if the option is selected or not)\n        $optionLi.prop('selected', notAdded);\n\n        return notAdded;\n      }\n\n      /**\n       * Set text value to input\n       */\n\n    }, {\n      key: \"_setValueToInput\",\n      value: function _setValueToInput() {\n        var values = [];\n        var options = this.$el.find('option');\n\n        options.each(function (el) {\n          if ($(el).prop('selected')) {\n            var text = $(el).text();\n            values.push(text);\n          }\n        });\n\n        if (!values.length) {\n          var firstDisabled = this.$el.find('option:disabled').eq(0);\n          if (firstDisabled.length && firstDisabled[0].value === '') {\n            values.push(firstDisabled.text());\n          }\n        }\n\n        this.input.value = values.join(', ');\n      }\n\n      /**\n       * Set selected state of dropdown to match actual select element\n       */\n\n    }, {\n      key: \"_setSelectedStates\",\n      value: function _setSelectedStates() {\n        this._keysSelected = {};\n\n        for (var key in this._valueDict) {\n          var option = this._valueDict[key];\n          var optionIsSelected = $(option.el).prop('selected');\n          $(option.optionEl).find('input[type=\"checkbox\"]').prop('checked', optionIsSelected);\n          if (optionIsSelected) {\n            this._activateOption($(this.dropdownOptions), $(option.optionEl));\n            this._keysSelected[key] = true;\n          } else {\n            $(option.optionEl).removeClass('selected');\n          }\n        }\n      }\n\n      /**\n       * Make option as selected and scroll to selected position\n       * @param {jQuery} collection  Select options jQuery element\n       * @param {Element} newOption  element of the new option\n       */\n\n    }, {\n      key: \"_activateOption\",\n      value: function _activateOption(collection, newOption) {\n        if (newOption) {\n          if (!this.isMultiple) {\n            collection.find('li.selected').removeClass('selected');\n          }\n          var option = $(newOption);\n          option.addClass('selected');\n        }\n      }\n\n      /**\n       * Get Selected Values\n       * @return {Array}  Array of selected values\n       */\n\n    }, {\n      key: \"getSelectedValues\",\n      value: function getSelectedValues() {\n        var selectedValues = [];\n        for (var key in this._keysSelected) {\n          selectedValues.push(this._valueDict[key].el.value);\n        }\n        return selectedValues;\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(FormSelect.__proto__ || Object.getPrototypeOf(FormSelect), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_FormSelect;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return FormSelect;\n  }(Component);\n\n  M.FormSelect = FormSelect;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(FormSelect, 'formSelect', 'M_FormSelect');\n  }\n})(cash);\n;(function ($, anim) {\n  'use strict';\n\n  var _defaults = {};\n\n  /**\n   * @class\n   *\n   */\n\n  var Range = function (_Component21) {\n    _inherits(Range, _Component21);\n\n    /**\n     * Construct Range instance\n     * @constructor\n     * @param {Element} el\n     * @param {Object} options\n     */\n    function Range(el, options) {\n      _classCallCheck(this, Range);\n\n      var _this72 = _possibleConstructorReturn(this, (Range.__proto__ || Object.getPrototypeOf(Range)).call(this, Range, el, options));\n\n      _this72.el.M_Range = _this72;\n\n      /**\n       * Options for the range\n       * @member Range#options\n       */\n      _this72.options = $.extend({}, Range.defaults, options);\n\n      _this72._mousedown = false;\n\n      // Setup\n      _this72._setupThumb();\n\n      _this72._setupEventHandlers();\n      return _this72;\n    }\n\n    _createClass(Range, [{\n      key: \"destroy\",\n\n\n      /**\n       * Teardown component\n       */\n      value: function destroy() {\n        this._removeEventHandlers();\n        this._removeThumb();\n        this.el.M_Range = undefined;\n      }\n\n      /**\n       * Setup Event Handlers\n       */\n\n    }, {\n      key: \"_setupEventHandlers\",\n      value: function _setupEventHandlers() {\n        this._handleRangeChangeBound = this._handleRangeChange.bind(this);\n        this._handleRangeMousedownTouchstartBound = this._handleRangeMousedownTouchstart.bind(this);\n        this._handleRangeInputMousemoveTouchmoveBound = this._handleRangeInputMousemoveTouchmove.bind(this);\n        this._handleRangeMouseupTouchendBound = this._handleRangeMouseupTouchend.bind(this);\n        this._handleRangeBlurMouseoutTouchleaveBound = this._handleRangeBlurMouseoutTouchleave.bind(this);\n\n        this.el.addEventListener('change', this._handleRangeChangeBound);\n\n        this.el.addEventListener('mousedown', this._handleRangeMousedownTouchstartBound);\n        this.el.addEventListener('touchstart', this._handleRangeMousedownTouchstartBound);\n\n        this.el.addEventListener('input', this._handleRangeInputMousemoveTouchmoveBound);\n        this.el.addEventListener('mousemove', this._handleRangeInputMousemoveTouchmoveBound);\n        this.el.addEventListener('touchmove', this._handleRangeInputMousemoveTouchmoveBound);\n\n        this.el.addEventListener('mouseup', this._handleRangeMouseupTouchendBound);\n        this.el.addEventListener('touchend', this._handleRangeMouseupTouchendBound);\n\n        this.el.addEventListener('blur', this._handleRangeBlurMouseoutTouchleaveBound);\n        this.el.addEventListener('mouseout', this._handleRangeBlurMouseoutTouchleaveBound);\n        this.el.addEventListener('touchleave', this._handleRangeBlurMouseoutTouchleaveBound);\n      }\n\n      /**\n       * Remove Event Handlers\n       */\n\n    }, {\n      key: \"_removeEventHandlers\",\n      value: function _removeEventHandlers() {\n        this.el.removeEventListener('change', this._handleRangeChangeBound);\n\n        this.el.removeEventListener('mousedown', this._handleRangeMousedownTouchstartBound);\n        this.el.removeEventListener('touchstart', this._handleRangeMousedownTouchstartBound);\n\n        this.el.removeEventListener('input', this._handleRangeInputMousemoveTouchmoveBound);\n        this.el.removeEventListener('mousemove', this._handleRangeInputMousemoveTouchmoveBound);\n        this.el.removeEventListener('touchmove', this._handleRangeInputMousemoveTouchmoveBound);\n\n        this.el.removeEventListener('mouseup', this._handleRangeMouseupTouchendBound);\n        this.el.removeEventListener('touchend', this._handleRangeMouseupTouchendBound);\n\n        this.el.removeEventListener('blur', this._handleRangeBlurMouseoutTouchleaveBound);\n        this.el.removeEventListener('mouseout', this._handleRangeBlurMouseoutTouchleaveBound);\n        this.el.removeEventListener('touchleave', this._handleRangeBlurMouseoutTouchleaveBound);\n      }\n\n      /**\n       * Handle Range Change\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleRangeChange\",\n      value: function _handleRangeChange() {\n        $(this.value).html(this.$el.val());\n\n        if (!$(this.thumb).hasClass('active')) {\n          this._showRangeBubble();\n        }\n\n        var offsetLeft = this._calcRangeOffset();\n        $(this.thumb).addClass('active').css('left', offsetLeft + 'px');\n      }\n\n      /**\n       * Handle Range Mousedown and Touchstart\n       * @param {Event} e\n       */\n\n    }, {\n      key: \"_handleRangeMousedownTouchstart\",\n      value: function _handleRangeMousedownTouchstart(e) {\n        // Set indicator value\n        $(this.value).html(this.$el.val());\n\n        this._mousedown = true;\n        this.$el.addClass('active');\n\n        if (!$(this.thumb).hasClass('active')) {\n          this._showRangeBubble();\n        }\n\n        if (e.type !== 'input') {\n          var offsetLeft = this._calcRangeOffset();\n          $(this.thumb).addClass('active').css('left', offsetLeft + 'px');\n        }\n      }\n\n      /**\n       * Handle Range Input, Mousemove and Touchmove\n       */\n\n    }, {\n      key: \"_handleRangeInputMousemoveTouchmove\",\n      value: function _handleRangeInputMousemoveTouchmove() {\n        if (this._mousedown) {\n          if (!$(this.thumb).hasClass('active')) {\n            this._showRangeBubble();\n          }\n\n          var offsetLeft = this._calcRangeOffset();\n          $(this.thumb).addClass('active').css('left', offsetLeft + 'px');\n          $(this.value).html(this.$el.val());\n        }\n      }\n\n      /**\n       * Handle Range Mouseup and Touchend\n       */\n\n    }, {\n      key: \"_handleRangeMouseupTouchend\",\n      value: function _handleRangeMouseupTouchend() {\n        this._mousedown = false;\n        this.$el.removeClass('active');\n      }\n\n      /**\n       * Handle Range Blur, Mouseout and Touchleave\n       */\n\n    }, {\n      key: \"_handleRangeBlurMouseoutTouchleave\",\n      value: function _handleRangeBlurMouseoutTouchleave() {\n        if (!this._mousedown) {\n          var paddingLeft = parseInt(this.$el.css('padding-left'));\n          var marginLeft = 7 + paddingLeft + 'px';\n\n          if ($(this.thumb).hasClass('active')) {\n            anim.remove(this.thumb);\n            anim({\n              targets: this.thumb,\n              height: 0,\n              width: 0,\n              top: 10,\n              easing: 'easeOutQuad',\n              marginLeft: marginLeft,\n              duration: 100\n            });\n          }\n          $(this.thumb).removeClass('active');\n        }\n      }\n\n      /**\n       * Setup dropdown\n       */\n\n    }, {\n      key: \"_setupThumb\",\n      value: function _setupThumb() {\n        this.thumb = document.createElement('span');\n        this.value = document.createElement('span');\n        $(this.thumb).addClass('thumb');\n        $(this.value).addClass('value');\n        $(this.thumb).append(this.value);\n        this.$el.after(this.thumb);\n      }\n\n      /**\n       * Remove dropdown\n       */\n\n    }, {\n      key: \"_removeThumb\",\n      value: function _removeThumb() {\n        $(this.thumb).remove();\n      }\n\n      /**\n       * morph thumb into bubble\n       */\n\n    }, {\n      key: \"_showRangeBubble\",\n      value: function _showRangeBubble() {\n        var paddingLeft = parseInt($(this.thumb).parent().css('padding-left'));\n        var marginLeft = -7 + paddingLeft + 'px'; // TODO: fix magic number?\n        anim.remove(this.thumb);\n        anim({\n          targets: this.thumb,\n          height: 30,\n          width: 30,\n          top: -30,\n          marginLeft: marginLeft,\n          duration: 300,\n          easing: 'easeOutQuint'\n        });\n      }\n\n      /**\n       * Calculate the offset of the thumb\n       * @return {Number}  offset in pixels\n       */\n\n    }, {\n      key: \"_calcRangeOffset\",\n      value: function _calcRangeOffset() {\n        var width = this.$el.width() - 15;\n        var max = parseFloat(this.$el.attr('max')) || 100; // Range default max\n        var min = parseFloat(this.$el.attr('min')) || 0; // Range default min\n        var percent = (parseFloat(this.$el.val()) - min) / (max - min);\n        return percent * width;\n      }\n    }], [{\n      key: \"init\",\n      value: function init(els, options) {\n        return _get(Range.__proto__ || Object.getPrototypeOf(Range), \"init\", this).call(this, this, els, options);\n      }\n\n      /**\n       * Get Instance\n       */\n\n    }, {\n      key: \"getInstance\",\n      value: function getInstance(el) {\n        var domElem = !!el.jquery ? el[0] : el;\n        return domElem.M_Range;\n      }\n    }, {\n      key: \"defaults\",\n      get: function () {\n        return _defaults;\n      }\n    }]);\n\n    return Range;\n  }(Component);\n\n  M.Range = Range;\n\n  if (M.jQueryLoaded) {\n    M.initializeJqueryWrapper(Range, 'range', 'M_Range');\n  }\n\n  Range.init($('input[type=range]'));\n})(cash, M.anime);\n"
  },
  {
    "path": "resources/assets/css/app.css",
    "content": "body {\n    background-color: lightgray;\n}\n"
  },
  {
    "path": "resources/assets/js/app.js",
    "content": "/*\n * Welcome to your app's main JavaScript file!\n *\n * We recommend including the built version of this JavaScript file\n * (and its CSS file) in your base layout (base.html.twig).\n */\n\n// any CSS you require will output into a single css file (app.css in this case)\nrequire('../css/app.css');\n\n// Need jQuery? Install it with \"yarn add jquery\", then uncomment to require it.\n// const $ = require('jquery');\n\nconsole.log('Hello Webpack Encore! Edit me in assets/js/app.js');\n"
  },
  {
    "path": "resources/templates/admin/command/list.twig",
    "content": "{# templates/admin/list.html.twig #}\n{% extends '@EasyAdmin/default/list.html.twig' %}\n{% block table_body %}\n    <style>\n        .company, .company:hover {\n            background-color: steelblue !important;\n            color: white !important;\n        }\n    </style>\n    {% for item in commandsWithCompany %}\n        {% if item.id is not defined %}\n            <tr class=\"company\">\n                <td class=\"company\" colspan=\"{{ fields|length }}\">{{ item }}</td>\n            </tr>\n        {% else %}\n            {# the empty string concatenation is needed when the primary key is an object (e.g. an Uuid object) #}\n            {% set _item_id = '' ~ attribute(item, _entity_config.primary_key_field_name) %}\n            <tr data-id=\"{{ _item_id }}\">\n                {% for field, metadata in fields %}\n                    {% set isSortingField = metadata.property == app.request.get('sortField') %}\n                    {% set _column_label =  (metadata.label ?: field|humanize)|trans(_trans_parameters) %}\n\n                    <td class=\"{{ isSortingField ? 'sorted' }} {{ metadata.dataType|lower }} {{ metadata.css_class }}\" {{ easyadmin_config('design.rtl') ? 'dir=\"rtl\"' }}>\n                        {{ easyadmin_render_field_for_list_view(_entity_config.name, item, metadata) }}\n                    </td>\n                {% endfor %}\n            </tr>\n        {% endif %}\n\n    {% else %}\n        <tr>\n            <td class=\"no-results\" colspan=\"{{ _list_item_actions|length > 0 ? fields|length + 1 : fields|length }}\">\n                {{ 'search.no_results'|trans(_trans_parameters, 'EasyAdminBundle') }}\n            </td>\n        </tr>\n    {% endfor %}\n{% endblock table_body %}\n\n{% block content_footer %}\n    <div class=\"list-pagination-counter\">\n        <strong>{{ total }}</strong> résultats\n    </div>\n{% endblock %}\n"
  },
  {
    "path": "resources/templates/base_resto.html.twig",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"css/materialize.min.css\" media=\"screen,projection\"/>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"css/seat.css\" media=\"screen,projection\"/>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"css/seat-base.css\" media=\"screen,projection\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>\n    <title>{% block title %}S'eat restaurant{% endblock %}</title>\n    {% block stylesheets %}{% endblock %}\n    <link rel=\"icon\" type=\"image/x-icon\" href=\"/ico/favicon.ico\"/>\n    <link rel=\"apple-touch-icon\" sizes=\"57x57\" href=\"/ico/apple-icon-57x57\"/>\n    <link rel=\"apple-touch-icon\" sizes=\"60x60\" href=\"/ico/apple-icon-60x60\"/>\n    <link rel=\"apple-touch-icon\" sizes=\"72x72\" href=\"/ico/apple-icon-72x72\"/>\n    <link rel=\"apple-touch-icon\" sizes=\"76x76\" href=\"/ico/apple-icon-76x76\"/>\n    <link rel=\"apple-touch-icon\" sizes=\"114x114\" href=\"/ico/apple-icon-114x114\"/>\n    <link rel=\"apple-touch-icon\" sizes=\"120x120\" href=\"/ico/apple-icon-120x120\"/>\n    <link rel=\"apple-touch-icon\" sizes=\"144x144\" href=\"/ico/apple-icon-144x144\"/>\n    <link rel=\"apple-touch-icon\" sizes=\"152x152\" href=\"/ico/apple-icon-152x152\"/>\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/ico/apple-icon-180x180\"/>\n    <link rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/ico/android-icon-192x192\"/>\n    <link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"/ico/favicon-96x96\"/>\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/ico/favicon-16x16\"/>\n</head>\n<body>\n<nav>\n    <div class=\"nav-wrapper seat-green\">\n        <div class=\"container\">\n            <a href=\"{{ path('home') }}\" class=\"brand-logo\" style=\"height: 100%\">\n                <img src=\"/images/logo_small.png\" alt=\"Logo S'eat restaurant\" height=\"100%\"/>\n            </a>\n            <a href=\"#\" data-target=\"seat-nav\" class=\"sidenav-trigger\"><i class=\"material-icons\">menu</i></a>\n            <ul id=\"nav-mobile\" class=\"right hide-on-med-and-down\">\n                <li><a href=\"{{ path('menu.show') }}\">Take away</a></li>\n                <li><a href=\"{{ path('menu.salle') }}\">Menu</a></li>\n                <li><a href=\"{{ path('business-lunch') }}\">Business lunch</a></li>\n                <li><a href=\"{{ path('contact') }}\">Contact</a></li>\n                <li style=\"width: 150px\">\n                    <a class=\"dropdown-trigger\" href=\"#!\" data-target=\"user-menu\">\n                        <i class=\"material-icons right\">person</i>\n                    </a>\n                </li>\n            </ul>\n            <ul id=\"user-menu\" class=\"dropdown-content\">\n                {% if app.user %}\n                    <li><a href=\"{{ path('user.my-info') }}\">{{ app.user.fullName() }}</a></li>\n                    <li><a href=\"{{ path('logout') }}\">Se déconnecter</a></li>\n                {% else %}\n                    <li><a href=\"{{ path('login') }}\">Login</a></li>\n                    <li><a href=\"{{ path('register') }}\">S'enregistrer</a></li>\n                {% endif %}\n            </ul>\n            <ul class=\"sidenav\" id=\"seat-nav\">\n                <li><a href=\"{{ path('menu.show') }}\">Take away</a></li>\n                <li><a href=\"{{ path('menu.salle') }}\">Menu</a></li>\n                <li><a href=\"{{ path('business-lunch') }}\">Business lunch</a></li>\n                <li><a href=\"{{ path('contact') }}\">Contact</a></li>\n                <li>\n                    <div class=\"divider\"></div>\n                </li>\n                {% if app.user %}\n                    <li><a href=\"{{ path('user.my-info') }}\">{{ app.user.fullName() }}</a></li>\n                    <li><a href=\"{{ path('logout') }}\">Se déconnecter</a></li>\n                {% else %}\n                    <li><a href=\"{{ path('login') }}\">Login</a></li>\n                    <li><a href=\"{{ path('register') }}\">S'enregistrer</a></li>\n                {% endif %}\n            </ul>\n        </div>\n    </div>\n</nav>\n<ul id=\"user-menu\" class=\"dropdown-content\">\n    <li><a href=\"#!\">one</a></li>\n    <li><a href=\"#!\">two</a></li>\n    <li class=\"divider\"></li>\n    <li><a href=\"#!\">three</a></li>\n</ul>\n\n<div class=\"container seat-main-container\">\n    {% for label, flashes in app.session.flashbag.all %}\n\n        {% for flash in flashes %}\n            {% if label == 'success' %}\n                <div class=\"card-panel green\"><i class=\"material-icons inline-icon\">check</i> {{ flash|trans }}</div>\n            {% elseif label == 'warning' %}\n                <div class=\"card-panel orange\"><i class=\"material-icons inline-icon\">warning</i> {{ flash|trans }}</div>\n            {% elseif label == 'error' %}\n                <div class=\"card-panel red\"><i class=\"material-icons inline-icon\">error</i> {{ flash|trans }}</div>\n            {% endif %}\n        {% endfor %}\n    {% endfor %}\n    {% block body %}{% endblock %}\n</div>\n{% if\n    showBasketMobileMenu is defined\n    and basket is defined\n    and orderType is defined\n    and orderType is not null\n    and basket is not null\n    and basket.products > 0\n    and orderType.error() == null %}\n    <div class=\"footer-to-order-on-mobile hide-on-med-and-up\">\n        <a class=\"btn btn-full\" href=\"{{ path('basket') }}\">Commander ({{ basket.totalPrice }} €)</a>\n    </div>\n{% endif %}\n\n\n<script type=\"text/javascript\" src=\"js/materialize.min.js\"></script>\n<script>\n    document.addEventListener('DOMContentLoaded', function () {\n        M.Sidenav.init(document.querySelectorAll('.sidenav'));\n        M.Dropdown.init(document.querySelectorAll('.dropdown-trigger'), {hover: false});\n    });\n</script>\n{% block javascripts %}{% endblock %}\n</body>\n</html>\n"
  },
  {
    "path": "resources/templates/bundles/EasyAdminBundle/default/layout.html.twig",
    "content": "{# DO THIS: the '!' symbol tells Symfony to extend from the original template #}\n{% extends '@!EasyAdmin/default/layout.html.twig' %}\n"
  },
  {
    "path": "resources/templates/component/download.html.twig",
    "content": "<p class=\"center-align\">\n    <a href=\"{{ pdf_path }}/{{ pdf.pdf|url_encode }}\" target=\"_blank\">{{ pdf.text }}</a>\n</p>\n"
  },
  {
    "path": "resources/templates/default/registration_complete.html.twig",
    "content": "{% extends 'base_resto.html.twig' %}\n\n{% block body %}\n    <div class=\"row seat-border\">\n        {{ 'registration-complete'|content }}\n    </div>\n{% endblock %}\n"
  },
  {
    "path": "resources/templates/form/field-new.html.twig",
    "content": "{{ form_widget(form[fieldName],{attr:{class:errors[fieldName] is defined ? 'invalid':''}}) }}\n{{ form_label(form[fieldName]) }}\n{% if errors[fieldName] is defined %}\n    <span class=\"helper-text\" data-error=\"{{ errors[fieldName]|trans }}\"></span>\n{% endif %}\n"
  },
  {
    "path": "resources/templates/form/field.html.twig",
    "content": "{{ form_widget(form[fieldName],{value: attribute(formValues, fieldName) ,attr:{class:errors[fieldName] ? 'invalid':''}}) }}\n{{ form_label(form[fieldName]) }}\n{% if errors[fieldName] %}\n    <span class=\"helper-text\" data-error=\"{{ errors[fieldName]|trans }}\"></span>\n{% endif %}\n"
  },
  {
    "path": "resources/templates/order/confirm-basket.html.twig",
    "content": "{#{% if orderType != null %}#}\n{#    {% if orderType.error() == null %}#}\n        {% if basket.count() > 0 %}\n\n            {{ form_start(form) }}\n            {{ form_widget(form) }}\n            <button type=\"submit\" class=\"btn btn-full\">Finaliser la commande</button>\n            {{ form_end(form) }}\n        {% endif %}\n{#    {% else %}#}\n{#        <div class=\"card-panel red lighten-3\">{{ orderType.error().getMessage()|trans }}</div>#}\n{#    {% endif %}#}\n{#{% endif %}#}\n"
  },
  {
    "path": "resources/templates/order/go-to-confirm-basket.html.twig",
    "content": "{% if orderType != null %}\n    {% if orderType.error() == null %}\n        {% if basket.products|length > 0 %}\n            <a class=\"btn btn-full\" href=\"{{ path('basket') }}\">Commander</a>\n        {% endif %}\n    {% else %}\n        <div class=\"card-panel red lighten-3\">{{ orderType.error().getMessage()|trans }}</div>\n    {% endif %}\n{% endif %}\n"
  },
  {
    "path": "resources/templates/order/summary.html.twig",
    "content": "<ul class=\"panier\">\n    {% for product in basket.products %}\n        <li class=\"panier-item\">\n            <div class=\"product-info\">\n                <div class=\"product-name\">{% if product.quantity > 1 %}{{ product.quantity }} x {% endif %}\n                    {{ product.name }}</div>\n                <div class=\"product-price\">{{ product.totalPrice }} €</div>\n            </div>\n            <ul>\n                {% if product.option is not null %}\n                    <li>\n                    <i class=\"tiny material-icons inline-icon\">chevron_right</i>\n                    {{ product.option }}\n                    </li>{% endif %}\n                {% for supplement in product.supplements %}\n                    <li><i class=\"tiny material-icons inline-icon\">add_circle</i> {{ supplement }}\n                    </li>\n                {% endfor %}\n                {% if product.comment is not empty %}\n                    <li><i class=\"tiny material-icons inline-icon\">comment</i> {{ product.comment }}\n                    </li>{% endif %}\n                <li>\n                    <form action=\"{{ path('basket.delete',{basketId:product.id}) }}\" method=\"post\">\n                        <a href=\"#!\" class=\"submiter remove-from-basket\">Supprimer</a>\n                    </form>\n                </li>\n            </ul>\n\n            <div class=\"divider\"></div>\n        </li>\n    {% endfor %}\n</ul>\n{% if basket.products|length > 0 %}\n    <div class=\"panier-total\">\n        <div class=\"panier-total-price\">\n            <div class=\"panier-total-price-label\">Total</div>\n            <div>{{ basket.totalPrice }} €</div>\n        </div>\n\n        <div class=\"divider\"></div>\n    </div>\n{% endif %}\n<script>\n    var submiters = document.querySelectorAll('.submiter');\n    for (var i = 0; i < submiters.length; i++) {\n        submiters[i].addEventListener('click', function (a, b) {\n            a.target.parentNode.submit();\n        });\n    }\n</script>\n"
  },
  {
    "path": "resources/templates/order/the-menu.html.twig",
    "content": "<div id=\"vue-app\">\n    {% verbatim %}\n    <div id=\"product-modal\" class=\"modal modal-fixed-footer\">\n        <form :action=\"addUrl\" method=\"post\">\n            <div class=\"modal-content\">\n                <a href=\"#!\" class=\"modal-close right\"><i class=\"medium material-icons\">close</i></a>\n                <h4 class=\"title\">{{selectedProduct.name}}</h4>\n                <input name=\"basket[productId]\" type=\"hidden\" :value=\"selectedProduct.value\"/>\n                <input name=\"basket[quantity]\" type=\"hidden\" :value=\"quantity\" min=\"1\" pattern=\"[0-9]+\" required/>\n                <div v-if=\"selectedCategory && selectedCategory.options && selectedCategory.options.length > 0\">\n                    <div class=\"sector flow-text\">Option</div>\n                    <div class=\"options\">\n                        <select name=\"basket[optionId]\" class=\"browser-default\">\n                            <option v-for=\"option in selectedCategory.options\" :value=\"option.value\">{{option.text}}</option>\n                        </select>\n                    </div>\n                </div>\n                <div v-if=\"selectedCategory.supplements && selectedCategory.supplements.length > 0\">\n                    <div class=\"sector flow-text\">Suppléments</div>\n                    <div class=\"supplements\">\n                        <p v-for=\"supplement in selectedCategory.supplements\">\n                          <label>\n                            <input type=\"checkbox\" name=\"basket[supplementIds][]\" :value=\"supplement.value\"/>\n                            <span>{{supplement.text}}</span>\n                          </label>\n                        </p>\n                    </div>\n                </div>\n                <div class=\"sector flow-text\">Commentaires</div>\n\n                <div class=\"comments\">\n                    <input name=\"basket[comment]\" placeholder=\"Ajouter une note (Sans tomate, etc...)\"/>\n                </div>\n            </div>\n            <div class=\"modal-footer\">\n                <div class=\"modal-sub-footer\">\n                <div class=\"quantity-zone\">\n                    <a class=\"waves-effect waves-light btn\"@click=\"removeQuantity()\"><i class=\"large material-icons\">remove</i></a>\n                    <span class=\"quantity\">{{quantity}}</span>\n                    <a class=\"waves-effect waves-light btn\" @click=\"addQuantity()\"><i class=\"large material-icons\">add</i></a>\n                </div>\n                <button type=\"submit\" class=\"add modal-close waves-effect waves-green btn-flat\">Ajouter</button>\n                </div>\n            </div>\n        </form>\n    </div>\n    <template v-for=\"category in menu\">\n        <h2 class=\"category seat-text-green2\"> {{ category.name }}</h2>\n        <ul class=\"products\">\n            <li class=\"product waves-effect waves-light modal-trigger\"\n                href=\"#product-modal\"\n                v-for=\"product in category.products\"\n                @click=\"select(product,category)\">\n                <div class=\"product-info\">\n                    <div class=\"product-name\">{{ product.name }}</div>\n                    <div class=\"product-price\">{{ product.price }} €</div>\n                </div>\n                <div class=\"product-description\" v-if=\"product.description\">{{ product.description }}</div>\n            </li>\n        </ul>\n    </template>\n    {% endverbatim %}\n</div>\n"
  },
  {
    "path": "resources/templates/page/basket.html.twig",
    "content": "{% extends 'base_resto.html.twig' %}\n\n{% block body %}\n    <div class=\"row\">\n        <div class=\"col m6 s12\">\n            <div class=\"card\">\n                <div class=\"card-content\">\n                    {% include 'order/summary.html.twig' with { basket:basket } only %}\n                </div>\n            </div>\n        </div>\n        <div class=\"col m6 s12\">\n            <div class=\"card\">\n                <div class=\"card-content\">\n                    <div class=\"panier-total\">\n                        <div class=\"panier-total-price\">\n                            <div class=\"panier-total-price-label\">Paiement</div>\n                            <div>Via facture</div>\n                        </div>\n                        <div class=\"panier-total-price\">\n                            <div class=\"panier-total-price-label\">Type de commande</div>\n                            <div>{{ form.orderTypeName.vars.value|trans }}</div>\n                        </div>\n                        <div class=\"divider\"></div>\n                    </div>\n\n                    {% if form.orderTypeName.vars.value %}\n                        {% include 'order/confirm-basket.html.twig' with { form:form, basket:basket } only %}\n                    {% endif %}\n                </div>\n            </div>\n        </div>\n    </div>\n{% endblock %}\n"
  },
  {
    "path": "resources/templates/page/business-lunch.html.twig",
    "content": "{% extends 'base_resto.html.twig' %}\n\n{% block body %}\n\n    <div class=\"card\">\n        <div class=\"card-content\">\n            {{ 'business-lunch'|content }}\n\n            {{ 'business-lunch-waterloo'|download }}\n            {{ 'business-lunch-genval'|download }}</div>\n    </div>\n\n{% endblock %}\n\n"
  },
  {
    "path": "resources/templates/page/contact.html.twig",
    "content": "{% extends 'base_resto.html.twig' %}\n\n{% block body %}\n\n    <div class=\"card\">\n        <div class=\"card-content\">{{ 'contact'|content }}</div>\n    </div>\n\n{% endblock %}\n\n"
  },
  {
    "path": "resources/templates/page/home.html.twig",
    "content": "{% extends 'base_resto.html.twig' %}\n\n{% block body %}\n    <div class=\"card hide-on-small-only\">\n        <div class=\"card-content\">\n            <div class=\"slider\">\n                <h1>{{ title }}</h1>\n                <label>\n                    <input type=\"text\"/>\n                </label>\n                <button>{{ searchButtonLabel }}</button>\n                <ul class=\"products\">\n                    {% for product in products %}\n                        <li>\n                            {% if product.isAvailable %}\n                                <a href=\"{{ path('profiler',{id:product.id }) }}\">\n                                    {{ product.name }}\n                                </a>\n                            {% else %}\n                                <span>{{ product.name }}</span>\n                            {% endif %}\n                        </li>\n                    {% endfor %}\n                </ul>\n            </div>\n        </div>\n    </div>\n\n    <div class=\"card\">\n        <div class=\"card-content\">{{ 'presentation'|raw }}</div>\n    </div>\n{% endblock %}\n\n\n{% block javascripts %}\n    <script type=\"text/javascript\">\n      document.addEventListener('DOMContentLoaded', function () {\n        M.Slider.init(document.querySelectorAll('.slider'), {});\n      });\n    </script>\n{% endblock %}\n"
  },
  {
    "path": "resources/templates/page/login.html.twig",
    "content": "{% extends 'base_resto.html.twig' %}\n\n{% block body %}\n    <div class=\"card\">\n        <div class=\"card-content\">\n            <div class=\"container\">\n\n                {% if error %}\n                    <div class=\"card-panel red lighten-2 seat-message\">{{ error.messageKey|trans }}</div>\n                {% endif %}\n                <div class=\"row\">\n                    <form action=\"{{ path('login_check') }}\" method=\"post\" class=\"col push-l3 l6 m12 s12\">\n                        <div class=\"row\">\n                            <div class=\"input-field col s12\">\n                                <input type=\"hidden\" name=\"_csrf_token\" value=\"{{ csrf_token('authenticate') }}\">\n                                <input type=\"text\" id=\"email\" name=\"email\" value=\"{{ last_username }}\"\n                                       class=\"validate\"/>\n                                <label for=\"email\">Email</label>\n                            </div>\n                        </div>\n                        <div class=\"row\">\n                            <div class=\"input-field col s12\">\n                                <input type=\"password\" id=\"password\" name=\"password\" class=\"validate\"/>\n                                <label for=\"password\">Password</label>\n                            </div>\n                        </div>\n                        <div class=\"row\">\n                            <div class=\"input-field col s12\">\n                                <button type=\"submit\" class=\"btn btn-full\">login</button>\n                            </div>\n                        </div>\n\n                    </form>\n                </div>\n            </div>\n\n        </div>\n    </div>\n\n{% endblock %}\n"
  },
  {
    "path": "resources/templates/page/menu-salle.html.twig",
    "content": "{% extends 'base_resto.html.twig' %}\n\n{% block body %}\n    <div class=\"card\">\n        <div class=\"card-content\">\n            {{ 'menu-salle'|content }}\n\n            {{ 'menu-salle-waterloo'|download }}\n            {{ 'menu-salle-genval'|download }}\n        </div>\n    </div>\n{% endblock %}\n"
  },
  {
    "path": "resources/templates/page/order-done.html.twig",
    "content": "{% extends 'base_resto.html.twig' %}\n\n{% block body %}\n    <div class=\"card\">\n        <div class=\"card-content\">\n            {{ 'order-complete'|content }}\n        </div>\n    </div>\n{% endblock %}\n"
  },
  {
    "path": "resources/templates/page/register-complete.html.twig",
    "content": "{% extends 'base_resto.html.twig' %}\n\n{% block body %}\n    <div class=\"card\">\n        <div class=\"card-content\">\n            {{ 'registration-complete'|content }}\n        </div>\n    </div>\n{% endblock %}\n"
  },
  {
    "path": "resources/templates/page/register.html.twig",
    "content": "{% extends 'base_resto.html.twig' %}\n\n{% block body %}\n    <div class=\"card\">\n        <div class=\"card-content\">\n            {{ 'register'|content }}\n        </div>\n    </div>\n    <div class=\"card\">\n        <div class=\"card-content\">\n            <div class=\"row\">\n                {{ form_start(form, {'attr': {'class': 'col push-l2 l8 m12 s12','novalidate':'novalidate'} }) }}\n                <div class=\"row\">\n                    <div class=\"input-field col s12\">\n                        {{ form_widget(form.companyName,{attr:{class:viewModel.errors.companyName is defined ? 'invalid':''}}) }}\n                        {{ form_label(form.companyName) }}\n                        {% if viewModel.errors.companyName is defined %}\n                            <span class=\"helper-text\" data-error=\"{{ viewModel.errors.companyName|trans }}\"></span>\n                        {% endif %}\n                    </div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"input-field col s6\">\n                        {{ form_widget(form.firstName,{attr:{class:viewModel.errors.firstName is defined ? 'invalid':''}}) }}\n                        {{ form_label(form.firstName) }}\n                        {% if viewModel.errors.firstName  is defined%}\n                            <span class=\"helper-text\" data-error=\"{{ viewModel.errors.firstName|trans }}\"></span>\n                        {% endif %}\n                    </div>\n                    <div class=\"input-field col s6\">\n                        {{ form_widget(form.lastName,{attr:{class:viewModel.errors.lastName is defined ? 'invalid':''}}) }}\n                        {{ form_label(form.lastName) }}\n                        {% if viewModel.errors.lastName  is defined%}\n                            <span class=\"helper-text\" data-error=\"{{ viewModel.errors.lastName|trans }}\"></span>\n                        {% endif %}\n                    </div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"input-field col s6\">\n                        {{ form_widget(form.email,{attr:{class:viewModel.errors.email is defined? 'invalid':''}}) }}\n                        {{ form_label(form.email) }}\n                        {% if viewModel.errors.email is defined %}\n                            <span class=\"helper-text\" data-error=\"{{ viewModel.errors.email|trans }}\"></span>\n                        {% endif %}\n                    </div>\n                    <div class=\"input-field col s6\">\n                        {{ form_widget(form.phoneNumber,{attr:{class:viewModel.errors.phoneNumber is defined ? 'invalid':''}}) }}\n                        {{ form_label(form.phoneNumber) }}\n                        {% if viewModel.errors.phoneNumber is defined %}\n                            <span class=\"helper-text\" data-error=\"{{ viewModel.errors.phoneNumber|trans }}\"></span>\n                        {% endif %}\n                    </div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"input-field col s12\">\n                        {{ form_widget(form.password,{attr:{class:viewModel.errors.password is defined ? 'invalid':''}}) }}\n                        {{ form_label(form.password) }}\n                        {% if viewModel.errors.password is defined %}\n                            <span class=\"helper-text\" data-error=\"{{ viewModel.errors.password|trans }}\"></span>\n                        {% endif %}\n                    </div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"input-field col s12\">\n                        {{ form_widget(form.store) }}\n                        {{ form_label(form.store) }}\n                    </div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"input-field col s12\">\n                        <button type=\"submit\" class=\"btn btn-full\">S'inscrire</button>\n                    </div>\n                </div>\n                {{ form_end(form) }}\n            </div>\n        </div>\n    </div>\n\n{% endblock %}\n{% block javascripts %}\n    <script>\n        document.addEventListener('DOMContentLoaded', function () {\n            var selects = document.querySelectorAll('select');\n            M.FormSelect.init(selects, {});\n        });\n    </script>\n{% endblock %}\n"
  },
  {
    "path": "resources/templates/page/take-away.html.twig",
    "content": "{% extends 'base_resto.html.twig' %}\n\n{% block javascripts %}\n    <script src=\"https://cdn.jsdelivr.net/npm/vue/dist/vue.js\"></script>\n    <script>\n        document.addEventListener('DOMContentLoaded', function () {\n            var elems = document.querySelectorAll('.modal');\n            M.Modal.init(elems, {});\n        });\n        var menu = {{ menu.json()|raw }};\n        var connected = '{{ app.user != null }}' !== '';\n        var addUrl = '{{ path('basket.add')|escape }}';\n    </script>\n    {% verbatim %}\n    <script>\n    var app = new Vue({\n    el: '#vue-app',\n    data: {\n        menu:menu,\n        selectedProduct:{},\n        selectedCategory:{},\n        quantity:1,\n        connected:connected,\n        addUrl:addUrl\n    },\n    methods: {\n        select(product, category){\n            if(connected){\n                this.selectedProduct = product;\n                this.selectedCategory = category;\n                this.quantity = 1;\n            }\n        },\n        removeQuantity(){\n            if(this.quantity>1){\n                this.quantity--;\n            }\n        },\n        addQuantity(){\n            this.quantity++;\n        }\n    }\n    });\n    </script>\n    {% endverbatim %}\n{% endblock %}\n{% block body %}\n\n    <div class=\"card\">\n        <div class=\"card-content\">{{ 'take-away'|content }}</div>\n    </div>\n    <div class=\"row\">\n        <div class=\"col m{% if app.user %}9{% else %}12{% endif %} menu\">\n            <div class=\"card\">\n                <div class=\"card-content\">{% include 'order/the-menu.html.twig' with {} only %}</div>\n            </div>\n\n        </div>\n        {% if app.user %}\n            <div class=\"col m3 hide-on-small-and-down\">\n\n                <div class=\"card\">\n                    <div class=\"card-content\">\n                        <span class=\"card-title\">Votre panier</span>\n                        {% if basket.products|length == 0 %}\n                            <p>Votre panier est vide</p>\n                        {% endif %}\n                        {% include 'order/summary.html.twig' with {basket:basket} only %}\n                        {% include 'order/go-to-confirm-basket.html.twig' with {orderType:orderType, basket:basket} only %}\n                    </div>\n                </div>\n            </div>\n        {% endif %}\n    </div>\n{% endblock %}\n"
  },
  {
    "path": "resources/templates/page/update-client.html.twig",
    "content": "{% extends 'base_resto.html.twig' %}\n\n{% block body -%}\n    <div class=\"card\">\n        <div class=\"card-content\">\n            <div class=\"row\">\n                {{ form_start(form, {'attr': {'class': 'col push-l2 l8 m12 s12','novalidate':'novalidate'} }) }}\n                <div class=\"row\">\n                    <div class=\"input-field col s6\">\n                        {% include 'form/field-new.html.twig' with {form:form, 'errors': errors|default([]),'fieldName': 'firstName'} only %}\n                    </div>\n                    <div class=\"input-field col s6\">\n                        {% include 'form/field-new.html.twig' with {form:form, 'errors':errors|default([]),'fieldName': 'lastName'} only %}\n                    </div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"input-field col s6\">\n                        {% include 'form/field-new.html.twig' with {form:form, 'errors':errors|default([]),'fieldName': 'email'} only %}\n                    </div>\n                    <div class=\"input-field col s6\">\n                        {% include 'form/field-new.html.twig' with {form:form, 'errors':errors|default([]),'fieldName': 'phoneNumber'} only %}\n                    </div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"input-field col s12\">\n                        {% include 'form/field-new.html.twig' with {form:form, 'errors':errors|default([]),'fieldName': 'password'} only %}\n                    </div>\n                </div>\n\n                <div class=\"row\">\n                    <div class=\"input-field col s12\">\n                        <button type=\"submit\" class=\"btn btn-full\">Mettre à jour</button>\n                    </div>\n                </div>\n                {{ form_end(form) }}\n            </div>\n        </div>\n    </div>\n{% endblock %}\n"
  },
  {
    "path": "resources/translations/EasyAdminBundle.fr.xlf",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xliff xmlns=\"urn:oasis:names:tc:xliff:document:1.2\" version=\"1.2\">\n  <file source-language=\"fr\" target-language=\"fr\" datatype=\"plaintext\" original=\"file.ext\">\n    <header>\n      <tool tool-id=\"symfony\" tool-name=\"Symfony\"/>\n    </header>\n    <body>\n      <trans-unit id=\"wYcx0So\" resname=\"search.no_results\">\n        <source>search.no_results</source>\n        <target>__search.no_results</target>\n      </trans-unit>\n    </body>\n  </file>\n</xliff>\n"
  },
  {
    "path": "resources/translations/messages.fr.yaml",
    "content": "\"delivery\": Livraison\n\"take-away\": À emporter\n\"error-notEmpty\": Ce champs est obligatoire\n\"error-string\": Ce champs doit être composé de lettres\n\"error-choice\": Choix invalide\n\"invalid-email\": E-mail invalide\n\"unknown-company\": Cette société n'existe pas\n\"disabled-company\": La société a été désactivée\n\"email-already-used\": Cet e-mail est déjà utilisé\n\"unknown-client\": Le client n'existe pas\n\"unknown-email\": L'utilisateur n'existe pas\n\"invalid-password\": Mot de passe incorrect\n\"disabled-user\": L'utilisateur a été désactivé\n\"unknown-supplement\": Un des suppléments sélectionné n'existe plus\n\"unknown-product\": Ce produit n'existe plus\n\"unknown-option\": L'option sélectionnée n'existe plus\n\"my-info-updated\": Vos informations ont bien été mises à jour\n\"new-password-login-needed\": Vos informations ont bien été mises à jour. Veuillez vous reconnecter avec votre nouveau mot de passe\n\"wrong-check-sum\": Le panier a été modifé entre temps. Veuillez réessayer\n\"empty-basket\": Impossible de commander car votre panier est vide\n\"Delivery not available\": La livraison n'est pas disponible\n\"Order too late\": Il est trop tard pour faire une commande\n\"Take away not available\": L'option \"à emporter\" est indisponible\n\"Take away too late\": Il est trop tard pour commander \"à emporter\"\n\n\"Company name\": Société\n\"First name\": Prénom\n\"Last name\": Nom\n\"Email\": E-mail\n\"Phone number\": Téléphone\n\"Password\": Mot de passe\n\"La hulpe\": La hulpe\n\"Waterloo\": Waterloo\n\"Store\": Restaurant\n\n# Admin\n\n\"Quantity\": Quantité\n\"Name\": Nom\n\"Comment\": Commentaires\n\"Order type string\": \"Type\"\n"
  },
  {
    "path": "src/Seat/Domain/Basket/Entity/Basket.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\Entity;\n\nuse Seat\\Domain\\Basket\\Model\\BasketProduct;\n\nclass Basket extends \\ArrayObject\n{\n    private $userId;\n\n    /**\n     * @param BasketProduct[] $basketProducts\n     */\n    public function __construct(string $userId, array $basketProducts)\n    {\n        parent::__construct($basketProducts);\n        $this->userId = $userId;\n    }\n\n    public function totalPrice()\n    {\n        $price = 0;\n        /** @var BasketProduct $basketProduct */\n        foreach ($this as $basketProduct) {\n            $price += $basketProduct->totalPrice();\n        }\n\n        return $price;\n    }\n\n    public function userId(): string\n    {\n        return $this->userId;\n    }\n\n    public function isEmpty()\n    {\n        return $this->count() === 0;\n    }\n\n    public function checkSum()\n    {\n        $content = '';\n        /** @var BasketProduct $basketProduct */\n        foreach ($this as $basketProduct) {\n            $content .= '|'.$basketProduct->id();\n        }\n        $json = [\n            'price' => $this->totalPrice(),\n            'content' => $content,\n        ];\n\n        return sha1(json_encode($json));\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/Entity/BasketRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\Entity;\n\nuse Seat\\Domain\\Basket\\Model\\BasketProduct;\n\ninterface BasketRepository\n{\n    public function addToBasket(string $userId, BasketProduct $basketProduct);\n\n    public function getUserBasket(string $userId): Basket;\n\n    public function emptyBasketFor(string $userId): void;\n\n    public function delete(string $basketId, string $userId): void;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/Model/BasketProduct.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\Model;\n\nclass BasketProduct\n{\n    private $name;\n    private $price;\n    private $option;\n    /** @var BasketProductSupplement[] */\n    private $supplements;\n    private $comment;\n    private $quantity;\n    private $id;\n\n    public function __construct(\n        string $id,\n        int $quantity,\n        string $name,\n        float $price,\n        ?BasketProductOption $option,\n        array $supplements,\n        string $comment\n    ) {\n        $this->id = $id;\n        $this->name = $name;\n        $this->price = $price;\n        $this->option = $option;\n        $this->supplements = $supplements;\n        $this->comment = $comment;\n        $this->quantity = $quantity;\n    }\n\n    public function id(): string\n    {\n        return $this->id;\n    }\n\n    public function name(): string\n    {\n        return $this->name;\n    }\n\n    public function price(): float\n    {\n        return $this->price;\n    }\n\n    public function option(): ?BasketProductOption\n    {\n        return $this->option;\n    }\n\n    /**\n     * @return BasketProductSupplement[]\n     */\n    public function supplements(): array\n    {\n        return $this->supplements;\n    }\n\n    public function comment(): string\n    {\n        return $this->comment;\n    }\n\n    public function quantity(): int\n    {\n        return $this->quantity;\n    }\n\n    public function totalPrice()\n    {\n        $productPrice = $this->price();\n        if ($this->option()) {\n            $productPrice += $this->option()->price();\n        }\n        foreach ($this->supplements() as $supplement) {\n            $productPrice += $supplement->price();\n        }\n\n        return $productPrice * $this->quantity();\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/Model/BasketProductOption.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\Model;\n\nclass BasketProductOption\n{\n    private $name;\n    private $price;\n\n    public function __construct(string $name, float $price)\n    {\n        $this->name = $name;\n        $this->price = $price;\n    }\n\n    public function name(): string\n    {\n        return $this->name;\n    }\n\n    public function price(): float\n    {\n        return $this->price;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/Model/BasketProductSupplement.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\Model;\n\nclass BasketProductSupplement\n{\n    private $name;\n    private $price;\n\n    public function __construct(string $name, float $price)\n    {\n        $this->name = $name;\n        $this->price = $price;\n    }\n\n    public function name(): string\n    {\n        return $this->name;\n    }\n\n    public function price(): float\n    {\n        return $this->price;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/Model/OrderType.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\Model;\n\n\nclass OrderType\n{\n//type: take-away | delivery\n//if take-away => take-away-time: 12:00:00\n\n    private $name;\n    private $time;\n\n    public static function takeAwayFor($time)\n    {\n        return new OrderType('take-away', $time);\n    }\n\n    public static function delivery()\n    {\n        return new OrderType('delivery');\n    }\n\n    public static function fromString($orderType, $takeAwayTime = null)\n    {\n        switch ($orderType) {\n            case OrderTypeName::$takeAway:\n                return OrderType::takeAwayFor($takeAwayTime);\n            case OrderTypeName::$delivery:\n                return OrderType::delivery();\n        }\n\n        throw new \\Exception('Invalid order type');\n    }\n\n    public function __construct(string $name, ?string $time = null)\n    {\n        $this->name = $name;\n        $this->time = $time;\n    }\n\n    public function name(): string\n    {\n        return $this->name;\n    }\n\n    public function time(): ?string\n    {\n        return $this->time;\n    }\n\n    public function isDelivery()\n    {\n        return $this->name === OrderTypeName::$delivery;\n    }\n\n    public function isTakeAway()\n    {\n        return $this->name === OrderTypeName::$takeAway;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/Model/OrderTypeName.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\Model;\n\nclass OrderTypeName\n{\n    static $takeAway = 'take-away';\n    static $delivery = 'delivery';\n\n    static $all = [];\n}\n\nOrderTypeName::$all = [OrderTypeName::$takeAway, OrderTypeName::$delivery];\n\n"
  },
  {
    "path": "src/Seat/Domain/Basket/Model/PossibleOrderType.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\Model;\n\nuse Seat\\SharedKernel\\Model\\TimeRange;\n\nclass PossibleOrderType\n{\n    private $name;\n    private $range;\n    private $error;\n\n    public function __construct(string $name, ?TimeRange $range, ?\\Exception $error)\n    {\n        $this->name = $name;\n        $this->range = $range;\n        $this->error = $error;\n    }\n\n    public function name(): string\n    {\n        return $this->name;\n    }\n\n    public function range(): ?TimeRange\n    {\n        return $this->range;\n    }\n\n    public function error(): ?\\Exception\n    {\n        return $this->error;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/Service/Error/DeliveryNotAvailable.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\Service\\Error;\n\nclass DeliveryNotAvailable extends \\Exception\n{\n    protected $message = 'Delivery not available';\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/Service/Error/OrderTooLate.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\Service\\Error;\n\nclass OrderTooLate extends \\Exception\n{\n    protected $message = 'Order too late';\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/Service/Error/TakeAwayNotAvailable.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\Service\\Error;\n\nclass TakeAwayNotAvailable extends \\Exception\n{\n    protected $message = 'Take away not available';\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/Service/Error/TakeAwayTooLate.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\Service\\Error;\n\nclass TakeAwayTooLate extends \\Exception\n{\n    protected $message = 'Take away too late';\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/Service/OrderTypeChecker.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\Service;\n\nuse DateInterval;\nuse DateTimeZone;\nuse Seat\\Domain\\Client\\Entity\\ClientRepository;\nuse Seat\\Domain\\Client\\Entity\\CompanyRepository;\nuse Seat\\Domain\\Basket\\Service\\Error\\DeliveryNotAvailable;\nuse Seat\\Domain\\Basket\\Service\\Error\\OrderTooLate;\nuse Seat\\Domain\\Basket\\Service\\Error\\TakeAwayNotAvailable;\nuse Seat\\Domain\\Basket\\Service\\Error\\TakeAwayTooLate;\nuse Seat\\Domain\\Basket\\Model\\OrderType;\nuse Seat\\Domain\\Basket\\Model\\OrderTypeName;\nuse Seat\\Domain\\Basket\\Model\\PossibleOrderType;\nuse Seat\\SharedKernel\\Model\\TimeRange;\nuse Seat\\SharedKernel\\Service\\Clock;\n\nclass OrderTypeChecker\n{\n    const MAX_TAKE_AWAY_ORDER_HOUR = '11:10:00';\n    const MAX_TAKE_AWAY_HOUR = '14:00:00';\n\n    private $companyRepository;\n    private $clientRepository;\n    private $clock;\n\n    public function __construct(\n        CompanyRepository $companyRepository,\n        ClientRepository $clientRepository,\n        Clock $clock\n    ) {\n        $this->companyRepository = $companyRepository;\n        $this->clientRepository = $clientRepository;\n        $this->clock = $clock;\n    }\n\n    public function getPossibleOrderType(string $userId): PossibleOrderType\n    {\n        $client = $this->clientRepository->getClientById($userId);\n\n        if ($client === null) {\n            throw new \\Exception('Unknown client');\n        }\n\n        return $this->getPossibleOrderTypeForCompany($client->companyId());\n\n    }\n\n    private function getPossibleOrderTypeForCompany(?string $companyId)\n    {\n        $confirmationTime = $this->clock->now()->setTimezone(new DateTimeZone('Europe/Brussels'));\n        $company = null;\n        if ($companyId !== null) {\n            $company = $this->companyRepository->getCompanyById($companyId);\n        }\n\n        if ($company && $company->canBeDelivered()) {\n            if ($confirmationTime->format('H:i:s') < $company->maxOrderTimeForDelivery()) {\n                return new PossibleOrderType(OrderTypeName::$delivery, null, null);\n            }\n\n            return new PossibleOrderType(OrderTypeName::$delivery, null, new OrderTooLate());\n        } else {\n            if ($confirmationTime->format('H:i:s') > self::MAX_TAKE_AWAY_ORDER_HOUR) {\n                return new PossibleOrderType(OrderTypeName::$takeAway, null, new OrderTooLate());\n            }\n            $currentTime = $confirmationTime->add(DateInterval::createFromDateString('30 minutes'));\n            $timeRange = (new TimeRange('10:30:00', '14:00:00'))->delayFromDate($currentTime, 15);\n\n            if (count($timeRange->getRoundedStep(15)) === 0) {\n                return new PossibleOrderType(OrderTypeName::$takeAway, null, new TakeAwayTooLate());\n            }\n\n            return new PossibleOrderType(OrderTypeName::$takeAway, $timeRange, null);\n        }\n    }\n\n    /**\n     * @throws DeliveryNotAvailable\n     * @throws OrderTooLate\n     * @throws TakeAwayTooLate\n     * @throws TakeAwayNotAvailable\n     */\n    public function checkPossibleOrderType(OrderType $orderType, ?string $companyId)\n    {\n        $possibleOrderType = $this->getPossibleOrderTypeForCompany($companyId);\n\n        if ($orderType->isDelivery() && $possibleOrderType->name() === OrderTypeName::$takeAway) {\n            throw new DeliveryNotAvailable();\n        }\n        if ($orderType->isTakeAway() && $possibleOrderType->name() === OrderTypeName::$delivery) {\n            throw new TakeAwayNotAvailable();\n        }\n        if ($possibleOrderType->error()) {\n            throw $possibleOrderType->error();\n        }\n\n        if ($orderType->isTakeAway() && $orderType->time() > $possibleOrderType->range()->to()) {\n            throw new TakeAwayTooLate();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/UseCase/AddProductToBasket/AddProductToBasket.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\UseCase\\AddProductToBasket;\n\nuse Assert\\Assert;\nuse Assert\\LazyAssertionException;\nuse Ramsey\\Uuid\\Uuid;\nuse Seat\\Domain\\Basket\\Entity\\BasketRepository;\nuse Seat\\Domain\\Menu\\Entity\\Product;\nuse Seat\\Domain\\Menu\\Entity\\ProductOptionRepository;\nuse Seat\\Domain\\Menu\\Entity\\ProductRepository;\nuse Seat\\Domain\\Menu\\Entity\\ProductSupplementRepository;\nuse Seat\\Domain\\Basket\\Model\\BasketProduct;\nuse Seat\\Domain\\Basket\\Model\\BasketProductOption;\nuse Seat\\Domain\\Basket\\Model\\BasketProductSupplement;\n\nclass AddProductToBasket\n{\n    private $basketRepository;\n    private $productRepository;\n    private $productOptionRepository;\n    private $productSupplementRepository;\n\n    public function __construct(\n        BasketRepository $basketRepository,\n        ProductRepository $productRepository,\n        ProductOptionRepository $productOptionRepository,\n        ProductSupplementRepository $productSupplementRepository\n    ) {\n        $this->basketRepository = $basketRepository;\n        $this->productRepository = $productRepository;\n        $this->productOptionRepository = $productOptionRepository;\n        $this->productSupplementRepository = $productSupplementRepository;\n    }\n\n    /** @throws */\n    public function execute(AddProductToBasketRequest $request, AddProductToBasketPresenter $presenter)\n    {\n        $response = new AddProductToBasketResponse();\n        $isValid = $this->checkRequest($request, $response);\n\n        if ($isValid) {\n            $product = $this->getProduct($request, $response);\n            if ($product) {\n                $option = $this->getOption($request, $response, $product);\n                $supplements = $this->getSupplements($request, $response, $product);\n\n                if (!$response->notification()->hasError()) {\n                    $basketProduct = new BasketProduct(\n                        Uuid::uuid4()->toString(),\n                        $request->quantity,\n                        $product->name(),\n                        $product->price(),\n                        $option,\n                        $supplements,\n                        (string)$request->comment\n                    );\n\n                    $this->basketRepository->addToBasket($request->userId, $basketProduct);\n\n                    $response->setBasketProduct($basketProduct);\n                }\n\n            }\n\n        }\n\n        $presenter->present($response);\n\n    }\n\n    private function getProduct(AddProductToBasketRequest $basketData, AddProductToBasketResponse $response)\n    {\n        $product = $this->productRepository->get($basketData->productId);\n\n        if ($product === null) {\n            $response->addError('productId', 'unknown-product');\n        }\n\n        return $product;\n    }\n\n    private function getSupplements(AddProductToBasketRequest $basketData, AddProductToBasketResponse $response, Product $product): array\n    {\n        $basketProductSupplements = [];\n        foreach ($basketData->supplementIds as $supplementId) {\n            $supplement = $this->productSupplementRepository->get($supplementId);\n            if ($supplement === null) {\n                $response->addError('supplementIds', 'unknown-supplement');\n\n                return [];\n            }\n            if ($supplement->categoryId() !== $product->categoryId()) {\n                $response->addError('supplementIds', 'unknown-supplement');\n\n                return [];\n            }\n            $basketProductSupplements[] = new BasketProductSupplement($supplement->name(), $supplement->price());\n        }\n\n        return $basketProductSupplements;\n    }\n\n    private function getOption(AddProductToBasketRequest $basketData, AddProductToBasketResponse $response, Product $product)\n    {\n        if ($basketData->optionId === null) {\n            return null;\n        }\n\n        $productOption = $this->productOptionRepository->get($basketData->optionId);\n        if ($productOption === null || $productOption->categoryId() !== $product->categoryId()) {\n            $response->addError('optionId', 'unknown-option');\n\n            return null;\n        }\n\n        return new BasketProductOption($productOption->name(), $productOption->price());\n\n    }\n\n    private function checkRequest(AddProductToBasketRequest $request, AddProductToBasketResponse $response): bool\n    {\n        try {\n            Assert::lazy()\n                ->that($request->quantity, 'quantity')->notEmpty('error-notEmpty')->integer('error-integer')\n                ->that($request->userId, 'userId')->notEmpty('error-notEmpty')->string('error-string')\n                ->that($request->productId, 'productId')->notEmpty('error-notEmpty')->string('error-string')\n                ->that($request->optionId, 'optionId')->nullOr()->string('error-string')\n                ->that($request->supplementIds, 'supplementIds')->isArray()\n                ->that($request->comment, 'comment')->nullOr()->string('error-string')\n                ->verifyNow();\n\n            return true;\n        } catch (LazyAssertionException $e) {\n            foreach ($e->getErrorExceptions() as $error) {\n                $response->addError($error->getPropertyPath(), $error->getMessage());\n            }\n\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/UseCase/AddProductToBasket/AddProductToBasketPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\UseCase\\AddProductToBasket;\n\ninterface AddProductToBasketPresenter\n{\n    public function present(AddProductToBasketResponse $response): void;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/UseCase/AddProductToBasket/AddProductToBasketRequest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\UseCase\\AddProductToBasket;\n\nclass AddProductToBasketRequest\n{\n    /** @var string */\n    public $userId;\n    /** @var string */\n    public $productId;\n    /** @var string|int */\n    public $optionId;\n    /** @var array */\n    public $supplementIds;\n    /** @var string */\n    public $comment;\n    /** @var int */\n    public $quantity;\n\n    public static function fromAll($quantity, $userId, $productId, $optionId = null, $supplementIds = [], $comment = '')\n    {\n        $request = new self();\n        $request->quantity = (int)$quantity;\n        $request->userId = $userId;\n        $request->productId = $productId;\n        $request->optionId = $optionId;\n        $request->supplementIds = $supplementIds;\n        $request->comment = $comment;\n\n        return $request;\n    }\n\n    public function withUserId(string $userId)\n    {\n        $this->userId = $userId;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/UseCase/AddProductToBasket/AddProductToBasketResponse.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\UseCase\\AddProductToBasket;\n\nuse Seat\\Domain\\Basket\\Model\\BasketProduct;\nuse Seat\\SharedKernel\\Error\\Notification;\n\nclass AddProductToBasketResponse\n{\n    private $notification;\n    /** @var BasketProduct|null */\n    private $basketProduct;\n\n    public function __construct()\n    {\n        $this->notification = new Notification();\n    }\n\n    public function addError(string $fieldName, string $error)\n    {\n        $this->notification->addError($fieldName, $error);\n    }\n\n    public function notification(): Notification\n    {\n        return $this->notification;\n    }\n\n    public function setBasketProduct(BasketProduct $basketProduct)\n    {\n        $this->basketProduct = $basketProduct;\n    }\n\n    public function basketProduct(): ?BasketProduct\n    {\n        return $this->basketProduct;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/UseCase/RemoveFromBasket/RemoveFromBasket.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\UseCase\\RemoveFromBasket;\n\nuse Seat\\Domain\\Basket\\Entity\\BasketRepository;\n\nclass RemoveFromBasket\n{\n    private $basketRepository;\n\n    public function __construct(BasketRepository $basketRepository)\n    {\n        $this->basketRepository = $basketRepository;\n    }\n\n    public function execute(RemoveFromBasketRequest $request, RemoveFromBasketPresenter $presenter)\n    {\n        $response = new RemoveFromBasketResponse();\n        $this->basketRepository->delete($request->basketId, $request->userId);\n        $response->setIsDone(true);\n\n        $presenter->present($response);\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/UseCase/RemoveFromBasket/RemoveFromBasketPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\UseCase\\RemoveFromBasket;\n\ninterface RemoveFromBasketPresenter\n{\n    public function present(RemoveFromBasketResponse $response): void;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/UseCase/RemoveFromBasket/RemoveFromBasketRequest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\UseCase\\RemoveFromBasket;\n\nclass RemoveFromBasketRequest\n{\n    public $userId;\n    public $basketId;\n\n    public function __construct($userId, $basketId)\n    {\n        $this->userId = $userId;\n        $this->basketId = $basketId;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/UseCase/RemoveFromBasket/RemoveFromBasketResponse.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\UseCase\\RemoveFromBasket;\n\nclass RemoveFromBasketResponse\n{\n    private $isDone = false;\n\n    public function isDone(): bool\n    {\n        return $this->isDone;\n    }\n\n    public function setIsDone($isDone)\n    {\n        $this->isDone = $isDone;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/UseCase/ShowBasket/ShowBasket.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\UseCase\\ShowBasket;\n\nuse Seat\\Domain\\Basket\\Entity\\BasketRepository;\n\nclass ShowBasket\n{\n    private $basketRepository;\n\n    public function __construct(BasketRepository $basketRepository)\n    {\n\n        $this->basketRepository = $basketRepository;\n    }\n\n    public function execute(ShowBasketRequest $request, ShowBasketPresenter $presenter)\n    {\n        $response = new ShowBasketResponse();\n\n        $basket = $this->basketRepository->getUserBasket($request->userId);\n        $response->setBasket($basket);\n\n        $presenter->present($response);\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/UseCase/ShowBasket/ShowBasketPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\UseCase\\ShowBasket;\n\ninterface ShowBasketPresenter\n{\n    public function present(ShowBasketResponse $response): void;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/UseCase/ShowBasket/ShowBasketRequest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\UseCase\\ShowBasket;\n\nclass ShowBasketRequest\n{\n    public $userId;\n\n    public function __construct($userId)\n    {\n        $this->userId = $userId;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Basket/UseCase/ShowBasket/ShowBasketResponse.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Basket\\UseCase\\ShowBasket;\n\nuse Seat\\Domain\\Basket\\Entity\\Basket;\n\nclass ShowBasketResponse\n{\n    /** @var Basket|null */\n    private $basket;\n\n    public function setBasket(?Basket $basket)\n    {\n        $this->basket = $basket;\n\n        return $this;\n    }\n\n    public function basket(): ?Basket\n    {\n        return $this->basket;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/Entity/Client.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\Entity;\n\nclass Client\n{\n    private $firstName;\n    private $lastName;\n    private $phoneNumber;\n    private $id;\n    private $email;\n    private $password;\n    private $store;\n    private $companyId;\n    private $role;\n    private $isEnabled;\n\n    public function __construct(\n        string $id,\n        string $firstName,\n        string $lastName,\n        string $email,\n        string $phoneNumber,\n        string $password,\n        string $store,\n        string $role,\n        bool $isEnabled,\n        ?string $companyId\n    ) {\n        $this->id = $id;\n        $this->firstName = $firstName;\n        $this->lastName = $lastName;\n        $this->phoneNumber = $phoneNumber;\n        $this->email = $email;\n        $this->password = $password;\n        $this->store = $store;\n        $this->companyId = $companyId;\n        $this->role = $role;\n        $this->isEnabled = $isEnabled;\n    }\n\n    public function firstName(): string\n    {\n        return $this->firstName;\n    }\n\n    public function lastName(): string\n    {\n        return $this->lastName;\n    }\n\n    public function phoneNumber(): string\n    {\n        return $this->phoneNumber;\n    }\n\n    public function id(): string\n    {\n        return $this->id;\n    }\n\n    public function email(): string\n    {\n        return $this->email;\n    }\n\n    public function password(): string\n    {\n        return $this->password;\n    }\n\n    public function store(): string\n    {\n        return $this->store;\n    }\n\n    public function companyId(): ?string\n    {\n        return $this->companyId;\n    }\n\n    public function hasCompany()\n    {\n        return $this->companyId !== null;\n    }\n\n    public function role(): string\n    {\n        return $this->role;\n    }\n\n    public function isEnabled(): bool\n    {\n        return $this->isEnabled;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/Entity/ClientRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\Entity;\n\ninterface ClientRepository\n{\n    public function addClient(Client $client);\n\n    public function getClientByEmail(string $email): ?Client;\n\n    public function getClientById(string $id): ?Client;\n\n    public function updateClient(Client $client): void;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/Entity/Company.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\Entity;\n\nclass Company\n{\n    private $id;\n    private $name;\n    private $maxOrderTimeForDelivery;\n    private $hasInvoice;\n    private $store;\n    private $isEnabled;\n\n    public function __construct(string $id, string $name, bool $hasInvoice, string $store, bool $isEnabled, ?string $maxOrderTimeForDelivery)\n    {\n        $this->id = $id;\n        $this->name = $name;\n        $this->maxOrderTimeForDelivery = $maxOrderTimeForDelivery;\n        $this->hasInvoice = $hasInvoice;\n        $this->store = $store;\n        $this->isEnabled = $isEnabled;\n    }\n\n    public function id(): string\n    {\n        return $this->id;\n    }\n\n    public function name(): string\n    {\n        return $this->name;\n    }\n\n    public function maxOrderTimeForDelivery(): ?string\n    {\n        return $this->maxOrderTimeForDelivery;\n    }\n\n    public function canBeDelivered(): bool\n    {\n        return $this->maxOrderTimeForDelivery !== null;\n    }\n\n    public function hasInvoice(): bool\n    {\n        return $this->hasInvoice;\n    }\n\n    public function store(): string\n    {\n        return $this->store;\n    }\n\n    public function isEnabled(): bool\n    {\n        return $this->isEnabled;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/Entity/CompanyRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\Entity;\n\ninterface CompanyRepository\n{\n    public function getCompanyNamed(string $companyName): ?Company;\n\n    public function addCompany(Company $company): void;\n\n    public function getCompanyById(?string $companyId): ?Company;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/Entity/Role.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\Entity;\n\nclass Role\n{\n    static $client = 'client';\n    static $sandwich = 'sandwich';\n    static $admin = 'admin';\n\n    static $all = [];\n}\n\nRole::$all = [Role::$client, Role::$sandwich, Role::$admin];\n"
  },
  {
    "path": "src/Seat/Domain/Client/Entity/Store.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\Entity;\n\nclass Store\n{\n    static $laHulpe = 'la-hulpe';\n    static $waterloo = 'waterloo';\n\n    static $all = [];\n}\n\nStore::$all = [Store::$laHulpe, Store::$waterloo];\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/GetClient/GetClient.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\GetClient;\n\nuse Seat\\Domain\\Client\\Entity\\ClientRepository;\n\nclass GetClient\n{\n    private $clientRepository;\n\n    public function __construct(ClientRepository $clientRepository)\n    {\n        $this->clientRepository = $clientRepository;\n    }\n\n    public function execute(GetClientRequest $request, GetClientPresenter $presenter)\n    {\n        $client = $this->clientRepository->getClientById($request->clientId);\n\n        $response = new GetClientResponse();\n        if ($client !== null) {\n            $response->setClient($client);\n        }\n\n        $presenter->present($response);\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/GetClient/GetClientPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\GetClient;\n\ninterface GetClientPresenter\n{\n    public function present(GetClientResponse $response): void;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/GetClient/GetClientRequest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\GetClient;\n\nclass GetClientRequest\n{\n    public $clientId;\n\n    public function __construct(string $clientId)\n    {\n        $this->clientId = $clientId;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/GetClient/GetClientResponse.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\GetClient;\n\nuse Seat\\Domain\\Client\\Entity\\Client;\n\nclass GetClientResponse\n{\n    private $client;\n\n    public function client(): ?Client\n    {\n        return $this->client;\n    }\n\n    public function setClient(Client $client)\n    {\n        $this->client = $client;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/Login/Login.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\Login;\n\nuse Seat\\Domain\\Client\\Entity\\Client;\nuse Seat\\Domain\\Client\\Entity\\ClientRepository;\nuse Seat\\Domain\\Client\\Entity\\CompanyRepository;\nuse Seat\\SharedKernel\\Service\\PasswordHasher;\n\nclass Login\n{\n    private $clientRepository;\n    private $passwordHasher;\n    private $companyRepository;\n\n    public function __construct(ClientRepository $clientRepository, CompanyRepository $companyRepository, PasswordHasher $passwordHasher)\n    {\n        $this->clientRepository = $clientRepository;\n        $this->passwordHasher = $passwordHasher;\n        $this->companyRepository = $companyRepository;\n    }\n\n    /**\n     * throws DisabledUser\n     * throws DisabledCompany\n     * throws UnknownUser\n     * throws WrongPassword\n     */\n    public function execute(LoginRequest $request, LoginPresenter $presenter)\n    {\n        $response = new LoginResponse();\n        $client = $this->clientRepository->getClientByEmail($request->email);\n\n        $isValid = $this->checkClient($client, $response);\n        $isValid = $isValid && $this->checkPassword($request, $client, $response);\n        $isValid = $isValid && $this->checkClientEnabled($client, $response);\n        $isValid = $isValid && $this->checkCompanyEnabled($client, $response);\n\n        if($isValid){\n            $response->setClient($client);\n        }\n\n        return $presenter->present($response);\n    }\n\n    private function checkClient(?Client $client, LoginResponse $response): bool\n    {\n        if ($client === null) {\n            $response->addError('email', 'unknown-email');\n\n            return false;\n        }\n\n        return true;\n    }\n\n    private function checkPassword(LoginRequest $request, Client $client, LoginResponse $response): bool\n    {\n        if (!$this->passwordHasher->isPasswordValid($client->password(), $request->password)) {\n            $response->addError('password', 'invalid-password');\n\n            return false;\n        }\n\n        return true;\n    }\n\n    private function checkClientEnabled(Client $client, LoginResponse $response): bool\n    {\n        if (!$client->isEnabled()) {\n            $response->addError('email', 'disabled-user');\n\n            return false;\n        }\n\n        return true;\n    }\n\n    private function checkCompanyEnabled(Client $client, LoginResponse $response): bool\n    {\n        if ($client->hasCompany()) {\n            $company = $this->companyRepository->getCompanyById($client->companyId());\n            if (!$company->isEnabled()) {\n                $response->addError('email', 'disabled-company');\n\n                return false;\n            }\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/Login/LoginPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\Login;\n\ninterface LoginPresenter\n{\n    public function present(LoginResponse $response);\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/Login/LoginRequest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\Login;\n\nclass LoginRequest\n{\n    public $email;\n    public $password;\n\n    public function __construct(string $email, string $password)\n    {\n        $this->email = $email;\n        $this->password = $password;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/Login/LoginResponse.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\Login;\n\nuse Seat\\Domain\\Client\\Entity\\Client;\nuse Seat\\SharedKernel\\Error\\Notification;\n\nclass LoginResponse\n{\n    private $notification;\n\n    /** @var ?Client */\n    private $client;\n\n    public function __construct()\n    {\n        $this->notification = new Notification();\n    }\n\n    public function addError(string $fieldName, string $error)\n    {\n        $this->notification->addError($fieldName, $error);\n    }\n\n    public function notification(): Notification\n    {\n        return $this->notification;\n    }\n\n    public function setClient(Client $client)\n    {\n        $this->client = $client;\n    }\n\n    public function client(): ?Client\n    {\n        return $this->client;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/Register/Register.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\Register;\n\nuse Assert\\Assert;\nuse Assert\\LazyAssertionException;\nuse Seat\\Domain\\Client\\Entity\\Client;\nuse Seat\\Domain\\Client\\Entity\\ClientRepository;\nuse Seat\\Domain\\Client\\Entity\\Company;\nuse Seat\\Domain\\Client\\Entity\\CompanyRepository;\nuse Seat\\Domain\\Client\\Entity\\Role;\nuse Seat\\Domain\\Client\\Entity\\Store;\nuse Seat\\SharedKernel\\Service\\IdGenerator;\nuse Seat\\SharedKernel\\Service\\PasswordHasher;\n\nclass Register\n{\n    private $idGenerator;\n    private $clientRepository;\n    private $passwordHasher;\n    private $companyRepository;\n\n    public function __construct(\n        IdGenerator $idGenerator,\n        ClientRepository $clientRepository,\n        CompanyRepository $companyRepository,\n        PasswordHasher $passwordHasher\n    ) {\n        $this->clientRepository = $clientRepository;\n        $this->idGenerator = $idGenerator;\n        $this->passwordHasher = $passwordHasher;\n        $this->companyRepository = $companyRepository;\n    }\n\n    public function execute(RegisterRequest $request): void\n    {\n        $response = new RegisterResponse();\n\n        if ($request->isPosted) {\n            $this->register($request, $response);\n        }\n        $presenter->present($response);\n    }\n\n    private function register(RegisterRequest $request, RegisterResponse $response)\n    {\n        $isValid = $this->validateRequest($request, $response);\n        $isValid = $this->validateCompany($request, $response, $company) && $isValid;\n        $isValid = $this->validateClient($request, $response) && $isValid;\n        if ($isValid) {\n            $this->saveClient($request, $response, $company);\n        }\n    }\n\n    private function validateClient(RegisterRequest $request, RegisterResponse $response): bool\n    {\n        if ($request->email === null) {\n            return false;\n        }\n        $existingClient = $this->clientRepository->getClientByEmail((string)$request->email);\n        if ($existingClient !== null) {\n            $response->addError('email', 'email-already-used');\n\n            return false;\n        }\n\n        return true;\n    }\n\n    private function validateCompany(RegisterRequest $request, RegisterResponse $response, &$company): bool\n    {\n        $company = null;\n        if ($request->companyName !== null) {\n            $company = $this->companyRepository->getCompanyNamed($request->companyName);\n            if ($company === null) {\n                $response->addError('companyName', 'unknown-company');\n\n                return false;\n            }\n            if (!$company->isEnabled()) {\n                $response->addError('companyName', 'disabled-company');\n\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    private function saveClient(RegisterRequest $request, RegisterResponse $response, ?Company $company): void\n    {\n        $hashedPassword = $this->passwordHasher->hash($request->password);\n        $client = new Client(\n            $this->idGenerator->next(),\n            $request->firstName,\n            $request->lastName,\n            $request->email,\n            $request->phoneNumber,\n            $hashedPassword,\n            $company ? $company->store() : $request->store,\n            Role::$client,\n            true,\n            $company ? $company->id() : null\n        );\n        $this->clientRepository->addClient($client);\n        $response->setRegisteredClient($client);\n    }\n\n    private function validateRequest(RegisterRequest $request, RegisterResponse $response)\n    {\n        try {\n            Assert::lazy()\n                ->that($request->firstName, 'firstName')->notEmpty('error-notEmpty')->string('error-string')\n                ->that($request->lastName, 'lastName')->notEmpty('error-notEmpty')->string('error-string')\n                ->that($request->email, 'email')->notEmpty('error-notEmpty')->email('invalid-email')\n                ->that($request->phoneNumber, 'phoneNumber')->notEmpty('error-notEmpty')\n                ->that($request->password, 'password')->notEmpty('error-notEmpty')->string('error-string')\n                ->that($request->companyName, 'companyName')\n                ->that($request->store, 'store')->notEmpty('error-notEmpty')->choice(Store::$all, 'error-choice')\n                ->verifyNow();\n\n            return true;\n        } catch (LazyAssertionException $e) {\n            foreach ($e->getErrorExceptions() as $error) {\n                $response->addError($error->getPropertyPath(), $error->getMessage());\n            }\n\n            return false;\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/Register/RegisterPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\Register;\n\ninterface RegisterPresenter\n{\n    public function present(RegisterResponse $response): void;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/Register/RegisterRequest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\Register;\n\nclass RegisterRequest\n{\n    public $isPosted = false;\n    public $firstName;\n    public $lastName;\n    public $store;\n    public $password;\n    public $phoneNumber;\n    public $email;\n    public $companyName;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/Register/RegisterResponse.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\Register;\n\nuse Seat\\Domain\\Client\\Entity\\Client;\nuse Seat\\SharedKernel\\Error\\Notification;\n\nclass RegisterResponse\n{\n    private $client;\n    private $note;\n\n    public function __construct()\n    {\n        $this->note = new Notification();\n    }\n\n    public function addError(string $fieldName, string $error)\n    {\n        $this->note->addError($fieldName, $error);\n    }\n\n    public function notification(): Notification\n    {\n        return $this->note;\n    }\n\n    public function setRegisteredClient(Client $client)\n    {\n        $this->client = $client;\n\n        return $this;\n    }\n\n    public function client(): ?Client\n    {\n        return $this->client;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/UpdateClient/UpdateClient.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\UpdateClient;\n\nuse Assert\\Assert;\nuse Assert\\LazyAssertionException;\nuse Seat\\Domain\\Client\\Entity\\Client;\nuse Seat\\Domain\\Client\\Entity\\ClientRepository;\nuse Seat\\SharedKernel\\Service\\PasswordHasher;\n\nclass UpdateClient\n{\n    private $clientRepository;\n    private $passwordHasher;\n\n    public function __construct(ClientRepository $clientRepository, PasswordHasher $passwordHasher)\n    {\n        $this->clientRepository = $clientRepository;\n        $this->passwordHasher = $passwordHasher;\n    }\n\n    public function execute(UpdateClientRequest $request, UpdateClientPresenter $presenter)\n    {\n        $response = new UpdateClientResponse();\n        $response->setRequest($request);\n\n        /** @var Client $client */\n        $isValid = $this->validateClient($request, $response, $client);\n        $isValid = $this->validateRequest($request, $response) && $isValid;\n\n        if ($isValid) {\n            $client = new Client(\n                $client->id(),\n                $request->firstName,\n                $request->lastName,\n                $request->email,\n                $request->phoneNumber,\n                $request->password ? $this->passwordHasher->hash($request->password) : $client->password(),\n                $client->store(),\n                $client->role(),\n                $client->isEnabled(),\n                $client->companyId()\n            );\n            $this->clientRepository->updateClient($client);\n            $response->setUpdatedClient($client);\n        }\n\n        $presenter->present($response);\n    }\n\n    private function validateRequest(UpdateClientRequest $request, UpdateClientResponse $response)\n    {\n        try {\n            Assert::lazy()\n                ->that($request->clientId, 'clientId')->notEmpty('error-notEmpty')->string('string')\n                ->that($request->firstName, 'firstName')->notEmpty('error-notEmpty')->string('string')\n                ->that($request->lastName, 'lastName')->notEmpty('error-notEmpty')->string('string')\n                ->that($request->email, 'email')->notEmpty('error-notEmpty')->email('invalid-email')\n                ->that($request->phoneNumber, 'phoneNumber')->notEmpty('error-notEmpty')\n                ->that($request->password, 'password')->nullOr()->string('string')\n                ->verifyNow();\n\n            return true;\n\n        } catch (LazyAssertionException $e) {\n            foreach ($e->getErrorExceptions() as $error) {\n                $response->addError($error->getPropertyPath(), $error->getMessage());\n            }\n\n            return false;\n        }\n    }\n\n    private function validateClient(UpdateClientRequest $request, UpdateClientResponse $response, ?Client &$client)\n    {\n        if ($request->clientId === null) {\n            return false;\n        }\n\n        $client = $this->clientRepository->getClientById($request->clientId);\n\n        if ($client === null) {\n            $response->addError('clientId', 'unknown-client');\n\n            return false;\n        }\n\n        $response->setOriginalClient($client);\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/UpdateClient/UpdateClientPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\UpdateClient;\n\ninterface UpdateClientPresenter\n{\n    public function present(UpdateClientResponse $response);\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/UpdateClient/UpdateClientRequest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\UpdateClient;\n\nuse Seat\\Presentation\\Client\\EditableClient;\n\nclass UpdateClientRequest extends EditableClient\n{\n    public static function fromEditable(EditableClient $nullableRequest)\n    {\n        $request = new UpdateClientRequest();\n        $request->firstName = $nullableRequest->firstName;\n        $request->lastName = $nullableRequest->lastName;\n        $request->password = $nullableRequest->password;\n        $request->phoneNumber = $nullableRequest->phoneNumber;\n        $request->email = $nullableRequest->email;\n        $request->clientId = $nullableRequest->clientId;\n\n        return $request;\n    }\n\n    public function byClientId(string $clientId)\n    {\n        $this->clientId = $clientId;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Client/UseCase/UpdateClient/UpdateClientResponse.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Client\\UseCase\\UpdateClient;\n\nuse Seat\\Domain\\Client\\Entity\\Client;\nuse Seat\\SharedKernel\\Error\\Notification;\n\nclass UpdateClientResponse\n{\n    /** @var Client */\n    private $updatedClient;\n    /** @var Client */\n    private $originalClient;\n    private $request;\n    private $hasPasswordChanged = false;\n    private $note;\n\n    public function __construct()\n    {\n        $this->note = new Notification();\n    }\n\n    public function addError(string $fieldName, string $error)\n    {\n        $this->note->addError($fieldName, $error);\n    }\n\n    public function notification(): Notification\n    {\n        return $this->note;\n    }\n\n    public function setUpdatedClient(Client $client)\n    {\n        $this->updatedClient = $client;\n        $this->hasPasswordChanged = $client->password() !== $this->originalClient->password();\n\n        return $this;\n    }\n\n    public function hasPasswordChanged(): bool\n    {\n        return $this->hasPasswordChanged;\n    }\n\n    public function updatedClient(): ?Client\n    {\n        return $this->updatedClient;\n    }\n\n    public function setOriginalClient(?Client $originalClient)\n    {\n        $this->originalClient = $originalClient;\n    }\n\n    public function originalClient(): ?Client\n    {\n        return $this->originalClient;\n    }\n\n    public function request(): ?UpdateClientRequest\n    {\n        return $this->request;\n    }\n\n    public function setRequest(UpdateClientRequest $request)\n    {\n        $this->request = $request;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Cms/Entity/HtmlContent.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Cms\\Entity;\n\nclass HtmlContent\n{\n    private $name;\n    private $html;\n\n    public function __construct(string $name, string $html)\n    {\n        $this->name = $name;\n        $this->html = $html;\n    }\n\n    public function name()\n    {\n        return $this->name;\n    }\n\n    public function html()\n    {\n        return $this->html;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Cms/Entity/HtmlContentRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Cms\\Entity;\n\ninterface HtmlContentRepository\n{\n    public function getNamed(string $name): HtmlContent;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/Entity/Category.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Menu\\Entity;\n\nclass Category\n{\n    private $id;\n    private $name;\n    private $description;\n\n    public function __construct(string $id, string $name, ?string $description)\n    {\n        $this->id = $id;\n        $this->name = $name;\n        $this->description = $description;\n    }\n\n    public function id(): string\n    {\n        return $this->id;\n    }\n\n    public function name(): string\n    {\n        return $this->name;\n    }\n\n    public function description(): ?string\n    {\n        return $this->description;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/Entity/CategoryRepository.php",
    "content": "<?php declare(strict_types=1);\n\n\nnamespace Seat\\Domain\\Menu\\Entity;\n\ninterface CategoryRepository\n{\n    /**\n     * @return Category[]\n     */\n    public function getCategories(): array;\n\n    public function addCategory(Category $category);\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/Entity/Product.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Menu\\Entity;\n\nclass Product\n{\n    private $id;\n    private $name;\n    private $description;\n    private $price;\n    private $categoryId;\n\n    public function __construct(string $id, string $categoryId, string $name, string $description, float $price)\n    {\n        $this->id = $id;\n        $this->name = $name;\n        $this->description = $description;\n        $this->price = $price;\n        $this->categoryId = $categoryId;\n    }\n\n    public function id(): string\n    {\n        return $this->id;\n    }\n\n    public function name(): string\n    {\n        return $this->name;\n    }\n\n    public function description(): string\n    {\n        return $this->description;\n    }\n\n    public function price(): float\n    {\n        return $this->price;\n    }\n\n    public function categoryId(): string\n    {\n        return $this->categoryId;\n    }\n\n\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/Entity/ProductOption.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Menu\\Entity;\n\nclass ProductOption\n{\n    private $id;\n    private $name;\n    private $price;\n    private $categoryId;\n\n    public function __construct(string $id, string $categoryId, string $name, float $price)\n    {\n        $this->id = $id;\n        $this->name = $name;\n        $this->price = $price;\n        $this->categoryId = $categoryId;\n    }\n\n    public function id(): string\n    {\n        return $this->id;\n    }\n\n    public function name(): string\n    {\n        return $this->name;\n    }\n\n    public function price(): float\n    {\n        return $this->price;\n    }\n\n    public function categoryId(): string\n    {\n        return $this->categoryId;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/Entity/ProductOptionRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Menu\\Entity;\n\ninterface ProductOptionRepository\n{\n    /**\n     * @return ProductOption\n     */\n    public function get(string $productOptionId): ?ProductOption;\n\n    /**\n     * @return ProductOption[]\n     */\n    public function getByCategoryId(string $categoryId): array;\n\n    public function add(ProductOption $productOption): void;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/Entity/ProductRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Menu\\Entity;\n\n\ninterface ProductRepository\n{\n    public function add(Product $product): void;\n\n    public function get(string $id): ?Product;\n\n    /**\n     * @return Product[]\n     */\n    public function getByCategoryId(string $categoryId): array;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/Entity/ProductSupplement.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Menu\\Entity;\n\nclass ProductSupplement\n{\n    private $id;\n    private $name;\n    private $price;\n    private $categoryId;\n\n    public function __construct(string $id, string $categoryId, string $name, float $price)\n    {\n        $this->id = $id;\n        $this->name = $name;\n        $this->price = $price;\n        $this->categoryId = $categoryId;\n    }\n\n    public function id(): string\n    {\n        return $this->id;\n    }\n\n    public function name(): string\n    {\n        return $this->name;\n    }\n\n    public function price(): float\n    {\n        return $this->price;\n    }\n\n    public function categoryId(): string\n    {\n        return $this->categoryId;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/Entity/ProductSupplementRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Menu\\Entity;\n\ninterface ProductSupplementRepository\n{\n    public function get(string $supplementId): ?ProductSupplement;\n\n    public function add(ProductSupplement $supplement): void;\n\n    /**\n     * @return ProductSupplement[]\n     */\n    public function getByCategoryId(string $categoryId): array;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/Model/MenuLine.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Menu\\Model;\n\nclass MenuLine\n{\n    private $name;\n    private $description;\n    private $options;\n    private $supplements;\n    private $products;\n\n    /**\n     * @param string           $name\n     * @param string           $description\n     * @param MenuProduct[]    $products\n     * @param MenuOption[]     $options\n     * @param MenuSupplement[] $supplements\n     */\n    public function __construct(string $name, ?string $description, array $products, array $options, array $supplements)\n    {\n        $this->name = $name;\n        $this->description = $description;\n        $this->options = $options;\n        $this->supplements = $supplements;\n        $this->products = $products;\n    }\n\n    public function name(): string\n    {\n        return $this->name;\n    }\n\n    public function description(): ?string\n    {\n        return $this->description;\n    }\n\n    /**\n     * @return MenuOption[]\n     */\n    public function options(): array\n    {\n        return $this->options;\n    }\n\n    /**\n     * @return MenuSupplement[]\n     */\n    public function supplements(): array\n    {\n        return $this->supplements;\n    }\n\n    public function products()\n    {\n        return $this->products;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/Model/MenuOption.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Menu\\Model;\n\nclass MenuOption\n{\n    private $id;\n    private $name;\n    private $price;\n\n    public function __construct(string $id, string $name, float $price)\n    {\n\n        $this->id = $id;\n        $this->name = $name;\n        $this->price = $price;\n    }\n\n    public function id(): string\n    {\n        return $this->id;\n    }\n\n    public function name(): string\n    {\n        return $this->name;\n    }\n\n    public function price(): float\n    {\n        return $this->price;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/Model/MenuProduct.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Menu\\Model;\n\nclass MenuProduct\n{\n    private $id;\n    private $name;\n    private $price;\n    private $description;\n\n    public function __construct(string $id, string $name, ?string $description, float $price)\n    {\n\n        $this->id = $id;\n        $this->name = $name;\n        $this->price = $price;\n        $this->description = $description;\n    }\n\n    public function id(): string\n    {\n        return $this->id;\n    }\n\n    public function name(): string\n    {\n        return $this->name;\n    }\n\n    public function price(): float\n    {\n        return $this->price;\n    }\n\n    public function description(): ?string\n    {\n        return $this->description;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/Model/MenuSupplement.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Menu\\Model;\n\nclass MenuSupplement\n{\n    private $id;\n    private $name;\n    private $price;\n\n    public function __construct(string $id, string $name, float $price)\n    {\n\n        $this->id = $id;\n        $this->name = $name;\n        $this->price = $price;\n    }\n\n    public function id(): string\n    {\n        return $this->id;\n    }\n\n    public function name(): string\n    {\n        return $this->name;\n    }\n\n    public function price(): float\n    {\n        return $this->price;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/UseCase/GetMenu/GetMenu.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Menu\\UseCase\\GetMenu;\n\nuse Seat\\Domain\\Menu\\Entity\\Category;\nuse Seat\\Domain\\Menu\\Entity\\CategoryRepository;\nuse Seat\\Domain\\Menu\\Entity\\Product;\nuse Seat\\Domain\\Menu\\Entity\\ProductOption;\nuse Seat\\Domain\\Menu\\Entity\\ProductOptionRepository;\nuse Seat\\Domain\\Menu\\Entity\\ProductRepository;\nuse Seat\\Domain\\Menu\\Entity\\ProductSupplement;\nuse Seat\\Domain\\Menu\\Entity\\ProductSupplementRepository;\nuse Seat\\Domain\\Menu\\Model\\MenuLine;\nuse Seat\\Domain\\Menu\\Model\\MenuOption;\nuse Seat\\Domain\\Menu\\Model\\MenuProduct;\nuse Seat\\Domain\\Menu\\Model\\MenuSupplement;\n\nclass GetMenu\n{\n    private $categoryRepository;\n    private $optionRepository;\n    private $supplementRepository;\n    private $productRepository;\n\n    public function __construct(\n        CategoryRepository $categoryRepository,\n        ProductOptionRepository $optionRepository,\n        ProductSupplementRepository $supplementRepository,\n        ProductRepository $productRepository\n    ) {\n        $this->categoryRepository = $categoryRepository;\n        $this->optionRepository = $optionRepository;\n        $this->supplementRepository = $supplementRepository;\n        $this->productRepository = $productRepository;\n    }\n\n    public function execute(GetMenuPresenter $presenter)\n    {\n        $menu = [];\n        foreach ($this->categoryRepository->getCategories() as $category) {\n            $menu[] = new MenuLine(\n                $category->name(),\n                $category->description(),\n                $this->getProductsOf($category),\n                $this->getOptionsOf($category),\n                $this->getSupplementsOf($category)\n            );\n        }\n\n        $presenter->present(new GetMenuResponse($menu));\n    }\n\n    private function getOptionsOf(Category $category): array\n    {\n        $options = $this->optionRepository->getByCategoryId($category->id());\n        $transformToMenuOption = function (ProductOption $option) {\n            return new MenuOption($option->id(), $option->name(), $option->price());\n        };\n\n        return array_map($transformToMenuOption, $options);\n    }\n\n    private function getProductsOf(Category $category): array\n    {\n        $products = $this->productRepository->getByCategoryId($category->id());\n        $transformToMenuProduct = function (Product $product) {\n            return new MenuProduct($product->id(), $product->name(), $product->description(), $product->price());\n        };\n\n        return array_map($transformToMenuProduct, $products);\n    }\n\n    private function getSupplementsOf(Category $category): array\n    {\n        $supplements = $this->supplementRepository->getByCategoryId($category->id());\n        $transformToMenuSupplement = function (ProductSupplement $supplement) {\n            return new MenuSupplement($supplement->id(), $supplement->name(), $supplement->price());\n        };\n\n        return array_map($transformToMenuSupplement, $supplements);\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/UseCase/GetMenu/GetMenuPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Menu\\UseCase\\GetMenu;\n\ninterface GetMenuPresenter\n{\n    public function present(GetMenuResponse $response): void;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Menu/UseCase/GetMenu/GetMenuResponse.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Menu\\UseCase\\GetMenu;\n\nuse Seat\\Domain\\Menu\\Model\\MenuLine;\n\nclass GetMenuResponse\n{\n    public $menuLines;\n\n    /** @param MenuLine[] $menuLines */\n    public function __construct(array $menuLines)\n    {\n        $this->menuLines = $menuLines;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Order/Entity/Command.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Order\\Entity;\n\nuse DateTimeImmutable;\nuse Seat\\Domain\\Basket\\Entity\\Basket;\nuse Seat\\Domain\\Basket\\Model\\OrderType;\n\nclass Command\n{\n    private $id;\n    private $userId;\n    private $basket;\n    private $date;\n    private $orderType;\n\n    public function __construct(string $id, string $userId, OrderType $orderType, Basket $basket, DateTimeImmutable $date)\n    {\n        $this->id = $id;\n        $this->userId = $userId;\n        $this->basket = $basket;\n        $this->date = $date;\n        $this->orderType = $orderType;\n    }\n\n    public function id(): string\n    {\n        return $this->id;\n    }\n\n    public function userId(): string\n    {\n        return $this->userId;\n    }\n\n    public function basket(): Basket\n    {\n        return $this->basket;\n    }\n\n    public function date(): DateTimeImmutable\n    {\n        return $this->date;\n    }\n\n    public function orderType(): OrderType\n    {\n        return $this->orderType;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Order/Entity/CommandRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Order\\Entity;\n\ninterface CommandRepository\n{\n    /**\n     * @return Command[]\n     */\n    public function getTodayList(): array;\n\n    public function add(Command $command): void;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Order/UseCase/ConfirmBasket/ConfirmBasket.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Order\\UseCase\\ConfirmBasket;\n\nuse DateTimeImmutable;\nuse Exception;\nuse Ramsey\\Uuid\\Uuid;\nuse Seat\\Domain\\Client\\Entity\\Client;\nuse Seat\\Domain\\Client\\Entity\\ClientRepository;\nuse Seat\\Domain\\Basket\\Entity\\Basket;\nuse Seat\\Domain\\Basket\\Entity\\BasketRepository;\nuse Seat\\Domain\\Order\\Entity\\Command;\nuse Seat\\Domain\\Order\\Entity\\CommandRepository;\nuse Seat\\Domain\\Basket\\Model\\OrderType;\nuse Seat\\Domain\\Basket\\Service\\OrderTypeChecker;\n\nclass ConfirmBasket\n{\n    private $commandRepository;\n    private $basketRepository;\n    private $clientRepository;\n    private $orderTypeChecker;\n\n    public function __construct(\n        CommandRepository $commandRepository,\n        BasketRepository $basketRepository,\n        ClientRepository $clientRepository,\n        OrderTypeChecker $orderTypeChecker\n    ) {\n        $this->commandRepository = $commandRepository;\n        $this->basketRepository = $basketRepository;\n        $this->clientRepository = $clientRepository;\n        $this->orderTypeChecker = $orderTypeChecker;\n    }\n\n    public function execute(ConfirmBasketRequest $request, ConfirmBasketPresenter $presenter)\n    {\n        $response = new ConfirmBasketResponse();\n        $this->doExecute($request, $response);\n        $presenter->present($response);\n    }\n\n    private function doExecute(ConfirmBasketRequest $request, ConfirmBasketResponse $response)\n    {\n        $client = $this->checkClient($request, $response);\n        if ($client === null) {\n            return;\n        }\n        $basket = $this->checkBasket($request, $response);\n        if ($basket === null) {\n            return;\n        }\n        $orderType = $this->checkOrderType($request, $response, $client);\n        if ($orderType === null) {\n            return;\n        }\n        $this->saveBasketToCommand($orderType, $basket, $client);\n    }\n\n    private function saveBasketToCommand(OrderType $orderType, Basket $basket, Client $client): void\n    {\n        $command = new Command(\n            Uuid::uuid4()->toString(),\n            $client->id(),\n            $orderType,\n            $basket,\n            new DateTimeImmutable()\n        );\n\n        $this->commandRepository->add($command);\n        $this->basketRepository->emptyBasketFor($client->id());\n    }\n\n    private function checkClient(ConfirmBasketRequest $request, ConfirmBasketResponse $response)\n    {\n        if ($request->userId === null) {\n            $response->addError('userId', 'unknown-client');\n\n            return null;\n        }\n\n        $client = $this->clientRepository->getClientById($request->userId);\n\n        if ($client === null) {\n            $response->addError('userId', 'unknown-client');\n\n            return null;\n        }\n\n        return $client;\n    }\n\n    private function checkBasket(ConfirmBasketRequest $request, ConfirmBasketResponse $response): ?Basket\n    {\n        $basket = $this->basketRepository->getUserBasket($request->userId);\n\n        if ($basket->isEmpty()) {\n            $response->addError('userId', 'empty-basket');\n\n            return null;\n        }\n\n        if ($request->checkSum !== $basket->checkSum()) {\n            $response->addError('checkSum', 'wrong-check-sum');\n\n            return null;\n        }\n\n        return $basket;\n    }\n\n    private function checkOrderType(ConfirmBasketRequest $request, ConfirmBasketResponse $response, Client $client): ?OrderType\n    {\n        try {\n            $orderType = OrderType::fromString($request->orderTypeName, $request->takeAwayTime);\n        } catch (Exception $e) {\n            $response->addError('orderTypeName', $e->getMessage());\n\n            return null;\n        }\n        try {\n            $this->orderTypeChecker->checkPossibleOrderType($orderType, $client->companyId());\n        } catch (Exception $e) {\n            $response->addError('orderTypeName', $e->getMessage());\n\n            return null;\n\n        }\n\n        return $orderType;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Order/UseCase/ConfirmBasket/ConfirmBasketPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Order\\UseCase\\ConfirmBasket;\n\ninterface ConfirmBasketPresenter\n{\n    public function present(ConfirmBasketResponse $response): void;\n}\n"
  },
  {
    "path": "src/Seat/Domain/Order/UseCase/ConfirmBasket/ConfirmBasketRequest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Order\\UseCase\\ConfirmBasket;\n\nclass ConfirmBasketRequest\n{\n    public $userId;\n    public $checkSum;\n    public $orderTypeName;\n    public $takeAwayTime;\n\n    public function withUserId($userId)\n    {\n        $this->userId = $userId;\n\n        return $this;\n    }\n\n    public function withCheckSum($checkSum)\n    {\n        $this->checkSum = $checkSum;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Domain/Order/UseCase/ConfirmBasket/ConfirmBasketResponse.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Domain\\Order\\UseCase\\ConfirmBasket;\n\nuse Seat\\SharedKernel\\Error\\Notification;\n\nclass ConfirmBasketResponse\n{\n    private $notification;\n\n    public function __construct()\n    {\n        $this->notification = new Notification();\n    }\n\n    public function addError(string $fieldName, string $error)\n    {\n        $this->notification->addError($fieldName, $error);\n    }\n\n    public function notification(): Notification\n    {\n        return $this->notification;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/AddToBasketController.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Symfony4\\Security\\User;\nuse Symfony4\\View\\AddProductToBasketView;\nuse Seat\\Domain\\Basket\\UseCase\\AddProductToBasket\\AddProductToBasket;\nuse Seat\\Domain\\Basket\\UseCase\\AddProductToBasket\\AddProductToBasketRequest;\nuse Seat\\Presentation\\Basket\\AddProductToBasketHtmlPresenter;\nuse Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\ParamConverter;\nuse Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Security;\nuse Symfony\\Component\\Routing\\Annotation\\Route;\nuse Symfony\\Component\\Security\\Core\\User\\UserInterface;\n\n/**\n * @Route(\"/basket/add\", name=\"basket.add\",methods={\"POST\"})\n * @Security(\"is_granted('IS_AUTHENTICATED_REMEMBERED')\")\n * @ParamConverter(\"nullableRequest\", options={\"form\":\"Symfony4\\Form\\BasketType\"})\n */\nclass AddToBasketController\n{\n    public function __invoke(\n        AddProductToBasket $addProductToBasket,\n        AddProductToBasketHtmlPresenter $presenter,\n        AddProductToBasketView $view,\n        AddProductToBasketRequest $nullableRequest,\n        UserInterface $user = null\n    ) {\n        /** @var User $user */\n        $addProductToBasket->execute($nullableRequest->withUserId($user->getId()), $presenter);\n\n        return $view->generateView($presenter->viewModel());\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/AdminController.php",
    "content": "<?php\ndeclare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Infrastructure\\Persistence\\Command;\nuse Doctrine\\ORM\\Query\\Expr\\Join;\nuse EasyCorp\\Bundle\\EasyAdminBundle\\Controller\\EasyAdminController;\nuse EasyCorp\\Bundle\\EasyAdminBundle\\Event\\EasyAdminEvents;\nuse Symfony\\Component\\EventDispatcher\\GenericEvent;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\n\nclass AdminController extends EasyAdminController\n{\n    protected function listCommandLaHulpeAction()\n    {\n        $this->listen();\n\n        return parent::listAction();\n    }\n\n    protected function listCommandWaterlooAction()\n    {\n        $this->listen();\n\n        return parent::listAction();\n    }\n\n    private function listen()\n    {\n        $this->get('event_dispatcher')->addListener(\n            EasyAdminEvents::POST_LIST,\n            function (GenericEvent $event) {\n                $paginator = $event->getSubject();\n                $userIds = [];\n                /** @var Command $command */\n                foreach ($paginator as $command) {\n                    $userIds[] = $command->userId();\n                }\n            }\n        );\n\n        return parent::listAction();\n    }\n\n    public function renderCommandWaterlooTemplate($type, $twigPath, $parameters)\n    {\n        return $this->renderCommandOfTodayTemplate($type, $twigPath, $parameters, 'waterloo');\n    }\n\n    public function renderCommandLaHulpeTemplate($type, $twigPath, $parameters)\n    {\n        return $this->renderCommandOfTodayTemplate($type, $twigPath, $parameters, 'la-hulpe');\n    }\n\n    protected function renderCommandOfTodayTemplate($type, $twigPath, $parameters, $store): Response\n    {\n        if ($type !== 'list') {\n            return $this->renderTemplate($type, $twigPath, $parameters);\n        }\n\n        $commands = [];\n        /** @var Command $commandOfUser */\n        foreach ($parameters['paginator'] as $commandOfUser) {\n            if (!isset($commands[$commandOfUser->userId()])) {\n                $commands[$commandOfUser->userId()] = [];\n            }\n            $commands[$commandOfUser->userId()][] = $commandOfUser;\n        }\n        $total = 0;\n\n        $companies = $this->em->createQueryBuilder()\n            ->select(['c.id', 'c.name', 't.name as tourneeName', 'c.canBeDelivered', 'u.id as user_id'])\n            ->from('App:Company', 'c')\n            ->join('App:User', 'u', Join::WITH, 'c.id = u.company')\n            ->join('App:Tournee', 't', Join::WITH, 'c.tournee = t.id')\n            ->where('u.id in (:userIds)')\n            ->andWhere('c.store = :store')\n            ->orderBy('c.name', 'ASC')\n            ->setParameter('userIds', array_keys($commands))\n            ->setParameter('store', $store)\n            ->getQuery()\n            ->getResult();\n\n        $companiesWithUsers = [];\n        foreach ($companies as $company) {\n            if (!isset($companiesWithUsers[$company['id']])) {\n                $orderType = $company['canBeDelivered'] ? 'Livraison \"'.$company['tourneeName'].'\"' : 'À emporter';\n                $companiesWithUsers[$company['id']] = [\n                    'name' => $company['name'].' ('.$orderType.')',\n                    'users' => [],\n                ];\n            }\n            $companiesWithUsers[$company['id']]['users'][] = $company['user_id'];\n        }\n\n        $commandsWithCompany = [];\n\n        foreach ($companiesWithUsers as $company) {\n            $commandsWithCompany[] = $company['name'];\n            foreach ($company['users'] as $userId) {\n                foreach ($commands[$userId] as $commandOfUser) {\n                    $commandsWithCompany[] = $commandOfUser;\n                    $total++;\n                }\n                unset($commands[$userId]);\n            }\n        }\n        if (!empty($commands)) {\n            $userStore = $this->em->createQueryBuilder()\n                ->select(['u.id', 'u.store'])\n                ->from('App:User', 'u', 'u.id')\n                ->where('u.id in (:userIds)')\n                ->setParameter('userIds', array_keys($commands))\n                ->getQuery()\n                ->getResult();\n            $userCommands = [];\n            foreach ($commands as $commandOfUser) {\n                foreach ($commandOfUser as $command) {\n                    if ($userStore[$command->userId()]['store'] === $store) {\n                        $userCommands[] = $command;\n                        $total++;\n                    }\n                }\n            }\n            if (!empty($userCommands)) {\n                $commandsWithCompany[] = 'Client sans société';\n                array_push($commandsWithCompany, ...$userCommands);\n            }\n        }\n\n        return $this->renderTemplate($type, $twigPath, array_merge($parameters, ['commandsWithCompany' => $commandsWithCompany, 'total' => $total]));\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/BusinessLunchController.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\Routing\\Annotation\\Route;\nuse Twig\\Environment;\n\n/**\n * @Route(\"/business-lunch\", name=\"business-lunch\")\n */\nclass BusinessLunchController\n{\n    public function __invoke(Environment $twig)\n    {\n        return new Response($twig->render('page/business-lunch.html.twig'));\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/ContactController.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\Routing\\Annotation\\Route;\nuse Twig\\Environment;\n\n/**\n * @Route(\"/contact\", name=\"contact\")\n */\nclass ContactController\n{\n    public function __invoke(Environment $twig)\n    {\n        return new Response($twig->render('page/contact.html.twig'));\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/HomeController.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\Routing\\Annotation\\Route;\nuse Twig\\Environment;\n\n/**\n * @Route(\"/\", name=\"home\")\n */\nclass HomeController\n{\n    const NUMBER_OF_PICS = 12;\n\n    public function __invoke(Environment $twig)\n    {\n        $images = [];\n        for ($i = 1; $i <= self::NUMBER_OF_PICS; $i++) {\n            $images[] = \"/gallery/genval{$i}.jpg\";\n        }\n\n        return new Response(\n            $twig->render('page/home.html.twig', ['images' => $images])\n        );\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/LoginCheckController.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Symfony\\Component\\Routing\\Annotation\\Route;\n\n/**\n * @Route(\"/login-check\", name=\"login_check\", methods={\"POST\"})\n */\nclass LoginCheckController\n{\n    public function __invoke()\n    {\n        throw new \\Exception('Don\\'t forget to activate logout in security.yaml');\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/LoginController.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\Routing\\Annotation\\Route;\nuse Symfony\\Component\\Security\\Http\\Authentication\\AuthenticationUtils;\nuse Twig\\Environment;\n\n/**\n * @Route(\"/login\", name=\"login\")\n */\nclass LoginController\n{\n    public function __invoke(Environment $twig, AuthenticationUtils $authenticationUtils)\n    {\n        // get the login error if there is one\n        $error = $authenticationUtils->getLastAuthenticationError();\n\n        // last username entered by the user\n        $lastUsername = $authenticationUtils->getLastUsername();\n\n        $response = $twig->render(\n            'page/login.html.twig',\n            [\n                'last_username' => $lastUsername,\n                'error' => $error,\n            ]\n        );\n\n        return new Response($response);\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/LogoutController.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Symfony\\Component\\Routing\\Annotation\\Route;\n\n/**\n * @Route(\"/logout\", name=\"logout\")\n */\nclass LogoutController\n{\n\n    public function __invoke()\n    {\n        throw new \\Exception('Don\\'t forget to activate logout in security.yaml');\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/MenuSalleController.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\Routing\\Annotation\\Route;\nuse Twig\\Environment;\n\n/**\n * @Route(\"/menu-salle\", name=\"menu.salle\")\n */\nclass MenuSalleController\n{\n    public function __invoke(Environment $twig)\n    {\n        return new Response($twig->render('page/menu-salle.html.twig'));\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/RegisterCompleteController.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\Routing\\Annotation\\Route;\nuse Twig\\Environment;\n\n/**\n * @Route(\"/register-complete\", name=\"register-complete\")\n */\nclass RegisterCompleteController\n{\n    /** @throws */\n    public function __invoke(Environment $twig)\n    {\n        return new Response($twig->render('page/register-complete.html.twig'));\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/RegisterController.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony4\\View\\RegisterView;\nuse Seat\\Domain\\Client\\UseCase\\Register\\Register;\nuse Seat\\Domain\\Client\\UseCase\\Register\\RegisterRequest;\nuse Seat\\Presentation\\Client\\RegisterHtmlPresenter;\nuse Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\ParamConverter;\nuse Symfony\\Component\\Routing\\Annotation\\Route;\n\n/**\n * @Route(\"/register\", name=\"register\")\n * @ParamConverter(\"form2request\", options={\"form\":\"Symfony4\\Form\\RegisterType\"})\n */\nclass RegisterController\n{\n    public function __invoke(Request $request, Register $registerUseCase, RegisterView $view, RegisterHtmlPresenter $presenter, RegisterRequest $form2request)\n    {\n        $registerRequest = new RegisterRequest();\n        $registerRequest->email = $request->request->get('email');\n        $registerRequest->password = $request->request->get('password');\n\n        $registerUseCase->execute($registerRequest);\n        //...\n\n        return $view->generateView($form2request, $presenter->viewModel());\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/RemoveFromBasketController.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Symfony4\\Security\\User;\nuse Symfony4\\View\\RemoveFromBasketView;\nuse Seat\\Domain\\Basket\\UseCase\\RemoveFromBasket\\RemoveFromBasket;\nuse Seat\\Domain\\Basket\\UseCase\\RemoveFromBasket\\RemoveFromBasketRequest;\nuse Seat\\Presentation\\Basket\\RemoveFromBasketHtmlPresenter;\nuse Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Security;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\Routing\\Annotation\\Route;\nuse Symfony\\Component\\Security\\Core\\User\\UserInterface;\n\n/**\n * @Route(\"/basket/{basketId}/delete\", name=\"basket.delete\",methods={\"POST\"})\n * @Security(\"is_granted('IS_AUTHENTICATED_REMEMBERED')\")\n */\nclass RemoveFromBasketController\n{\n    public function __invoke(\n        RemoveFromBasket $removeFromBasket,\n        RemoveFromBasketHtmlPresenter $presenter,\n        RemoveFromBasketView $view,\n        Request $request,\n        $basketId,\n        UserInterface $user = null\n    ) {\n        /** @var User $user */\n        $removeFromBasket->execute(new RemoveFromBasketRequest($user->getId(), $basketId), $presenter);\n\n        return $view->generateView($request->request->get('redirect'), $presenter->viewModel());\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/ShowBasketController.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Seat\\Domain\\Basket\\UseCase\\ShowBasket\\ShowBasket;\nuse Seat\\Domain\\Basket\\UseCase\\ShowBasket\\ShowBasketRequest;\nuse Seat\\Domain\\Order\\UseCase\\ConfirmBasket\\ConfirmBasket;\nuse Seat\\Domain\\Order\\UseCase\\ConfirmBasket\\ConfirmBasketRequest;\nuse Seat\\Presentation\\Basket\\ShowBasketHtmlPresenter;\nuse Seat\\Presentation\\Order\\ConfirmBasketHtmlPresenter;\nuse Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\ParamConverter;\nuse Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Security;\nuse Symfony\\Component\\Routing\\Annotation\\Route;\nuse Symfony\\Component\\Security\\Core\\User\\UserInterface;\nuse Symfony4\\Security\\User;\nuse Symfony4\\View\\ConfirmBasketView;\nuse Symfony4\\View\\ShowBasketView;\n\n/**\n * @Route(\"/basket\", name=\"basket\")\n * @Security(\"is_granted('IS_AUTHENTICATED_REMEMBERED')\")\n * @ParamConverter(\"nullableRequest\", options={\"form\":\"Symfony4\\Form\\BasketConfirmationType\"})\n */\nclass ShowBasketController\n{\n    public function __invoke(\n        ConfirmBasket $confirmBasket,\n        ConfirmBasketHtmlPresenter $presenter,\n        ConfirmBasketView $view,\n\n        ShowBasket $showBasket,\n        ShowBasketHtmlPresenter $showBasketPresenter,\n        ShowBasketView $showBasketView,\n\n        ?ConfirmBasketRequest $nullableRequest,\n        UserInterface $user = null\n    ) {\n        /** @var User $user */\n\n        if ($nullableRequest === null) {\n            $showBasket->execute(new ShowBasketRequest($user->getId()), $showBasketPresenter);\n\n            return $showBasketView->generateView($showBasketPresenter->viewModel());\n        }\n\n        $confirmBasket->execute($nullableRequest->withUserId($user->getId()), $presenter);\n\n        return $view->generateView($presenter->viewModel());\n    }\n\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/ShowOrderMenuController.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Seat\\Domain\\Menu\\UseCase\\GetMenu\\GetMenu;\nuse Seat\\Presentation\\Menu\\GetMenuHtmlPresenter;\nuse Symfony\\Component\\Routing\\Annotation\\Route;\nuse Symfony\\Component\\Security\\Core\\User\\UserInterface;\nuse Symfony4\\Security\\User;\nuse Symfony4\\View\\GetMenuView;\n\n/**\n * @Route(\"/order\", name=\"menu.show\")\n */\nclass ShowOrderMenuController\n{\n    public function __invoke(GetMenu $getMenu, GetMenuHtmlPresenter $presenter, GetMenuView $view, UserInterface $user = null)\n    {\n        $userId = $user instanceof User ? $user->getId() : '';\n        $getMenu->execute($presenter);\n\n        return $view->generateView($presenter->viewModel(), $userId);\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Controller/UpdateClientController.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Controller;\n\nuse Symfony4\\Security\\User;\nuse Symfony4\\View\\UpdateClientView;\nuse Seat\\Domain\\Client\\UseCase\\GetClient\\GetClient;\nuse Seat\\Domain\\Client\\UseCase\\GetClient\\GetClientRequest;\nuse Seat\\Domain\\Client\\UseCase\\UpdateClient\\UpdateClient;\nuse Seat\\Domain\\Client\\UseCase\\UpdateClient\\UpdateClientRequest;\nuse Seat\\Presentation\\Client\\EditableClient;\nuse Seat\\Presentation\\Client\\GetClientHtmlPresenter;\nuse Seat\\Presentation\\Client\\UpdateClientHtmlPresenter;\nuse Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\ParamConverter;\nuse Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Security;\nuse Symfony\\Component\\Routing\\Annotation\\Route;\nuse Symfony\\Component\\Security\\Core\\User\\UserInterface;\n\n/**\n * @Route(\"/mes-informations\", name=\"user.my-info\")\n * @Security(\"is_granted('IS_AUTHENTICATED_REMEMBERED')\")\n * @ParamConverter(\"nullableRequest\", options={\"form\":\"Symfony4\\Form\\UpdateClientType\"})\n */\nclass UpdateClientController\n{\n    /** @param User $user */\n    public function __invoke(\n        UpdateClient $updateClient,\n        UpdateClientView $view,\n        UpdateClientHtmlPresenter $updatePresenter,\n\n        GetClient $getClient,\n        GetClientHtmlPresenter $getClientPresenter,\n\n        ?EditableClient $nullableRequest,\n        UserInterface $user = null\n    ) {\n        if ($nullableRequest === null) {\n            $getClient->execute(new GetClientRequest($user->getId()), $getClientPresenter);\n\n            return $view->generateViewBeforePost($getClientPresenter->viewModel());\n        }\n\n        $request = UpdateClientRequest::fromEditable($nullableRequest)->byClientId($user->getId());\n        $updateClient->execute($request, $updatePresenter);\n\n        return $view->generateViewAfterPost($request, $updatePresenter->viewModel());\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/DependencyInjection/Compiler/AdminFilterRolePass.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\DependencyInjection\\Compiler;\n\nuse EasyCorp\\Bundle\\EasyAdminBundle\\Configuration\\ConfigPassInterface;\nuse Symfony\\Component\\Security\\Core\\Authentication\\Token\\Storage\\TokenStorageInterface;\nuse Symfony\\Component\\Security\\Core\\Authorization\\AuthorizationCheckerInterface;\n\nclass AdminFilterRolePass implements ConfigPassInterface\n{\n    private $authorizationChecker;\n    private $tokenStorage;\n\n    public function __construct(AuthorizationCheckerInterface $authorizationChecker, TokenStorageInterface $tokenStorage)\n    {\n        $this->authorizationChecker = $authorizationChecker;\n        $this->tokenStorage = $tokenStorage;\n    }\n\n    public function process(array $backendConfig)\n    {\n        $entities = [];\n        $user = $this->tokenStorage->getToken()->getUser();\n\n        foreach ($backendConfig['entities'] as $class => $entity) {\n            if (isset($entity['role']) && $this->authorizationChecker->isGranted($entity['role'], $user)) {\n                $entities[$class] = $entity;\n            }\n\n        }\n        $backendConfig['entities'] = $entities;\n\n        return $backendConfig;\n    }\n\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/DependencyInjection/Compiler/AutowireSeatPass.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\DependencyInjection\\Compiler;\n\nuse ReflectionClass;\nuse Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface;\nuse Symfony\\Component\\DependencyInjection\\ContainerBuilder;\n\nclass AutowireSeatPass implements CompilerPassInterface\n{\n    public function __construct()\n    {\n    }\n\n    /**\n     * You can modify the container here before it is dumped to PHP code.\n     */\n    public function process(ContainerBuilder $container)\n    {\n        $ids = $container->findTaggedServiceIds('seat.autowire');\n        foreach (array_keys($ids) as $className) {\n            $rf = new ReflectionClass($className);\n            foreach ($rf->getInterfaces() as $interface) {\n                if (strpos($interface->getName(), 'Seat') === 0) {\n                    $container->autowire($interface->getName(), $className);\n                }\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/Basket.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Doctrine\\ORM\\Mapping as ORM;\n\n/**\n * Class BusinessLunch\n * @ORM\\Entity()\n */\nclass Basket\n{\n    /**\n     * @ORM\\Id\n     * @ORM\\Column(type=\"string\")\n     */\n    private $id;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\")\n     */\n    private $userId;\n\n    /**\n     * @var array\n     * @ORM\\Column(type=\"json\")\n     */\n    private $content;\n\n    public function id()\n    {\n        return $this->id;\n    }\n\n    public function setId($id)\n    {\n        $this->id = $id;\n    }\n\n    public function userId(): string\n    {\n        return $this->userId;\n    }\n\n    public function setUserId($userId)\n    {\n        $this->userId = $userId;\n    }\n\n    public function content(): array\n    {\n        return $this->content;\n    }\n\n    public function setContent(array $content)\n    {\n        $this->content = $content;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/BasketProductJson.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Seat\\Domain\\Basket\\Model\\BasketProduct;\nuse Seat\\Domain\\Basket\\Model\\BasketProductOption;\nuse Seat\\Domain\\Basket\\Model\\BasketProductSupplement;\n\nclass BasketProductJson\n{\n    private $json = [];\n\n    public static function fromBasketProduct(BasketProduct $basketProduct)\n    {\n        $json = [\n            'id' => $basketProduct->id(),\n            'quantity' => $basketProduct->quantity(),\n            'comment' => $basketProduct->comment(),\n            'name' => $basketProduct->name(),\n            'price' => $basketProduct->price(),\n        ];\n\n        if ($basketProduct->option()) {\n            $json['option'] = [\n                'name' => $basketProduct->option()->name(),\n                'price' => $basketProduct->option()->price(),\n            ];\n        }\n\n        if (count($basketProduct->supplements()) > 0) {\n            $supplementToJson = function (BasketProductSupplement $supplement) {\n                return [\n                    'name' => $supplement->name(),\n                    'price' => $supplement->price(),\n                ];\n            };\n            $json['supplements'] = array_map($supplementToJson, $basketProduct->supplements());\n        }\n\n        return new BasketProductJson($json);\n    }\n\n    public function __construct(array $json)\n    {\n        $this->json = $json;\n    }\n\n    public function json()\n    {\n        return $this->json;\n    }\n\n    public function basketProduct(string $basketId)\n    {\n        $json = $this->json;\n        $supplementsToObjects = function (array $supplement) {\n            return new BasketProductSupplement($supplement['name'], $supplement['price']);\n        };\n\n        return new BasketProduct(\n            $basketId,\n            $json['quantity'],\n            $json['name'],\n            $json['price'],\n            isset($json['option']) ? new BasketProductOption($json['option']['name'], $json['option']['price']) : null,\n            isset($json['supplements']) ? array_map($supplementsToObjects, $json['supplements']) : [],\n            $json['comment']\n        );\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/Category.php",
    "content": "<?php\n\nnamespace Symfony4\\Doctrine;\n\nuse Doctrine\\Common\\Collections\\ArrayCollection;\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Symfony\\Component\\Validator\\Constraints as Assert;\n\n/**\n * @ORM\\Entity()\n * @ORM\\Table(name=\"category\")\n */\nclass Category\n{\n    const SOUP_ID = 4;\n\n    /**\n     * @ORM\\Id\n     * @ORM\\Column(type=\"integer\")\n     * @ORM\\GeneratedValue(strategy=\"AUTO\")\n     */\n    private $id;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=100)\n     * @Assert\\NotBlank()\n     */\n    private $name;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", nullable=true)\n     */\n    private $description;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"integer\", name=\"order_id\")\n     * @Assert\\NotBlank()\n     */\n    private $order = 1;\n\n    /**\n     * Category constructor.\n     */\n    public function __construct()\n    {\n        $this->options = new ArrayCollection();\n        $this->supplements = new ArrayCollection();\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getId()\n    {\n        return $this->id;\n    }\n\n    /**\n     * @param mixed $id\n     */\n    public function setId($id)\n    {\n        $this->id = $id;\n    }\n\n    /**\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->name;\n    }\n\n    /**\n     * @param string $name\n     *\n     * @return Category\n     */\n    public function setName($name)\n    {\n        $this->name = $name;\n\n        return $this;\n    }\n\n    /**\n     * @return string\n     */\n    public function getDescription()\n    {\n        return $this->description;\n    }\n\n    /**\n     * @param string $description\n     */\n    public function setDescription($description)\n    {\n        $this->description = $description;\n    }\n\n    /**\n     * @return string\n     */\n    public function getOrder()\n    {\n        return $this->order;\n    }\n\n    /**\n     * @param string $order\n     */\n    public function setOrder($order)\n    {\n        $this->order = $order;\n    }\n\n    public function __toString()\n    {\n        return $this->name;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/CategoryOption.php",
    "content": "<?php\nnamespace Symfony4\\Doctrine;\n\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Symfony\\Component\\Validator\\Constraints as Assert;\n\n/**\n * @ORM\\Entity\n * @ORM\\Table(name=\"category_option\")\n */\nclass CategoryOption\n{\n\n    /**\n     * @ORM\\Id\n     * @ORM\\Column(type=\"integer\")\n     * @ORM\\GeneratedValue(strategy=\"AUTO\")\n     */\n    private $id;\n\n    /**\n     * @var Category\n     * @ORM\\ManyToOne(targetEntity=\"Symfony4\\Doctrine\\Category\",inversedBy=\"options\")\n     * @ORM\\JoinColumn(name=\"category_id\", referencedColumnName=\"id\", nullable=false)\n     *\n     */\n    private $category;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=100)\n     * @Assert\\NotBlank()\n     */\n    private $name;\n\n    /**\n     * @var int x 100\n     * @ORM\\Column(type=\"float\")\n     * @Assert\\NotBlank()\n     */\n    private $price;\n\n    /**\n     * @var int\n     * @ORM\\Column(type=\"integer\", name=\"order_id\", options={\"default\":1})\n     * @Assert\\NotBlank()\n     */\n    private $order = 1;\n\n    /**\n     * @return mixed\n     */\n    public function getId()\n    {\n        return $this->id;\n    }\n\n    /**\n     * @param mixed $id\n     */\n    public function setId($id)\n    {\n        $this->id = $id;\n    }\n\n    /**\n     * @return Category\n     */\n    public function getCategory()\n    {\n        return $this->category;\n    }\n\n    /**\n     * @param Category $category\n     */\n    public function setCategory($category)\n    {\n        $this->category = $category;\n    }\n\n    /**\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->name;\n    }\n\n    /**\n     * @param string $name\n     */\n    public function setName($name)\n    {\n        $this->name = $name;\n    }\n\n    /**\n     * @return int\n     */\n    public function getPrice()\n    {\n        return $this->price;\n    }\n\n    /**\n     * @param int $price\n     */\n    public function setPrice($price)\n    {\n        $this->price = $price;\n    }\n\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->name.' ('.($this->price).' €)';\n    }\n\n    /**\n     * @return int\n     */\n    public function getOrder()\n    {\n        return $this->order;\n    }\n\n    /**\n     * @param int $order\n     */\n    public function setOrder($order)\n    {\n        $this->order = $order;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/CategorySupplement.php",
    "content": "<?php\nnamespace Symfony4\\Doctrine;\n\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Symfony\\Component\\Validator\\Constraints as Assert;\n\n/**\n * @ORM\\Entity\n * @ORM\\Table(name=\"category_supplement\")\n */\nclass CategorySupplement\n{\n\n    /**\n     * @ORM\\Id\n     * @ORM\\Column(type=\"integer\")\n     * @ORM\\GeneratedValue(strategy=\"AUTO\")\n     */\n    private $id;\n\n    /**\n     * @var Category\n     * @ORM\\ManyToOne(targetEntity=\"Symfony4\\Doctrine\\Category\", inversedBy=\"supplements\")\n     * @Assert\\NotBlank()\n     */\n    private $category;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=100)\n     * @Assert\\NotBlank()\n     */\n    private $name;\n\n    /**\n     * @var int x 100\n     * @ORM\\Column(type=\"float\")\n     * @Assert\\NotBlank()\n     */\n    private $price;\n\n    /**\n     * @var int\n     * @ORM\\Column(type=\"integer\", name=\"order_id\", options={\"default\":1})\n     * @Assert\\NotBlank()\n     */\n    private $order = 1;\n\n    /**\n     * @return mixed\n     */\n    public function getId()\n    {\n        return $this->id;\n    }\n\n    /**\n     * @param mixed $id\n     */\n    public function setId($id)\n    {\n        $this->id = $id;\n    }\n\n    /**\n     * @return Category\n     */\n    public function getCategory()\n    {\n        return $this->category;\n    }\n\n    /**\n     * @param Category $category\n     */\n    public function setCategory($category)\n    {\n        $this->category = $category;\n    }\n\n    /**\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->name;\n    }\n\n    /**\n     * @param string $name\n     */\n    public function setName($name)\n    {\n        $this->name = $name;\n    }\n\n    /**\n     * @return int\n     */\n    public function getPrice()\n    {\n        return $this->price;\n    }\n\n    /**\n     * @param int $price\n     */\n    public function setPrice($price)\n    {\n        $this->price = $price;\n    }\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->name.' ('.($this->price).' €)';\n    }\n\n    /**\n     * @return int\n     */\n    public function getOrder()\n    {\n        return $this->order;\n    }\n\n    /**\n     * @param int $order\n     */\n    public function setOrder($order)\n    {\n        $this->order = $order;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/Command.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Seat\\Domain\\Basket\\Model\\OrderType;\n\n/**\n * @ORM\\Entity()\n * @ORM\\Table()\n */\nclass Command\n{\n    /**\n     * @ORM\\Id\n     * @ORM\\Column(type=\"integer\")\n     * @ORM\\GeneratedValue(strategy=\"AUTO\")\n     */\n    private $id;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\")\n     */\n    private $userId;\n\n    /**\n     * @var array\n     * @ORM\\Column(type=\"json\")\n     */\n    private $content;\n\n    /**\n     * @var \\DateTimeImmutable\n     * @ORM\\Column(type=\"datetime_immutable\")\n     */\n    private $date;\n\n    /**\n     * @var array\n     * @ORM\\Column(type=\"json_array\")\n     */\n    private $orderType;\n\n    public function id()\n    {\n        return $this->id;\n    }\n\n    public function setId($id)\n    {\n        $this->id = $id;\n    }\n\n    public function userId(): string\n    {\n        return $this->userId;\n    }\n\n    public function setUserId($userId)\n    {\n        $this->userId = $userId;\n    }\n\n    public function content(): array\n    {\n        return $this->content;\n    }\n\n    public function setContent($content)\n    {\n        $this->content = $content;\n    }\n\n    public function date()\n    {\n        return $this->date;\n    }\n\n    public function setDate(\\DateTimeImmutable $date)\n    {\n        $this->date = $date->setTimezone(new \\DateTimeZone('Europe/Brussels'));\n    }\n\n    public function setOrderType(OrderType $orderType)\n    {\n        $this->orderType = ['name' => $orderType->name(), 'time' => $orderType->time()];\n    }\n\n    public function getOrderTypeString()\n    {\n        $str = $this->orderType['name'];\n        if (!empty($this->orderType['time'])) {\n            $str .= ' ('.substr($this->orderType['time'], 0, -3).')';\n        }\n\n        return $str;\n    }\n\n    public function getName()\n    {\n        return $this->content['name'];\n    }\n\n    public function getOption()\n    {\n        if (!empty($this->content['option'])) {\n            return $this->content['option']['name'];\n        }\n\n        return '-';\n    }\n\n    public function getSupplements()\n    {\n        $supplementNames = [];\n        $supplements = $this->content['supplements'] ?? [];\n        foreach ($supplements as $supplement) {\n            $supplementNames[] = $supplement['name'];\n        }\n\n        $str = join(', ', $supplementNames);\n\n        return !empty($str) ? $str : '-';\n    }\n\n    public function getComment()\n    {\n        return !empty($this->content['comment']) ? $this->content['comment'] : '-';\n    }\n\n    public function getQuantity()\n    {\n        return $this->content['quantity'];\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/Company.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Symfony\\Component\\Validator\\Constraints as Assert;\n\n/**\n * @ORM\\Entity()\n * @ORM\\Table(name=\"company\")\n */\nclass Company\n{\n    /**\n     * @ORM\\Id\n     * @ORM\\Column(type=\"integer\")\n     * @ORM\\GeneratedValue(strategy=\"AUTO\")\n     */\n    private $id;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=100)\n     * @Assert\\NotBlank()\n     */\n    private $name;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=100, nullable=false)\n     * @Assert\\NotBlank()\n     */\n    private $slug;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=12, nullable=true)\n     * @Assert\\NotBlank(groups={\"Update\"})\n     */\n    private $vat;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=255)\n     * @Assert\\NotBlank()\n     */\n    private $street;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=10)\n     * @Assert\\NotBlank()\n     */\n    private $streetNumber;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=4)\n     * @Assert\\NotBlank()\n     */\n    private $zipCode;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=50)\n     * @Assert\\NotBlank()\n     */\n    private $city;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=15)\n     * @Assert\\NotBlank()\n     */\n    private $phoneNumber;\n\n    /**\n     * @var bool\n     * @ORM\\Column(type=\"boolean\")\n     */\n    private $canBeDelivered = false;\n\n    /**\n     * @example 11:30\n     * @var string\n     * @ORM\\Column(type=\"string\", length=8, nullable=true)\n     */\n    private $orderDeliveryDeadLine = '11:30:00';\n\n    /**\n     * @var string\n     * @ORM\\ManyToOne(targetEntity=\"Symfony4\\Doctrine\\Tournee\", inversedBy=\"supplements\")\n     * @ORM\\JoinColumn(name=\"tourneeId\", referencedColumnName=\"id\", nullable=true)\n     *\n     */\n    private $tournee;\n\n    /**\n     * @var bool\n     * @ORM\\Column(type=\"boolean\")\n     */\n    private $isEnabled = false;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"text\", nullable=true)\n     */\n    private $comment;\n\n    /**\n     * @Assert\\NotBlank()\n     * @var string\n     * @ORM\\Column(type=\"string\")\n     */\n    private $contactEmail;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"text\", nullable=false)\n     */\n    private $store;\n\n    /**\n     * @var boolean\n     * @ORM\\Column(type=\"boolean\", nullable=false)\n     */\n    private $hasInvoice;\n\n    /**\n     * @return mixed\n     */\n    public function getId()\n    {\n        return $this->id;\n    }\n\n    /**\n     * @param mixed $id\n     */\n    public function setId($id)\n    {\n        $this->id = $id;\n    }\n\n    /**\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->name;\n    }\n\n    /**\n     * @param string $name\n     */\n    public function setName($name)\n    {\n        $this->name = $name;\n    }\n\n    /**\n     * @return string\n     */\n    public function getVat()\n    {\n        return $this->vat;\n    }\n\n    /**\n     * @param string $vat\n     */\n    public function setVat($vat)\n    {\n        $this->vat = $vat;\n    }\n\n    public function getSlug()\n    {\n        return $this->slug;\n    }\n\n    public function setSlug($slug)\n    {\n        $this->slug = $slug;\n    }\n\n\n    /**\n     * @return string\n     */\n    public function getStreet()\n    {\n        return $this->street;\n    }\n\n    /**\n     * @param string $street\n     */\n    public function setStreet($street)\n    {\n        $this->street = $street;\n    }\n\n    /**\n     * @return string\n     */\n    public function getStreetNumber()\n    {\n        return $this->streetNumber;\n    }\n\n    /**\n     * @param string $streetNumber\n     */\n    public function setStreetNumber($streetNumber)\n    {\n        $this->streetNumber = $streetNumber;\n    }\n\n    /**\n     * @return string\n     */\n    public function getZipCode()\n    {\n        return $this->zipCode;\n    }\n\n    /**\n     * @param string $zipCode\n     */\n    public function setZipCode($zipCode)\n    {\n        $this->zipCode = $zipCode;\n    }\n\n    /**\n     * @return string\n     */\n    public function getCity()\n    {\n        return $this->city;\n    }\n\n    /**\n     * @param string $city\n     */\n    public function setCity($city)\n    {\n        $this->city = $city;\n    }\n\n    /**\n     * @return string\n     */\n    public function getPhoneNumber()\n    {\n        return $this->phoneNumber;\n    }\n\n    /**\n     * @param string $phoneNumber\n     */\n    public function setPhoneNumber($phoneNumber)\n    {\n        $this->phoneNumber = $phoneNumber;\n    }\n\n    /**\n     * @return string\n     */\n    public function getOrderDeliveryDeadLine()\n    {\n        return $this->orderDeliveryDeadLine;\n    }\n\n    /**\n     * @param string $orderDeliveryDeadLine\n     */\n    public function setOrderDeliveryDeadLine($orderDeliveryDeadLine)\n    {\n        $this->orderDeliveryDeadLine = $orderDeliveryDeadLine;\n    }\n\n\n    /**\n     * @return boolean\n     */\n    public function canBeDelivered()\n    {\n        return $this->canBeDelivered;\n    }\n\n    /**\n     * @param boolean $canBeDelivered\n     */\n    public function setCanBeDelivered($canBeDelivered)\n    {\n        $this->canBeDelivered = $canBeDelivered;\n    }\n\n    /**\n     * @return string\n     */\n    public function getTournee()\n    {\n        return $this->tournee;\n    }\n\n    /**\n     * @param string $tournee\n     */\n    public function setTournee($tournee)\n    {\n        $this->tournee = $tournee;\n    }\n\n\n    public function __toString()\n    {\n        return $this->name;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function isEnabled()\n    {\n        return $this->isEnabled;\n    }\n\n    /**\n     * @param boolean $isEnabled\n     */\n    public function setIsEnabled($isEnabled)\n    {\n        $this->isEnabled = $isEnabled;\n    }\n\n    /**\n     * @return string\n     */\n    public function getComment()\n    {\n        return $this->comment;\n    }\n\n    /**\n     * @param string $comment\n     */\n    public function setComment($comment)\n    {\n        $this->comment = $comment;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getContactEmail()\n    {\n        return $this->contactEmail;\n    }\n\n    /**\n     * @param mixed $contactEmail\n     */\n    public function setContactEmail($contactEmail)\n    {\n        $this->contactEmail = $contactEmail;\n    }\n\n    public function setAdminCommandBefore(?\\DateTimeInterface $date)\n    {\n        if ($date) {\n            $this->orderDeliveryDeadLine = $date->format('H:i:s');\n        } else {\n            $this->orderDeliveryDeadLine = null;\n        }\n    }\n\n    public function getAdminCommandBefore()\n    {\n        if ($this->orderDeliveryDeadLine) {\n            $time = \\DateTimeImmutable::createFromFormat('H:i:s', $this->orderDeliveryDeadLine);\n            if ($time !== false) {\n                return $time;\n            }\n        }\n\n        return null;\n    }\n\n    public function store(): string\n    {\n        return $this->store;\n    }\n\n    public function setStore($store)\n    {\n        $this->store = $store;\n    }\n\n    public function hasInvoice(): bool\n    {\n        return $this->hasInvoice;\n    }\n\n    public function setHasInvoice($hasInvoice)\n    {\n        $this->hasInvoice = $hasInvoice;\n    }\n}\n\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/DoctrineBasketRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Symfony4\\Doctrine\\Basket as BasketEntity;\nuse Doctrine\\Bundle\\DoctrineBundle\\Repository\\ServiceEntityRepository;\nuse Doctrine\\Common\\Persistence\\ManagerRegistry;\nuse Seat\\Domain\\Basket\\Entity\\Basket;\nuse Seat\\Domain\\Basket\\Entity\\BasketRepository;\nuse Seat\\Domain\\Basket\\Model\\BasketProduct;\n\nclass DoctrineBasketRepository extends ServiceEntityRepository implements BasketRepository\n{\n    public function __construct(ManagerRegistry $registry)\n    {\n        parent::__construct($registry, BasketEntity::class);\n    }\n\n    public function addToBasket(string $userId, BasketProduct $basketProduct)\n    {\n        $basketEntity = new BasketEntity();\n        $basketEntity->setId($basketProduct->id());\n        $basketEntity->setUserId($userId);\n        $basketEntity->setContent(BasketProductJson::fromBasketProduct($basketProduct)->json());\n        $this->getEntityManager()->persist($basketEntity);\n        $this->getEntityManager()->flush($basketEntity);\n    }\n\n    public function getUserBasket(string $userId): Basket\n    {\n        /** @var BasketEntity[] $basketProducts */\n        $basketProducts = $this->findBy(['userId' => $userId]);\n\n        $convertToObject = function (BasketEntity $basket) {\n            return (new BasketProductJson($basket->content()))->basketProduct($basket->id().'');\n        };\n\n        $lines = array_map($convertToObject, $basketProducts);\n\n        return new Basket($userId, $lines);\n    }\n\n    public function emptyBasketFor(string $userId): void\n    {\n        $this->createQueryBuilder('b')\n            ->delete()\n            ->where('b.userId = :userId')\n            ->setParameter('userId', $userId)\n            ->getQuery()\n            ->getResult();\n    }\n\n    public function delete(string $basketId, string $userId): void\n    {\n        $this->createQueryBuilder('b')\n            ->delete()\n            ->where('b.userId = :userId')\n            ->andWhere('b.id = :basketId')\n            ->setParameter('userId', $userId)\n            ->setParameter('basketId', $basketId)\n            ->getQuery()\n            ->getResult();\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/DoctrineCategoryRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Error;\nuse Symfony4\\Doctrine\\Category as CategoryEntity;\nuse Doctrine\\Bundle\\DoctrineBundle\\Repository\\ServiceEntityRepository;\nuse Doctrine\\Common\\Persistence\\ManagerRegistry;\nuse Seat\\Domain\\Menu\\Entity\\Category;\nuse Seat\\Domain\\Menu\\Entity\\CategoryRepository;\n\nclass DoctrineCategoryRepository extends ServiceEntityRepository implements CategoryRepository\n{\n\n    public function __construct(ManagerRegistry $registry)\n    {\n        parent::__construct($registry, CategoryEntity::class);\n    }\n\n    /**\n     * @return Category[]\n     */\n    public function getCategories(): array\n    {\n        $categories = $this->findBy([], array('order' => 'ASC'));\n\n        return array_map(\n            function (CategoryEntity $category) {\n                return new Category($category->getId().'', $category->getName(), $category->getDescription());\n            },\n            $categories\n        );\n    }\n\n    public function addCategory(Category $category)\n    {\n        throw new Error('Method \"'.__METHOD__.'\" to implement');\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/DoctrineClientRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Symfony4\\Doctrine\\Company;\nuse Symfony4\\Doctrine\\User;\nuse Doctrine\\Bundle\\DoctrineBundle\\Repository\\ServiceEntityRepository;\nuse Doctrine\\Common\\Persistence\\ManagerRegistry;\nuse Seat\\Domain\\Client\\Entity\\Client;\nuse Seat\\Domain\\Client\\Entity\\ClientRepository;\n\nclass DoctrineClientRepository extends ServiceEntityRepository implements ClientRepository\n{\n    public function __construct(ManagerRegistry $registry)\n    {\n        parent::__construct($registry, User::class);\n    }\n\n    public function addClient(Client $client)\n    {\n        $user = new User();\n        $user->setId($client->id());\n        $user->setEmail($client->email());\n        $user->setFirstName($client->firstName());\n        $user->setLastName($client->lastName());\n        $user->setPhoneNumber($client->phoneNumber());\n        $user->setPassword($client->password());\n        $user->setStore($client->store());\n        $user->setRole($client->role());\n        $user->setIsEnabled($client->isEnabled());\n\n        if ($client->hasCompany()) {\n            $companyForeign = $this->getEntityManager()->getReference(Company::class, $client->companyId());\n            $user->setCompany($companyForeign);\n        }\n\n        $this->getEntityManager()->persist($user);\n        $this->getEntityManager()->flush($user);\n\n    }\n\n    public function getClientByEmail(string $email): ?Client\n    {\n        /** @var User $user */\n        $user = $this->findOneBy(['email' => $email]);\n        if ($user === null) {\n            return null;\n        }\n\n        $companyId = $user->getCompany() === null\n            ? null\n            : $this->getEntityManager()->getUnitOfWork()->getEntityIdentifier($user->getCompany())['id'].'';\n\n        return new Client(\n            $user->id(),\n            $user->firstName(),\n            $user->lastName(),\n            $user->email(),\n            $user->phoneNumber(),\n            $user->password(),\n            $user->store(),\n            $user->role(),\n            $user->isEnabled(),\n            $companyId\n        );\n    }\n\n    public function getClientById(string $id): ?Client\n    {\n        /** @var User $user */\n        $user = $this->findOneBy(['id' => $id]);\n        if ($user === null) {\n            return null;\n        }\n\n        $companyId = $user->getCompany() === null\n            ? null\n            : $this->getEntityManager()->getUnitOfWork()->getEntityIdentifier($user->getCompany())['id'].'';\n\n        return new Client(\n            $user->id(),\n            $user->firstName(),\n            $user->lastName(),\n            $user->email(),\n            $user->phoneNumber(),\n            $user->password(),\n            $user->store(),\n            $user->role(),\n            $user->isEnabled(),\n            $companyId\n        );\n    }\n\n    public function updateClient(Client $client): void\n    {\n        $user = $this->findOneBy(['id' => $client->id()]);\n        $user->setEmail($client->email());\n        $user->setFirstName($client->firstName());\n        $user->setLastName($client->lastName());\n        $user->setPhoneNumber($client->phoneNumber());\n        $user->setPassword($client->password());\n\n        $this->getEntityManager()->persist($user);\n        $this->getEntityManager()->flush($user);\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/DoctrineCommandRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Symfony4\\Doctrine\\Command as CommandEntity;\nuse Doctrine\\Bundle\\DoctrineBundle\\Repository\\ServiceEntityRepository;\nuse Doctrine\\Common\\Persistence\\ManagerRegistry;\nuse Error;\nuse Ramsey\\Uuid\\Uuid;\nuse Seat\\Domain\\Order\\Entity\\Command;\nuse Seat\\Domain\\Order\\Entity\\CommandRepository;\nuse Seat\\Domain\\Basket\\Model\\BasketProduct;\n\nclass DoctrineCommandRepository extends ServiceEntityRepository implements CommandRepository\n{\n    public function __construct(ManagerRegistry $registry)\n    {\n        parent::__construct($registry, CommandEntity::class);\n    }\n\n    /**\n     * @return Command[]\n     */\n    public function getTodayList(): array\n    {\n        throw new Error('Method \"'.__METHOD__.'\" to implement');\n    }\n\n    public function add(Command $command): void\n    {\n        /** @var BasketProduct $basketProduct */\n        foreach ($command->basket() as $basketProduct) {\n            $commandEntity = new CommandEntity();\n            $commandEntity->setId(Uuid::uuid4()->toString());\n            $commandEntity->setUserId($command->userId());\n            $commandEntity->setDate($command->date());\n            $commandEntity->setOrderType($command->orderType());\n            $commandEntity->setContent(BasketProductJson::fromBasketProduct($basketProduct)->json());\n            $this->getEntityManager()->persist($commandEntity);\n        }\n        $this->getEntityManager()->flush();\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/DoctrineCompanyRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Symfony4\\Doctrine\\Company as CompanyEntity;\nuse Doctrine\\Bundle\\DoctrineBundle\\Repository\\ServiceEntityRepository;\nuse Doctrine\\Common\\Persistence\\ManagerRegistry;\nuse Seat\\Domain\\Client\\Entity\\Company;\nuse Seat\\Domain\\Client\\Entity\\CompanyRepository;\n\nclass DoctrineCompanyRepository extends ServiceEntityRepository implements CompanyRepository\n{\n    public function __construct(ManagerRegistry $registry)\n    {\n        parent::__construct($registry, CompanyEntity::class);\n    }\n\n    public function getCompanyNamed(string $companyName): ?Company\n    {\n        /** @var CompanyEntity $company */\n        $company = $this->findOneBy(['name' => $companyName]);\n        if ($company === null) {\n            return null;\n        }\n\n        return new Company(\n            $company->getId().'',\n            $company->getName(),\n            $company->hasInvoice(),\n            $company->store(),\n            $company->isEnabled(),\n            $company->getOrderDeliveryDeadLine()\n        );\n    }\n\n    public function addCompany(Company $company): void\n    {\n        $companyEntity = new CompanyEntity();\n        $companyEntity->setId($company->id());\n        $companyEntity->setName($company->name());\n\n        $this->getEntityManager()->persist($companyEntity);\n        $this->getEntityManager()->flush($companyEntity);\n    }\n\n    public function getCompanyById(?string $companyId): ?Company\n    {\n        /** @var CompanyEntity $company */\n        $company = $this->findOneBy(['id' => $companyId]);\n        if ($company === null) {\n            return null;\n        }\n\n        return new Company(\n            $company->getId().'',\n            $company->getName(),\n            $company->hasInvoice(),\n            $company->store(),\n            $company->isEnabled(),\n            $company->getOrderDeliveryDeadLine()\n        );\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/DoctrineHtmlContentRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Symfony4\\Doctrine\\HtmlContent as HtmlContentEntity;\nuse Doctrine\\Bundle\\DoctrineBundle\\Repository\\ServiceEntityRepository;\nuse Doctrine\\Common\\Persistence\\ManagerRegistry;\nuse Exception;\nuse Seat\\Domain\\Cms\\Entity\\HtmlContent;\nuse Seat\\Domain\\Cms\\Entity\\HtmlContentRepository;\n\nclass DoctrineHtmlContentRepository extends ServiceEntityRepository implements HtmlContentRepository\n{\n    public function __construct(ManagerRegistry $registry)\n    {\n        parent::__construct($registry, HtmlContentEntity::class);\n    }\n\n    public function getNamed(string $name): HtmlContent\n    {\n        try {\n            /** @var HtmlContentEntity $htmlContent */\n            $htmlContent = $this->createQueryBuilder('p')\n                ->where('p.name = :name')\n                ->setParameter('name', $name)\n                ->getQuery()\n                ->getSingleResult();\n\n            return new HtmlContent($htmlContent->getName(), $htmlContent->getHtml());\n        } catch (Exception $e) {\n            return new HtmlContent($name, '');\n        }\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/DoctrineProductOptionRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Doctrine\\Bundle\\DoctrineBundle\\Repository\\ServiceEntityRepository;\nuse Doctrine\\Common\\Persistence\\ManagerRegistry;\nuse Error;\nuse Seat\\Domain\\Menu\\Entity\\ProductOption;\nuse Seat\\Domain\\Menu\\Entity\\ProductOptionRepository;\n\nclass DoctrineProductOptionRepository extends ServiceEntityRepository implements ProductOptionRepository\n{\n    public function __construct(ManagerRegistry $registry)\n    {\n        parent::__construct($registry, CategoryOption::class);\n    }\n\n    /**\n     * @return ProductOption\n     */\n    public function get(string $productOptionId): ?ProductOption\n    {\n        /** @var CategoryOption $option */\n        $option = $this->find($productOptionId);\n        if ($option === null) {\n            return null;\n        }\n\n        return new ProductOption(\n            $option->getId().'',\n            $option->getCategory()->getId().'',\n            $option->getName(),\n            $option->getPrice()\n        );\n    }\n\n    public function add(ProductOption $productOption): void\n    {\n        throw new Error('Method \"'.__METHOD__.'\" to implement');\n    }\n\n    /**\n     * @return ProductOption[]\n     */\n    public function getByCategoryId(string $categoryId): array\n    {\n        /** @var CategoryOption $option */\n        $options = $this->findBy(['category' => $categoryId], array('order' => 'ASC'));\n\n        return array_map(\n            function (CategoryOption $option) {\n                return new ProductOption(\n                    $option->getId().'',\n                    $option->getCategory()->getId().'',\n                    $option->getName(),\n                    $option->getPrice()\n                );\n            },\n            $options\n        );\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/DoctrineProductRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Symfony4\\Doctrine\\Product as ProductEntity;\nuse Doctrine\\Bundle\\DoctrineBundle\\Repository\\ServiceEntityRepository;\nuse Doctrine\\Common\\Persistence\\ManagerRegistry;\nuse Error;\nuse Seat\\Domain\\Menu\\Entity\\Product;\nuse Seat\\Domain\\Menu\\Entity\\ProductRepository;\n\nclass DoctrineProductRepository extends ServiceEntityRepository implements ProductRepository\n{\n\n    public function __construct(ManagerRegistry $registry)\n    {\n        parent::__construct($registry, ProductEntity::class);\n    }\n\n    public function add(Product $product): void\n    {\n        throw new Error('Method \"'.__METHOD__.'\" to implement');\n    }\n\n    public function get(string $id): ?Product\n    {\n        /** @var ProductEntity $productEntity */\n        $productEntity = $this->find($id);\n        if ($productEntity === null) {\n            return null;\n        }\n\n        return new Product(\n            $productEntity->getId().'',\n            $productEntity->getCategory()->getId().'',\n            $productEntity->getName(),\n            $productEntity->getDescription().'',\n            $productEntity->getPrice()\n        );\n    }\n\n    /**\n     * @return Product[]\n     */\n    public function getByCategoryId(string $categoryId): array\n    {\n        /** @var ProductEntity[] $products */\n        $products = $this->findBy(['category' => $categoryId]);\n\n        return array_map(\n            function (ProductEntity $product) {\n                return new Product(\n                    $product->getId().'',\n                    $product->getCategory()->getId().'',\n                    $product->getName(),\n                    $product->getDescription().'',\n                    $product->getPrice()\n                );\n            },\n            $products\n        );\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/DoctrineProductSupplementRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Doctrine\\Bundle\\DoctrineBundle\\Repository\\ServiceEntityRepository;\nuse Doctrine\\Common\\Persistence\\ManagerRegistry;\nuse Error;\nuse Seat\\Domain\\Menu\\Entity\\ProductSupplement;\nuse Seat\\Domain\\Menu\\Entity\\ProductSupplementRepository;\n\nclass DoctrineProductSupplementRepository extends ServiceEntityRepository implements ProductSupplementRepository\n{\n    public function __construct(ManagerRegistry $registry)\n    {\n        parent::__construct($registry, CategorySupplement::class);\n    }\n\n    public function get(string $supplementId): ?ProductSupplement\n    {\n        /** @var CategorySupplement $supplement */\n        $supplement = $this->find($supplementId);\n        if ($supplement === null) {\n            return null;\n        }\n\n        return new ProductSupplement(\n            $supplement->getId().'',\n            $supplement->getCategory()->getId().'',\n            $supplement->getName(),\n            $supplement->getPrice()\n        );\n    }\n\n    public function add(ProductSupplement $supplement): void\n    {\n        throw new Error('Method \"'.__METHOD__.'\" to implement');\n    }\n\n    /**\n     * @return ProductSupplement[]\n     */\n    public function getByCategoryId(string $categoryId): array\n    {\n        /** @var CategorySupplement $option */\n        $supplements = $this->findBy(['category' => $categoryId], array('order' => 'ASC'));\n\n        return array_map(\n            function (CategorySupplement $supplement) {\n                return new ProductSupplement(\n                    $supplement->getId().'',\n                    $supplement->getCategory()->getId().'',\n                    $supplement->getName(),\n                    $supplement->getPrice()\n                );\n            },\n            $supplements\n        );\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/HtmlContent.php",
    "content": "<?php\n\nnamespace Symfony4\\Doctrine;\n\n\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Symfony\\Component\\Validator\\Constraints as Assert;\n\n/**\n * @ORM\\Entity()\n * @ORM\\Table(name=\"html_content\")\n */\nclass HtmlContent\n{\n    /**\n     * @var string\n     * @ORM\\Id\n     * @ORM\\Column(type=\"string\", length=50)\n     * @Assert\\NotBlank()\n     */\n    private $name;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"text\")\n     * @Assert\\NotBlank()\n     */\n    private $html;\n\n    /**\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->name;\n    }\n\n    /**\n     * @param string $name\n     */\n    public function setName($name)\n    {\n        $this->name = $name;\n    }\n\n    /**\n     * @return string\n     */\n    public function getHtml()\n    {\n        return $this->html;\n    }\n\n    /**\n     * @param string $html\n     */\n    public function setHtml($html)\n    {\n        $this->html = $html;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/Pdf.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Symfony\\Component\\HttpFoundation\\File\\File;\nuse Vich\\UploaderBundle\\Mapping\\Annotation as Vich;\n\n/**\n * @ORM\\Entity\n * @Vich\\Uploadable\n */\nclass Pdf\n{\n    /**\n     * @ORM\\Id\n     * @ORM\\Column(type=\"string\")\n     */\n    private $id;\n    /**\n     * @ORM\\Column(type=\"string\")\n     */\n    private $text;\n\n    /**\n     * @ORM\\Column(type=\"string\", length=255)\n     * @var string\n     */\n    private $pdf;\n\n    /**\n     * @Vich\\UploadableField(mapping=\"pdf\", fileNameProperty=\"pdf\")\n     * @var File\n     */\n    private $pdfFile;\n\n    public function id()\n    {\n        return $this->id;\n    }\n\n    public function setId($id)\n    {\n        $this->id = $id;\n    }\n\n    public function text()\n    {\n        return $this->text;\n    }\n\n    public function setText($text)\n    {\n        $this->text = $text;\n    }\n\n    public function pdf(): ?string\n    {\n        return $this->pdf;\n    }\n\n    public function setPdf($pdf)\n    {\n        $this->pdf = $pdf;\n    }\n\n    public function pdfFile(): ?File\n    {\n        return $this->pdfFile;\n    }\n\n    public function setPdfFile($pdfFile)\n    {\n        $this->pdfFile = $pdfFile;\n        if($this->pdfFile){\n            $this->setPdf($this->pdfFile->getFilename());\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/Product.php",
    "content": "<?php\n\n\nnamespace Symfony4\\Doctrine;\n\n\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Symfony\\Component\\Validator\\Constraints as Assert;\n\n/**\n * @ORM\\Entity()\n * @ORM\\Table(name=\"product\")\n */\nclass Product\n{\n    /**\n     * @ORM\\Id\n     * @ORM\\Column(type=\"integer\")\n     * @ORM\\GeneratedValue(strategy=\"AUTO\")\n     */\n    private $id;\n\n\n    /**\n     * @var Category\n     * @ORM\\ManyToOne(targetEntity=\"Symfony4\\Doctrine\\Category\", inversedBy=\"products\")\n     * @Assert\\NotBlank()\n     */\n    private $category;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=100)\n     * @Assert\\NotBlank()\n     */\n    private $name;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", nullable=true)\n     */\n    private $description;\n\n    /**\n     * @var int x 100\n     * @ORM\\Column(type=\"integer\")\n     * @Assert\\NotBlank()\n     */\n    private $price;\n\n    /**\n     * @var int\n     * @ORM\\Column(type=\"integer\", name=\"order_id\")\n     * @Assert\\NotBlank()\n     */\n    private $order = 1;\n\n    /**\n     * @var bool\n     * @ORM\\Column(type=\"boolean\")\n     */\n    private $isEnabled = true;\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->name;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getId()\n    {\n        return $this->id;\n    }\n\n    /**\n     * @param mixed $id\n     *\n     * @return $this\n     */\n    public function setId($id)\n    {\n        $this->id = $id;\n\n        return $this;\n    }\n\n    /**\n     * @return Category\n     */\n    public function getCategory()\n    {\n        return $this->category;\n    }\n\n    /**\n     * @param Category $category\n     *\n     * @return $this\n     */\n    public function setCategory($category)\n    {\n        $this->category = $category;\n\n        return $this;\n    }\n\n    /**\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->name;\n    }\n\n    /**\n     * @param string $name\n     *\n     * @return $this\n     */\n    public function setName($name)\n    {\n        $this->name = $name;\n\n        return $this;\n    }\n\n    /**\n     * @return string\n     */\n    public function getDescription()\n    {\n        return $this->description;\n    }\n\n    /**\n     * @param string $description\n     *\n     * @return $this\n     */\n    public function setDescription($description)\n    {\n        $this->description = $description;\n\n        return $this;\n    }\n\n    /**\n     * @return int\n     */\n    public function getPrice()\n    {\n        return $this->price;\n    }\n\n    /**\n     * @param int $price\n     *\n     * @return $this\n     */\n    public function setPrice($price)\n    {\n        $this->price = $price;\n\n        return $this;\n    }\n\n    /**\n     * @return int\n     */\n    public function getOrder()\n    {\n        return $this->order;\n    }\n\n    /**\n     * @param int $order\n     *\n     * @return $this\n     */\n    public function setOrder($order)\n    {\n        $this->order = $order;\n\n        return $this;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function isEnabled()\n    {\n        return $this->isEnabled;\n    }\n\n    /**\n     * @param boolean $isEnabled\n     *\n     * @return $this\n     */\n    public function setIsEnabled($isEnabled)\n    {\n        $this->isEnabled = $isEnabled;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/Tournee.php",
    "content": "<?php\n\n\nnamespace Symfony4\\Doctrine;\n\n\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Symfony\\Component\\Validator\\Constraints as Assert;\n\n/**\n * @ORM\\Entity()\n * @ORM\\Table(name=\"tournees\")\n */\nclass Tournee\n{\n\n    /**\n     * @ORM\\Id\n     * @ORM\\Column(type=\"string\")\n     */\n    private $id;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\")\n     * @Assert\\NotBlank()\n     */\n    private $name;\n\n    /**\n     * @return string\n     */\n    public function __toString()\n    {\n        return $this->name;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getId()\n    {\n        return $this->id;\n    }\n\n    /**\n     * @param mixed $id\n     */\n    public function setId($id)\n    {\n        $this->id = $id;\n    }\n\n    /**\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->name;\n    }\n\n    /**\n     * @param string $name\n     */\n    public function setName($name)\n    {\n        $this->name = $name;\n    }\n\n\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Doctrine/User.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Doctrine;\n\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Symfony\\Component\\Validator\\Constraints as Assert;\n\n/**\n * @ORM\\Entity\n * @ORM\\Table(name=\"users\")\n */\nclass User\n{\n    /**\n     * @ORM\\Id\n     * @ORM\\Column(type=\"string\")\n     */\n    protected $id;\n\n    /**\n     * @var Company\n     * @ORM\\ManyToOne(targetEntity=\"Symfony4\\Doctrine\\Company\")\n     * @ORM\\JoinColumn(name=\"company_id\", referencedColumnName=\"id\")\n     */\n    private $company;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=50)\n     * @Assert\\NotBlank()\n     */\n    private $firstName;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=50)\n     * @Assert\\NotBlank()\n     */\n    private $lastName;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=20)\n     * @Assert\\NotBlank()\n     */\n    private $phoneNumber;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=255)\n     * @Assert\\NotBlank()\n     */\n    private $password;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=255, unique=true)\n     * @Assert\\NotBlank()\n     */\n    private $email;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=255, nullable=false)\n     */\n    private $store;\n\n    /**\n     * @var string\n     * @ORM\\Column(type=\"string\", length=10, nullable=false)\n     */\n    private $role;\n\n    /**\n     * @var bool\n     * @ORM\\Column(type=\"boolean\")\n     */\n    private $isEnabled = false;\n\n    public function id()\n    {\n        return $this->id;\n    }\n\n    public function setId($id)\n    {\n        $this->id = $id;\n    }\n\n    public function getCompany()\n    {\n        return $this->company;\n    }\n\n    public function setCompany($company)\n    {\n        $this->company = $company;\n    }\n\n    public function firstName(): ?string\n    {\n        return $this->firstName;\n    }\n\n    public function setFirstName($firstName)\n    {\n        $this->firstName = $firstName;\n    }\n\n    public function lastName(): ?string\n    {\n        return $this->lastName;\n    }\n\n    public function setLastName($lastName)\n    {\n        $this->lastName = $lastName;\n    }\n\n    public function phoneNumber(): ?string\n    {\n        return $this->phoneNumber;\n    }\n\n    public function setPhoneNumber($phoneNumber)\n    {\n        $this->phoneNumber = $phoneNumber;\n    }\n\n    public function password(): string\n    {\n        return $this->password;\n    }\n\n    public function setPassword($password)\n    {\n        $this->password = $password;\n    }\n\n    public function email(): ?string\n    {\n        return $this->email;\n    }\n\n    public function setEmail($email)\n    {\n        $this->email = $email;\n    }\n\n    public function store(): string\n    {\n        return $this->store;\n    }\n\n    public function setStore($store)\n    {\n        $this->store = $store;\n    }\n\n    public function role(): string\n    {\n        return $this->role;\n    }\n\n    public function setRole($role)\n    {\n        $this->role = $role;\n    }\n\n    public function isEnabled()\n    {\n        return $this->isEnabled;\n    }\n\n    public function setIsEnabled($isEnabled)\n    {\n        $this->isEnabled = $isEnabled;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Form/BasketConfirmationType.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Form;\n\nuse Seat\\Domain\\Basket\\Model\\OrderTypeName;\nuse Seat\\Domain\\Basket\\Model\\PossibleOrderType;\nuse Seat\\Domain\\Basket\\Service\\OrderTypeChecker;\nuse Seat\\Domain\\Order\\UseCase\\ConfirmBasket\\ConfirmBasketRequest;\nuse Symfony\\Component\\Form\\AbstractType;\nuse Symfony\\Component\\Form\\Extension\\Core\\Type\\ChoiceType;\nuse Symfony\\Component\\Form\\Extension\\Core\\Type\\HiddenType;\nuse Symfony\\Component\\Form\\FormBuilderInterface;\nuse Symfony\\Component\\OptionsResolver\\OptionsResolver;\nuse Symfony\\Component\\Security\\Core\\Authentication\\Token\\Storage\\TokenStorageInterface;\n\nclass BasketConfirmationType extends AbstractType\n{\n    private $orderTypeChecker;\n    /**\n     *\n     */\n    private $userId;\n\n    public function __construct(OrderTypeChecker $orderTypeChecker, TokenStorageInterface $tokenStorage)\n    {\n        $this->orderTypeChecker = $orderTypeChecker;\n        $this->userId = is_string($tokenStorage->getToken()->getUser()) ? '' : $tokenStorage->getToken()->getUser()->getId();\n    }\n\n    public function buildForm(FormBuilderInterface $builder, array $options)\n    {\n        $builder->add('checkSum', HiddenType::class);\n        try {\n            $possibleOrderType = $this->orderTypeChecker->getPossibleOrderType($this->userId);\n            $builder->add('orderTypeName', HiddenType::class, ['data' => $possibleOrderType->name()]);\n            $this->buildForOrderType($builder, $possibleOrderType);\n        } catch (\\Exception $e) {\n            //Can explode when the user is unknown\n        }\n    }\n\n    private function buildForOrderType(FormBuilderInterface $builder, PossibleOrderType $possibleOrderType): void\n    {\n        if ($possibleOrderType->name() == OrderTypeName::$takeAway) {\n            $roundedSteps = array_reduce(\n                $possibleOrderType->range()->getRoundedStep(15),\n                function ($list, $time) {\n                    $list[substr($time, 0, 5)] = $time;\n\n                    return $list;\n                },\n                []\n            );\n            $builder->add('takeAwayTime', ChoiceType::class, ['choices' => $roundedSteps]);\n        }\n    }\n\n    public function configureOptions(OptionsResolver $resolver)\n    {\n        $resolver->setDefaults(\n            [\n                'data_class' => ConfirmBasketRequest::class,\n                'userId' => '',\n                'csrf_protection' => false,\n                'possibleOrderType' => null,\n            ]\n        );\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Form/BasketType.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Form;\n\nuse Seat\\Domain\\Basket\\UseCase\\AddProductToBasket\\AddProductToBasketRequest;\nuse Symfony\\Component\\Form\\AbstractType;\nuse Symfony\\Component\\Form\\Extension\\Core\\Type\\CollectionType;\nuse Symfony\\Component\\Form\\Extension\\Core\\Type\\IntegerType;\nuse Symfony\\Component\\Form\\Extension\\Core\\Type\\TextType;\nuse Symfony\\Component\\Form\\FormBuilderInterface;\nuse Symfony\\Component\\OptionsResolver\\OptionsResolver;\n\nclass BasketType extends AbstractType\n{\n    public function buildForm(FormBuilderInterface $builder, array $options)\n    {\n        $builder\n            ->add('productId')\n            ->add('optionId', TextType::class)\n            ->add('comment')\n            ->add(\n                'supplementIds',\n                CollectionType::class,\n                [\n                    'entry_type' => TextType::class,\n                    'empty_data' => [],\n                    'by_reference' => false,\n                    'allow_add' => true,\n                ]\n            )\n            ->add('quantity', IntegerType::class);\n    }\n\n    public function configureOptions(OptionsResolver $resolver)\n    {\n        $resolver->setDefaults(\n            [\n                'data_class' => AddProductToBasketRequest::class,\n                'csrf_protection' => false,\n            ]\n        );\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Form/FormHelper.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Form;\n\nuse Symfony\\Component\\Form\\FormFactoryInterface;\nuse Symfony\\Component\\HttpFoundation\\Request;\n\nclass FormHelper\n{\n    private $formFactory;\n\n    public function __construct(FormFactoryInterface $formFactory)\n    {\n        $this->formFactory = $formFactory;\n    }\n\n    public function getFormData(Request $request, string $typeClass, $options = [])\n    {\n        $formBuilder = $this->formFactory->createBuilder($typeClass, null, $options);\n        $form = $formBuilder->getForm();\n        $form->handleRequest($request);\n\n        return $form->getData();\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Form/RegisterType.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Form;\n\nuse Seat\\Domain\\Client\\Entity\\Store;\nuse Seat\\Domain\\Client\\UseCase\\Register\\RegisterRequest;\nuse Symfony\\Component\\Form\\AbstractType;\nuse Symfony\\Component\\Form\\Extension\\Core\\Type\\ChoiceType;\nuse Symfony\\Component\\Form\\Extension\\Core\\Type\\HiddenType;\nuse Symfony\\Component\\Form\\Extension\\Core\\Type\\PasswordType;\nuse Symfony\\Component\\Form\\FormBuilderInterface;\nuse Symfony\\Component\\OptionsResolver\\OptionsResolver;\n\nclass RegisterType extends AbstractType\n{\n    public function buildForm(FormBuilderInterface $builder, array $options)\n    {\n        $builder\n            ->add('isPosted', HiddenType::class, ['data' => true])\n            ->add('companyName')\n            ->add('firstName', null, ['required' => true])\n            ->add('lastName', null, ['required' => true])\n            ->add('email', null, ['required' => true])\n            ->add('phoneNumber', null, ['required' => true])\n            ->add('password', PasswordType::class)\n            ->add(\n                'store',\n                ChoiceType::class,\n                [\n                    'required' => true,\n                    'choices' => [\n                        'La hulpe' => Store::$laHulpe,\n                        'Waterloo' => Store::$waterloo,\n                    ],\n                ]\n            );\n    }\n\n    public function configureOptions(OptionsResolver $resolver)\n    {\n        $resolver->setDefaults(\n            [\n                'data_class' => RegisterRequest::class,\n            ]\n        );\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Form/UpdateClientType.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Form;\n\nuse Seat\\Presentation\\Client\\EditableClient;\nuse Symfony\\Component\\Form\\AbstractType;\nuse Symfony\\Component\\Form\\Extension\\Core\\Type\\PasswordType;\nuse Symfony\\Component\\Form\\FormBuilderInterface;\nuse Symfony\\Component\\OptionsResolver\\OptionsResolver;\n\nclass UpdateClientType extends AbstractType\n{\n    public function buildForm(FormBuilderInterface $builder, array $options)\n    {\n        $builder\n            ->add('firstName')\n            ->add('lastName')\n            ->add('email')\n            ->add('phoneNumber')\n            ->add('password', PasswordType::class, ['required' => false]);\n    }\n\n    public function configureOptions(OptionsResolver $resolver)\n    {\n        $resolver->setDefaults(['data_class' => EditableClient::class]);\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Kernel.php",
    "content": "<?php\ndeclare(strict_types=1);\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Symfony4;\n\nuse Symfony4\\DependencyInjection\\Compiler\\AutowireSeatPass;\nuse Symfony\\Bundle\\FrameworkBundle\\Kernel\\MicroKernelTrait;\nuse Symfony\\Component\\Config\\Loader\\LoaderInterface;\nuse Symfony\\Component\\Config\\Resource\\FileResource;\nuse Symfony\\Component\\DependencyInjection\\ContainerBuilder;\nuse Symfony\\Component\\HttpKernel\\Kernel as BaseKernel;\nuse Symfony\\Component\\Routing\\RouteCollectionBuilder;\n\nclass Kernel extends BaseKernel\n{\n    use MicroKernelTrait;\n    const CONFIG_EXTS = '.{php,xml,yaml,yml}';\n\n    public function getCacheDir()\n    {\n        return $this->getProjectDir().'/var/cache/'.$this->environment;\n    }\n\n    public function getLogDir()\n    {\n        return $this->getProjectDir().'/var/log';\n    }\n\n    public function registerBundles()\n    {\n        $contents = require $this->getProjectDir().'/config/bundles.php';\n        foreach ($contents as $class => $envs) {\n            if ($envs[$this->environment] ?? $envs['all'] ?? false) {\n                yield new $class();\n            }\n        }\n    }\n\n    protected function build(ContainerBuilder $container)\n    {\n        $container->addCompilerPass(new AutowireSeatPass());\n    }\n\n\n    protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader)\n    {\n        $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php'));\n        $container->setParameter('container.dumper.inline_class_loader', true);\n        $confDir = $this->getProjectDir().'/config';\n        $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob');\n        $loader->load($confDir.'/{packages}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob');\n        $loader->load($confDir.'/{services}'.self::CONFIG_EXTS, 'glob');\n        $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob');\n    }\n\n    protected function configureRoutes(RouteCollectionBuilder $routes)\n    {\n        $confDir = $this->getProjectDir().'/config';\n        $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS, '/', 'glob');\n        $routes->import($confDir.'/{routes}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob');\n        $routes->import($confDir.'/{routes}'.self::CONFIG_EXTS, '/', 'glob');\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/ParamConverter/FormToNullableRequestConverter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\ParamConverter;\n\nuse Symfony4\\Form\\FormHelper;\nuse Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\ParamConverter;\nuse Sensio\\Bundle\\FrameworkExtraBundle\\Request\\ParamConverter\\ParamConverterInterface;\nuse Symfony\\Component\\HttpFoundation\\Request;\n\nclass FormToNullableRequestConverter implements ParamConverterInterface\n{\n    private $formHelper;\n\n    public function __construct(FormHelper $formHelper)\n    {\n        $this->formHelper = $formHelper;\n    }\n\n    /**\n     * Stores the object in the request.\n     *\n     * @param ParamConverter $configuration Contains the name, class and options of the object\n     *\n     * @return bool True if the object has been successfully set, else false\n     */\n    public function apply(Request $request, ParamConverter $configuration)\n    {\n        $specificRequest = $this->formHelper->getFormData($request, $configuration->getOptions()['form']);\n\n        $request->attributes->set($configuration->getName(), $specificRequest);\n\n        return true;\n    }\n\n    /**\n     * Checks if the object is supported.\n     *\n     * @return bool True if the object is supported, else false\n     */\n    public function supports(ParamConverter $configuration)\n    {\n\n        return !empty($configuration->getOptions()['form']) && $configuration->getName() === 'nullableRequest';\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/ParamConverter/FormToRequestConverter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\ParamConverter;\n\nuse Symfony4\\Form\\FormHelper;\nuse Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\ParamConverter;\nuse Sensio\\Bundle\\FrameworkExtraBundle\\Request\\ParamConverter\\ParamConverterInterface;\nuse Symfony\\Component\\HttpFoundation\\Request;\n\nclass FormToRequestConverter implements ParamConverterInterface\n{\n    private $formHelper;\n\n    public function __construct(FormHelper $formHelper)\n    {\n        $this->formHelper = $formHelper;\n    }\n\n    /**\n     * Stores the object in the request.\n     *\n     * @param ParamConverter $configuration Contains the name, class and options of the object\n     *\n     * @return bool True if the object has been successfully set, else false\n     */\n    public function apply(Request $request, ParamConverter $configuration)\n    {\n        $specificRequest = $this->formHelper->getFormData($request, $configuration->getOptions()['form']);\n        if ($specificRequest === null) {\n            return false;\n        }\n\n        $request->attributes->set($configuration->getName(), $specificRequest);\n\n        return true;\n    }\n\n    /**\n     * Checks if the object is supported.\n     *\n     * @return bool True if the object is supported, else false\n     */\n    public function supports(ParamConverter $configuration)\n    {\n\n        return !empty($configuration->getOptions()['form']) && $configuration->getName() === 'form2request';\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Security/Service/ClientUserProvider.php",
    "content": "<?php\ndeclare(strict_types=1);\n\nnamespace Symfony4\\Security\\Service;\n\nuse Symfony4\\Security\\User;\nuse Seat\\Domain\\Client\\Entity\\ClientRepository;\nuse Symfony\\Component\\Security\\Core\\Exception\\UsernameNotFoundException;\nuse Symfony\\Component\\Security\\Core\\User\\UserInterface;\nuse Symfony\\Component\\Security\\Core\\User\\UserProviderInterface;\n\nclass ClientUserProvider implements UserProviderInterface\n{\n    private $clientRepository;\n\n    public function __construct(ClientRepository $clientRepository)\n    {\n        $this->clientRepository = $clientRepository;\n    }\n\n    /**\n     * Loads the user for the given username.\n     *\n     * This method must throw UsernameNotFoundException if the user is not\n     * found.\n     *\n     * @param string $username The username\n     *\n     * @return UserInterface\n     *\n     * @throws UsernameNotFoundException if the user is not found\n     */\n    public function loadUserByUsername($username)\n    {\n        $client = $this->clientRepository->getClientByEmail($username);\n        if ($client === null || !$client->isEnabled()) {\n            throw new UsernameNotFoundException();\n        }\n\n        return new User($client);\n    }\n\n    public function refreshUser(UserInterface $user)\n    {\n        $client = $this->clientRepository->getClientByEmail($user->getUsername());\n        if ($client === null || !$client->isEnabled()) {\n            throw new UsernameNotFoundException();\n        }\n\n        return $user;\n    }\n\n    /**\n     * Whether this provider supports the given user class.\n     *\n     * @param string $class\n     *\n     * @return bool\n     */\n    public function supportsClass($class)\n    {\n        return User::class === $class;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Security/Service/FormAuthenticator.php",
    "content": "<?php\ndeclare(strict_types=1);\n\nnamespace Symfony4\\Security\\Service;\n\nuse Symfony4\\Security\\User;\nuse Seat\\Domain\\Client\\UseCase\\Login\\Login;\nuse Seat\\Domain\\Client\\UseCase\\Login\\LoginPresenter;\nuse Seat\\Domain\\Client\\UseCase\\Login\\LoginRequest;\nuse Seat\\Domain\\Client\\UseCase\\Login\\LoginResponse;\nuse Symfony\\Component\\HttpFoundation\\RedirectResponse;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\Routing\\RouterInterface;\nuse Symfony\\Component\\Security\\Core\\Authentication\\Token\\TokenInterface;\nuse Symfony\\Component\\Security\\Core\\Encoder\\UserPasswordEncoderInterface;\nuse Symfony\\Component\\Security\\Core\\Exception\\AuthenticationException;\nuse Symfony\\Component\\Security\\Core\\Exception\\CustomUserMessageAuthenticationException;\nuse Symfony\\Component\\Security\\Core\\Security;\nuse Symfony\\Component\\Security\\Core\\User\\UserInterface;\nuse Symfony\\Component\\Security\\Core\\User\\UserProviderInterface;\nuse Symfony\\Component\\Security\\Guard\\AbstractGuardAuthenticator;\n\nclass FormAuthenticator extends AbstractGuardAuthenticator implements LoginPresenter\n{\n\n    private $router;\n    /** @var UserPasswordEncoderInterface */\n    private $passwordHasher;\n    /** @var Login */\n    private $login;\n    /** @var LoginResponse */\n    private $response;\n\n    public function __construct(RouterInterface $router, UserPasswordEncoderInterface $passwordHasher, Login $login)\n    {\n        $this->router = $router;\n        $this->passwordHasher = $passwordHasher;\n        $this->login = $login;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getCredentials(Request $request)\n    {\n        return [\n            'email' => $this->getEmail($request),\n            'password' => $request->request->get('password', ''),\n        ];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function getUser($credentials, UserProviderInterface $userProvider)\n    {\n        $this->login->execute(new LoginRequest($credentials['email'], $credentials['password']), $this);\n        if ($this->response->notification()->hasError()) {\n            throw new CustomUserMessageAuthenticationException(\n                $this->response->notification()->getErrors()[0]->message()\n            );\n        }\n\n        return new User($this->response->client());\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function checkCredentials($credentials, UserInterface $user)\n    {\n        //All the checks are done in getUser\n        return true;\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)\n    {\n        return new RedirectResponse($this->router->generate('home'));\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)\n    {\n        $request->getSession()->set(Security::AUTHENTICATION_ERROR, $exception);\n        $request->getSession()->set(Security::LAST_USERNAME, $this->getEmail($request));\n        $url = $this->router->generate('login');\n\n        return new RedirectResponse($url);\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function start(Request $request, AuthenticationException $authException = null)\n    {\n        return new RedirectResponse($this->router->generate('login'));\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function supportsRememberMe()\n    {\n        return true;\n    }\n\n    private function getEmail(Request $request): string\n    {\n        return $request->request->get('email', '');\n    }\n\n    /**\n     * Does the authenticator support the given Request?\n     *\n     * If this returns false, the authenticator will be skipped.\n     *\n     * @param Request $request\n     *\n     * @return bool\n     */\n    public function supports(Request $request)\n    {\n        return $request->getPathInfo() === '/login-check' && $request->isMethod('POST');\n    }\n\n    public function present(LoginResponse $response)\n    {\n        $this->response = $response;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Security/User.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\Security;\n\nuse Seat\\Domain\\Client\\Entity\\Client;\nuse Seat\\Domain\\Client\\Entity\\Role;\nuse Symfony\\Component\\Security\\Core\\User\\UserInterface;\n\nclass User implements UserInterface\n{\n    /** @var Client */\n    private $client;\n\n    public function __construct(Client $client)\n    {\n        $this->client = $client;\n    }\n\n    /**\n     * Returns the roles granted to the user.\n     *\n     *     public function getRoles()\n     *     {\n     *         return ['ROLE_USER'];\n     *     }\n     *\n     * Alternatively, the roles might be stored on a ``roles`` property,\n     * and populated in any number of different ways when the user object\n     * is created.\n     *\n     * @return (Role|string)[] The user roles\n     * @throws \\Exception\n     */\n    public function getRoles()\n    {\n        switch ($this->client->role()) {\n            case Role::$client:\n                return ['ROLE_CLIENT'];\n            case Role::$sandwich:\n                return ['ROLE_SANDWICH'];\n            case Role::$admin:\n                return ['ROLE_ADMIN'];\n        }\n\n        throw new \\Exception('No role for client '.$this->client->id());\n    }\n\n    /**\n     * Returns the password used to authenticate the user.\n     *\n     * This should be the encoded password. On authentication, a plain-text\n     * password will be salted, encoded, and then compared to this value.\n     *\n     * @return string The password\n     */\n    public function getPassword()\n    {\n        return $this->client->password();\n    }\n\n    /**\n     * Returns the salt that was originally used to encode the password.\n     *\n     * This can return null if the password was not encoded using a salt.\n     *\n     * @return string|null The salt\n     */\n    public function getSalt()\n    {\n        return '';\n    }\n\n    /**\n     * Returns the username used to authenticate the user.\n     *\n     * @return string The username\n     */\n    public function getUsername()\n    {\n        return $this->client->email();\n    }\n\n    /**\n     * Removes sensitive data from the user.\n     *\n     * This is important if, at any given point, sensitive information like\n     * the plain-text password is stored on this object.\n     */\n    public function eraseCredentials()\n    {\n    }\n\n    public function getId()\n    {\n        return $this->client->id();\n    }\n\n    public function fullName()\n    {\n        return $this->client->firstName().' '.$this->client->lastName();\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Twig/ContentExtension.php",
    "content": "<?php\n\nnamespace Symfony4\\Twig;\n\nuse Doctrine\\ORM\\EntityManager;\nuse Doctrine\\ORM\\EntityManagerInterface;\nuse Psr\\Log\\LoggerInterface;\nuse Twig\\Extension\\AbstractExtension;\n\nclass ContentExtension extends AbstractExtension\n{\n    /**\n     * @var EntityManager\n     */\n    private $entityManager;\n    /**\n     * @var LoggerInterface\n     */\n    private $logger;\n\n    public function __construct(EntityManagerInterface $entityManager, LoggerInterface $logger)\n    {\n        $this->entityManager = $entityManager;\n        $this->logger = $logger;\n    }\n\n    /**\n     * @return array\n     */\n    public function getFilters()\n    {\n        return [\n            new \\Twig_SimpleFilter('content', [$this, 'getContent'], ['is_safe' => ['html']]),\n        ];\n    }\n\n    /**\n     * @param string $slug\n     *\n     * @return string\n     */\n    public function getContent($slug)\n    {\n        try {\n            $htmlContent = $this->entityManager->getRepository('App:HtmlContent')->findOneBy(\n                [\n                    'name' => $slug,\n                ]\n            );\n            if ($htmlContent === null) {\n                $this->logger->error(sprintf('No content for \"%s\"', $slug));\n\n                return '';\n            }\n\n            return $htmlContent->getHtml();\n        } catch (\\Exception $ex) {\n            $this->logger->error(sprintf('Exception \"%s\" content for \"%s\"', $ex->getMessage(), $slug));\n\n            return '';\n        }\n    }\n\n    /**\n     * @return string\n     */\n    public function getName()\n    {\n        return 'content_extension';\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/Twig/DownloadExtension.php",
    "content": "<?php\n\nnamespace Symfony4\\Twig;\n\nuse Doctrine\\ORM\\EntityManager;\nuse Doctrine\\ORM\\EntityManagerInterface;\nuse Psr\\Log\\LoggerInterface;\nuse Twig\\Environment;\nuse Twig\\Extension\\AbstractExtension;\n\nclass DownloadExtension extends AbstractExtension\n{\n    /**\n     * @var EntityManager\n     */\n    private $entityManager;\n    private $twig;\n    private $logger;\n\n    public function __construct(EntityManagerInterface $entityManager, Environment $twig, LoggerInterface $logger)\n    {\n        $this->entityManager = $entityManager;\n        $this->twig = $twig;\n        $this->logger = $logger;\n    }\n\n    /**\n     * @return array\n     */\n    public function getFilters()\n    {\n        return [\n            new \\Twig_SimpleFilter('download', [$this, 'getDownload'], ['is_safe' => ['html']]),\n        ];\n    }\n\n    public function getDownload($slug)\n    {\n        try {\n            $pdf = $this->entityManager->getRepository('App:Pdf')->find($slug);\n            if ($pdf === null) {\n                $this->logger->error(sprintf('No pdf for \"%s\"', $slug));\n\n                return '';\n            }\n\n            return $this->twig->render('component/download.html.twig', ['pdf' => $pdf]);\n\n        } catch (\\Exception $ex) {\n            $this->logger->error(sprintf('Exception \"%s\" content for \"%s\"', $ex->getMessage(), $slug), ['error' => $ex]);\n\n            return '';\n        }\n\n    }\n\n    /**\n     * @return string\n     */\n    public function getName()\n    {\n        return 'download_extension';\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/View/AddProductToBasketView.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\View;\n\nuse Seat\\Presentation\\Basket\\AddProductToBasketHtmlViewModel;\nuse Symfony\\Component\\HttpFoundation\\RedirectResponse;\nuse Symfony\\Component\\HttpFoundation\\Session\\Session;\nuse Symfony\\Component\\Routing\\RouterInterface;\n\nclass AddProductToBasketView\n{\n    private $router;\n    private $session;\n\n    public function __construct(RouterInterface $router, Session $session)\n    {\n        $this->router = $router;\n        $this->session = $session;\n    }\n\n    public function generateView(AddProductToBasketHtmlViewModel $viewModel)\n    {\n        foreach ($viewModel->notifications as $notification) {\n            $this->session->getFlashBag()->add($notification['type'], $notification['message']);\n        }\n\n        return new RedirectResponse($this->router->generate('menu.show'));\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/View/ConfirmBasketView.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\View;\n\nuse Seat\\Presentation\\Order\\ConfirmBasketHtmlViewModel;\nuse Symfony\\Component\\HttpFoundation\\RedirectResponse;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\HttpFoundation\\Session\\Session;\nuse Symfony\\Component\\Routing\\RouterInterface;\nuse Twig\\Environment;\n\nclass ConfirmBasketView\n{\n    private $twig;\n    private $session;\n    private $router;\n\n    public function __construct(Environment $twig, Session $session, RouterInterface $router)\n    {\n        $this->twig = $twig;\n        $this->session = $session;\n        $this->router = $router;\n    }\n\n    /** @throws */\n    public function generateView(ConfirmBasketHtmlViewModel $viewModel)\n    {\n        if (empty($viewModel->errors)) {\n            return new Response($this->twig->render('page/order-done.html.twig'));\n        }\n\n        foreach ($viewModel->errors as $error) {\n            $this->session->getFlashBag()->add('error', $error);\n        }\n\n        return new RedirectResponse($this->router->generate('basket'));\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/View/GetMenuView.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\View;\n\nuse Seat\\Domain\\Basket\\Entity\\BasketRepository;\nuse Seat\\Domain\\Basket\\Service\\OrderTypeChecker;\nuse Seat\\Presentation\\Menu\\GetMenuHtmlViewModel;\nuse Seat\\Presentation\\Basket\\Model\\BasketViewModel;\nuse Symfony\\Component\\Form\\FormFactoryInterface;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony4\\Form\\BasketType;\nuse Twig\\Environment;\n\nclass GetMenuView\n{\n    private $twig;\n    private $formFactory;\n    private $basketRepository;\n    private $orderTypeChecker;\n\n    public function __construct(\n        FormFactoryInterface $formFactory,\n        Environment $twig,\n        BasketRepository $basketRepository,\n        OrderTypeChecker $orderTypeChecker\n    ) {\n        $this->twig = $twig;\n        $this->formFactory = $formFactory;\n        $this->basketRepository = $basketRepository;\n        $this->orderTypeChecker = $orderTypeChecker;\n    }\n\n    /** @throws */\n    public function generateView(GetMenuHtmlViewModel $viewModel, string $userId)\n    {\n        $html = $this->twig->render(\n            'page/take-away.html.twig',\n            [\n                'newForm' => $this->formFactory->createBuilder(BasketType::class)->getForm()->createView(),\n                'showBasketMobileMenu' => true,\n                'basket' => BasketViewModel::fromBasket($this->basketRepository->getUserBasket($userId)),\n                'menu' => $viewModel->menu,\n                'orderType' => $userId ? $this->orderTypeChecker->getPossibleOrderType($userId) : null,\n            ]\n        );\n\n        return new Response($html);\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/View/RegisterView.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\View;\n\nuse Symfony4\\Form\\RegisterType;\nuse Seat\\Domain\\Client\\UseCase\\Register\\RegisterRequest;\nuse Seat\\Presentation\\Client\\RegisterHtmlViewModel;\nuse Symfony\\Component\\Form\\FormFactoryInterface;\nuse Symfony\\Component\\HttpFoundation\\RedirectResponse;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\Routing\\RouterInterface;\nuse Twig\\Environment;\n\nclass RegisterView\n{\n    private $twig;\n    private $formFactory;\n    private $router;\n\n    public function __construct(Environment $twig, FormFactoryInterface $formFactory, RouterInterface $router)\n    {\n        $this->twig = $twig;\n        $this->formFactory = $formFactory;\n        $this->router = $router;\n    }\n\n    /**\n     * @throws\n     */\n    public function generateView(RegisterRequest $registerRequest, RegisterHtmlViewModel $viewModel): Response\n    {\n        if ($viewModel->clientSaved) {\n            return new RedirectResponse($this->router->generate('register-complete'));\n        }\n\n        $form = $this->formFactory->createBuilder(RegisterType::class, $registerRequest)->getForm();\n\n        return new Response($this->twig->render('page/register.html.twig', ['form' => $form->createView(), 'viewModel' => $viewModel]));\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/View/RemoveFromBasketView.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\View;\n\nuse Seat\\Presentation\\Basket\\RemoveFromBasketHtmlViewModel;\nuse Symfony\\Component\\HttpFoundation\\RedirectResponse;\nuse Symfony\\Component\\Routing\\RouterInterface;\n\nclass RemoveFromBasketView\n{\n    private $router;\n\n    public function __construct(RouterInterface $router)\n    {\n        $this->router = $router;\n    }\n\n    public function generateView(?string $redirect, RemoveFromBasketHtmlViewModel $viewModel)\n    {\n        return new RedirectResponse($redirect ?? $this->router->generate('menu.show'));\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/View/ShowBasketView.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\View;\n\nuse Seat\\Domain\\Order\\UseCase\\ConfirmBasket\\ConfirmBasketRequest;\nuse Seat\\Presentation\\Basket\\ShowBasketHtmlViewModel;\nuse Symfony\\Component\\Form\\FormFactoryInterface;\nuse Symfony\\Component\\HttpFoundation\\RedirectResponse;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\Routing\\RouterInterface;\nuse Symfony\\Component\\Security\\Core\\Authentication\\Token\\Storage\\TokenStorageInterface;\nuse Symfony4\\Form\\BasketConfirmationType;\nuse Twig\\Environment;\n\nclass ShowBasketView\n{\n    private $twig;\n    private $formFactory;\n    private $tokenStorage;\n    private $router;\n    private $userId;\n\n    public function __construct(Environment $twig, FormFactoryInterface $formFactory, TokenStorageInterface $tokenStorage, RouterInterface $router)\n    {\n        $this->twig = $twig;\n        $this->formFactory = $formFactory;\n        $this->userId = is_string($tokenStorage->getToken()->getUser()) ? '' : $tokenStorage->getToken()->getUser()->getId();\n        $this->tokenStorage = $tokenStorage;\n        $this->router = $router;\n    }\n\n    public function generateView(ShowBasketHtmlViewModel $viewModel)\n    {\n        if ($viewModel->mustRedirectToMenu) {\n            return new RedirectResponse($this->router->generate('menu.show'));\n        }\n\n        $confirmBasketRequest = (new ConfirmBasketRequest())->withCheckSum($viewModel->basket->checkSum);\n        $form = $this->formFactory\n            ->createBuilder(BasketConfirmationType::class, $confirmBasketRequest, ['userId' => $this->userId])\n            ->getForm()->createView();\n\n        return new Response($this->twig->render('page/basket.html.twig', ['form' => $form, 'basket' => $viewModel->basket]));\n    }\n}\n"
  },
  {
    "path": "src/Seat/Infrastructure/Symfony4/View/UpdateClientView.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Symfony4\\View;\n\nuse Symfony4\\Form\\UpdateClientType;\nuse Seat\\Domain\\Client\\UseCase\\UpdateClient\\UpdateClientRequest;\nuse Seat\\Presentation\\Client\\EditableClient;\nuse Seat\\Presentation\\Client\\GetClientHtmlViewModel;\nuse Seat\\Presentation\\Client\\UpdateClientHtmlViewModel;\nuse Symfony\\Component\\Form\\FormFactoryInterface;\nuse Symfony\\Component\\Form\\FormInterface;\nuse Symfony\\Component\\HttpFoundation\\RedirectResponse;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Symfony\\Component\\HttpFoundation\\Session\\Session;\nuse Symfony\\Component\\Routing\\RouterInterface;\nuse Twig\\Environment;\n\nclass UpdateClientView\n{\n    private $twig;\n    private $formFactory;\n    private $router;\n    private $session;\n\n    public function __construct(Environment $twig, FormFactoryInterface $formFactory, RouterInterface $router, Session $session)\n    {\n        $this->twig = $twig;\n        $this->formFactory = $formFactory;\n        $this->router = $router;\n        $this->session = $session;\n    }\n\n    public function generateViewAfterPost(UpdateClientRequest $request, UpdateClientHtmlViewModel $viewModel)\n    {\n        if ($viewModel->notificationMessage && $viewModel->notificationType) {\n            $this->session->getFlashBag()->add($viewModel->notificationType, $viewModel->notificationMessage);\n        }\n        if ($viewModel->redirectToLogout) {\n            return new RedirectResponse($this->router->generate('logout'));\n        }\n        if ($viewModel->redirectToThankYouPage) {\n            return new RedirectResponse($this->router->generate('user.my-info'));\n        }\n\n        return $this->generateView($request, $viewModel->errors);\n    }\n\n    public function generateViewBeforePost(GetClientHtmlViewModel $viewModel)\n    {\n        return $this->generateView($viewModel->editableClient());\n    }\n\n    private function generateForm(EditableClient $editableClient): FormInterface\n    {\n        return $this->formFactory->createBuilder(UpdateClientType::class, $editableClient)->getForm();\n    }\n\n    /** @throws */\n    private function generateView(EditableClient $editableClient, $errors = []): Response\n    {\n        return new Response(\n            $this->twig->render(\n                'page/update-client.html.twig',\n                [\n                    'form' => $this->generateForm($editableClient)->createView(),\n                    'errors' => $errors,\n                ]\n            )\n        );\n    }\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Basket/AddProductToBasketHtmlPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Basket;\n\nuse Seat\\Domain\\Basket\\UseCase\\AddProductToBasket\\AddProductToBasketPresenter;\nuse Seat\\Domain\\Basket\\UseCase\\AddProductToBasket\\AddProductToBasketResponse;\n\nclass AddProductToBasketHtmlPresenter implements AddProductToBasketPresenter\n{\n    private $viewModel;\n\n    public function present(AddProductToBasketResponse $response): void\n    {\n        $this->viewModel = new AddProductToBasketHtmlViewModel();\n        foreach ($response->notification()->getErrors() as $error) {\n            $this->viewModel->addNotification('error', $error->message());\n        }\n    }\n\n    public function viewModel(): AddProductToBasketHtmlViewModel\n    {\n        return $this->viewModel;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Basket/AddProductToBasketHtmlViewModel.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Basket;\n\nclass AddProductToBasketHtmlViewModel\n{\n    public $notifications = [];\n\n    public function addNotification(string $type, string $message)\n    {\n        $this->notifications[] = ['type' => $type, 'message' => $message];\n    }\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Basket/Model/BasketViewModel.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Basket\\Model;\n\nuse Seat\\Domain\\Basket\\Entity\\Basket;\nuse Seat\\Domain\\Basket\\Model\\BasketProduct;\nuse Seat\\Domain\\Basket\\Model\\BasketProductSupplement;\n\nclass BasketViewModel\n{\n    public $totalPrice;\n    public $checkSum;\n    public $products;\n\n    public function __construct($totalPrice, $checkSum, $products)\n    {\n        $this->totalPrice = $totalPrice;\n        $this->checkSum = $checkSum;\n        $this->products = $products;\n    }\n\n    public static function fromBasket(Basket $basket)\n    {\n        $lines = [];\n        /** @var BasketProduct $basketProduct */\n        foreach ($basket as $basketProduct) {\n            $lines[] = [\n                'id' => $basketProduct->id(),\n                'quantity' => $basketProduct->quantity(),\n                'name' => $basketProduct->name(),\n                'totalPrice' => $basketProduct->totalPrice(),\n                'option' => $basketProduct->option() ? $basketProduct->option()->name() : null,\n                'comment' => $basketProduct->comment(),\n                'supplements' => array_map(\n                    function (BasketProductSupplement $supplement) {\n                        return $supplement->name();\n                    },\n                    $basketProduct->supplements()\n                ),\n            ];\n        }\n\n        return new BasketViewModel(\n            $basket->totalPrice(),\n            $basket->checkSum(),\n            $lines\n        );\n    }\n\n    public function count()\n    {\n        return count($this->products);\n    }\n\n    public function totalPrice()\n    {\n        return $this->totalPrice;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Basket/RemoveFromBasketHtmlPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Basket;\n\nuse Seat\\Domain\\Basket\\UseCase\\RemoveFromBasket\\RemoveFromBasketPresenter;\nuse Seat\\Domain\\Basket\\UseCase\\RemoveFromBasket\\RemoveFromBasketResponse;\n\nclass RemoveFromBasketHtmlPresenter implements RemoveFromBasketPresenter\n{\n    private $viewModel;\n\n    public function present(RemoveFromBasketResponse $response): void\n    {\n        $this->viewModel = new RemoveFromBasketHtmlViewModel();\n    }\n\n    public function viewModel(): RemoveFromBasketHtmlViewModel\n    {\n        return $this->viewModel;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Basket/RemoveFromBasketHtmlViewModel.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Basket;\n\nclass RemoveFromBasketHtmlViewModel\n{\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Basket/ShowBasketHtmlPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Basket;\n\nuse Seat\\Presentation\\Basket\\Model\\BasketViewModel;\nuse Seat\\Domain\\Basket\\UseCase\\ShowBasket\\ShowBasketPresenter;\nuse Seat\\Domain\\Basket\\UseCase\\ShowBasket\\ShowBasketResponse;\n\nclass ShowBasketHtmlPresenter implements ShowBasketPresenter\n{\n\n    private $viewModel;\n\n    public function present(ShowBasketResponse $response): void\n    {\n        $this->viewModel = new ShowBasketHtmlViewModel();\n        if ($response->basket()->isEmpty()) {\n            $this->viewModel->mustRedirectToMenu = true;\n        } else {\n            $this->viewModel->basket = BasketViewModel::fromBasket($response->basket());\n        }\n    }\n\n    public function viewModel(): ShowBasketHtmlViewModel\n    {\n        return $this->viewModel;\n    }\n\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Basket/ShowBasketHtmlViewModel.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Basket;\n\nuse Seat\\Presentation\\Basket\\Model\\BasketViewModel;\n\nclass ShowBasketHtmlViewModel\n{\n    /** @var BasketViewModel */\n    public $basket;\n    public $mustRedirectToMenu = false;\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Client/EditableClient.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Client;\n\nclass EditableClient\n{\n    public $clientId;\n    public $password;\n    public $firstName;\n    public $lastName;\n    public $email;\n    public $phoneNumber;\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Client/GetClientHtmlPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Client;\n\nuse Seat\\Domain\\Client\\UseCase\\GetClient\\GetClientPresenter;\nuse Seat\\Domain\\Client\\UseCase\\GetClient\\GetClientResponse;\n\nclass GetClientHtmlPresenter implements GetClientPresenter\n{\n    private $viewModel;\n\n    public function present(GetClientResponse $response): void\n    {\n        $this->viewModel = new GetClientHtmlViewModel();\n        $this->viewModel->makeEditableClient(\n            $response->client()->firstName(),\n            $response->client()->lastName(),\n            $response->client()->email(),\n            $response->client()->phoneNumber()\n        );\n    }\n\n    public function viewModel()\n    {\n        return $this->viewModel;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Client/GetClientHtmlViewModel.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Client;\n\nclass GetClientHtmlViewModel\n{\n    private $editableClient;\n\n    public function editableClient(): EditableClient\n    {\n        return $this->editableClient;\n    }\n\n    public function makeEditableClient(string $firstName, string $lastName, string $email, string $phoneNumber)\n    {\n        $this->editableClient = new EditableClient();\n        $this->editableClient->firstName = $firstName;\n        $this->editableClient->lastName = $lastName;\n        $this->editableClient->email = $email;\n        $this->editableClient->phoneNumber = $phoneNumber;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Client/RegisterHtmlPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Client;\n\nuse Seat\\Domain\\Client\\UseCase\\Register\\RegisterPresenter;\nuse Seat\\Domain\\Client\\UseCase\\Register\\RegisterResponse;\n\nclass RegisterHtmlPresenter implements RegisterPresenter\n{\n    private $viewModel;\n\n    public function __construct()\n    {\n    }\n\n    public function present(RegisterResponse $response): void\n    {\n        $this->viewModel = new RegisterHtmlViewModel();\n        $this->viewModel->clientSaved = $response->client() !== null;\n\n        foreach ($response->notification()->getErrors() as $error) {\n            $this->viewModel->errors[$error->fieldName()] = $error->message();\n        }\n    }\n\n    public function viewModel()\n    {\n        return $this->viewModel;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Client/RegisterHtmlViewModel.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Client;\n\nclass RegisterHtmlViewModel\n{\n    public $clientSaved = false;\n    public $errors = [];\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Client/UpdateClientHtmlPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Client;\n\nuse Seat\\Domain\\Client\\UseCase\\UpdateClient\\UpdateClientPresenter;\nuse Seat\\Domain\\Client\\UseCase\\UpdateClient\\UpdateClientResponse;\n\nclass UpdateClientHtmlPresenter implements UpdateClientPresenter\n{\n    private $viewModel;\n\n    public function __construct()\n    {\n        $this->viewModel = new UpdateClientHtmlViewModel();\n    }\n\n    public function present(UpdateClientResponse $response)\n    {\n        $this->viewModel = new UpdateClientHtmlViewModel();\n\n        if ($response->updatedClient() !== null) {\n            $this->viewModel->redirectToThankYouPage = true;\n            $this->viewModel->displayNotification('success', 'my-info-updated');\n            $this->viewModel->redirectToLogout = $response->hasPasswordChanged();\n\n            if ($this->viewModel->redirectToLogout) {\n                $this->viewModel->displayNotification('warning', 'new-password-login-needed');\n            }\n        }\n\n        foreach ($response->notification()->getErrors() as $error) {\n            $this->viewModel->errors[$error->fieldName()] = $error->message();\n        }\n    }\n\n    public function viewModel()\n    {\n        return $this->viewModel;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Client/UpdateClientHtmlViewModel.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Client;\n\nclass UpdateClientHtmlViewModel\n{\n    public $errors = [];\n    public $redirectToThankYouPage = false;\n    public $redirectToLogout = false;\n    public $notificationMessage = null;\n    public $notificationType = null;\n    public $hasPasswordChanged = false;\n\n    public function displayNotification(string $type, string $message)\n    {\n        $this->notificationType = $type;\n        $this->notificationMessage = $message;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Menu/GetMenuHtmlPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Menu;\n\nuse Seat\\Domain\\Menu\\UseCase\\GetMenu\\GetMenuPresenter;\nuse Seat\\Domain\\Menu\\UseCase\\GetMenu\\GetMenuResponse;\nuse Seat\\Presentation\\Menu\\Model\\MenuViewModel;\n\nclass GetMenuHtmlPresenter implements GetMenuPresenter\n{\n    private $viewModel;\n\n    public function present(GetMenuResponse $response): void\n    {\n        $this->viewModel = new GetMenuHtmlViewModel();\n        $this->viewModel->menu = MenuViewModel::fromMenuLines($response->menuLines);\n    }\n\n    public function viewModel(): GetMenuHtmlViewModel\n    {\n        return $this->viewModel;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Menu/GetMenuHtmlViewModel.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Menu;\n\nuse Seat\\Presentation\\Menu\\Model\\MenuViewModel;\n\nclass GetMenuHtmlViewModel\n{\n\n    /** @var MenuViewModel */\n    public $menu;\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Menu/Model/MenuViewModel.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Menu\\Model;\n\nuse Seat\\Domain\\Menu\\Model\\MenuLine;\nuse Seat\\Domain\\Menu\\Model\\MenuOption;\nuse Seat\\Domain\\Menu\\Model\\MenuProduct;\nuse Seat\\Domain\\Menu\\Model\\MenuSupplement;\n\nclass MenuViewModel\n{\n    private $categories;\n\n    /** @param MenuLine[] $menuLines */\n    public static function fromMenuLines(array $menuLines)\n    {\n        $categories = [];\n        foreach ($menuLines as $menuLine) {\n            $categories[$menuLine->name()] = [\n                'description' => $menuLine->description(),\n                'products' => array_map(\n                    function (MenuProduct $product) {\n                        return [\n                            'value' => $product->id(),\n                            'name' => $product->name(),\n                            'description' => $product->description(),\n                            'price' => $product->price(),\n                        ];\n                    },\n                    $menuLine->products()\n                ),\n                'options' => array_map(\n                    function (MenuOption $option) {\n                        return [\n                            'value' => $option->id(),\n                            'text' => $option->name().' ('.$option->price().' €)',\n                        ];\n                    },\n                    $menuLine->options()\n                ),\n                'supplements' => array_map(\n                    function (MenuSupplement $supplement) {\n                        return [\n                            'value' => $supplement->id(),\n                            'text' => $supplement->name().' ('.$supplement->price().' €)',\n                        ];\n                    },\n                    $menuLine->supplements()\n                ),\n            ];\n        }\n\n        return new MenuViewModel($categories);\n    }\n\n    public function __construct(array $categories)\n    {\n        $this->categories = $categories;\n    }\n\n    public function categories(): array\n    {\n        return $this->categories;\n    }\n\n    public function json()\n    {\n        return json_encode($this->categories);\n    }\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Order/ConfirmBasketHtmlPresenter.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Order;\n\nuse Seat\\Domain\\Order\\UseCase\\ConfirmBasket\\ConfirmBasketPresenter;\nuse Seat\\Domain\\Order\\UseCase\\ConfirmBasket\\ConfirmBasketResponse;\n\nclass ConfirmBasketHtmlPresenter implements ConfirmBasketPresenter\n{\n    private $viewModel;\n\n    public function present(ConfirmBasketResponse $response): void\n    {\n        $this->viewModel = new ConfirmBasketHtmlViewModel();\n        if ($response->notification()->hasError()) {\n            foreach ($response->notification()->getErrors() as $error) {\n                $this->viewModel->errors[] = $error->message();\n            }\n        }\n    }\n\n    public function viewModel(): ConfirmBasketHtmlViewModel\n    {\n        return $this->viewModel;\n    }\n}\n"
  },
  {
    "path": "src/Seat/Presentation/Order/ConfirmBasketHtmlViewModel.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\Presentation\\Order;\n\nclass ConfirmBasketHtmlViewModel\n{\n    /** @var array|string[] */\n    public $errors = [];\n}\n"
  },
  {
    "path": "src/Seat/SharedKernel/Error/Error.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\SharedKernel\\Error;\n\nclass Error\n{\n    private $fieldName;\n    private $message;\n\n    public function __construct(string $fieldName, string $message)\n    {\n        $this->fieldName = $fieldName;\n        $this->message = $message;\n    }\n\n    public function __toString()\n    {\n        return $this->fieldName.':'.$this->message;\n    }\n\n    public function fieldName(): string\n    {\n        return $this->fieldName;\n    }\n\n    public function message(): string\n    {\n        return $this->message;\n    }\n}\n"
  },
  {
    "path": "src/Seat/SharedKernel/Error/Notification.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\SharedKernel\\Error;\n\nclass Notification\n{\n    private $errors = [];\n\n    public function addError(string $fieldName, string $error)\n    {\n        $this->errors[] = new Error($fieldName, $error);\n\n        return $this;\n    }\n\n    /**\n     * @return Error[]\n     */\n    public function getErrors(): array\n    {\n        return $this->errors;\n    }\n\n    public function hasError()\n    {\n        return count($this->errors) > 0;\n    }\n}\n"
  },
  {
    "path": "src/Seat/SharedKernel/Model/TimeRange.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\SharedKernel\\Model;\n\nuse DateInterval;\nuse DateTimeImmutable;\n\nclass TimeRange\n{\n    private $from;\n    private $to;\n\n    public function __construct(string $from, string $to)\n    {\n        $this->from = $from;\n        $this->to = $to;\n    }\n\n    public function getRoundedStep(int $minuteStep)\n    {\n        $interval = DateInterval::createFromDateString($minuteStep.' minutes');\n        $current = DateTimeImmutable::createFromFormat('H:i:s', $this->from);\n\n        $steps = [];\n        do {\n            $steps[] = $current->format('H:i:s');\n\n            $current = $current->add($interval);\n        } while ($current->format('H:i:s') <= $this->to);\n\n\n        return $steps;\n    }\n\n    public function delayFromDate(DateTimeImmutable $delay, ?int $minuteStep = null)\n    {\n        $newFrom = $delay->format('H:i:s');\n\n        if ($newFrom < $this->from) {\n            return $this;\n        }\n\n        if ($minuteStep === null) {\n            return new TimeRange($newFrom, $this->to);\n        }\n\n        $diffWithNextGoodMinute = $delay->getTimestamp() % ($minuteStep * 60);\n        $newFromTimeStamp = ($diffWithNextGoodMinute === 0)\n            ? $delay->getTimestamp()\n            : $delay->getTimestamp() - $diffWithNextGoodMinute + ($minuteStep * 60);\n\n\n        $newFrom = (new DateTimeImmutable())->setTimestamp($newFromTimeStamp);\n\n        return new TimeRange($newFrom->format('H:i:s'), $this->to);\n    }\n\n    public function from(): string\n    {\n        return $this->from;\n    }\n\n    public function to(): string\n    {\n        return $this->to;\n    }\n}\n\n"
  },
  {
    "path": "src/Seat/SharedKernel/Service/Base64PasswordHasher.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\SharedKernel\\Service;\n\nclass Base64PasswordHasher implements PasswordHasher\n{\n    public function hash(string $password): string\n    {\n        return base64_encode($password);\n    }\n\n    public function isPasswordValid(string $hashedPassword, string $password): bool\n    {\n        return base64_decode($hashedPassword) === $password;\n    }\n}\n"
  },
  {
    "path": "src/Seat/SharedKernel/Service/Clock.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\SharedKernel\\Service;\n\nclass Clock\n{\n    public function now()\n    {\n        return new \\DateTimeImmutable();\n    }\n}\n"
  },
  {
    "path": "src/Seat/SharedKernel/Service/IdGenerator.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\SharedKernel\\Service;\n\nuse Ramsey\\Uuid\\Uuid;\n\nclass IdGenerator\n{\n    public function next()\n    {\n        return Uuid::uuid4()->toString();\n    }\n}\n"
  },
  {
    "path": "src/Seat/SharedKernel/Service/NativePasswordHasher.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Seat\\SharedKernel\\Service;\n\nclass NativePasswordHasher implements PasswordHasher\n{\n    public function hash(string $password): string\n    {\n        return password_hash($password, PASSWORD_DEFAULT);\n    }\n\n    public function isPasswordValid(string $hashedPassword, string $password): bool\n    {\n        return password_verify($password, $hashedPassword);\n    }\n}\n"
  },
  {
    "path": "src/Seat/SharedKernel/Service/PasswordHasher.php",
    "content": "<?php\ndeclare(strict_types=1);\n\nnamespace Seat\\SharedKernel\\Service;\n\ninterface PasswordHasher\n{\n    public function hash(string $password): string;\n\n    public function isPasswordValid(string $hashedPassword, string $password): bool;\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Basket/Entity/ProductBuilder.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Basket\\Entity;\n\nuse Seat\\Domain\\Menu\\Entity\\Product;\n\nclass ProductBuilder\n{\n    private $id = 'product-id';\n    private $name = 'Jambon beurre';\n    private $description = 'Du jambon et du beurre';\n    private $price = 3.2;\n    private $categoryId = 'category-id';\n\n    public static function aProduct()\n    {\n        return new ProductBuilder();\n    }\n\n    public function id(string $id)\n    {\n        $this->id = $id;\n\n        return $this;\n    }\n\n    public function name(string $name)\n    {\n        $this->name = $name;\n\n        return $this;\n    }\n\n    public function description(string $description)\n    {\n        $this->description = $description;\n\n        return $this;\n    }\n\n    public function price(float $price)\n    {\n        $this->price = $price;\n\n        return $this;\n    }\n\n    public function categoryId(string $categoryId)\n    {\n        $this->categoryId = $categoryId;\n\n        return $this;\n    }\n\n    public function build()\n    {\n        return new Product($this->id, $this->categoryId, $this->name, $this->description, $this->price);\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Basket/Service/OrderTypeCheckerTest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Basket\\Service;\n\nuse DateTimeImmutable;\nuse PHPUnit\\Framework\\TestCase;\nuse Seat\\Domain\\Basket\\Model\\OrderType;\nuse Seat\\Domain\\Basket\\Service\\OrderTypeChecker;\nuse Seat\\SharedKernel\\Service\\Clock;\nuse SeatTest\\_Mock\\Domain\\Client\\Entity\\InMemoryClientRepository;\nuse SeatTest\\_Mock\\Domain\\Client\\Entity\\InMemoryCompanyRepository;\nuse SeatTest\\Domain\\Client\\Entity\\CompanyBuilder;\n\n\nclass OrderTypeCheckerTest extends TestCase\n{\n    private $checker;\n    private $companyRepository;\n    private $clientRepository;\n\n    private $company;\n    private $companyWithoutDelivery;\n    /**\n     *\n     */\n    private $clock;\n\n    protected function setUp()\n    {\n        $this->companyRepository = new InMemoryCompanyRepository();\n        $this->clientRepository = new InMemoryClientRepository();\n        $this->clock = $this->createMock(Clock::class);\n        $this->checker = new OrderTypeChecker($this->companyRepository, $this->clientRepository, $this->clock);\n\n        $this->company = CompanyBuilder::aCompany()->deliverable('10:00:00')->build();\n        $this->companyWithoutDelivery = CompanyBuilder::aCompany()->build();\n        $this->companyRepository->addCompany($this->company);\n        $this->companyRepository->addCompany($this->companyWithoutDelivery);\n    }\n\n    private function nowIs(string $hourMinuteSecond)\n    {\n        $this->clock->method('now')->willReturn(\n            DateTimeImmutable::createFromFormat('H:i:s', $hourMinuteSecond, new \\DateTimeZone('Europe/Brussels'))\n        );\n\n        return '';\n    }\n\n    public function test_order_delivery_must_be_before_the_company_max_order_time()\n    {\n        $this->nowIs('09:59:59');\n\n        $this->assertNull(\n            $this->checker->checkPossibleOrderType(OrderType::delivery(), $this->company->id())\n        );\n    }\n\n    public function test_take_away_must_be_ordered_before_11h10()\n    {\n        $this->nowIs('11:10:00');\n\n        $this->assertNull(\n            $this->checker->checkPossibleOrderType(OrderType::takeAwayFor('00:00:00'), null)\n        );\n    }\n\n    public function test_take_away_is_possible_until_14h()\n    {\n        $this->nowIs('11:10:00');\n        $this->assertNull(\n            $this->checker->checkPossibleOrderType(OrderType::takeAwayFor('14:00:00'), null)\n        );\n    }\n\n    /**\n     * @expectedException \\Seat\\Domain\\Basket\\Service\\Error\\DeliveryNotAvailable\n     */\n    public function test_a_user_without_a_company_can_not_choose_delivery()\n    {\n        $this->nowIs('09:00:00');\n        $this->checker->checkPossibleOrderType(OrderType::delivery(), null);\n    }\n\n    /**\n     * @expectedException \\Seat\\Domain\\Basket\\Service\\Error\\DeliveryNotAvailable\n     */\n    public function test_impossible_to_delivery_on_a_company_that_does_not_accept_delivery()\n    {\n        $this->nowIs('09:00:00');\n        $this->checker->checkPossibleOrderType(OrderType::delivery(), $this->companyWithoutDelivery->id());\n    }\n\n    /**\n     * @expectedException \\Seat\\Domain\\Basket\\Service\\Error\\OrderTooLate\n     */\n    public function test_take_away_can_not_be_ordered_after_11h10()\n    {\n        $this->nowIs('11:10:01');\n        $this->checker->checkPossibleOrderType(OrderType::takeAwayFor('00:00:00'), null);\n    }\n\n    /**\n     * @expectedException \\Seat\\Domain\\Basket\\Service\\Error\\OrderTooLate\n     */\n    public function test_impossible_to_order_a_delivery_after_the_company_max_order_time()\n    {\n        $this->nowIs('10:00:01');\n        $this->checker->checkPossibleOrderType(OrderType::delivery(), $this->company->id());\n    }\n\n    /**\n     * @expectedException \\Seat\\Domain\\Basket\\Service\\Error\\TakeAwayTooLate\n     */\n    public function test_impossible_to_order_a_take_away_for_14h()\n    {\n        $this->nowIs('10:00:01');\n        $this->checker->checkPossibleOrderType(OrderType::takeAwayFor('14:00:01'), $this->companyWithoutDelivery->id());\n    }\n\n    /**\n     * @expectedException \\Seat\\Domain\\Basket\\Service\\Error\\TakeAwayNotAvailable\n     */\n    public function test_a_daliverable_company_can_not_take_out()\n    {\n        $this->nowIs('10:00:00');\n        $this->checker->checkPossibleOrderType(OrderType::takeAwayFor('12:00:00'), $this->company->id());\n    }\n\n    /**\n     * @expectedException \\Exception\n     * @expectedExceptionMessage Unknown client\n     */\n    public function test_an_unknown_client_has_no_delivery()\n    {\n        $this->nowIs('10:00:00');\n        $this->assertNull($this->checker->getPossibleOrderType('unknown-client'));\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Basket/UseCase/AddProductToBasket/AddProductToBasketTest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Basket\\UseCase\\AddProductToBasket;\n\n\nuse PHPUnit\\Framework\\TestCase;\nuse Seat\\Domain\\Menu\\Entity\\ProductOption;\nuse Seat\\Domain\\Menu\\Entity\\ProductSupplement;\nuse Seat\\Domain\\Basket\\Model\\BasketProduct;\nuse Seat\\Domain\\Basket\\UseCase\\AddProductToBasket\\AddProductToBasket;\nuse Seat\\Domain\\Basket\\UseCase\\AddProductToBasket\\AddProductToBasketPresenter;\nuse Seat\\Domain\\Basket\\UseCase\\AddProductToBasket\\AddProductToBasketRequest;\nuse Seat\\Domain\\Basket\\UseCase\\AddProductToBasket\\AddProductToBasketResponse;\nuse Seat\\SharedKernel\\Error\\Notification;\nuse SeatTest\\_Mock\\Domain\\Basket\\Entity\\InMemoryBasketRepository;\nuse SeatTest\\_Mock\\Domain\\Menu\\Entity\\InMemoryProductOptionRepository;\nuse SeatTest\\_Mock\\Domain\\Menu\\Entity\\InMemoryProductRepository;\nuse SeatTest\\_Mock\\Domain\\Menu\\Entity\\InMemoryProductSupplementRepository;\nuse SeatTest\\Domain\\Basket\\Entity\\ProductBuilder;\n\nclass AddProductToBasketTest extends TestCase implements AddProductToBasketPresenter\n{\n    private $productRepository;\n    private $basketRepository;\n    private $product1;\n    private $userId;\n    private $product2;\n    private $addToBasket;\n    private $productOptionRepository;\n    private $productOption1;\n    private $productOption2;\n    private $productSupplement1a;\n    private $productSupplementRepository;\n    private $productSupplement2a;\n    /** @var AddProductToBasketResponse */\n    private $response;\n\n    protected function setUp()\n    {\n        $this->product1 = ProductBuilder::aProduct()->build();\n        $this->product2 = ProductBuilder::aProduct()->categoryId('category-2')->id('product-2')->name('product2')->price(1)->build();\n        $this->userId = 'user-id';\n        $this->productOption1 = new ProductOption('option-1', $this->product1->categoryId(), 'Option 1', 0.5);\n        $this->productOption2 = new ProductOption('option-2', $this->product2->categoryId(), 'Option 2', 1.5);\n        $this->productSupplement1a = new ProductSupplement('sup-1a', $this->product1->categoryId(), 'Supp 1a', 0.26);\n        $this->productSupplement2a = new ProductSupplement('sup-2a', $this->product2->categoryId(), 'Supp 2a', 0.52);\n\n        $this->productRepository = new InMemoryProductRepository();\n        $this->basketRepository = new InMemoryBasketRepository();\n        $this->productOptionRepository = new InMemoryProductOptionRepository();\n        $this->productSupplementRepository = new InMemoryProductSupplementRepository();\n\n        $this->productRepository->add($this->product1);\n        $this->productRepository->add($this->product2);\n        $this->productOptionRepository->add($this->productOption1);\n        $this->productOptionRepository->add($this->productOption2);\n        $this->productSupplementRepository->add($this->productSupplement1a);\n        $this->productSupplementRepository->add($this->productSupplement2a);\n\n        $this->addToBasket = new AddProductToBasket(\n            $this->basketRepository,\n            $this->productRepository,\n            $this->productOptionRepository,\n            $this->productSupplementRepository\n        );\n    }\n\n    public function present(AddProductToBasketResponse $response): void\n    {\n        $this->response = $response;\n    }\n\n    public function test_it_adds_a_product_in_the_basket()\n    {\n        $this->addToBasket->execute(AddProductToBasketRequest::fromAll(1, $this->userId, $this->product1->id()), $this);\n\n        $basket = $this->basketRepository->getUserBasket($this->userId);\n\n        $this->assertCount(1, $basket);\n        $this->assertSame($this->product1->name(), $basket[0]->name());\n        $this->assertSame($this->product1->price(), $basket[0]->price());\n    }\n\n    public function test_it_calculate_the_total_price()\n    {\n        $firstBasketPrice = 1.2;\n        $this->basketRepository->addToBasket($this->userId, new BasketProduct('basket-1', 1, 'first product', $firstBasketPrice, null, [], ''));\n\n        $this->addToBasket->execute(AddProductToBasketRequest::fromAll(1, $this->userId, $this->product1->id()), $this);\n\n        $basket = $this->basketRepository->getUserBasket($this->userId);\n\n        $this->assertCount(2, $basket);\n        $this->assertSame($firstBasketPrice + $this->product1->price(), $basket->totalPrice());\n    }\n\n    public function test_impossible_to_add_a_non_existing_product()\n    {\n        $this->addToBasket->execute(AddProductToBasketRequest::fromAll(1, $this->userId, 'unknown product id'), $this);\n\n        $this->assertEquals(\n            (new Notification())->addError('productId', 'unknown-product'),\n            $this->response->notification()\n        );\n        $this->assertNull($this->response->basketProduct());\n    }\n\n    public function test_can_add_a_product_with_an_option_to_the_basket()\n    {\n        $this->addToBasket->execute(AddProductToBasketRequest::fromAll(1, $this->userId, $this->product1->id(), $this->productOption1->id()), $this);\n\n        $basket = $this->basketRepository->getUserBasket($this->userId);\n\n        $this->assertCount(1, $basket);\n        $this->assertSame($this->product1->price() + $this->productOption1->price(), $basket->totalPrice());\n    }\n\n    public function test_throws_a_error_when_the_option_does_not_exist()\n    {\n        $this->addToBasket->execute(AddProductToBasketRequest::fromAll(1, $this->userId, $this->product1->id(), 'unknown option id'), $this);\n\n        $this->assertEquals(\n            (new Notification())->addError('optionId', 'unknown-option'),\n            $this->response->notification()\n        );\n        $this->assertNull($this->response->basketProduct());\n    }\n\n    public function test_throws_a_error_when_the_option_is_not_linked_to_the_category_of_the_product()\n    {\n        $this->addToBasket->execute(AddProductToBasketRequest::fromAll(1, $this->userId, $this->product1->id(), $this->productOption2->id()), $this);\n\n        $this->assertEquals(\n            (new Notification())->addError('optionId', 'unknown-option'),\n            $this->response->notification()\n        );\n    }\n\n    public function test_can_add_supplements_on_product()\n    {\n        $this->addToBasket->execute(\n            AddProductToBasketRequest::fromAll(1, $this->userId, $this->product1->id(), null, [$this->productSupplement1a->id()]),\n            $this\n        );\n\n        $basket = $this->basketRepository->getUserBasket($this->userId);\n        $this->assertCount(1, $basket);\n        $this->assertSame($this->product1->price() + $this->productSupplement1a->price(), $basket->totalPrice());\n    }\n\n    public function test_throws_an_error_when_a_supplement_is_unknown()\n    {\n        $this->addToBasket->execute(AddProductToBasketRequest::fromAll(1, $this->userId, $this->product1->id(), null, ['unknown supplement']), $this);\n\n        $this->assertEquals(\n            (new Notification())->addError('supplementIds', 'unknown-supplement'),\n            $this->response->notification()\n        );\n        $this->assertNull($this->response->basketProduct());\n    }\n\n    public function test_throws_an_error_when_a_supplement_is_not_linked_to_the_category_of_the_product()\n    {\n        $this->addToBasket->execute(\n            AddProductToBasketRequest::fromAll(1, $this->userId, $this->product1->id(), null, [$this->productSupplement2a->id()]),\n            $this\n        );\n\n        $this->assertEquals(\n            (new Notification())->addError('supplementIds', 'unknown-supplement'),\n            $this->response->notification()\n        );\n\n        $this->assertNull($this->response->basketProduct());\n    }\n\n    public function test_it_is_possible_to_add_a_comment()\n    {\n        $this->addToBasket->execute(\n            AddProductToBasketRequest::fromAll(1, $this->userId, $this->product1->id(), null, [], 'This is a comment'),\n            $this\n        );\n\n        $basket = $this->basketRepository->getUserBasket($this->userId);\n        $this->assertCount(1, $basket);\n        $this->assertSame('This is a comment', $basket[0]->comment());\n    }\n\n    public function test_it_is_possible_to_add_a_quantity()\n    {\n        $quantity = 3;\n        $this->addToBasket->execute(\n            AddProductToBasketRequest::fromAll(\n                $quantity,\n                $this->userId,\n                $this->product1->id(),\n                $this->productOption1->id(),\n                [$this->productSupplement1a->id()],\n                'No comment'\n            ),\n            $this\n        );\n\n        $basket = $this->basketRepository->getUserBasket($this->userId);\n        $this->assertCount(1, $basket);\n        $this->assertSame(11.88, $basket->totalPrice());\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Basket/UseCase/RemoveFromBasket/RemoveFromBasketTest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Basket\\UseCase\\RemoveFromBasket;\n\nuse PHPUnit\\Framework\\TestCase;\nuse Seat\\Domain\\Basket\\Model\\BasketProduct;\nuse Seat\\Domain\\Basket\\UseCase\\RemoveFromBasket\\RemoveFromBasket;\nuse Seat\\Domain\\Basket\\UseCase\\RemoveFromBasket\\RemoveFromBasketPresenter;\nuse Seat\\Domain\\Basket\\UseCase\\RemoveFromBasket\\RemoveFromBasketRequest;\nuse Seat\\Domain\\Basket\\UseCase\\RemoveFromBasket\\RemoveFromBasketResponse;\nuse SeatTest\\_Mock\\Domain\\Basket\\Entity\\InMemoryBasketRepository;\n\nclass RemoveFromBasketTest extends TestCase implements RemoveFromBasketPresenter\n{\n\n    private $basketRepository;\n    private $userId = 'user-id';\n    /** @var RemoveFromBasketResponse */\n    private $response;\n\n    public function test_it_deletes_a_line_from_the_basket()\n    {\n        $this->basketRepository = new InMemoryBasketRepository();\n        $this->basketRepository->addToBasket($this->userId, new BasketProduct('basket-id', 1, ',', 2, null, [], ''));\n\n        $removeFromBasket = new RemoveFromBasket($this->basketRepository);\n        $removeFromBasket->execute(new RemoveFromBasketRequest($this->userId, 'basket-id'), $this);\n\n        $basket = $this->basketRepository->getUserBasket($this->userId);\n\n        $this->assertTrue($basket->isEmpty());\n        $this->assertTrue($this->response->isDone());\n    }\n\n    public function present(RemoveFromBasketResponse $response): void\n    {\n        $this->response = $response;\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Client/Entity/ClientBuilder.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Client\\Entity;\n\nuse Ramsey\\Uuid\\Uuid;\nuse Seat\\Domain\\Client\\Entity\\Client;\n\n\nclass ClientBuilder\n{\n    private $firstName = 'Nicolas';\n    private $lastName = 'De Boose';\n    private $phoneNumber = '0474 45 78 12';\n    private $id = null;\n    private $email = 'nico@email.com';\n    private $password = 'dqfn4qsdf';\n    private $store = 'my-store';\n    private $companyId = null;\n    private $role = 'client';\n    private $isEnabled = true;\n\n    public function withFirstName($firstName)\n    {\n        $this->firstName = $firstName;\n\n        return $this;\n    }\n\n    public function withLastName($lastName)\n    {\n        $this->lastName = $lastName;\n\n        return $this;\n    }\n\n    public function withPhoneNumber($phoneNumber)\n    {\n        $this->phoneNumber = $phoneNumber;\n\n        return $this;\n    }\n\n    public function withId($id)\n    {\n        $this->id = $id;\n\n        return $this;\n    }\n\n    public function withEmail($email)\n    {\n        $this->email = $email;\n\n        return $this;\n    }\n\n    public function withPassword($password)\n    {\n        $this->password = $password;\n\n        return $this;\n    }\n\n    public function withStore(string $store)\n    {\n        $this->store = $store;\n\n        return $this;\n    }\n\n    public function withCompanyId(string $companyId)\n    {\n        $this->companyId = $companyId;\n\n        return $this;\n    }\n\n    public function withRole(string $role)\n    {\n        $this->role = $role;\n\n        return $this;\n    }\n\n    public function withDisabled()\n    {\n        $this->isEnabled = false;\n\n        return $this;\n    }\n\n    public function build()\n    {\n        $id = $this->id ?? Uuid::uuid4()->toString();\n\n        return new Client(\n            $id,\n            $this->firstName,\n            $this->lastName,\n            $this->email,\n            $this->phoneNumber,\n            $this->password,\n            $this->store,\n            $this->role,\n            $this->isEnabled,\n            $this->companyId\n        );\n    }\n\n    public static function aClient()\n    {\n        return new ClientBuilder();\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Client/Entity/CompanyBuilder.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Client\\Entity;\n\nuse Ramsey\\Uuid\\Uuid;\nuse Seat\\Domain\\Client\\Entity\\Company;\nuse Seat\\Domain\\Client\\Entity\\Store;\n\nclass CompanyBuilder\n{\n    private $id = null;\n    private $name = 'Namico';\n    private $hasInvoice = false;\n    private $store = null;\n    private $maxOrderTimeForDelivery = null;\n    private $isEnabled = true;\n\n\n    public function name($name)\n    {\n        $this->name = $name;\n\n        return $this;\n    }\n\n    public function invoiced()\n    {\n        $this->hasInvoice = true;\n\n        return $this;\n    }\n\n    public function store($store)\n    {\n        $this->store = $store;\n\n        return $this;\n    }\n\n    public function deliverable($maxOrderTimeForDelivery)\n    {\n        $this->maxOrderTimeForDelivery = $maxOrderTimeForDelivery;\n\n        return $this;\n    }\n\n    public function build()\n    {\n        $id = $this->id ?? Uuid::uuid4()->toString();\n        $store = $this->store ?? Store::$laHulpe;\n\n        return new Company($id, $this->name, $this->hasInvoice, $store, $this->isEnabled, $this->maxOrderTimeForDelivery);\n    }\n\n    public static function aCompany()\n    {\n        return new CompanyBuilder();\n    }\n\n    public function disabled()\n    {\n        $this->isEnabled = false;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Client/UseCase/GetClient/GetClientTest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Client\\UseCase\\GetClient;\n\nuse PHPUnit\\Framework\\TestCase;\nuse Seat\\Domain\\Client\\UseCase\\GetClient\\GetClient;\nuse Seat\\Domain\\Client\\UseCase\\GetClient\\GetClientPresenter;\nuse Seat\\Domain\\Client\\UseCase\\GetClient\\GetClientRequest;\nuse Seat\\Domain\\Client\\UseCase\\GetClient\\GetClientResponse;\nuse SeatTest\\_Mock\\Domain\\Client\\Entity\\InMemoryClientRepository;\nuse SeatTest\\Domain\\Client\\Entity\\ClientBuilder;\n\nclass GetClientTest extends TestCase implements GetClientPresenter\n{\n    const CLIENT_ID = 'client-id';\n    /** @var GetClientResponse */\n    private $response;\n    private $clientRepository;\n    private $getClient;\n    private $client;\n\n    protected function setUp()\n    {\n        $this->clientRepository = new InMemoryClientRepository();\n        $this->client = ClientBuilder::aClient()->withId(self::CLIENT_ID)->build();\n        $this->clientRepository->addClient($this->client);\n        $this->getClient = new GetClient($this->clientRepository);\n    }\n\n    public function present(GetClientResponse $response): void\n    {\n        $this->response = $response;\n    }\n\n    public function test_it_returns_a_client()\n    {\n        $this->getClient->execute(new GetClientRequest(self::CLIENT_ID), $this);\n\n        $this->assertNotNull($this->response->client());\n        $this->assertSame($this->client->firstName(), $this->response->client()->firstName());\n    }\n\n    public function test_it_returns_no_client_when_he_does_not_exist()\n    {\n        $this->getClient->execute(new GetClientRequest('unknown-client'), $this);\n\n        $this->assertNull($this->response->client());\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Client/UseCase/Login/LoginTest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Client\\UseCase\\Login;\n\nuse PHPUnit\\Framework\\TestCase;\nuse Seat\\Domain\\Client\\UseCase\\Login\\Login;\nuse Seat\\Domain\\Client\\UseCase\\Login\\LoginPresenter;\nuse Seat\\Domain\\Client\\UseCase\\Login\\LoginRequest;\nuse Seat\\Domain\\Client\\UseCase\\Login\\LoginResponse;\nuse Seat\\SharedKernel\\Error\\Notification;\nuse Seat\\SharedKernel\\Service\\Base64PasswordHasher;\nuse SeatTest\\_Mock\\Domain\\Client\\Entity\\InMemoryClientRepository;\nuse SeatTest\\_Mock\\Domain\\Client\\Entity\\InMemoryCompanyRepository;\nuse SeatTest\\Domain\\Client\\Entity\\ClientBuilder;\nuse SeatTest\\Domain\\Client\\Entity\\CompanyBuilder;\n\nclass LoginTest extends TestCase implements LoginPresenter\n{\n    const PASSWORD = 'my password';\n\n    private $registeredClient;\n    private $clientRepository;\n    private $companyRepository;\n\n    private $login;\n    private $passwordHasher;\n    /** @var LoginResponse */\n    private $response;\n\n    protected function setUp()\n    {\n        $this->clientRepository = new InMemoryClientRepository();\n        $this->companyRepository = new InMemoryCompanyRepository();\n        $this->passwordHasher = new Base64PasswordHasher();\n        $this->login = new Login($this->clientRepository, $this->companyRepository, $this->passwordHasher);\n\n        $this->registeredClient = ClientBuilder::aClient()->withPassword($this->passwordHasher->hash(self::PASSWORD))->build();\n    }\n\n    public function present(LoginResponse $response)\n    {\n        $this->response = $response;\n    }\n\n    public function test_it_saves_the_logged_client_in_the_response()\n    {\n        $this->clientRepository->addClient($this->registeredClient);\n\n        $this->login->execute(new LoginRequest($this->registeredClient->email(), self::PASSWORD), $this);\n\n        $this->assertNotNull($this->response->client());\n        $this->assertSame($this->registeredClient->email(), $this->response->client()->email());\n        $this->assertSame($this->registeredClient->firstName(), $this->response->client()->firstName());\n    }\n\n    public function test_an_error_when_the_password_is_wrong()\n    {\n        $this->clientRepository->addClient($this->registeredClient);\n\n        $this->login->execute(new LoginRequest($this->registeredClient->email(), 'wrong password'), $this);\n        $this->assertEquals((new Notification())->addError('password', 'invalid-password'), $this->response->notification());\n    }\n\n    public function test_throws_an_error_when_user_does_not_exist()\n    {\n        $this->login->execute(new LoginRequest('unknown user', 'wrong password'), $this);\n        $this->assertEquals((new Notification())->addError('email', 'unknown-email'), $this->response->notification());\n    }\n\n    public function test_throws_an_error_when_the_user_is_disabled()\n    {\n        $client = ClientBuilder::aClient()->withPassword($this->passwordHasher->hash(self::PASSWORD))->withDisabled()->build();\n        $this->clientRepository->addClient($client);\n\n        $this->login->execute(new LoginRequest($client->email(), self::PASSWORD), $this);\n\n        $this->assertEquals((new Notification())->addError('email', 'disabled-user'), $this->response->notification());\n    }\n\n    public function test_throws_an_error_when_his_company_is_disabled()\n    {\n        $company = CompanyBuilder::aCompany()->disabled()->build();\n        $this->companyRepository->addCompany($company);\n        $client = ClientBuilder::aClient()->withPassword($this->passwordHasher->hash(self::PASSWORD))->withCompanyId($company->id())->build();\n        $this->clientRepository->addClient($client);\n\n        $this->login->execute(new LoginRequest($client->email(), self::PASSWORD), $this);\n\n\n        $this->assertEquals((new Notification())->addError('email', 'disabled-company'), $this->response->notification());\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Client/UseCase/Register/RegisterRequestBuilder.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Client\\UseCase\\Register;\n\nuse Seat\\Domain\\Client\\UseCase\\Register\\RegisterRequest;\n\nclass RegisterRequestBuilder extends RegisterRequest\n{\n    const FIRST_NAME = 'Nico';\n    const LAST_NAME = 'last name';\n    const PHONE_NUMBER = '0474474747';\n    const EMAIL = 'nico@email.com';\n    const PASSWORD = 'dzefzfsdf';\n    const STORE = 'la-hulpe';\n\n    public static function aRequest()\n    {\n        $request = new static();\n        $request->isPosted = true;\n        $request->firstName = self::FIRST_NAME;\n        $request->lastName = self::LAST_NAME;\n        $request->store = self::STORE;\n        $request->password = self::PASSWORD;\n        $request->phoneNumber = self::PHONE_NUMBER;\n        $request->email = self::EMAIL;\n\n        return $request;\n    }\n\n    public function build()\n    {\n        $request = new RegisterRequest();\n        $request->isPosted = $this->isPosted;\n        $request->firstName = $this->firstName;\n        $request->lastName = $this->lastName;\n        $request->store = $this->store;\n        $request->password = $this->password;\n        $request->phoneNumber = $this->phoneNumber;\n        $request->email = $this->email;\n        $request->companyName = $this->companyName;\n\n        return $request;\n    }\n\n    public function empty()\n    {\n        $this->isPosted = false;\n        $this->firstName = null;\n        $this->lastName = null;\n        $this->store = null;\n        $this->password = null;\n        $this->phoneNumber = null;\n        $this->email = null;\n\n        return $this;\n    }\n\n    public function withIsPosted($isPosted)\n    {\n        $this->isPosted = $isPosted;\n\n        return $this;\n    }\n\n    public function withFirstName($firstName)\n    {\n        $this->firstName = $firstName;\n\n        return $this;\n    }\n\n    public function withLastName($lastName)\n    {\n        $this->lastName = $lastName;\n\n        return $this;\n    }\n\n    public function withStore($store)\n    {\n        $this->store = $store;\n\n        return $this;\n    }\n\n    public function withPassword($password)\n    {\n        $this->password = $password;\n\n        return $this;\n    }\n\n    public function withPhoneNumber($phoneNumber)\n    {\n        $this->phoneNumber = $phoneNumber;\n\n        return $this;\n    }\n\n    public function withEmail($email)\n    {\n        $this->email = $email;\n\n        return $this;\n    }\n\n    public function withCompanyName($companyName)\n    {\n        $this->companyName = $companyName;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Client/UseCase/Register/RegisterTest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Client\\UseCase\\Register;\n\nuse PHPUnit\\Framework\\TestCase;\nuse Seat\\Domain\\Client\\UseCase\\Register\\Register;\nuse Seat\\Domain\\Client\\UseCase\\Register\\RegisterPresenter;\nuse Seat\\Domain\\Client\\UseCase\\Register\\RegisterResponse;\nuse Seat\\SharedKernel\\Error\\Notification;\nuse Seat\\SharedKernel\\Service\\Base64PasswordHasher;\nuse SeatTest\\_Mock\\Domain\\Client\\Entity\\InMemoryClientRepository;\nuse SeatTest\\_Mock\\Domain\\Client\\Entity\\InMemoryCompanyRepository;\nuse SeatTest\\_Mock\\Seat\\SharedKernel\\Service\\IdGeneratorMock;\nuse SeatTest\\Domain\\Client\\Entity\\ClientBuilder;\nuse SeatTest\\Domain\\Client\\Entity\\CompanyBuilder;\n\nclass RegisterTest extends TestCase implements RegisterPresenter\n{\n    private $idGenerator;\n    private $clientRepository;\n    private $register;\n    private $passwordHasher;\n    private $companyRepository;\n    /** @var RegisterResponse */\n    private $response;\n\n    public function present(RegisterResponse $response): void\n    {\n        $this->response = $response;\n    }\n\n    protected function setUp()\n    {\n        $this->clientRepository = new InMemoryClientRepository();\n        $this->companyRepository = new InMemoryCompanyRepository();\n        $this->idGenerator = new IdGeneratorMock();\n        $this->passwordHasher = new Base64PasswordHasher();\n        $this->register = new Register(\n            $this->idGenerator,\n            $this->clientRepository,\n            $this->companyRepository,\n            $this->passwordHasher\n        );\n    }\n\n    public function test_saves_the_client_in_the_database_with_a_hashed_password()\n    {\n        $request = RegisterRequestBuilder::aRequest()->build();\n        $this->register->execute($request, $this);\n\n        $this->assertEquals(\n            ClientBuilder::aClient()\n                ->withId($this->idGenerator->lastId)\n                ->withFirstName($request->firstName)\n                ->withLastName($request->lastName)\n                ->withEmail($request->email)\n                ->withPhoneNumber($request->phoneNumber)\n                ->withPassword(base64_encode($request->password))\n                ->withStore($request->store)\n                ->build(),\n            $this->clientRepository->getClientByEmail($request->email)\n        );\n    }\n\n    public function test_fails_when_email_already_exist()\n    {\n        $request = RegisterRequestBuilder::aRequest()->build();\n        $this->clientRepository->addClient(ClientBuilder::aClient()->withEmail($request->email)->build());\n        $this->register->execute($request, $this);\n\n        $shouldBe = (new Notification())->addError('email', 'email-already-used');\n        $this->assertEquals($shouldBe, $this->response->notification());\n    }\n\n    public function test_a_user_can_not_be_linked_to_an_missing_company()\n    {\n        $request = RegisterRequestBuilder::aRequest()->withCompanyName('Missing company')->build();\n        $this->register->execute($request, $this);\n\n\n        $shouldBe = (new Notification())->addError('companyName', 'unknown-company');\n        $this->assertEquals($shouldBe, $this->response->notification());\n    }\n\n    public function test_a_user_can_be_linked_to_an_existing_company()\n    {\n        $company = CompanyBuilder::aCompany()->build();\n        $this->companyRepository->addCompany($company);\n\n        $request = RegisterRequestBuilder::aRequest()->withCompanyName($company->name())->build();\n\n        $this->register->execute($request, $this);\n\n        $this->assertNotNull($this->response->client());\n        $this->assertSame($company->id(), $this->response->client()->companyId());\n        $this->assertEquals(\n            ClientBuilder::aClient()\n                ->withId($this->idGenerator->lastId)\n                ->withFirstName($request->firstName)\n                ->withLastName($request->lastName)\n                ->withEmail($request->email)\n                ->withPhoneNumber($request->phoneNumber)\n                ->withPassword(base64_encode($request->password))\n                ->withStore($request->store)\n                ->withCompanyId($company->id())\n                ->build(),\n            $this->clientRepository->getClientByEmail($request->email)\n        );\n    }\n\n    public function test_when_a_company_is_linked_the_user_inherits_from_its_store()\n    {\n        $company = CompanyBuilder::aCompany()->store('waterloo')->build();\n        $this->companyRepository->addCompany($company);\n        $request = RegisterRequestBuilder::aRequest()->withCompanyName($company->name())->withStore('la-hulpe')->build();\n\n        $this->register->execute($request, $this);\n\n        $this->assertNotNull($this->response->client());\n        $this->assertSame($company->store(), $this->response->client()->store());\n    }\n\n    public function test_a_user_can_not_register_in_a_disabled_company()\n    {\n        $company = CompanyBuilder::aCompany()->disabled()->build();\n        $this->companyRepository->addCompany($company);\n        $request = RegisterRequestBuilder::aRequest()->withCompanyName($company->name())->build();\n\n        $this->register->execute($request, $this);\n\n        $shouldBe = (new Notification())->addError('companyName', 'disabled-company');\n        $this->assertEquals($shouldBe, $this->response->notification());\n    }\n\n    public function test_the_request_is_validated()\n    {\n        $request = RegisterRequestBuilder::aRequest()->empty()->withIsPosted(true)->build();\n        $this->register->execute($request, $this);\n\n        $shouldBe = (new Notification())\n            ->addError('firstName', 'error-notEmpty')\n            ->addError('lastName', 'error-notEmpty')\n            ->addError('email', 'error-notEmpty')\n            ->addError('phoneNumber', 'error-notEmpty')\n            ->addError('password', 'error-notEmpty')\n            ->addError('store', 'error-notEmpty');\n\n        $this->assertEquals($shouldBe, $this->response->notification());\n    }\n\n    public function test_firstname_lastname_and_password_must_be_a_string()\n    {\n        $request = RegisterRequestBuilder::aRequest()\n            ->withFirstName(1)->withLastName(1)->withEmail(1)->withPassword(1)->withStore(1)->build();\n\n        $this->register->execute($request, $this);\n\n        $shouldBe = (new Notification())\n            ->addError('firstName', 'error-string')\n            ->addError('lastName', 'error-string')\n            ->addError('email', 'invalid-email')\n            ->addError('password', 'error-string')\n            ->addError('store', 'error-choice');\n\n        $this->assertEquals($shouldBe, $this->response->notification());\n\n    }\n\n    public function test_email_must_be_valid()\n    {\n        $request = RegisterRequestBuilder::aRequest()->withEmail('invalid-email')->build();\n        $this->register->execute($request, $this);\n\n        $shouldBe = (new Notification())->addError('email', 'invalid-email');\n        $this->assertEquals($shouldBe, $this->response->notification());\n    }\n\n    public function test_invalid_store_throws_an_error()\n    {\n        $request = RegisterRequestBuilder::aRequest()->withStore('invalid')->build();\n\n        $this->register->execute($request, $this);\n\n\n        $shouldBe = (new Notification())->addError('store', 'error-choice');\n        $this->assertEquals($shouldBe, $this->response->notification());\n    }\n\n    /**\n     * @dataProvider stores\n     */\n    public function test_store_must_be_la_hulpe_or_waterloo($store)\n    {\n        $request = RegisterRequestBuilder::aRequest()->withStore($store)->build();\n        $this->register->execute($request, $this);\n        $this->assertFalse($this->response->notification()->hasError());\n    }\n\n    public function stores(): array\n    {\n        return [['la-hulpe'], ['waterloo']];\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Client/UseCase/UpdateClient/UpdateClientRequestBuilder.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Client\\UseCase\\UpdateClient;\n\nuse Seat\\Domain\\Client\\UseCase\\UpdateClient\\UpdateClientRequest;\n\nclass UpdateClientRequestBuilder extends UpdateClientRequest\n{\n    const FIRST_NAME = 'Nicolas';\n    const LAST_NAME = 'De Boose';\n    const PHONE_NUMBER = '0474474747';\n    const EMAIL = 'nicolas@email.com';\n    const PASSWORD = 'dzefzfsdf';\n    const CLIENT_ID = 'my-client-id';\n\n    public static function aRequest()\n    {\n        $request = new static();\n        $request->firstName = self::FIRST_NAME;\n        $request->lastName = self::LAST_NAME;\n        $request->password = self::PASSWORD;\n        $request->phoneNumber = self::PHONE_NUMBER;\n        $request->email = self::EMAIL;\n        $request->clientId = self::CLIENT_ID;\n\n        return $request;\n    }\n\n    public function build()\n    {\n        $request = new UpdateClientRequest();\n        $request->firstName = $this->firstName;\n        $request->lastName = $this->lastName;\n        $request->password = $this->password;\n        $request->phoneNumber = $this->phoneNumber;\n        $request->email = $this->email;\n        $request->clientId = $this->clientId;\n\n        return $request;\n    }\n\n    public function empty()\n    {\n        $this->firstName = null;\n        $this->lastName = null;\n        $this->password = null;\n        $this->phoneNumber = null;\n        $this->email = null;\n        $this->clientId = null;\n\n        return $this;\n    }\n\n    public function withClientId($clientId)\n    {\n        $this->clientId = $clientId;\n\n        return $this;\n    }\n\n    public function withPassword($password)\n    {\n        $this->password = $password;\n\n        return $this;\n    }\n\n    public function withFirstName($firstName)\n    {\n        $this->firstName = $firstName;\n\n        return $this;\n    }\n\n    public function withLastName($lastName)\n    {\n        $this->lastName = $lastName;\n\n        return $this;\n    }\n\n    public function withEmail($email)\n    {\n        $this->email = $email;\n\n        return $this;\n    }\n\n    public function withPhoneNumber($phoneNumber)\n    {\n        $this->phoneNumber = $phoneNumber;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Client/UseCase/UpdateClient/UpdateClientTest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Client\\UseCase\\UpdateClient;\n\nuse PHPUnit\\Framework\\TestCase;\nuse Seat\\Domain\\Client\\Entity\\Client;\nuse Seat\\Domain\\Client\\UseCase\\UpdateClient\\UpdateClient;\nuse Seat\\Domain\\Client\\UseCase\\UpdateClient\\UpdateClientPresenter;\nuse Seat\\Domain\\Client\\UseCase\\UpdateClient\\UpdateClientResponse;\nuse Seat\\SharedKernel\\Error\\Notification;\nuse Seat\\SharedKernel\\Service\\Base64PasswordHasher;\nuse SeatTest\\_Mock\\Domain\\Client\\Entity\\InMemoryClientRepository;\nuse SeatTest\\Domain\\Client\\Entity\\ClientBuilder;\n\n\nclass UpdateClientTest extends TestCase implements UpdateClientPresenter\n{\n    private $clientRepository;\n    private $existingClient;\n    private $updateClient;\n    private $passwordHasher;\n    /**\n     * @var UpdateClientResponse\n     */\n    private $response;\n\n    protected function setUp()\n    {\n        $this->clientRepository = new InMemoryClientRepository();\n        $this->passwordHasher = new Base64PasswordHasher();\n        $this->existingClient = ClientBuilder::aClient()->build();\n        $this->clientRepository->addClient($this->existingClient);\n        $this->updateClient = new UpdateClient($this->clientRepository, $this->passwordHasher);\n    }\n\n    public function present(UpdateClientResponse $response)\n    {\n        $this->response = $response;\n    }\n\n    public function test_it_updates_a_client()\n    {\n        $this->updateClient->execute(\n            UpdateClientRequestBuilder::aRequest()->withClientId($this->existingClient->id())->build(),\n            $this\n        );\n\n        $client = $this->clientRepository->getClientById($this->existingClient->id());\n\n        $this->assertNotNull($client);\n        $this->assertSame('Nicolas', $client->firstName());\n        $this->assertSame('De Boose', $client->lastName());\n        $this->assertSame('nicolas@email.com', $client->email());\n        $this->assertSame('0474474747', $client->phoneNumber());\n\n    }\n\n    public function test_it_fills_the_response()\n    {\n        $this->updateClient->execute(\n            UpdateClientRequestBuilder::aRequest()\n                ->withClientId($this->existingClient->id())\n                ->withFirstName('new first name')\n                ->withLastName('new last name')\n                ->withPhoneNumber('0474451232')\n                ->withEmail('new@email.com')\n                ->withPassword('new-password')\n                ->build(),\n            $this\n        );\n        $this->assertNotNull($this->response);\n        $this->assertInstanceOf(Client::class, $this->response->originalClient());\n        $this->assertSame('Nicolas', $this->response->originalClient()->firstName());\n        $this->assertNotNull($this->response->updatedClient());\n        $this->assertSame('new first name', $this->response->updatedClient()->firstName());\n    }\n\n    public function test_it_checks_fields_validity()\n    {\n        $this->updateClient->execute(\n            UpdateClientRequestBuilder::aRequest()->empty()->build(),\n            $this\n        );\n\n        $this->assertEquals(\n            (new Notification())\n                ->addError('clientId', 'error-notEmpty')\n                ->addError('firstName', 'error-notEmpty')\n                ->addError('lastName', 'error-notEmpty')\n                ->addError('email', 'error-notEmpty')\n                ->addError('phoneNumber', 'error-notEmpty'),\n            $this->response->notification()\n        );\n    }\n\n    public function test_it_checks_email_validity()\n    {\n        $this->updateClient->execute(\n            UpdateClientRequestBuilder::aRequest()->withClientId($this->existingClient->id())->withEmail('invalid')->build(),\n            $this\n        );\n\n        $this->assertEquals(\n            (new Notification())\n                ->addError('email', 'invalid-email'),\n            $this->response->notification()\n        );\n    }\n\n    public function test_it_may_not_update_the_password()\n    {\n        $this->updateClient->execute(\n            UpdateClientRequestBuilder::aRequest()\n                ->withClientId($this->existingClient->id())\n                ->withPassword(null)\n                ->build(),\n            $this\n        );\n\n        $client = $this->clientRepository->getClientById($this->existingClient->id());\n\n        $this->assertNotNull($client);\n        $this->assertSame($this->existingClient->password(), $client->password());\n    }\n\n    public function test_it_hashes_the_password()\n    {\n        $this->updateClient->execute(\n            UpdateClientRequestBuilder::aRequest()\n                ->withClientId($this->existingClient->id())\n                ->withPassword('new-password')\n                ->build(),\n            $this\n        );\n\n        $client = $this->clientRepository->getClientById($this->existingClient->id());\n\n        $this->assertNotNull($client);\n        $this->assertSame($this->passwordHasher->hash('new-password'), $client->password());\n        $this->assertTrue($this->response->hasPasswordChanged());\n    }\n\n    public function test_it_fails_when_the_client_does_not_exist()\n    {\n        $this->updateClient->execute(\n            UpdateClientRequestBuilder::aRequest()->withClientId('unknown-client-id')->build(),\n            $this\n        );\n\n        $this->assertEquals(\n            (new Notification())->addError('clientId', 'unknown-client'),\n            $this->response->notification()\n        );\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Menu/UseCase/GetMenu/GetMenuTest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Menu\\UseCase\\GetMenu;\n\nuse PHPUnit\\Framework\\TestCase;\nuse Seat\\Domain\\Menu\\UseCase\\GetMenu\\GetMenu;\nuse Seat\\Domain\\Menu\\UseCase\\GetMenu\\GetMenuPresenter;\nuse Seat\\Domain\\Menu\\UseCase\\GetMenu\\GetMenuResponse;\nuse Seat\\Domain\\Menu\\Entity\\Category;\nuse Seat\\Domain\\Menu\\Entity\\Product;\nuse Seat\\Domain\\Menu\\Entity\\ProductOption;\nuse Seat\\Domain\\Menu\\Entity\\ProductSupplement;\nuse SeatTest\\_Mock\\Domain\\Menu\\Entity\\InMemoryCategoryRepository;\nuse SeatTest\\_Mock\\Domain\\Menu\\Entity\\InMemoryProductOptionRepository;\nuse SeatTest\\_Mock\\Domain\\Menu\\Entity\\InMemoryProductRepository;\nuse SeatTest\\_Mock\\Domain\\Menu\\Entity\\InMemoryProductSupplementRepository;\n\nclass GetMenuTest extends TestCase implements GetMenuPresenter\n{\n    private $categoryRepository;\n    private $optionRepository;\n    private $getMenu;\n\n    private $category1;\n    private $category2;\n    private $supplementRepository;\n    private $productRepository;\n    /** @var GetMenuResponse */\n    private $response;\n\n    protected function setUp()\n    {\n        $this->categoryRepository = new InMemoryCategoryRepository();\n        $this->optionRepository = new InMemoryProductOptionRepository();\n        $this->supplementRepository = new InMemoryProductSupplementRepository();\n        $this->productRepository = new InMemoryProductRepository();\n        $this->category1 = new Category('category-1', 'Cat 1', 'My first category');\n        $this->category2 = new Category('category-2', 'Cat 2', 'My second category');\n\n        $this->categoryRepository->addCategory($this->category1);\n        $this->categoryRepository->addCategory($this->category2);\n\n        $this->getMenu = new GetMenu(\n            $this->categoryRepository,\n            $this->optionRepository,\n            $this->supplementRepository,\n            $this->productRepository\n        );\n    }\n\n    public function present(GetMenuResponse $response): void\n    {\n        $this->response = $response;\n    }\n\n    public function test_it_returns_a_list_of_category()\n    {\n        $this->getMenu->execute($this);\n\n        $this->assertCount(2, $this->response->menuLines);\n        $this->assertSame($this->category1->name(), $this->response->menuLines[0]->name());\n        $this->assertSame($this->category1->description(), $this->response->menuLines[0]->description());\n\n        $this->assertSame($this->category2->name(), $this->response->menuLines[1]->name());\n        $this->assertSame($this->category2->description(), $this->response->menuLines[1]->description());\n    }\n\n    public function test_the_list_may_contains_options()\n    {\n        $option1a = new ProductOption('option-1a', $this->category1->id(), 'Option 1a', 1);\n        $option1b = new ProductOption('option-1b', $this->category1->id(), 'Option 1b', 1);\n        $this->optionRepository->add($option1a);\n        $this->optionRepository->add($option1b);\n\n        $this->getMenu->execute($this);\n\n        $this->assertCount(2, $this->response->menuLines[0]->options());\n\n        $this->assertSame($option1a->id(), $this->response->menuLines[0]->options()[0]->id());\n        $this->assertSame($option1a->name(), $this->response->menuLines[0]->options()[0]->name());\n        $this->assertSame($option1a->price(), $this->response->menuLines[0]->options()[0]->price());\n\n        $this->assertSame($option1b->id(), $this->response->menuLines[0]->options()[1]->id());\n        $this->assertSame($option1b->name(), $this->response->menuLines[0]->options()[1]->name());\n        $this->assertSame($option1b->price(), $this->response->menuLines[0]->options()[1]->price());\n    }\n\n    public function test_the_list_may_contains_supplements()\n    {\n        $supplement1a = new ProductSupplement('supplement-1a', $this->category1->id(), 'Supplement 1a', 1);\n        $supplement1b = new ProductSupplement('supplement-1b', $this->category1->id(), 'Supplement 1b', 1);\n        $this->supplementRepository->add($supplement1a);\n        $this->supplementRepository->add($supplement1b);\n\n        $this->getMenu->execute($this);\n\n        $this->assertCount(2, $this->response->menuLines[0]->supplements());\n\n        $this->assertSame($supplement1a->id(), $this->response->menuLines[0]->supplements()[0]->id());\n        $this->assertSame($supplement1a->name(), $this->response->menuLines[0]->supplements()[0]->name());\n        $this->assertSame($supplement1a->price(), $this->response->menuLines[0]->supplements()[0]->price());\n\n        $this->assertSame($supplement1b->id(), $this->response->menuLines[0]->supplements()[1]->id());\n        $this->assertSame($supplement1b->name(), $this->response->menuLines[0]->supplements()[1]->name());\n        $this->assertSame($supplement1b->price(), $this->response->menuLines[0]->supplements()[1]->price());\n    }\n\n    public function test_the_list_may_contains_products()\n    {\n        $product1a = new Product('product-1a', $this->category1->id(), 'Product 1a', 'Product 1a desc', 1);\n        $product1b = new Product('product-1b', $this->category1->id(), 'Product 1b', 'Product 1b desc', 1);\n        $this->productRepository->add($product1a);\n        $this->productRepository->add($product1b);\n\n        $this->getMenu->execute($this);\n\n        $this->assertCount(2, $this->response->menuLines[0]->products());\n\n        $this->assertSame($product1a->id(), $this->response->menuLines[0]->products()[0]->id());\n        $this->assertSame($product1a->name(), $this->response->menuLines[0]->products()[0]->name());\n        $this->assertSame($product1a->price(), $this->response->menuLines[0]->products()[0]->price());\n        $this->assertSame($product1a->description(), $this->response->menuLines[0]->products()[0]->description());\n\n        $this->assertSame($product1b->id(), $this->response->menuLines[0]->products()[1]->id());\n        $this->assertSame($product1b->name(), $this->response->menuLines[0]->products()[1]->name());\n        $this->assertSame($product1b->price(), $this->response->menuLines[0]->products()[1]->price());\n        $this->assertSame($product1b->description(), $this->response->menuLines[0]->products()[1]->description());\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Order/UseCase/ConfirmBasket/ConfirmBasketRequestBuilder.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Order\\UseCase\\ConfirmBasket;\n\nuse Seat\\Domain\\Client\\Entity\\Client;\nuse Seat\\Domain\\Basket\\Entity\\Basket;\nuse Seat\\Domain\\Order\\UseCase\\ConfirmBasket\\ConfirmBasketRequest;\n\nclass ConfirmBasketRequestBuilder\n{\n    private $userId = '';\n    private $checkSum = '';\n    private $orderTypeName = 'delivery';\n    private $takeAwayTime = null;\n\n    public static function aConfirmBasket()\n    {\n        return new self();\n    }\n\n    public function build()\n    {\n        $request = new ConfirmBasketRequest();\n        $request->userId = $this->userId;\n        $request->checkSum = $this->checkSum;\n        $request->orderTypeName = $this->orderTypeName;\n        $request->takeAwayTime = $this->takeAwayTime;\n\n        return $request;\n    }\n\n    public function withUserId($userId)\n    {\n        $this->userId = $userId;\n\n        return $this;\n    }\n\n    public function withCheckSum($checkSum)\n    {\n        $this->checkSum = $checkSum;\n\n        return $this;\n    }\n\n    public function withOrderTypeName($orderTypeName)\n    {\n        $this->orderTypeName = $orderTypeName;\n\n        return $this;\n    }\n\n    public function withTakeAwayTime($takeAwayTime)\n    {\n        $this->takeAwayTime = $takeAwayTime;\n\n        return $this;\n    }\n\n    public function forBasket(Basket $basket)\n    {\n        $this->checkSum = $basket->checkSum();\n\n        return $this;\n    }\n\n    public function takeAwayAt(string $takeAwayTime)\n    {\n        $this->orderTypeName = 'take-away';\n        $this->takeAwayTime = $takeAwayTime;\n\n        return $this;\n    }\n\n    public function forClient(Client $client)\n    {\n        $this->userId = $client->id();\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/Domain/Order/UseCase/ConfirmBasket/ConfirmBasketTest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\Domain\\Order\\UseCase\\ConfirmBasket;\n\nuse DateTimeImmutable;\nuse PHPUnit\\Framework\\TestCase;\nuse Seat\\Domain\\Basket\\Entity\\Basket;\nuse Seat\\Domain\\Basket\\Model\\BasketProduct;\nuse Seat\\Domain\\Basket\\Service\\OrderTypeChecker;\nuse Seat\\Domain\\Order\\UseCase\\ConfirmBasket\\ConfirmBasket;\nuse Seat\\Domain\\Order\\UseCase\\ConfirmBasket\\ConfirmBasketPresenter;\nuse Seat\\Domain\\Order\\UseCase\\ConfirmBasket\\ConfirmBasketResponse;\nuse Seat\\SharedKernel\\Error\\Notification;\nuse Seat\\SharedKernel\\Service\\Clock;\nuse SeatTest\\_Mock\\Domain\\Client\\Entity\\InMemoryClientRepository;\nuse SeatTest\\_Mock\\Domain\\Client\\Entity\\InMemoryCompanyRepository;\nuse SeatTest\\_Mock\\Domain\\Basket\\Entity\\InMemoryBasketRepository;\nuse SeatTest\\_Mock\\Domain\\Order\\Entity\\InMemoryCommandRepository;\nuse SeatTest\\Domain\\Client\\Entity\\ClientBuilder;\nuse SeatTest\\Domain\\Client\\Entity\\CompanyBuilder;\n\nclass ConfirmBasketTest extends TestCase implements ConfirmBasketPresenter\n{\n    private $commandRepository;\n    private $basketRepository;\n    private $clientRepository;\n\n    private $company;\n\n    private $takeAwayClient;\n    private $deliveredClient;\n    private $clientWithoutBasket;\n\n    private $confirmBasket;\n    private $basketProduct;\n    private $basket;\n    /** @var ConfirmBasketResponse */\n    private $response;\n    private $companyRepository;\n    private $clock;\n\n    protected function setUp()\n    {\n        $this->commandRepository = new InMemoryCommandRepository();\n        $this->basketRepository = new InMemoryBasketRepository();\n        $this->clientRepository = new InMemoryClientRepository();\n        $this->companyRepository = new InMemoryCompanyRepository();\n\n        $this->company = CompanyBuilder::aCompany()->deliverable('11:00:00')->build();\n\n        $this->deliveredClient = ClientBuilder::aClient()->withCompanyId($this->company->id())->build();\n        $this->takeAwayClient = ClientBuilder::aClient()->build();\n        $this->clientWithoutBasket = ClientBuilder::aClient()->withCompanyId($this->company->id())->build();\n        $this->clientRepository->addClient($this->deliveredClient);\n        $this->clientRepository->addClient($this->takeAwayClient);\n        $this->clientRepository->addClient($this->clientWithoutBasket);\n        $this->companyRepository->addCompany($this->company);\n\n        $this->basketProduct = new BasketProduct('product-id', 1, 'Product 1', 2, null, [], '');\n        $this->basket = new Basket('_not_used_', [$this->basketProduct]);\n        $this->basketRepository->addToBasket($this->deliveredClient->id(), $this->basketProduct);\n        $this->basketRepository->addToBasket($this->takeAwayClient->id(), $this->basketProduct);\n\n        $this->clock = $this->createMock(Clock::class);\n        $this->confirmBasket = new ConfirmBasket(\n            $this->commandRepository,\n            $this->basketRepository,\n            $this->clientRepository,\n            new OrderTypeChecker($this->companyRepository, $this->clientRepository, $this->clock)\n        );\n    }\n\n    public function present(ConfirmBasketResponse $response): void\n    {\n        $this->response = $response;\n    }\n\n    private function nowIs(string $hourMinute)\n    {\n        $this->clock->method('now')->willReturn(\n            DateTimeImmutable::createFromFormat('H:i', $hourMinute, new \\DateTimeZone('Europe/Brussels'))\n        );\n    }\n\n    public function test_it_saves_take_away_into_a_command()\n    {\n        $this->nowIs('10:00');\n\n        $request = ConfirmBasketRequestBuilder::aConfirmBasket()\n            ->takeAwayAt('10:00')\n            ->forBasket($this->basket)\n            ->forClient($this->takeAwayClient)\n            ->build();\n\n        $this->confirmBasket->execute($request, $this);\n\n        $commands = $this->commandRepository->getTodayList();\n\n        $this->assertCount(1, $commands);\n        $this->assertSame('take-away', $commands[0]->orderType()->name());\n        $this->assertSame($this->takeAwayClient->id(), $commands[0]->userId());\n        $this->assertSame($this->basket->totalPrice(), $commands[0]->basket()->totalPrice());\n    }\n\n    public function test_it_saves_delivery_into_a_command()\n    {\n        $this->nowIs('10:00');\n        $request = ConfirmBasketRequestBuilder::aConfirmBasket()->forBasket($this->basket)->forClient($this->deliveredClient)->build();\n\n        $this->confirmBasket->execute($request, $this);\n\n        $commands = $this->commandRepository->getTodayList();\n\n        $this->assertCount(1, $commands);\n        $this->assertSame('delivery', $commands[0]->orderType()->name());\n        $this->assertSame($this->deliveredClient->id(), $commands[0]->userId());\n    }\n\n    public function test_a_delivery_company_can_not_take_away()\n    {\n        $this->nowIs('10:00');\n\n        $request = ConfirmBasketRequestBuilder::aConfirmBasket()\n            ->takeAwayAt('10:00')\n            ->forBasket($this->basket)\n            ->forClient($this->deliveredClient)\n            ->build();\n\n        $this->confirmBasket->execute($request, $this);\n\n        $this->assertEquals(\n            (new Notification())->addError('orderTypeName', 'Take away not available'),\n            $this->response->notification()\n        );\n    }\n\n    public function test_a_take_away_client_can_not_deliver()\n    {\n        $this->nowIs('10:00');\n\n        $request = ConfirmBasketRequestBuilder::aConfirmBasket()\n            ->forBasket($this->basket)\n            ->forClient($this->takeAwayClient)\n            ->build();\n\n        $this->confirmBasket->execute($request, $this);\n\n        $this->assertEquals(\n            (new Notification())->addError('orderTypeName', 'Delivery not available'),\n            $this->response->notification()\n        );\n    }\n\n    public function test_it_fails_when_the_given_check_sum_is_not_correct()\n    {\n        $this->nowIs('10:00');\n        $request = ConfirmBasketRequestBuilder::aConfirmBasket()->withCheckSum('wrong')->forClient($this->deliveredClient)->build();\n\n        $this->confirmBasket->execute($request, $this);\n\n        $this->assertEquals(\n            (new Notification())->addError('checkSum', 'wrong-check-sum'),\n            $this->response->notification()\n        );\n    }\n\n    public function test_an_empty_basket_can_not_be_confirmed()\n    {\n        $this->nowIs('10:00');\n        $request = ConfirmBasketRequestBuilder::aConfirmBasket()->forClient($this->clientWithoutBasket)->build();\n\n        $this->confirmBasket->execute($request, $this);\n\n        $this->assertEquals(\n            (new Notification())->addError('userId', 'empty-basket'),\n            $this->response->notification()\n        );\n    }\n\n    public function test_it_empties_the_basket()\n    {\n        $this->nowIs('10:00');\n        $request = ConfirmBasketRequestBuilder::aConfirmBasket()\n            ->forBasket($this->basket)\n            ->forClient($this->takeAwayClient)\n            ->takeAwayAt('10:00')\n            ->build();\n\n        $this->confirmBasket->execute($request, $this);\n\n        $basket = $this->basketRepository->getUserBasket($this->takeAwayClient->id());\n        $this->assertTrue($basket->isEmpty());\n    }\n\n    public function test_throws_an_error_when_the_client_is_unknown()\n    {\n        $this->nowIs('10:00');\n        $request = ConfirmBasketRequestBuilder::aConfirmBasket()->withUserId('unknown client')->build();\n\n        $this->confirmBasket->execute($request, $this);\n\n        $this->assertEquals(\n            (new Notification())->addError('userId', 'unknown-client'),\n            $this->response->notification()\n        );\n    }\n\n    public function test_a_deliver_must_be_done_before_company_limit_time()\n    {\n        $this->nowIs('11:30');\n\n        $request = ConfirmBasketRequestBuilder::aConfirmBasket()\n            ->forBasket($this->basket)\n            ->forClient($this->deliveredClient)\n            ->build();\n\n        $this->confirmBasket->execute($request, $this);\n\n        $this->assertEquals(\n            (new Notification())->addError('orderTypeName', 'Order too late'),\n            $this->response->notification()\n        );\n    }\n\n    public function test_a_take_away_done_at_11h11_is_too_late()\n    {\n        $this->nowIs('11:11');\n\n        $request = ConfirmBasketRequestBuilder::aConfirmBasket()\n            ->forBasket($this->basket)\n            ->forClient($this->takeAwayClient)\n            ->takeAwayAt('14:00')\n            ->build();\n\n        $this->confirmBasket->execute($request, $this);\n\n        $this->assertEquals(\n            (new Notification())->addError('orderTypeName', 'Order too late'),\n            $this->response->notification()\n        );\n    }\n\n    public function test_a_take_away_time_14h01_is_too_late()\n    {\n        $this->nowIs('11:10');\n\n        $request = ConfirmBasketRequestBuilder::aConfirmBasket()\n            ->forBasket($this->basket)\n            ->forClient($this->takeAwayClient)\n            ->takeAwayAt('14:01')\n            ->build();\n\n        $this->confirmBasket->execute($request, $this);\n\n        $this->assertEquals(\n            (new Notification())->addError('orderTypeName', 'Take away too late'),\n            $this->response->notification()\n        );\n    }\n\n    public function test_a_take_away_time_can_be_set_to_maximum_14h00()\n    {\n        $this->nowIs('11:10');\n\n        $request = ConfirmBasketRequestBuilder::aConfirmBasket()\n            ->forBasket($this->basket)\n            ->forClient($this->takeAwayClient)\n            ->takeAwayAt('14:00')\n            ->build();\n\n        $this->confirmBasket->execute($request, $this);\n\n        $this->assertCount(1, $this->commandRepository->getTodayList());\n    }\n\n    public function test_it_notifies_when_the_type_is_unknown()\n    {\n        $request = ConfirmBasketRequestBuilder::aConfirmBasket()\n            ->forBasket($this->basket)\n            ->forClient($this->deliveredClient)\n            ->withOrderTypeName('fake order type')\n            ->build();\n\n        $this->confirmBasket->execute($request, $this);\n\n        $this->assertEquals(\n            (new Notification())->addError('orderTypeName', 'Invalid order type'),\n            $this->response->notification()\n        );\n    }\n\n    public function test_a_null_client_is_considered_unknown()\n    {\n        $request = ConfirmBasketRequestBuilder::aConfirmBasket()\n            ->withUserId(null)\n            ->build();\n\n        $this->confirmBasket->execute($request, $this);\n\n        $this->assertEquals(\n            (new Notification())->addError('userId', 'unknown-client'),\n            $this->response->notification()\n        );\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/SharedKernel/Model/TimeRangeTest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\SharedKernel\\Model;\n\nuse DateInterval;\nuse DateTimeImmutable;\nuse PHPUnit\\Framework\\TestCase;\nuse Seat\\SharedKernel\\Model\\TimeRange;\n\nclass TimeRangeTest extends TestCase\n{\n\n    public function test_returns_steps()\n    {\n        $timeRange = new TimeRange('10:00:00', '11:00:00');\n\n        $this->assertSame(['10:00:00', '10:15:00', '10:30:00', '10:45:00', '11:00:00'], $timeRange->getRoundedStep(15));\n    }\n\n    public function test_from_can_be_delayed()\n    {\n        $timeRange = new TimeRange('10:00:00', '11:00:00');\n        $delay = DateTimeImmutable::createFromFormat('H:i:s', '10:26:21');\n        $timeRange = $timeRange->delayFromDate($delay);\n\n        $this->assertSame(['10:26:21', '10:41:21', '10:56:21',], $timeRange->getRoundedStep(15));\n    }\n\n    public function test_from_can_be_delayed_and_rounded()\n    {\n        $timeRange = new TimeRange('10:00:00', '11:00:00');\n        $delay = DateTimeImmutable::createFromFormat('H:i:s', '10:20:21');\n        $timeRange = $timeRange->delayFromDate($delay, 10);\n\n        $this->assertSame(['10:30:00', '10:45:00', '11:00:00'], $timeRange->getRoundedStep(15));\n    }\n\n    public function test_can_not_delay_before_the_current_from_time()\n    {\n        $timeRange = new TimeRange('10:00:00', '11:00:00');\n        $delay = DateTimeImmutable::createFromFormat('H:i:s', '09:30:00');\n        $timeRange = $timeRange->delayFromDate($delay, 10);\n\n        $this->assertSame(['10:00:00', '10:15:00', '10:30:00', '10:45:00', '11:00:00'], $timeRange->getRoundedStep(15));\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/_Mock/Domain/Basket/Entity/InMemoryBasketRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\_Mock\\Domain\\Basket\\Entity;\n\nuse Seat\\Domain\\Basket\\Entity\\Basket;\nuse Seat\\Domain\\Basket\\Entity\\BasketRepository;\nuse Seat\\Domain\\Basket\\Model\\BasketProduct;\n\nclass InMemoryBasketRepository implements BasketRepository\n{\n    /** @var  BasketProduct[][] */\n    private $baskets = [];\n\n    public function __construct()\n    {\n    }\n\n    public function addToBasket(string $userId, BasketProduct $basketProduct)\n    {\n        if (!array_key_exists($userId, $this->baskets)) {\n            $this->baskets[$userId] = [];\n        }\n        $this->baskets[$userId][] = $basketProduct;\n    }\n\n    public function getUserBasket(string $userId): Basket\n    {\n        if (!array_key_exists($userId, $this->baskets) || count($this->baskets[$userId]) === 0) {\n            return new Basket($userId, []);\n        }\n\n        return new Basket($userId, $this->baskets[$userId]);\n    }\n\n    public function emptyBasketFor(string $userId): void\n    {\n        unset($this->baskets[$userId]);\n    }\n\n    public function delete(string $basketId, string $userId): void\n    {\n        for ($i = 0; $i < count($this->baskets[$userId]); $i++) {\n            if ($this->baskets[$userId][$i]->id() === $basketId) {\n                array_splice($this->baskets[$userId], $i, 1);\n\n                return;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/_Mock/Domain/Client/Entity/InMemoryClientRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\_Mock\\Domain\\Client\\Entity;\n\nuse Seat\\Domain\\Client\\Entity\\Client;\nuse Seat\\Domain\\Client\\Entity\\ClientRepository;\n\nclass InMemoryClientRepository implements ClientRepository\n{\n    /**\n     * @var Client[]\n     */\n    private $clients = [];\n\n    public function addClient(Client $client)\n    {\n        $this->clients[] = $client;\n    }\n\n    public function getRegisterClient(string $email, string $password): ?Client\n    {\n        $find = function (Client $client) use ($email, $password) {\n            return $client->email() === $email && $client->password() === $password;\n        };\n\n        $clientsFound = array_values(array_filter($this->clients, $find));\n        if (count($clientsFound) === 1) {\n            return $clientsFound[0];\n        }\n\n        return null;\n    }\n\n    public function getClientByEmail(string $email): ?Client\n    {\n        $find = function (Client $client) use ($email) {\n            return $client->email() === $email;\n        };\n\n        $clientsFound = array_values(array_filter($this->clients, $find));\n        if (count($clientsFound) === 1) {\n            return $clientsFound[0];\n        }\n\n        return null;\n    }\n\n    public function getClientById(string $id): ?Client\n    {\n        $find = function (Client $client) use ($id) {\n            return $client->id() === $id;\n        };\n\n        $clientsFound = array_values(array_filter($this->clients, $find));\n        if (count($clientsFound) === 1) {\n            return $clientsFound[0];\n        }\n\n        return null;\n    }\n\n    public function updateClient(Client $client): void\n    {\n        for ($i = 0; $i < count($this->clients); $i++) {\n            if ($this->clients[$i]->id() === $client->id()) {\n                $this->clients[$i] = $client;\n                break;\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/_Mock/Domain/Client/Entity/InMemoryCompanyRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\_Mock\\Domain\\Client\\Entity;\n\nuse Seat\\Domain\\Client\\Entity\\Company;\nuse Seat\\Domain\\Client\\Entity\\CompanyRepository;\n\nclass InMemoryCompanyRepository implements CompanyRepository\n{\n\n    /** @var Company[] */\n    private $companies = [];\n\n    public function getCompanyNamed(string $companyName): ?Company\n    {\n        $find = function (Company $company) use ($companyName) {\n            return $company->name() === $companyName;\n        };\n        $foundCompanies = array_values(array_filter($this->companies, $find));\n\n        if (count($foundCompanies) === 1) {\n            return $foundCompanies[0];\n        }\n\n        return null;\n    }\n\n    public function addCompany(Company $company): void\n    {\n        $this->companies[] = $company;\n    }\n\n    public function getCompanyById(?string $companyId): ?Company\n    {\n        $find = function (Company $company) use ($companyId) {\n            return $company->id() === $companyId;\n        };\n        $foundCompanies = array_values(array_filter($this->companies, $find));\n\n        if (count($foundCompanies) === 1) {\n            return $foundCompanies[0];\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/_Mock/Domain/Menu/Entity/InMemoryCategoryRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\_Mock\\Domain\\Menu\\Entity;\n\nuse Seat\\Domain\\Menu\\Entity\\Category;\nuse Seat\\Domain\\Menu\\Entity\\CategoryRepository;\n\nclass InMemoryCategoryRepository implements CategoryRepository\n{\n    private $categories = [];\n\n    public function __construct()\n    {\n    }\n\n    /**\n     * @return Category[]\n     */\n    public function getCategories(): array\n    {\n        return $this->categories;\n    }\n\n    public function addCategory(Category $category)\n    {\n        $this->categories[] = $category;\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/_Mock/Domain/Menu/Entity/InMemoryProductOptionRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\_Mock\\Domain\\Menu\\Entity;\n\nuse Seat\\Domain\\Menu\\Entity\\ProductOption;\nuse Seat\\Domain\\Menu\\Entity\\ProductOptionRepository;\n\nclass InMemoryProductOptionRepository implements ProductOptionRepository\n{\n    private $options = [];\n\n    public function get(string $productOptionId): ?ProductOption\n    {\n        return $this->options[$productOptionId] ?? null;\n    }\n\n    public function add(ProductOption $productOption): void\n    {\n        $this->options[$productOption->id()] = $productOption;\n    }\n\n    /**\n     * @return ProductOption[]\n     */\n    public function getByCategoryId(string $categoryId): array\n    {\n        return array_values(\n            array_filter(\n                $this->options,\n                function (ProductOption $productOption) use ($categoryId) {\n                    return $productOption->categoryId() === $categoryId;\n                }\n            )\n        );\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/_Mock/Domain/Menu/Entity/InMemoryProductRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\_Mock\\Domain\\Menu\\Entity;\n\nuse Seat\\Domain\\Menu\\Entity\\Product;\nuse Seat\\Domain\\Menu\\Entity\\ProductRepository;\n\nclass InMemoryProductRepository implements ProductRepository\n{\n\n    /** @var Product[] */\n    private $products = [];\n\n    public function __construct()\n    {\n    }\n\n    public function add(Product $product): void\n    {\n        $this->products[$product->id()] = $product;\n    }\n\n    public function get(string $id): ?Product\n    {\n        return $this->products[$id] ?? null;\n    }\n\n    /**\n     * @return Product[]\n     */\n    public function getByCategoryId(string $categoryId): array\n    {\n        return array_values(\n            array_filter(\n                $this->products,\n                function (Product $product) use ($categoryId) {\n                    return $product->categoryId() === $categoryId;\n                }\n            )\n        );\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/_Mock/Domain/Menu/Entity/InMemoryProductSupplementRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\_Mock\\Domain\\Menu\\Entity;\n\nuse Seat\\Domain\\Menu\\Entity\\ProductSupplement;\nuse Seat\\Domain\\Menu\\Entity\\ProductSupplementRepository;\n\nclass InMemoryProductSupplementRepository implements ProductSupplementRepository\n{\n    private $supplements = [];\n\n    public function get(string $supplementId): ?ProductSupplement\n    {\n        return $this->supplements[$supplementId] ?? null;\n    }\n\n    public function add(ProductSupplement $supplement): void\n    {\n        $this->supplements[$supplement->id()] = $supplement;\n    }\n\n    /**\n     * @return ProductSupplement[]\n     */\n    public function getByCategoryId(string $categoryId): array\n    {\n        return array_values(\n            array_filter(\n                $this->supplements,\n                function (ProductSupplement $supplement) use ($categoryId) {\n                    return $supplement->categoryId() === $categoryId;\n                }\n            )\n        );\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/_Mock/Domain/Order/Entity/InMemoryCommandRepository.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\_Mock\\Domain\\Order\\Entity;\n\n\nuse Seat\\Domain\\Order\\Entity\\Command;\nuse Seat\\Domain\\Order\\Entity\\CommandRepository;\n\nclass InMemoryCommandRepository implements CommandRepository\n{\n    /** @var Command[] */\n    private $commands = [];\n\n    public function add(Command $command): void\n    {\n        $this->commands[] = $command;\n    }\n\n    /**\n     * @return Command[]\n     */\n    public function getTodayList(): array\n    {\n        $today = date('Y-m-d');\n\n        return array_filter(\n            $this->commands,\n            function (Command $command) use ($today) {\n                return $command->date()->format('Y-m-d') === $today;\n            }\n        );\n    }\n}\n"
  },
  {
    "path": "tests/unit/Seat/_Mock/Seat/SharedKernel/Service/IdGeneratorMock.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace SeatTest\\_Mock\\Seat\\SharedKernel\\Service;\n\nuse Seat\\SharedKernel\\Service\\IdGenerator;\n\nclass IdGeneratorMock extends IdGenerator\n{\n    public $id = 0;\n    public $lastId = '';\n\n    public function next()\n    {\n        $this->lastId = (string)++$this->id;\n\n        return $this->lastId;\n    }\n}\n"
  },
  {
    "path": "webpack.config.js",
    "content": "var Encore = require('@symfony/webpack-encore');\n\nEncore\n    // directory where compiled assets will be stored\n    .setOutputPath('public/build/')\n    // public path used by the web server to access the output path\n    .setPublicPath('/build')\n    // only needed for CDN's or sub-directory deploy\n    //.setManifestKeyPrefix('build/')\n\n    /*\n     * ENTRY CONFIG\n     *\n     * Add 1 entry for each \"page\" of your app\n     * (including one that's included on every page - e.g. \"app\")\n     *\n     * Each entry will result in one JavaScript file (e.g. app.js)\n     * and one CSS file (e.g. app.css) if you JavaScript imports CSS.\n     */\n    .addEntry('app', './resources/assets/js/app.js')\n    //.addEntry('page1', './assets/js/page1.js')\n    //.addEntry('page2', './assets/js/page2.js')\n\n    // When enabled, Webpack \"splits\" your files into smaller pieces for greater optimization.\n    .splitEntryChunks()\n\n    // will require an extra script tag for runtime.js\n    // but, you probably want this, unless you're building a single-page app\n    .enableSingleRuntimeChunk()\n\n    /*\n     * FEATURE CONFIG\n     *\n     * Enable & configure other features below. For a full\n     * list of features, see:\n     * https://symfony.com/doc/current/frontend.html#adding-more-features\n     */\n    .cleanupOutputBeforeBuild()\n    .enableBuildNotifications()\n    .enableSourceMaps(!Encore.isProduction())\n    // enables hashed filenames (e.g. app.abc123.css)\n    .enableVersioning(Encore.isProduction())\n\n    // enables @babel/preset-env polyfills\n    .configureBabel(() => {}, {\n        useBuiltIns: 'usage',\n        corejs: 3\n    })\n\n    // enables Sass/SCSS support\n    //.enableSassLoader()\n\n    // uncomment if you use TypeScript\n    //.enableTypeScriptLoader()\n\n    // uncomment to get integrity=\"...\" attributes on your script & link tags\n    // requires WebpackEncoreBundle 1.4 or higher\n    //.enableIntegrityHashes()\n\n    // uncomment if you're having problems with a jQuery plugin\n    //.autoProvidejQuery()\n\n    // uncomment if you use API Platform Admin (composer req api-admin)\n    //.enableReactPreset()\n    //.addEntry('admin', './assets/js/admin.js')\n;\n\nmodule.exports = Encore.getWebpackConfig();\n"
  }
]