[
  {
    "path": ".coveralls.yml",
    "content": "service_name: travis-ci\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto\n*.css linguist-vendored\n*.less linguist-vendored\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: ngmy\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: # Replace with a single Ko-fi username\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\ncustom: https://flattr.com/@ngmy\n"
  },
  {
    "path": ".gitignore",
    "content": "/vendor\n/node_modules\n.env\n*.swp\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: php\n\nphp:\n  - 5.6\n  - 7.0\n  - 7.1\n  - 7.2\n  - 7.3\n  - 7.4\n\nservices:\n  - mysql\n\nbefore_script:\n  - curl -s http://getcomposer.org/installer | php\n  - php composer.phar install --dev --no-interaction\n  - mysql -u root -e \"create database webloyer_test\"\n\nscript:\n  - mkdir -p build/logs\n  - php vendor/bin/phpunit\n\nafter_success:\n  - travis_retry php vendor/bin/php-coveralls\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Yuta Nagamiya\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "README.md",
    "content": "# Webloyer\n\n[![Latest Stable Version](https://poser.pugx.org/ngmy/webloyer/v/stable)](https://packagist.org/packages/ngmy/webloyer)\n[![Total Downloads](https://poser.pugx.org/ngmy/webloyer/downloads)](https://packagist.org/packages/ngmy/webloyer)\n[![Latest Unstable Version](https://poser.pugx.org/ngmy/webloyer/v/unstable)](https://packagist.org/packages/ngmy/webloyer)\n[![License](https://poser.pugx.org/ngmy/webloyer/license)](https://packagist.org/packages/ngmy/webloyer)<br>\n[![Build Status](https://travis-ci.org/ngmy/webloyer.svg?branch=master)](https://travis-ci.org/ngmy/webloyer)\n[![Coverage Status](https://coveralls.io/repos/ngmy/webloyer/badge.svg?branch=master)](https://coveralls.io/r/ngmy/webloyer?branch=master)\n\nWebloyer is a Web UI for managing [Deployer](https://github.com/deployphp/deployer) deployments.\n\n## Features\n\nWebloyer has the following features:\n\n* Project management\n  * Managing deployment settings on a project-by-project basis\n* Deployment management on a project-by-project basis\n  * 1-click deploying and rolling back\n  * Keeping a log of every deployments\n  * E-mail notifications can be sent when a deployment finishes\n* Recipe management\n  * Creating, editing, deleting and listing recipe files\n* Server management\n  * Creating, editing, deleting and listing server list files\n* User management\n  * Authentication with e-mail address and password\n  * Role-based access control to features\n* Web APIs\n* Webhooks\n  * GitHub\n\n## Screenshots\n\nSee [screenshots](/SCREENSHOTS.md).\n\n## Requirements\n\nWebloyer has the following requirements:\n\n* PHP >= 5.6.0\n* OpenSSL PHP Extension\n* PDO PHP Extension\n* Mbstring PHP Extension\n* Tokenizer PHP Extension\n\n## Installation\n\n### Option 1: Download Source Code\n\n1. Download the application source code by using the Composer `create-project` command:\n   ```\n   composer create-project ngmy/webloyer\n   ```\n2. Give write permission to the `storage` directory and the `bootstrap/cache` directory for your web server user (e.g. `www-data`) by running the following command:\n   ```\n   chown -R www-data:www-data storage\n   chown -R www-data:www-data bootstrap/cache\n   ```\n3. Run the installer by using the Artisan `webloyer:install` command:\n   ```\n   php artisan webloyer:install\n   ```\n   **Note:** You must be running this command as your web server user.\n4. Start the queue listener as a background process by using the Artisan `queue:listen` command:\n   ```\n   nohup php artisan queue:listen --timeout=0 &\n   ```\n   **Note:** You must be running this command as your web server user.\n5. Add the following Cron entry to your server:\n   ```\n   * * * * * php /path/to/webloyer/artisan schedule:run >> /dev/null 2>&1\n   ```\n   **Note:** You must be running this Cron entry as your web server user.\n\n### Option 2: Using Docker\n\nYou can also install using [Webloyer Docker](https://github.com/ngmy/webloyer-docker).\n\n## Basic Usage\n\n### Step 1: Login to Webloyer\n\n1. Go to the Login page by click the \"Login\" link.\n2. Enter the e-mail address and password.\n3. Click the \"Login\" button to login to Webloyer.\n\n### Step 2: Create Your Project\n\n1. Go to the Create Project page by click the \"Create\" button in the Projects page.\n2. Enter your project information.\n   **Note:** For now, Webloyer only supports the `deploy` task and the `rollback` task. Therefore, you must define these tasks in your Deployer recipe file.\n   **Note:** If you want to use the e-mail notification, you need to enter your e-mail settings from the E-Mail Settings page.\n3. Click the \"Store\" button to finish project creation process.\n\n### Step 3: Managing Deployments\n\n1. Go to the Deployments page by click the \"Deployments\" button.\n2. Run the `deploy` task by click the \"Deploy\" button. Or run the `rollback` task by click the \"Rollback\" button.\n3. After the task of execution has been completed, it is possible to go to the Deployment Detail page by click the \"Show\" button, you can see the details of the task execution results.\n\n## Advanced Usage\n\n* [Web APIs](/WEBAPIS.md)\n* [Webhooks](/WEBHOOKS.md)\n\n## Foundation Library\n\nWebloyer uses [Laravel](http://laravel.com/) as a foundation PHP framework.\n\n## License\n\nWebloyer is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT).\n\n## Donation\n\nDo you want to buy me a coffee?\n\n[![Flattr this](https://button.flattr.com/flattr-badge-large.png \"Flattr this\")](https://flattr.com/submit/auto?fid=513grl&url=https%3A%2F%2Fgithub.com%2Fngmy%2Fwebloyer)\n"
  },
  {
    "path": "SCREENSHOTS.md",
    "content": "# Screenshots\n\n## Login\n\n[![https://gyazo.com/97aadef9d25c06e67d70aae12a0aa8da](https://i.gyazo.com/97aadef9d25c06e67d70aae12a0aa8da.png)](https://gyazo.com/97aadef9d25c06e67d70aae12a0aa8da)\n\n## Project Management\n\n[![https://gyazo.com/d8c7d46ac818f57e738dd34fa1c83713](https://i.gyazo.com/d8c7d46ac818f57e738dd34fa1c83713.png)](https://gyazo.com/d8c7d46ac818f57e738dd34fa1c83713)<br>\n[![https://gyazo.com/24d48ddf502b46acdc407efc7f5c2dda](https://i.gyazo.com/24d48ddf502b46acdc407efc7f5c2dda.png)](https://gyazo.com/24d48ddf502b46acdc407efc7f5c2dda)\n\n## Deployment Management\n\n[![https://gyazo.com/39e520f537d877bea52070d0a444ccff](https://i.gyazo.com/39e520f537d877bea52070d0a444ccff.png)](https://gyazo.com/39e520f537d877bea52070d0a444ccff)<br>\n[![https://gyazo.com/17cc4ff25b25e0a85e6a0e79cbbc7ac3](https://i.gyazo.com/17cc4ff25b25e0a85e6a0e79cbbc7ac3.png)](https://gyazo.com/17cc4ff25b25e0a85e6a0e79cbbc7ac3)\n\n## Recipe Management\n\n[![https://gyazo.com/d609b1ee6bc6b62b189d7cd100a08bf7](https://i.gyazo.com/d609b1ee6bc6b62b189d7cd100a08bf7.png)](https://gyazo.com/d609b1ee6bc6b62b189d7cd100a08bf7)<br>\n[![https://gyazo.com/47b875828f5f84156816a015d46472ed](https://i.gyazo.com/47b875828f5f84156816a015d46472ed.png)](https://gyazo.com/47b875828f5f84156816a015d46472ed)\n\n## Server Management\n\n[![https://gyazo.com/bb97dea77c1d84edd6b598420c9f7df3](https://i.gyazo.com/bb97dea77c1d84edd6b598420c9f7df3.png)](https://gyazo.com/bb97dea77c1d84edd6b598420c9f7df3)<br>\n[![https://gyazo.com/529e418174a32df51e12234f0a678c1b](https://i.gyazo.com/529e418174a32df51e12234f0a678c1b.png)](https://gyazo.com/529e418174a32df51e12234f0a678c1b)\n\n## User Management\n\n[![https://gyazo.com/8812374fa5917022cfb42fd333282c5f](https://i.gyazo.com/8812374fa5917022cfb42fd333282c5f.png)](https://gyazo.com/8812374fa5917022cfb42fd333282c5f)<br>\n[![https://gyazo.com/e89694d7dc7cdf05c4605f384aba1551](https://i.gyazo.com/e89694d7dc7cdf05c4605f384aba1551.png)](https://gyazo.com/e89694d7dc7cdf05c4605f384aba1551)<br>\n[![https://gyazo.com/e4f3aab674caa9ab97aa78ff206575ff](https://i.gyazo.com/e4f3aab674caa9ab97aa78ff206575ff.png)](https://gyazo.com/e4f3aab674caa9ab97aa78ff206575ff)<br>\n[![https://gyazo.com/1e12d1c8ed1447dcb3cb7fd0210a47c4](https://i.gyazo.com/1e12d1c8ed1447dcb3cb7fd0210a47c4.png)](https://gyazo.com/1e12d1c8ed1447dcb3cb7fd0210a47c4)\n\n## Settings\n\n[![https://gyazo.com/9af8b0675760785a19444a2ed5b7a87b](https://i.gyazo.com/9af8b0675760785a19444a2ed5b7a87b.png)](https://gyazo.com/9af8b0675760785a19444a2ed5b7a87b)\n"
  },
  {
    "path": "WEBAPIS.md",
    "content": "# Web APIs\n\nWebloyer provide Web APIs.<br>\nFor example, you can use these for Git hooks.\n\n## Protocol\n\nThe Web APIs use the [JSON-RPC 2.0](http://www.jsonrpc.org/specification) protocol.<br>\nYou must call the Web APIs with a **POST** HTTP request.<br>\nAnd you must call the Web APIs with a `Accept` header set to `application/json-rpc`.\n\n## Endpoint\n\n```\n/api/v1/jsonrpc\n```\n\n## Authentication\n\nYou must provide your API token into a `Authorization: Bearer` header.<br>\nYou can see your API token in Edit API Token Page ([Users] -> [Edit] -> [Edit API Token]).\n\n## API Reference\n\n### deploy\n\nDeploy a project.\n\n#### Parameters\n\n| Name | Type | Description |\n| --- | --- | --- |\n| project_id | integer | Project id. |\n\n#### Example Request\n\n```\ncurl -X POST -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"deploy\",\"params\":{\"project_id\":1}}' -H \"Authorization: Bearer aiSPTQE2nMnmHtyfjZenfI5dcb52zANE30n5t1gL5H2BwPpXz9GIVYKVFE8x\" -H \"Accept: application/json-rpc\" http://webloyer.local/api/v1/jsonrpc\n```\n\n#### Example Response\n\n```json\n{\"jsonrpc\":\"2.0\",\"result\":{\"id\":11,\"project_id\":1,\"number\":11,\"task\":\"deploy\",\"status\":null,\"message\":null,\"user_id\":1,\"created_at\":\"2016-10-15 18:25:31\",\"updated_at\":\"2016-10-15 18:25:31\"},\"id\":1}\n```\n\n### rollback\n\nRoll back a project to a previous deployment.\n\n#### Parameters\n\n| Name | Type | Description |\n| --- | --- | --- |\n| project_id | integer | Project id. |\n\n#### Example Request\n\n```\ncurl -X POST -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"rollback\",\"params\":{\"project_id\":1}}' -H \"Authorization: Bearer aiSPTQE2nMnmHtyfjZenfI5dcb52zANE30n5t1gL5H2BwPpXz9GIVYKVFE8x\" -H \"Accept: application/json-rpc\" http://webloyer.local/api/v1/jsonrpc\n```\n\n#### Example Response\n\n```json\n{\"jsonrpc\":\"2.0\",\"result\":{\"id\":13,\"project_id\":1,\"number\":13,\"task\":\"rollback\",\"status\":null,\"message\":null,\"user_id\":1,\"created_at\":\"2016-10-15 18:36:22\",\"updated_at\":\"2016-10-15 18:36:22\"},\"id\":1}\n```\n"
  },
  {
    "path": "WEBHOOKS.md",
    "content": "# Webhooks\n\nWebloyer provide webhooks of GitHub to deploy a project.\n\n## GitHub\n\n### Usage\n\nYou must set \"Execute By\" in Create Project Page.<br>\nIf you want to use [GitHub webhook secret](https://developer.github.com/webhooks/securing/), you must also set \"Secret\".\n\n### Endpoint\n\n```\n/webhook/github/v1/projects/:project_id/deployments\n```\n"
  },
  {
    "path": "app/Console/Commands/Inspire.php",
    "content": "<?php\n\nnamespace App\\Console\\Commands;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Foundation\\Inspiring;\n\nclass Inspire extends Command\n{\n    /**\n     * The console command name.\n     *\n     * @var string\n     */\n    protected $name = 'inspire';\n\n    /**\n     * The console command description.\n     *\n     * @var string\n     */\n    protected $description = 'Display an inspiring quote';\n\n    /**\n     * Execute the console command.\n     *\n     * @return mixed\n     */\n    public function handle()\n    {\n        $this->comment(PHP_EOL.Inspiring::quote().PHP_EOL);\n    }\n}\n"
  },
  {
    "path": "app/Console/Commands/Webloyer/DiscardOldDeployments.php",
    "content": "<?php\n\nnamespace App\\Console\\Commands\\Webloyer;\n\nuse App\\Repositories\\Project\\ProjectInterface;\nuse App\\Specifications\\OldDeploymentSpecification;\nuse Illuminate\\Console\\Command;\nuse DB;\nuse DateTime;\n\nclass DiscardOldDeployments extends Command\n{\n    /**\n     * The name and signature of the console command.\n     *\n     * @var string\n     */\n    protected $signature = 'webloyer:discard-old-deployments';\n\n    /**\n     * The console command description.\n     *\n     * @var string\n     */\n    protected $description = 'Discard old deployments';\n\n    protected $projectRepository;\n\n    protected $spec;\n\n    /**\n     * Create a new command instance.\n     *\n     * @param \\App\\Repositories\\Project\\ProjectInterface $projectRepository\n     * @return void\n     */\n    public function __construct(ProjectInterface $projectRepository)\n    {\n        parent::__construct();\n\n        $this->projectRepository = $projectRepository;\n        $this->spec = new OldDeploymentSpecification(new DateTime);\n    }\n\n    /**\n     * Execute the console command.\n     *\n     * @return mixed\n     */\n    public function handle()\n    {\n        DB::transaction(function () {\n            $projects = $this->projectRepository->all();\n            foreach ($projects as $project) {\n                $oldDeployments = $project->getSatisfyingDeployments($this->spec);\n                if (!$oldDeployments->isEmpty()) {\n                    $project->deleteDeployments($oldDeployments);\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "app/Console/Commands/Webloyer/Install.php",
    "content": "<?php\n\nnamespace App\\Console\\Commands\\Webloyer;\n\nuse Artisan;\nuse Hash;\n\nuse App\\Repositories\\Setting\\AppSettingInterface;\nuse App\\Repositories\\Setting\\DbSettingInterface;\nuse App\\Repositories\\User\\UserInterface;\n\nuse Illuminate\\Console\\Command;\n\nclass Install extends Command\n{\n    /**\n     * The name and signature of the console command.\n     *\n     * @var string\n     */\n    protected $signature = 'webloyer:install';\n\n    /**\n     * The console command description.\n     *\n     * @var string\n     */\n    protected $description = 'Install Webloyer';\n\n    /**\n     * Create a new command instance.\n     *\n     * @return void\n     */\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    /**\n     * Execute the console command.\n     *\n     * @param \\App\\Repositories\\Setting\\AppSettingInterface $appSetting\n     * @param \\App\\Repositories\\Setting\\DbSettingInterface  $dbSetting\n     * @param \\App\\Repositories\\User\\UserInterface          $userRepository\n     * @return void\n     */\n    public function handle(AppSettingInterface $appSetting, DbSettingInterface $dbSetting, UserInterface $userRepository)\n    {\n        $config['app']['url'] = $this->ask(trans('webloyer.enter_webloyer_url'));\n\n        $config['db']['driver'] = $this->choice(trans('webloyer.enter_db_system'), [\n            'mysql'  => 'MySQL',\n            'pgsql'  => 'Postgres',\n            'sqlite' => 'SQLite',\n            'sqlsrv' => 'SQL Server',\n        ], 'mysql');\n\n        if ($config['db']['driver'] !== 'sqlite') {\n            $config['db']['host']     = $this->ask(trans('webloyer.enter_db_host'), 'localhost');\n            $config['db']['database'] = $this->ask(trans('webloyer.enter_db_name'), 'webloyer');\n            $config['db']['username'] = $this->ask(trans('webloyer.enter_db_username'), 'webloyer');\n            $config['db']['password'] = $this->ask(trans('webloyer.enter_db_password'), false);\n        } else {\n            $config['db']['host']     = null;\n            $config['db']['database'] = $this->ask(trans('webloyer.enter_db_name_sqlite'), storage_path('webloyer.sqlite'));\n            $config['db']['username'] = null;\n            $config['db']['password'] = null;\n        }\n\n        $config['admin']['name']     = $this->ask(trans('webloyer.enter_admin_name'));\n        $config['admin']['email']    = $this->ask(trans('webloyer.enter_admin_email'));\n        $config['admin']['password'] = $this->ask(trans('webloyer.enter_admin_password'));\n\n        // Set configuration to .env\n        $appSetting->update($config['app']);\n        $dbSetting->update($config['db']);\n\n        config(['database.default'                                          => $config['db']['driver']]);\n        config(['database.connections.'.$config['db']['driver'].'.host'     => $config['db']['host']]);\n        config(['database.connections.'.$config['db']['driver'].'.database' => $config['db']['database']]);\n        config(['database.connections.'.$config['db']['driver'].'.username' => $config['db']['username']]);\n        config(['database.connections.'.$config['db']['driver'].'.password' => $config['db']['password']]);\n\n        // Migrate and seed database\n        Artisan::call('migrate:refresh', [\n            '--force'          => true,\n            '--no-interaction' => true,\n        ]);\n\n        Artisan::call('db:seed', [\n            '--force'          => true,\n            '--no-interaction' => true,\n            '--class'          => 'RecipeTableSeeder',\n        ]);\n        Artisan::call('db:seed', [\n            '--force'          => true,\n            '--no-interaction' => true,\n            '--class'          => 'RoleTableSeeder',\n        ]);\n        Artisan::call('db:seed', [\n            '--force'          => true,\n            '--no-interaction' => true,\n            '--class'          => 'PermissionTableSeeder',\n        ]);\n        Artisan::call('db:seed', [\n            '--force'          => true,\n            '--no-interaction' => true,\n            '--class'          => 'PermissionRoleTableSeeder',\n        ]);\n\n        // Create admin user\n        $config['admin']['password'] = Hash::make($config['admin']['password']);\n        $config['admin']['api_token'] = str_random(60);\n\n        $user = $userRepository->create($config['admin']);\n        $user->assignRole('administrator');\n    }\n}\n"
  },
  {
    "path": "app/Console/Kernel.php",
    "content": "<?php\n\nnamespace App\\Console;\n\nuse Illuminate\\Console\\Scheduling\\Schedule;\nuse Illuminate\\Foundation\\Console\\Kernel as ConsoleKernel;\n\nclass Kernel extends ConsoleKernel\n{\n    /**\n     * The Artisan commands provided by your application.\n     *\n     * @var array\n     */\n    protected $commands = [\n        'App\\Console\\Commands\\Webloyer\\Install',\n        'App\\Console\\Commands\\Webloyer\\DiscardOldDeployments',\n    ];\n\n    /**\n     * Define the application's command schedule.\n     *\n     * @param  \\Illuminate\\Console\\Scheduling\\Schedule  $schedule\n     * @return void\n     */\n    protected function schedule(Schedule $schedule)\n    {\n        $schedule->command('webloyer:discard-old-deployments')\n            ->everyMinute()\n            ->withoutOverlapping();\n    }\n}\n"
  },
  {
    "path": "app/Entities/ProjectAttribute/ProjectAttributeEntity.php",
    "content": "<?php\n\nnamespace App\\Entities\\ProjectAttribute;\n\nuse JMS\\Serializer\\Annotation\\Type;\nuse JMS\\Serializer\\Annotation\\Accessor;\nuse JMS\\Serializer\\Annotation\\SerializedName;\n\nclass ProjectAttributeEntity\n{\n    /**\n     * @Type(\"string\")\n     * @Accessor(getter=\"getDeployPath\",setter=\"setDeployPath\")\n     * @SerializedName(\"deploy_path\")\n     */\n    protected $deployPath;\n\n    public function getDeployPath()\n    {\n        return $this->deployPath;\n    }\n\n    public function setDeployPath($deployPath)\n    {\n        $this->deployPath = $deployPath;\n    }\n}\n"
  },
  {
    "path": "app/Entities/Setting/AbstractSettingEntity.php",
    "content": "<?php\n\nnamespace App\\Entities\\Setting;\n\nabstract class AbstractSettingEntity\n{\n}\n"
  },
  {
    "path": "app/Entities/Setting/AppSettingEntity.php",
    "content": "<?php\n\nnamespace App\\Entities\\Setting;\n\nuse App\\Entities\\Setting\\AbstractSettingEntity;\n\nclass AppSettingEntity extends AbstractSettingEntity\n{\n    protected $url;\n\n    public function getUrl()\n    {\n        return $this->url;\n    }\n\n    public function setUrl($url)\n    {\n        $this->url = $url;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "app/Entities/Setting/DbSettingEntity.php",
    "content": "<?php\n\nnamespace App\\Entities\\Setting;\n\nuse App\\Entities\\Setting\\AbstractSettingEntity;\n\nclass DbSettingEntity extends AbstractSettingEntity\n{\n    protected $driver;\n\n    protected $host;\n\n    protected $database;\n\n    protected $username;\n\n    protected $password;\n\n    public function getDriver()\n    {\n        return $this->driver;\n    }\n\n    public function getHost()\n    {\n        return $this->host;\n    }\n\n    public function getDatabase()\n    {\n        return $this->database;\n    }\n\n    public function getUsername()\n    {\n        return $this->username;\n    }\n\n    public function getPassword()\n    {\n        return $this->password;\n    }\n\n    public function setDriver($driver)\n    {\n        $this->driver = $driver;\n\n        return $this;\n    }\n\n    public function setHost($host)\n    {\n        $this->host = $host;\n\n        return $this;\n    }\n\n    public function setDatabase($database)\n    {\n        $this->database = $database;\n\n        return $this;\n    }\n\n    public function setUsername($username)\n    {\n        $this->username = $username;\n\n        return $this;\n    }\n\n    public function setPassword($password)\n    {\n        $this->password = $password;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "app/Entities/Setting/MailSettingEntity.php",
    "content": "<?php\n\nnamespace App\\Entities\\Setting;\n\nuse App\\Entities\\Setting\\AbstractSettingEntity;\nuse JMS\\Serializer\\Annotation\\Type;\nuse JMS\\Serializer\\Annotation\\Accessor;\nuse JMS\\Serializer\\Annotation\\SerializedName;\n\nclass MailSettingEntity extends AbstractSettingEntity\n{\n    /**\n     * @Type(\"string\")\n     * @Accessor(getter=\"getDriver\",setter=\"setDriver\")\n     */\n    protected $driver;\n\n    /**\n     * @Type(\"array\")\n     * @Accessor(getter=\"getFrom\",setter=\"setFrom\")\n     */\n    protected $from;\n\n    /**\n     * @Type(\"string\")\n     * @Accessor(getter=\"getSmtpHost\",setter=\"setSmtpHost\")\n     * @SerializedName(\"smtp_host\")\n     */\n    protected $smtpHost;\n\n    /**\n     * @Type(\"integer\")\n     * @Accessor(getter=\"getSmtpPort\",setter=\"setSmtpPort\")\n     * @SerializedName(\"smtp_port\")\n     */\n    protected $smtpPort;\n\n    /**\n     * @Type(\"string\")\n     * @Accessor(getter=\"getSmtpEncryption\",setter=\"setSmtpEncryption\")\n     * @SerializedName(\"smtp_encryption\")\n     */\n    protected $smtpEncryption;\n\n    /**\n     * @Type(\"string\")\n     * @Accessor(getter=\"getSmtpUsername\",setter=\"setSmtpUsername\")\n     * @SerializedName(\"smtp_username\")\n     */\n    protected $smtpUsername;\n\n    /**\n     * @Type(\"string\")\n     * @Accessor(getter=\"getSmtpPassword\",setter=\"setSmtpPassword\")\n     * @SerializedName(\"smtp_password\")\n     */\n    protected $smtpPassword;\n\n    /**\n     * @Type(\"string\")\n     * @Accessor(getter=\"getSendmailPath\",setter=\"setSendmailPath\")\n     * @SerializedName(\"sendmail_path\")\n     */\n    protected $sendmailPath;\n\n    public function getDriver()\n    {\n        return $this->driver;\n    }\n\n    public function getFrom()\n    {\n        return $this->from;\n    }\n\n    public function getSmtpHost()\n    {\n        return $this->smtpHost;\n    }\n\n    public function getSmtpPort()\n    {\n        return $this->smtpPort;\n    }\n\n    public function getSmtpEncryption()\n    {\n        return $this->smtpEncryption;\n    }\n\n    public function getSmtpUsername()\n    {\n        return $this->smtpUsername;\n    }\n\n    public function getSmtpPassword()\n    {\n        return $this->smtpPassword;\n    }\n\n    public function getSendmailPath()\n    {\n        return $this->sendmailPath;\n    }\n\n    public function setDriver($driver)\n    {\n        $this->driver = $driver;\n\n        return $this;\n    }\n\n    public function setFrom(array $from)\n    {\n        $this->from = $from;\n\n        return $this;\n    }\n\n    public function setSmtpHost($smtpHost)\n    {\n        $this->smtpHost = $smtpHost;\n\n        return $this;\n    }\n\n    public function setSmtpPort($smtpPort)\n    {\n        $this->smtpPort = $smtpPort;\n\n        return $this;\n    }\n\n    public function setSmtpEncryption($smtpEncryption)\n    {\n        $this->smtpEncryption = $smtpEncryption;\n\n        return $this;\n    }\n\n    public function setSmtpUsername($smtpUsername)\n    {\n        $this->smtpUsername = $smtpUsername;\n\n        return $this;\n    }\n\n    public function setSmtpPassword($smtpPassword)\n    {\n        $this->smtpPassword = $smtpPassword;\n\n        return $this;\n    }\n\n    public function setSendmailPath($sendmailPath)\n    {\n        $this->sendmailPath = $sendmailPath;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "app/Events/Event.php",
    "content": "<?php\n\nnamespace App\\Events;\n\nabstract class Event\n{\n    //\n}\n"
  },
  {
    "path": "app/Exceptions/Handler.php",
    "content": "<?php\n\nnamespace App\\Exceptions;\n\nuse App\\Traits\\RestExceptionHandlerTrait;\nuse Exception;\nuse Illuminate\\Validation\\ValidationException;\nuse Illuminate\\Auth\\Access\\AuthorizationException;\nuse Illuminate\\Database\\Eloquent\\ModelNotFoundException;\nuse Symfony\\Component\\HttpKernel\\Exception\\HttpException;\nuse Illuminate\\Foundation\\Exceptions\\Handler as ExceptionHandler;\n\nclass Handler extends ExceptionHandler\n{\n    use RestExceptionHandlerTrait;\n\n    /**\n     * A list of the exception types that should not be reported.\n     *\n     * @var array\n     */\n    protected $dontReport = [\n        AuthorizationException::class,\n        HttpException::class,\n        ModelNotFoundException::class,\n        ValidationException::class,\n    ];\n\n    /**\n     * Report or log an exception.\n     *\n     * This is a great spot to send exceptions to Sentry, Bugsnag, etc.\n     *\n     * @param  \\Exception  $e\n     * @return void\n     */\n    public function report(Exception $e)\n    {\n        return parent::report($e);\n    }\n\n    /**\n     * Render an exception into an HTTP response.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  \\Exception  $e\n     * @return \\Illuminate\\Http\\Response\n     */\n    public function render($request, Exception $e)\n    {\n        if ($request->is('webhook/*')) {\n            return $this->getJsonResponseForException($request, $e);\n        }\n\n        return parent::render($request, $e);\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Auth/AuthController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Models\\User;\nuse Validator;\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Foundation\\Auth\\AuthenticatesAndRegistersUsers;\n\nclass AuthController extends Controller\n{\n    /*\n    |--------------------------------------------------------------------------\n    | Registration & Login Controller\n    |--------------------------------------------------------------------------\n    |\n    | This controller handles the registration of new users, as well as the\n    | authentication of existing users. By default, this controller uses\n    | a simple trait to add these behaviors. Why don't you explore it?\n    |\n    */\n\n    use AuthenticatesAndRegistersUsers;\n\n    protected $redirectTo = '/projects';\n\n    /**\n     * Create a new authentication controller instance.\n     *\n     * @return void\n     */\n    public function __construct()\n    {\n        $this->middleware('guest', ['except' => 'getLogout']);\n    }\n\n    /**\n     * Get a validator for an incoming registration request.\n     *\n     * @param  array  $data\n     * @return \\Illuminate\\Contracts\\Validation\\Validator\n     */\n    public function validator(array $data)\n    {\n        return Validator::make($data, [\n            'name' => 'required|max:255',\n            'email' => 'required|email|max:255|unique:users',\n            'password' => 'required|confirmed|min:6',\n        ]);\n    }\n\n    /**\n     * Create a new user instance after a valid registration.\n     *\n     * @param  array  $data\n     * @return User\n     */\n    public function create(array $data)\n    {\n        return User::create([\n            'name' => $data['name'],\n            'email' => $data['email'],\n            'password' => bcrypt($data['password']),\n        ]);\n    }\n\n    /**\n     * Show the application registration form.\n     *\n     * @throws \\Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException\n     * @return void\n     */\n    public function getRegister()\n    {\n        abort(404);\n    }\n\n    /**\n     * Handle a registration request for the application.\n     *\n     * @throws \\Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException\n     * @return void\n     */\n    public function postRegister()\n    {\n        abort(404);\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Auth/PasswordController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Foundation\\Auth\\ResetsPasswords;\n\nclass PasswordController extends Controller\n{\n    /*\n    |--------------------------------------------------------------------------\n    | Password Reset Controller\n    |--------------------------------------------------------------------------\n    |\n    | This controller is responsible for handling password reset requests\n    | and uses a simple trait to include this behavior. You're free to\n    | explore this trait and override any methods you wish to tweak.\n    |\n    */\n\n    use ResetsPasswords;\n\n    protected $redirectTo = '/projects';\n\n    /**\n     * Create a new password controller instance.\n     *\n     * @return void\n     */\n    public function __construct()\n    {\n        $this->middleware('guest');\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Controller.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Foundation\\Bus\\DispatchesJobs;\nuse Illuminate\\Routing\\Controller as BaseController;\nuse Illuminate\\Foundation\\Validation\\ValidatesRequests;\nuse Illuminate\\Foundation\\Auth\\Access\\AuthorizesRequests;\n\nabstract class Controller extends BaseController\n{\n    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;\n}\n"
  },
  {
    "path": "app/Http/Controllers/DeploymentsController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse App\\Http\\Requests;\nuse App\\Http\\Controllers\\Controller;\nuse App\\Repositories\\Project\\ProjectInterface;\nuse App\\Services\\Form\\Deployment\\DeploymentForm;\nuse App\\Models\\Project;\nuse App\\Models\\Deployment;\n\nuse Illuminate\\Http\\Request;\n\nclass DeploymentsController extends Controller\n{\n    protected $project;\n\n    protected $deploymentForm;\n\n    /**\n     * Create a new controller instance.\n     *\n     * @param \\App\\Repositories\\Project\\ProjectInterface   $project\n     * @param \\App\\Services\\Form\\Deployment\\DeploymentForm $deploymentForm\n     * @return void\n     */\n    public function __construct(ProjectInterface $project, DeploymentForm $deploymentForm)\n    {\n        $this->middleware('auth');\n        $this->middleware('acl');\n\n        $this->project        = $project;\n        $this->deploymentForm = $deploymentForm;\n    }\n\n    /**\n     * Display a listing of the resource.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @param \\App\\Models\\Project      $project\n     * @return Response\n     */\n    public function index(Request $request, Project $project)\n    {\n        $page = $request->input('page', 1);\n\n        $perPage = 10;\n\n        $deployments = $project->getDeploymentsByPage($page, $perPage);\n\n        return view('deployments.index')\n            ->with('deployments', $deployments)\n            ->with('project', $project);\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @param \\App\\Models\\Project      $project\n     * @return Response\n     */\n    public function store(Request $request, Project $project)\n    {\n        $input = array_merge($request->all(), [\n            'status'     => null,\n            'message'    => null,\n            'project_id' => $project->id,\n            'user_id'    => $request->user()->id,\n        ]);\n\n        if ($this->deploymentForm->save($input)) {\n            $deployment = $project->getLastDeployment();\n            $link = link_to_route('projects.deployments.show', \"#$deployment->number\", [$project, $deployment->number]);\n            $request->session()->flash('status', \"The deployment $link was successfully started.\");\n\n            return redirect()->route('projects.deployments.index', [$project]);\n        } else {\n            return redirect()->route('projects.deployments.index', [$project])\n                ->withInput()\n                ->withErrors($this->deploymentForm->errors());\n        }\n    }\n\n    /**\n     * Display the specified resource.\n     *\n     * @param \\App\\Models\\Project    $project\n     * @param \\App\\Models\\Deployment $deployment\n     * @return Response\n     */\n    public function show(Project $project, Deployment $deployment)\n    {\n        return view('deployments.show')->with('deployment', $deployment);\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/HomeController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers;\n\nclass HomeController extends Controller\n{\n    /*\n    |--------------------------------------------------------------------------\n    | Home Controller\n    |--------------------------------------------------------------------------\n    |\n    | This controller renders your application's \"dashboard\" for users that\n    | are authenticated. Of course, you are free to change or remove the\n    | controller as you wish. It is just here to get your app started!\n    |\n    */\n\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct()\n    {\n        $this->middleware('auth');\n    }\n\n    /**\n     * Show the application dashboard to the user.\n     *\n     * @return Response\n     */\n    public function index()\n    {\n        return view('home');\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/ProjectsController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse App\\Http\\Requests;\nuse App\\Http\\Controllers\\Controller;\nuse App\\Repositories\\Project\\ProjectInterface;\nuse App\\Repositories\\Recipe\\RecipeInterface;\nuse App\\Repositories\\Server\\ServerInterface;\nuse App\\Repositories\\User\\UserInterface;\nuse App\\Services\\Form\\Project\\ProjectForm;\nuse App\\Models\\Project;\nuse Illuminate\\Http\\Request;\n\nclass ProjectsController extends Controller\n{\n    protected $project;\n\n    protected $projectForm;\n\n    protected $recipe;\n\n    protected $server;\n\n    protected $user;\n\n    /**\n     * Create a new controller instance.\n     *\n     * @param \\App\\Repositories\\Project\\ProjectInterface $project\n     * @param \\App\\Services\\Form\\Project\\ProjectForm     $projectForm\n     * @param \\App\\Repositories\\Recipe\\RecipeInterface   $recipe\n     * @param \\App\\Repositories\\Server\\ServerInterface   $server\n     * @param \\App\\Repositories\\User\\UserInterface       $user\n     * @return void\n     */\n    public function __construct(ProjectInterface $project, ProjectForm $projectForm, RecipeInterface $recipe, ServerInterface $server, UserInterface $user)\n    {\n        $this->middleware('auth');\n        $this->middleware('acl');\n\n        $this->project     = $project;\n        $this->projectForm = $projectForm;\n        $this->recipe      = $recipe;\n        $this->server      = $server;\n        $this->user        = $user;\n    }\n\n    /**\n     * Display a listing of the resource.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @return Response\n     */\n    public function index(Request $request)\n    {\n        $page = $request->input('page', 1);\n\n        $perPage = 10;\n\n        $projects = $this->project->byPage($page, $perPage);\n\n        return view('projects.index')->with('projects', $projects);\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     *\n     * @return Response\n     */\n    public function create()\n    {\n        $recipes = $this->recipe->all()->toArray();\n        $recipes = array_column($recipes, 'name', 'id');\n\n        $servers = $this->server->all()->toArray();\n        $servers = array_column($servers, 'name', 'id');\n\n        $users = $this->user->all()->toArray();\n        $users = array_column($users, 'email', 'id');\n        $users = ['' => ''] + $users;\n\n        return view('projects.create')\n            ->with('recipes', $recipes)\n            ->with('servers', $servers)\n            ->with('users', $users);\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @return Response\n     */\n    public function store(Request $request)\n    {\n        $input = $request->all();\n\n        if ($this->projectForm->save($input)) {\n            return redirect()->route('projects.index');\n        } else {\n            return redirect()->route('projects.create')\n                ->withInput()\n                ->withErrors($this->projectForm->errors());\n        }\n    }\n\n    /**\n     * Display the specified resource.\n     *\n     * @param \\App\\Models\\Project $project\n     * @return Response\n     */\n    public function show(Project $project)\n    {\n        $projectRecipe = $project->getRecipes()->toArray();\n\n        $projectServer = $this->server->byId($project->server_id);\n\n        return view('projects.show')\n            ->with('project', $project)\n            ->with('projectRecipe', $projectRecipe)\n            ->with('projectServer', $projectServer);\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     *\n     * @param \\App\\Models\\Project $project\n     * @return Response\n     */\n    public function edit(Project $project)\n    {\n        $recipes = $this->recipe->all()->toArray();\n        $recipes = array_column($recipes, 'name', 'id');\n\n        $servers = $this->server->all()->toArray();\n        $servers = array_column($servers, 'name', 'id');\n\n        $projectRecipe = $project->getRecipes()->toArray();\n        $projectRecipe = array_column($projectRecipe, 'id');\n\n        $users = $this->user->all()->toArray();\n        $users = array_column($users, 'email', 'id');\n        $users = ['' => ''] + $users;\n\n        return view('projects.edit')\n            ->with('project', $project)\n            ->with('recipes', $recipes)\n            ->with('servers', $servers)\n            ->with('projectRecipe', $projectRecipe)\n            ->with('users', $users);\n    }\n\n    /**\n     * Update the specified resource in storage.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @param \\App\\Models\\Project      $project\n     * @return Response\n     */\n    public function update(Request $request, Project $project)\n    {\n        $input = array_merge($request->all(), ['id' => $project->id]);\n\n        if ($this->projectForm->update($input)) {\n            return redirect()->route('projects.index');\n        } else {\n            return redirect()->route('projects.edit', [$project])\n                ->withInput()\n                ->withErrors($this->projectForm->errors());\n        }\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     *\n     * @param \\App\\Models\\Project $project\n     * @return Response\n     */\n    public function destroy(Project $project)\n    {\n        $this->project->delete($project->id);\n\n        return redirect()->route('projects.index');\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/RecipesController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Http\\Request;\n\nuse App\\Http\\Requests;\nuse App\\Http\\Controllers\\Controller;\nuse App\\Repositories\\Recipe\\RecipeInterface;\nuse App\\Services\\Form\\Recipe\\RecipeForm;\nuse App\\Models\\Recipe;\n\nclass RecipesController extends Controller\n{\n    protected $recipe;\n\n    protected $recipeForm;\n\n    /**\n     * Create a new controller instance.\n     *\n     * @param \\App\\Repositories\\Recipe\\RecipeInterface $recipe\n     * @param \\App\\Services\\Form\\Recipe\\RecipeForm     $recipeForm\n     * @return void\n     */\n    public function __construct(RecipeInterface $recipe, RecipeForm $recipeForm)\n    {\n        $this->middleware('auth');\n        $this->middleware('acl');\n\n        $this->recipe     = $recipe;\n        $this->recipeForm = $recipeForm;\n    }\n\n    /**\n     * Display a listing of the resource.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @return Response\n     */\n    public function index(Request $request)\n    {\n        $page = $request->input('page', 1);\n\n        $perPage = 10;\n\n        $recipes = $this->recipe->byPage($page, $perPage);\n\n        return view('recipes.index')->with('recipes', $recipes);\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     *\n     * @return Response\n     */\n    public function create()\n    {\n        return view('recipes.create');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @return Response\n     */\n    public function store(Request $request)\n    {\n        $input = $request->all();\n\n        if ($this->recipeForm->save($input)) {\n            return redirect()->route('recipes.index');\n        } else {\n            return redirect()->route('recipes.create')\n                ->withInput()\n                ->withErrors($this->recipeForm->errors());\n        }\n    }\n\n    /**\n     * Display the specified resource.\n     *\n     * @param \\App\\Models\\Recipe $recipe\n     * @return Response\n     */\n    public function show(Recipe $recipe)\n    {\n        $recipeProject = $recipe->getProjects()->toArray();\n\n        return view('recipes.show')->with('recipe', $recipe)\n            ->with('recipeProject', $recipeProject);\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     *\n     * @param \\App\\Models\\Recipe $recipe\n     * @return Response\n     */\n    public function edit(Recipe $recipe)\n    {\n        return view('recipes.edit')->with('recipe', $recipe);\n    }\n\n    /**\n     * Update the specified resource in storage.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @param \\App\\Models\\Recipe       $recipe\n     * @return Response\n     */\n    public function update(Request $request, Recipe $recipe)\n    {\n        $input = array_merge($request->all(), ['id' => $recipe->id]);\n\n        if ($this->recipeForm->update($input)) {\n            return redirect()->route('recipes.index');\n        } else {\n            return redirect()->route('recipes.edit', [$recipe])\n                ->withInput()\n                ->withErrors($this->recipeForm->errors());\n        }\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     *\n     * @param \\App\\Models\\Recipe $recipe\n     * @return Response\n     */\n    public function destroy(Recipe $recipe)\n    {\n        $this->recipe->delete($recipe->id);\n\n        return redirect()->route('recipes.index');\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/ServersController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Http\\Request;\n\nuse App\\Http\\Requests;\nuse App\\Http\\Controllers\\Controller;\nuse App\\Repositories\\Server\\ServerInterface;\nuse App\\Services\\Form\\Server\\ServerForm;\nuse App\\Models\\Server;\n\nclass ServersController extends Controller\n{\n    protected $server;\n\n    protected $serverForm;\n\n    /**\n     * Create a new controller instance.\n     *\n     * @param \\App\\Repositories\\Server\\ServerInterface $server\n     * @param \\App\\Services\\Form\\Server\\ServerForm     $serverForm\n     * @return void\n     */\n    public function __construct(ServerInterface $server, ServerForm $serverForm)\n    {\n        $this->middleware('auth');\n        $this->middleware('acl');\n\n        $this->server     = $server;\n        $this->serverForm = $serverForm;\n    }\n\n    /**\n     * Display a listing of the resource.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @return Response\n     */\n    public function index(Request $request)\n    {\n        $page = $request->input('page', 1);\n\n        $perPage = 10;\n\n        $servers = $this->server->byPage($page, $perPage);\n\n        return view('servers.index')->with('servers', $servers);\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     *\n     * @return Response\n     */\n    public function create()\n    {\n        return view('servers.create');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @return Response\n     */\n    public function store(Request $request)\n    {\n        $input = $request->all();\n\n        if ($this->serverForm->save($input)) {\n            return redirect()->route('servers.index');\n        } else {\n            return redirect()->route('servers.create')\n                ->withInput()\n                ->withErrors($this->serverForm->errors());\n        }\n    }\n\n    /**\n     * Display the specified resource.\n     *\n     * @param \\App\\Models\\Server $server\n     * @return Response\n     */\n    public function show(Server $server)\n    {\n        return view('servers.show')->with('server', $server);\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     *\n     * @param \\App\\Models\\Server $server\n     * @return Response\n     */\n    public function edit(Server $server)\n    {\n        return view('servers.edit')->with('server', $server);\n    }\n\n    /**\n     * Update the specified resource in storage.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @param \\App\\Models\\Server       $server\n     * @return Response\n     */\n    public function update(Request $request, Server $server)\n    {\n        $input = array_merge($request->all(), ['id' => $server->id]);\n\n        if ($this->serverForm->update($input)) {\n            return redirect()->route('servers.index');\n        } else {\n            return redirect()->route('servers.edit', [$server])\n                ->withInput()\n                ->withErrors($this->serverForm->errors());\n        }\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     *\n     * @param \\App\\Models\\Server $server\n     * @return Response\n     */\n    public function destroy(Server $server)\n    {\n        $this->server->delete($server->id);\n\n        return redirect()->route('servers.index');\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/SettingsController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Http\\Request;\n\nuse App\\Http\\Requests;\nuse App\\Http\\Controllers\\Controller;\nuse App\\Services\\Form\\Setting\\MailSettingForm;\nuse App\\Repositories\\Setting\\SettingInterface;\n\nclass SettingsController extends Controller\n{\n    public function __construct()\n    {\n        $this->middleware('auth');\n        $this->middleware('acl');\n    }\n\n    public function getEmail(SettingInterface $settingRepository)\n    {\n        $settings = $settingRepository->byType('mail');\n\n        return view('settings.email')\n            ->with('settings', $settings);\n    }\n\n    public function postEmail(Request $request, MailSettingForm $mailSettingForm)\n    {\n        $input = $request->all();\n\n        if ($mailSettingForm->update($input)) {\n            return redirect()->route('settings.email');\n        } else {\n            return redirect()->route('settings.email')\n                ->withInput()\n                ->withErrors($mailSettingForm->errors());\n        }\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/UsersController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Http\\Request;\n\nuse App\\Http\\Requests;\nuse App\\Http\\Controllers\\Controller;\nuse App\\Repositories\\User\\UserInterface;\nuse App\\Repositories\\Role\\RoleInterface;\nuse App\\Services\\Form\\User\\UserForm;\nuse App\\Models\\User;\n\nclass UsersController extends Controller\n{\n    protected $user;\n\n    protected $userForm;\n\n    protected $role;\n\n    /**\n     * Create a new controller instance.\n     *\n     * @param \\App\\Repositories\\User\\UserInterface $user\n     * @param \\App\\Services\\Form\\User\\UserForm     $userForm\n     * @param \\App\\Repositories\\Role\\RoleInterface $role\n     * @return void\n     */\n    public function __construct(UserInterface $user, UserForm $userForm, RoleInterface $role)\n    {\n        $this->middleware('auth');\n        $this->middleware('acl');\n\n        $this->user     = $user;\n        $this->userForm = $userForm;\n        $this->role     = $role;\n    }\n\n    /**\n     * Display a listing of the resource.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @return Response\n     */\n    public function index(Request $request)\n    {\n        $page = $request->input('page', 1);\n\n        $perPage = 10;\n\n        $users = $this->user->byPage($page, $perPage);\n\n        return view('users.index')->with('users', $users);\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     *\n     * @return Response\n     */\n    public function create()\n    {\n        $roles = $this->role->all();\n\n        return view('users.create')\n            ->with('roles', $roles);\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @return Response\n     */\n    public function store(Request $request)\n    {\n        $input = $request->all();\n\n        if ($this->userForm->save($input)) {\n            return redirect()->route('users.index');\n        } else {\n            return redirect()->route('users.create')\n                ->withInput()\n                ->withErrors($this->userForm->errors());\n        }\n    }\n\n    /**\n     * Display the specified resource.\n     *\n     * @param \\App\\Models\\User $user\n     * @return Response\n     */\n    public function show(User $user)\n    {\n        return redirect()->route('users.edit', [$user]);\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     *\n     * @param \\App\\Models\\User $user\n     * @return Response\n     */\n    public function edit(User $user)\n    {\n        return view('users.edit')->with('user', $user);\n    }\n\n    /**\n     * Update the specified resource in storage.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @param \\App\\Models\\User         $user\n     * @return Response\n     */\n    public function update(Request $request, User $user)\n    {\n        $input = array_merge($request->all(), ['id' => $user->id]);\n\n        if ($this->userForm->update($input)) {\n            return redirect()->route('users.index');\n        } else {\n            return redirect()->route('users.edit', [$user])\n                ->withInput()\n                ->withErrors($this->userForm->errors());\n        }\n    }\n\n    /**\n     * Show the form for changing the password of the specified resource.\n     *\n     * @param \\App\\Models\\User $user\n     * @return Response\n     */\n    public function changePassword(User $user)\n    {\n        return view('users.change_password')->with('user', $user);\n    }\n\n    /**\n     * Update the password of the specified resource in storage.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @param \\App\\Models\\User         $user\n     * @return Response\n     */\n    public function updatePassword(Request $request, User $user)\n    {\n        $input = array_merge($request->all(), ['id' => $user->id]);\n\n        if ($this->userForm->updatePassword($input)) {\n            return redirect()->route('users.index');\n        } else {\n            return redirect()->route('users.password.change', [$user])\n                ->withInput()\n                ->withErrors($this->userForm->errors());\n        }\n    }\n\n    /**\n     * Show the form for editing the role of the specified resource.\n     *\n     * @param \\App\\Models\\User $user\n     * @return Response\n     */\n    public function editRole(User $user)\n    {\n        $roles = $this->role->all();\n\n        return view('users.edit_role')\n            ->with('user', $user)\n            ->with('roles', $roles);\n    }\n\n    /**\n     * Update the role of the specified resource in storage.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @param \\App\\Models\\User         $user\n     * @return Response\n     */\n    public function updateRole(Request $request, User $user)\n    {\n        $input = array_merge($request->all(), ['id' => $user->id]);\n\n        if ($this->userForm->updateRole($input)) {\n            return redirect()->route('users.index');\n        } else {\n            return redirect()->route('users.role.edit', [$user])\n                ->withInput()\n                ->withErrors($this->userForm->errors());\n        }\n    }\n\n    /**\n     * Show the form for editing the API token of the specified resource.\n     *\n     * @param \\App\\Models\\User $user\n     * @return Response\n     */\n    public function editApiToken(User $user)\n    {\n        return view('users.edit_api_token')\n            ->with('user', $user);\n    }\n\n    /**\n     * Regenerate the API token of the specified resource in storage.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @param \\App\\Models\\User         $user\n     * @return Response\n     */\n    public function regenerateApiToken(Request $request, User $user)\n    {\n        $input = array_merge($request->all(), ['id' => $user->id]);\n\n        if ($this->userForm->regenerateApiToken($input)) {\n            return redirect()->route('users.index');\n        } else {\n            return redirect()->route('users.api_token.edit', [$user])\n                ->withInput()\n                ->withErrors($this->userForm->errors());\n        }\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     *\n     * @param \\App\\Models\\User $user\n     * @return Response\n     */\n    public function destroy(User $user)\n    {\n        $this->user->delete($user->id);\n\n        return redirect()->route('users.index');\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/Webhook/Github/V1/DeploymentsController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers\\Webhook\\Github\\V1;\n\nuse App\\Http\\Requests;\nuse App\\Http\\Controllers\\Controller;\nuse App\\Repositories\\Project\\ProjectInterface;\nuse App\\Services\\Form\\Deployment\\DeploymentForm;\nuse App\\Models\\Project;\nuse Illuminate\\Http\\Request;\n\nclass DeploymentsController extends Controller\n{\n    protected $project;\n\n    protected $deploymentForm;\n\n    /**\n     * Create a new controller instance.\n     *\n     * @param \\App\\Repositories\\Project\\ProjectInterface   $project\n     * @param \\App\\Services\\Form\\Deployment\\DeploymentForm $deploymentForm\n     * @return void\n     */\n    public function __construct(ProjectInterface $project, DeploymentForm $deploymentForm)\n    {\n        $this->project        = $project;\n        $this->deploymentForm = $deploymentForm;\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @param \\App\\Models\\Project      $project\n     * @return Response\n     */\n    public function store(Request $request, Project $project)\n    {\n        $input = array_merge($request->all(), [\n            'status'     => null,\n            'message'    => null,\n            'project_id' => $project->id,\n            'user_id'    => $project->github_webhook_user_id,\n            'task'       => 'deploy',\n        ]);\n\n        if ($this->deploymentForm->save($input)) {\n            $deployment = $project->getLastDeployment();\n            return $deployment->toJson();\n        } else {\n            abort(400, $this->deploymentForm->errors());\n        }\n    }\n}\n"
  },
  {
    "path": "app/Http/Controllers/WelcomeController.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers;\n\nclass WelcomeController extends Controller\n{\n    /*\n    |--------------------------------------------------------------------------\n    | Welcome Controller\n    |--------------------------------------------------------------------------\n    |\n    | This controller renders the \"marketing page\" for the application and\n    | is configured to only allow guests. Like most of the other sample\n    | controllers, you are free to modify or remove it as you desire.\n    |\n    */\n\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct()\n    {\n        $this->middleware('guest');\n    }\n\n    /**\n     * Show the application welcome screen to the user.\n     *\n     * @return Response\n     */\n    public function index()\n    {\n        return redirect('projects');\n    }\n}\n"
  },
  {
    "path": "app/Http/Kernel.php",
    "content": "<?php\n\nnamespace App\\Http;\n\nuse Illuminate\\Foundation\\Http\\Kernel as HttpKernel;\n\nclass Kernel extends HttpKernel\n{\n    /**\n     * The application's global HTTP middleware stack.\n     *\n     * @var array\n     */\n    protected $middleware = [\n        \\Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode::class,\n        \\App\\Http\\Middleware\\ApplySettings::class,\n    ];\n\n    protected $middlewareGroups = [\n        'web' => [\n            \\Illuminate\\Cookie\\Middleware\\EncryptCookies::class,\n            \\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse::class,\n            \\Illuminate\\Session\\Middleware\\StartSession::class,\n            \\Illuminate\\View\\Middleware\\ShareErrorsFromSession::class,\n            \\App\\Http\\Middleware\\VerifyCsrfToken::class,\n        ],\n\n        'api' => [\n            'throttle:60,1',\n        ],\n    ];\n\n    /**\n     * The application's route middleware.\n     *\n     * @var array\n     */\n    protected $routeMiddleware = [\n        'auth' => \\App\\Http\\Middleware\\Authenticate::class,\n        'auth.basic' => \\Illuminate\\Auth\\Middleware\\AuthenticateWithBasicAuth::class,\n        'guest' => \\App\\Http\\Middleware\\RedirectIfAuthenticated::class,\n        'throttle' => \\Illuminate\\Routing\\Middleware\\ThrottleRequests::class,\n        'acl' => \\Kodeine\\Acl\\Middleware\\HasPermission::class,\n        'github_webhook_secret' => \\App\\Http\\Middleware\\VerifyGithubWebhookSecret::class,\n    ];\n}\n"
  },
  {
    "path": "app/Http/Middleware/ApplySettings.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse App\\Repositories\\Setting\\SettingInterface;\n\nclass ApplySettings\n{\n    protected $settingRepository;\n\n    public function __construct(SettingInterface $settingRepository)\n    {\n        $this->settingRepository = $settingRepository;\n    }\n\n    /**\n     * Handle an incoming request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  \\Closure  $next\n     * @return mixed\n     */\n    public function handle($request, Closure $next)\n    {\n        $mailSettings = $this->settingRepository->byType('mail');\n\n        if (isset($mailSettings->attributes->getFrom()['address'])) {\n            $fromAddress = $mailSettings->attributes->getFrom()['address'];\n        } else {\n            $fromAddress = null;\n        }\n\n        if (isset($mailSettings->attributes->getFrom()['name'])) {\n            $fromName = $mailSettings->attributes->getFrom()['name'];\n        } else {\n            $fromName = null;\n        }\n\n        config(['mail.driver'       => $mailSettings->attributes->getDriver()]);\n        config(['mail.from.address' => $fromAddress]);\n        config(['mail.from.name'    => $fromName]);\n        config(['mail.host'         => $mailSettings->attributes->getSmtpHost()]);\n        config(['mail.port'         => $mailSettings->attributes->getSmtpPort()]);\n        config(['mail.encryption'   => $mailSettings->attributes->getSmtpEncryption()]);\n        config(['mail.username'     => $mailSettings->attributes->getSmtpUsername()]);\n        config(['mail.password'     => $mailSettings->attributes->getSmtpPassword()]);\n        config(['mail.sendmail'     => $mailSettings->attributes->getSendmailPath()]);\n\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "app/Http/Middleware/Authenticate.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Support\\Facades\\Auth;\n\nclass Authenticate\n{\n    /**\n     * Handle an incoming request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  \\Closure  $next\n     * @param  string|null  $guard\n     * @return mixed\n     */\n    public function handle($request, Closure $next, $guard = null)\n    {\n        if (Auth::guard($guard)->guest()) {\n            if ($request->ajax() || $request->wantsJson()) {\n                return response('Unauthorized.', 401);\n            } else {\n                return redirect()->guest('auth/login');\n            }\n        }\n\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "app/Http/Middleware/RedirectIfAuthenticated.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Contracts\\Auth\\Guard;\nuse Illuminate\\Http\\RedirectResponse;\n\nclass RedirectIfAuthenticated\n{\n    /**\n     * The Guard implementation.\n     *\n     * @var Guard\n     */\n    protected $auth;\n\n    /**\n     * Create a new filter instance.\n     *\n     * @param  Guard  $auth\n     * @return void\n     */\n    public function __construct(Guard $auth)\n    {\n        $this->auth = $auth;\n    }\n\n    /**\n     * Handle an incoming request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  \\Closure  $next\n     * @return mixed\n     */\n    public function handle($request, Closure $next)\n    {\n        if ($this->auth->check()) {\n            return new RedirectResponse(url('/projects'));\n        }\n\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "app/Http/Middleware/VerifyCsrfToken.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken as BaseVerifier;\n\nclass VerifyCsrfToken extends BaseVerifier\n{\n    /**\n     * Handle an incoming request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  \\Closure  $next\n     * @return mixed\n     */\n    public function handle($request, Closure $next)\n    {\n        return parent::handle($request, $next);\n    }\n}\n"
  },
  {
    "path": "app/Http/Middleware/VerifyGithubWebhookSecret.php",
    "content": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse App\\Repositories\\Project\\ProjectInterface;\n\nclass VerifyGithubWebhookSecret\n{\n    protected $projectRepository;\n\n    public function __construct(ProjectInterface $projectRepository)\n    {\n        $this->projectRepository = $projectRepository;\n    }\n\n    /**\n     * Handle an incoming request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  \\Closure  $next\n     * @return mixed\n     */\n    public function handle($request, Closure $next)\n    {\n        $secret = $request->projects->github_webhook_secret;\n\n        if (isset($secret)) {\n            $signature = 'sha1='.hash_hmac('sha1', $request->getContent(), $secret);\n\n            if ($signature !== $request->header('X-Hub-Signature')) {\n                abort(401);\n            }\n        }\n\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "app/Http/Requests/Request.php",
    "content": "<?php\n\nnamespace App\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nabstract class Request extends FormRequest\n{\n    //\n}\n"
  },
  {
    "path": "app/Http/breadcrumbs.php",
    "content": "<?php\n\nBreadcrumbs::register('projects.index', function ($breadcrumbs) {\n    $breadcrumbs->push('Projects', route('projects.index'));\n});\n\nBreadcrumbs::register('projects.create', function ($breadcrumbs) {\n    $breadcrumbs->parent('projects.index');\n    $breadcrumbs->push('Create', route('projects.create'));\n});\n\nBreadcrumbs::register('projects.show', function ($breadcrumbs, App\\Models\\Project $project) {\n    $breadcrumbs->parent('projects.index');\n    $breadcrumbs->push($project->name, route('projects.show', [$project]));\n});\n\nBreadcrumbs::register('projects.edit', function ($breadcrumbs, App\\Models\\Project $project) {\n    $breadcrumbs->parent('projects.show', $project);\n    $breadcrumbs->push('Edit', route('projects.edit', [$project]));\n});\n\nBreadcrumbs::register('projects.deployments.index', function ($breadcrumbs, App\\Models\\Project $project) {\n    $breadcrumbs->parent('projects.show', $project);\n    $breadcrumbs->push('Deployments', route('projects.deployments.index', [$project]));\n});\n\nBreadcrumbs::register('projects.deployments.show', function ($breadcrumbs, App\\Models\\Project $project, App\\Models\\Deployment $deployment) {\n    $breadcrumbs->parent('projects.deployments.index', $project);\n    $breadcrumbs->push($deployment->number, route('projects.deployments.show', [$project, $deployment]));\n});\n\nBreadcrumbs::register('recipes.index', function ($breadcrumbs) {\n    $breadcrumbs->push('Recipes', route('recipes.index'));\n});\n\nBreadcrumbs::register('recipes.create', function ($breadcrumbs) {\n    $breadcrumbs->parent('recipes.index');\n    $breadcrumbs->push('Create', route('recipes.create'));\n});\n\nBreadcrumbs::register('recipes.show', function ($breadcrumbs, App\\Models\\Recipe $recipe) {\n    $breadcrumbs->parent('recipes.index');\n    $breadcrumbs->push($recipe->name, route('recipes.show', [$recipe]));\n});\n\nBreadcrumbs::register('recipes.edit', function ($breadcrumbs, App\\Models\\Recipe $recipe) {\n    $breadcrumbs->parent('recipes.show', $recipe);\n    $breadcrumbs->push('Edit', route('recipes.edit', [$recipe]));\n});\n\nBreadcrumbs::register('servers.index', function ($breadcrumbs) {\n    $breadcrumbs->push('Servers', route('servers.index'));\n});\n\nBreadcrumbs::register('servers.create', function ($breadcrumbs) {\n    $breadcrumbs->parent('servers.index');\n    $breadcrumbs->push('Create', route('servers.create'));\n});\n\nBreadcrumbs::register('servers.show', function ($breadcrumbs, App\\Models\\Server $server) {\n    $breadcrumbs->parent('servers.index');\n    $breadcrumbs->push($server->name, route('servers.show', [$server]));\n});\n\nBreadcrumbs::register('servers.edit', function ($breadcrumbs, App\\Models\\Server $server) {\n    $breadcrumbs->parent('servers.show', $server);\n    $breadcrumbs->push('Edit', route('servers.edit', [$server]));\n});\n\nBreadcrumbs::register('users.index', function ($breadcrumbs) {\n    $breadcrumbs->push('Users', route('users.index'));\n});\n\nBreadcrumbs::register('users.create', function ($breadcrumbs) {\n    $breadcrumbs->parent('users.index');\n    $breadcrumbs->push('Create', route('users.create'));\n});\n\nBreadcrumbs::register('users.show', function ($breadcrumbs, App\\Models\\User $user) {\n    $breadcrumbs->parent('users.index');\n    $breadcrumbs->push($user->name, route('users.show', [$user]));\n});\n\nBreadcrumbs::register('users.edit', function ($breadcrumbs, App\\Models\\User $user) {\n    $breadcrumbs->parent('users.show', $user);\n    $breadcrumbs->push('Edit', route('users.edit', [$user]));\n});\n\nBreadcrumbs::register('users.password.change', function ($breadcrumbs, App\\Models\\User $user) {\n    $breadcrumbs->parent('users.show', $user);\n    $breadcrumbs->push('Change Password', route('users.password.change', [$user]));\n});\n\nBreadcrumbs::register('users.role.edit', function ($breadcrumbs, App\\Models\\User $user) {\n    $breadcrumbs->parent('users.show', $user);\n    $breadcrumbs->push('Edit Role', route('users.role.edit', [$user]));\n});\n"
  },
  {
    "path": "app/Http/routes.php",
    "content": "<?php\n\n/*\n|--------------------------------------------------------------------------\n| Application Routes\n|--------------------------------------------------------------------------\n|\n| Here is where you can register all of the routes for an application.\n| It's a breeze. Simply tell Laravel the URIs it should respond to\n| and give it the controller to call when that URI is requested.\n|\n*/\n\nRoute::group(['middleware' => 'web'], function () {\n    Route::get('/', 'WelcomeController@index');\n\n    Route::controller('auth', 'Auth\\AuthController', [\n        'getRegister' => 'auth.register',\n        'getLogin'    => 'auth.login',\n    ]);\n\n    Route::controller('password', 'Auth\\PasswordController', [\n        'getEmail' => 'password.email',\n        'getReset' => 'password.reset',\n    ]);\n\n    Route::group([\n        'protect_alias' => 'project',\n    ], function () {\n        Route::resource('projects', 'ProjectsController');\n    });\n\n    Route::group([\n        'protect_alias' => 'deployment',\n    ], function () {\n        Route::resource('projects.deployments', 'DeploymentsController', [\n            'only' => ['index', 'store', 'show']\n        ]);\n    });\n\n    Route::group([\n        'protect_alias' => 'recipe',\n    ], function () {\n        Route::resource('recipes', 'RecipesController');\n    });\n\n    Route::group([\n        'protect_alias' => 'server',\n    ], function () {\n        Route::resource('servers', 'ServersController');\n    });\n\n    Route::group([\n        'protect_alias' => 'user',\n    ], function () {\n        Route::get('users/{users}/password/change', [\n            'as'   => 'users.password.change',\n            'uses' => 'UsersController@changePassword',\n        ]);\n        Route::put('users/{users}/password', [\n            'as'   => 'users.password.update',\n            'uses' => 'UsersController@updatePassword'\n        ]);\n        Route::get('users/{users}/role/edit', [\n            'as'   => 'users.role.edit',\n            'uses' => 'UsersController@editRole',\n        ]);\n        Route::put('users/{users}/role', [\n            'as'   => 'users.role.update',\n            'uses' => 'UsersController@updateRole'\n        ]);\n        Route::get('users/{users}/api_token/edit', [\n            'as'   => 'users.api_token.edit',\n            'uses' => 'UsersController@editApiToken',\n        ]);\n        Route::put('users/{users}/api_token', [\n            'as'   => 'users.api_token.regenerate',\n            'uses' => 'UsersController@regenerateApiToken'\n        ]);\n        Route::resource('users', 'UsersController');\n    });\n\n    Route::group([\n        'protect_alias' => 'setting'\n    ], function () {\n        Route::controller('settings', 'SettingsController', [\n            'getEmail' => 'settings.email'\n        ]);\n    });\n});\n\nRoute::group(['middleware' => 'api'], function () {\n    Route::group(['prefix' => 'api/v1'], function () {\n        Route::post('jsonrpc', function (Illuminate\\Http\\Request $request) {\n            $server = new JsonRPC\\Server;\n            $middlewareHandler = $server->getMiddlewareHandler();\n            $middlewareHandler->withMiddleware(new App\\Services\\Api\\Middleware\\Authenticate($request));\n            $procedureHandler = $server->getProcedureHandler();\n            $procedureHandler->withObject(app()->make('App\\Services\\Api\\JsonRpc'));\n            return $server->execute();\n        });\n    });\n\n    Route::group(['prefix' => 'webhook/github/v1', 'middleware' => 'github_webhook_secret'], function () {\n        Route::resource('projects.deployments', 'Webhook\\Github\\V1\\DeploymentsController', [\n            'only' => ['store']\n        ]);\n    });\n});\n"
  },
  {
    "path": "app/Jobs/Deploy.php",
    "content": "<?php\n\nnamespace App\\Jobs;\n\nuse App\\Jobs\\Job;\nuse App\\Repositories\\Project\\ProjectInterface;\nuse App\\Repositories\\Server\\ServerInterface;\nuse App\\Repositories\\Setting\\SettingInterface;\nuse App\\Services\\Notification\\NotifierInterface;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nuse Symfony\\Component\\Process\\ProcessBuilder;\n\nclass Deploy extends Job implements ShouldQueue\n{\n    use InteractsWithQueue, SerializesModels;\n\n    protected $deployment;\n\n    protected $executable;\n\n    /**\n     * Create a new job instance.\n     *\n     * @param \\Illuminate\\Database\\Eloquent\\Model $deployment\n     * @return void\n     */\n    public function __construct(Model $deployment)\n    {\n        $this->deployment = $deployment;\n        $this->executable = base_path('vendor/bin/dep');\n    }\n\n    /**\n     * Execute the job.\n     *\n     * @param \\App\\Repositories\\Project\\ProjectInterface   $projectRepository\n     * @param \\App\\Repositories\\Server\\ServerInterface     $serverRepository\n     * @param \\Symfony\\Component\\Process\\ProcessBuilder    $processBuilder\n     * @param \\App\\Services\\Notification\\NotifierInterface $notifier\n     * @param \\App\\Repositories\\Setting\\SettingInterface   $settingRepository\n     * @return void\n     */\n    public function handle(ProjectInterface $projectRepository, ServerInterface $serverRepository, ProcessBuilder $processBuilder, NotifierInterface $notifier, SettingInterface $settingRepository)\n    {\n        $deployment = $this->deployment;\n        $project    = $projectRepository->byId($deployment->project_id);\n        $server     = $serverRepository->byId($project->server_id);\n\n        $app = app();\n\n        // Create a server list file\n        $serverListFileBuilder = $app->make('App\\Services\\Deployment\\DeployerServerListFileBuilder')\n            ->setServer($server)\n            ->setProject($project);\n        $serverListFile = $app->make('App\\Services\\Deployment\\DeployerFileDirector', [$serverListFileBuilder])->construct();\n\n        // Create recipe files\n        foreach ($project->getRecipes() as $i => $recipe) {\n            // HACK: If an instance of DeployerRecipeFileBuilder class is not stored in an array, a destructor is called and a recipe file is deleted immediately.\n            $recipeFileBuilders[] = $app->make('App\\Services\\Deployment\\DeployerRecipeFileBuilder')->setRecipe($recipe);\n            $recipeFiles[] = $app->make('App\\Services\\Deployment\\DeployerFileDirector', [$recipeFileBuilders[$i]])->construct();\n        }\n\n        // Create a deployment file\n        $deploymentFileBuilder = $app->make('App\\Services\\Deployment\\DeployerDeploymentFileBuilder')\n            ->setProject($project)\n            ->setServerListFile($serverListFile)\n            ->setRecipeFile($recipeFiles);\n        $deploymentFile = $app->make('App\\Services\\Deployment\\DeployerFileDirector', [$deploymentFileBuilder])->construct();\n\n        // Create a command\n        $processBuilder\n            ->add($this->executable)\n            ->add(\"-f={$deploymentFile->getFullPath()}\")\n            ->add('--ansi')\n            ->add('-n')\n            ->add('-vv')\n            ->add('deploy')\n            ->add($project->stage);\n\n        // Run the command\n        $tmp['id']      = $deployment->id;\n        $tmp['message'] = '';\n\n        $process = $processBuilder->getProcess();\n        $process->setTimeout(600);\n        $process->run(function ($type, $buffer) use (&$tmp, $project, $deployment) {\n            $tmp['message'] .= $buffer;\n            $tmp['number']   = $deployment->number;\n\n            $project->updateDeployment($tmp);\n        });\n\n        // Store the result\n        if ($process->isSuccessful()) {\n            $message = $process->getOutput();\n        } else {\n            $message = $process->getErrorOutput();\n        }\n\n        $data['id']      = $deployment->id;\n        $data['number']  = $deployment->number;\n        $data['message'] = $message;\n        $data['status']  = $process->getExitCode();\n\n        $project->updateDeployment($data);\n\n        // Notify\n        if (isset($project->email_notification_recipient)) {\n            $mailSettings = $settingRepository->byType('mail');\n\n            if (isset($mailSettings->attributes->getFrom()['address'])) {\n                $fromAddress = $mailSettings->attributes->getFrom()['address'];\n            } else {\n                $fromAddress = null;\n            }\n\n            if (isset($mailSettings->attributes->getFrom()['name'])) {\n                $fromName = $mailSettings->attributes->getFrom()['name'];\n            } else {\n                $fromName = null;\n            }\n\n            config(['mail.driver'       => $mailSettings->attributes->getDriver()]);\n            config(['mail.from.address' => $fromAddress]);\n            config(['mail.from.name'    => $fromName]);\n            config(['mail.host'         => $mailSettings->attributes->getSmtpHost()]);\n            config(['mail.port'         => $mailSettings->attributes->getSmtpPort()]);\n            config(['mail.encryption'   => $mailSettings->attributes->getSmtpEncryption()]);\n            config(['mail.username'     => $mailSettings->attributes->getSmtpUsername()]);\n            config(['mail.password'     => $mailSettings->attributes->getSmtpPassword()]);\n            config(['mail.sendmail'     => $mailSettings->attributes->getSendmailPath()]);\n\n            $deployment = $project->getDeploymentByNumber($deployment->number);\n\n            if ($process->isSuccessful()) {\n                $status = 'success';\n            } else {\n                $status = 'failure';\n            }\n            $subject = \"Deployment of {$project->name} #{$deployment->number} finished: {$status}\";\n\n            $message = view('emails.notification')\n                ->with('project', $project)\n                ->with('deployment', $deployment)\n                ->render();\n\n            $notifier->to($project->email_notification_recipient)->notify($subject, $message);\n        }\n    }\n}\n"
  },
  {
    "path": "app/Jobs/Job.php",
    "content": "<?php\n\nnamespace App\\Jobs;\n\nuse Illuminate\\Bus\\Queueable;\n\nabstract class Job\n{\n    /*\n    |--------------------------------------------------------------------------\n    | Queueable Jobs\n    |--------------------------------------------------------------------------\n    |\n    | This job base class provides a central location to place any logic that\n    | is shared across all of your jobs. The trait included with the class\n    | provides access to the \"queueOn\" and \"delay\" queue helper methods.\n    |\n    */\n\n    use Queueable;\n}\n"
  },
  {
    "path": "app/Jobs/Rollback.php",
    "content": "<?php\n\nnamespace App\\Jobs;\n\nuse App\\Jobs\\Job;\nuse App\\Repositories\\Project\\ProjectInterface;\nuse App\\Repositories\\Server\\ServerInterface;\nuse App\\Repositories\\Setting\\SettingInterface;\nuse App\\Services\\Notification\\NotifierInterface;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nuse Symfony\\Component\\Process\\ProcessBuilder;\n\nclass Rollback extends Job implements ShouldQueue\n{\n    use InteractsWithQueue, SerializesModels;\n\n    protected $deployment;\n\n    protected $executable;\n\n    /**\n     * Create a new job instance.\n     *\n     * @param \\Illuminate\\Database\\Eloquent\\Model $deployment\n     * @return void\n     */\n    public function __construct(Model $deployment)\n    {\n        $this->deployment = $deployment;\n        $this->executable = base_path('vendor/bin/dep');\n    }\n\n    /**\n     * Execute the job.\n     *\n     * @param \\App\\Repositories\\Project\\ProjectInterface   $projectRepository\n     * @param \\App\\Repositories\\Server\\ServerInterface     $serverRepository\n     * @param \\Symfony\\Component\\Process\\ProcessBuilder    $processBuilder\n     * @param \\App\\Services\\Notification\\NotifierInterface $notifier\n     * @param \\App\\Repositories\\Setting\\SettingInterface   $settingRepository\n     * @return void\n     */\n    public function handle(ProjectInterface $projectRepository, ServerInterface $serverRepository, ProcessBuilder $processBuilder, NotifierInterface $notifier, SettingInterface $settingRepository)\n    {\n        $deployment = $this->deployment;\n        $project    = $projectRepository->byId($deployment->project_id);\n        $server     = $serverRepository->byId($project->server_id);\n\n        $app = app();\n\n        // Create a server list file\n        $serverListFileBuilder = $app->make('App\\Services\\Deployment\\DeployerServerListFileBuilder')\n            ->setServer($server)\n            ->setProject($project);\n        $serverListFile = $app->make('App\\Services\\Deployment\\DeployerFileDirector', [$serverListFileBuilder])->construct();\n\n        // Create recipe files\n        foreach ($project->getRecipes() as $i => $recipe) {\n            // HACK: If an instance of DeployerRecipeFileBuilder class is not stored in an array, a destructor is called and a recipe file is deleted immediately.\n            $recipeFileBuilders[] = $app->make('App\\Services\\Deployment\\DeployerRecipeFileBuilder')->setRecipe($recipe);\n            $recipeFiles[] = $app->make('App\\Services\\Deployment\\DeployerFileDirector', [$recipeFileBuilders[$i]])->construct();\n        }\n\n        // Create a deployment file\n        $deploymentFileBuilder = $app->make('App\\Services\\Deployment\\DeployerDeploymentFileBuilder')\n            ->setProject($project)\n            ->setServerListFile($serverListFile)\n            ->setRecipeFile($recipeFiles);\n        $deploymentFile = $app->make('App\\Services\\Deployment\\DeployerFileDirector', [$deploymentFileBuilder])->construct();\n\n        // Create a command\n        $processBuilder\n            ->add($this->executable)\n            ->add(\"-f={$deploymentFile->getFullPath()}\")\n            ->add('--ansi')\n            ->add('-n')\n            ->add('-vv')\n            ->add('rollback')\n            ->add($project->stage);\n\n        // Run the command\n        $tmp['id']      = $deployment->id;\n        $tmp['message'] = '';\n\n        $process = $processBuilder->getProcess();\n        $process->setTimeout(600);\n        $process->run(function ($type, $buffer) use (&$tmp, $project, $deployment) {\n            $tmp['message'] .= $buffer;\n            $tmp['number']   = $deployment->number;\n\n            $project->updateDeployment($tmp);\n        });\n\n        // Store the result\n        if ($process->isSuccessful()) {\n            $message = $process->getOutput();\n        } else {\n            $message = $process->getErrorOutput();\n        }\n\n        $data['id']      = $deployment->id;\n        $data['number']  = $deployment->number;\n        $data['message'] = $message;\n        $data['status']  = $process->getExitCode();\n\n        $project->updateDeployment($data);\n\n        // Notify\n        if (isset($project->email_notification_recipient)) {\n            $mailSettings = $settingRepository->byType('mail');\n\n            if (isset($mailSettings->attributes->getFrom()['address'])) {\n                $fromAddress = $mailSettings->attributes->getFrom()['address'];\n            } else {\n                $fromAddress = null;\n            }\n\n            if (isset($mailSettings->attributes->getFrom()['name'])) {\n                $fromName = $mailSettings->attributes->getFrom()['name'];\n            } else {\n                $fromName = null;\n            }\n\n            config(['mail.driver'       => $mailSettings->attributes->getDriver()]);\n            config(['mail.from.address' => $fromAddress]);\n            config(['mail.from.name'    => $fromName]);\n            config(['mail.host'         => $mailSettings->attributes->getSmtpHost()]);\n            config(['mail.port'         => $mailSettings->attributes->getSmtpPort()]);\n            config(['mail.encryption'   => $mailSettings->attributes->getSmtpEncryption()]);\n            config(['mail.username'     => $mailSettings->attributes->getSmtpUsername()]);\n            config(['mail.password'     => $mailSettings->attributes->getSmtpPassword()]);\n            config(['mail.sendmail'     => $mailSettings->attributes->getSendmailPath()]);\n\n            $deployment = $project->getDeploymentByNumber($deployment->number);\n\n            if ($process->isSuccessful()) {\n                $status = 'success';\n            } else {\n                $status = 'failure';\n            }\n            $subject = \"Deployment of {$project->name} #{$deployment->number} finished: {$status}\";\n\n            $message = view('emails.notification')\n                ->with('project', $project)\n                ->with('deployment', $deployment)\n                ->render();\n\n            $notifier->to($project->email_notification_recipient)->notify($subject, $message);\n        }\n    }\n}\n"
  },
  {
    "path": "app/Listeners/.gitkeep",
    "content": ""
  },
  {
    "path": "app/Models/BaseModel.php",
    "content": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass BaseModel extends Model\n{\n    protected function nullIfBlank($value)\n    {\n        return trim($value) !== '' ? $value : null;\n    }\n}\n"
  },
  {
    "path": "app/Models/Deployment.php",
    "content": "<?php\n\nnamespace App\\Models;\n\nuse Robbo\\Presenter\\PresentableInterface;\nuse SensioLabs\\AnsiConverter\\AnsiToHtmlConverter;\n\nclass Deployment extends BaseModel implements PresentableInterface\n{\n    protected $table = 'deployments';\n\n    protected $fillable = [\n        'project_id',\n        'number',\n        'task',\n        'status',\n        'message',\n        'user_id',\n    ];\n\n    protected $casts = [\n        'number' => 'integer',\n        'status' => 'integer',\n    ];\n\n    /**\n     * Return a created presenter.\n     *\n     * @return \\Robbo\\Presenter\\Presenter\n     */\n    public function getPresenter()\n    {\n        $converter = new AnsiToHtmlConverter;\n        return new DeploymentPresenter($this, $converter);\n    }\n\n    public function user()\n    {\n        return $this->belongsTo('App\\Models\\User');\n    }\n}\n"
  },
  {
    "path": "app/Models/DeploymentPresenter.php",
    "content": "<?php\n\nnamespace App\\Models;\n\nuse Robbo\\Presenter\\Presenter;\n\nclass DeploymentPresenter extends Presenter\n{\n    protected $converter;\n\n    public function __construct($object, $converter)\n    {\n        parent::__construct($object);\n\n        $this->converter = $converter;\n    }\n\n    public function status()\n    {\n        if (!isset($this->status)) {\n            return '<span></span>';\n        } elseif ($this->status === 0) {\n            return '<span class=\"glyphicon glyphicon-ok-circle green\" aria-hidden=\"true\"></span>';\n        } else {\n            return '<span class=\"glyphicon glyphicon-ban-circle red\" aria-hidden=\"true\"></span>';\n        }\n    }\n\n    public function statusText()\n    {\n        if (!isset($this->status)) {\n            return 'running';\n        } elseif ($this->status === 0) {\n            return 'success';\n        } else {\n            return 'failure';\n        }\n    }\n\n    public function message()\n    {\n        $html = $this->converter->convert($this->message);\n\n        return $html;\n    }\n\n    public function messageText()\n    {\n        $html = $this->message();\n        $text = htmlspecialchars_decode(strip_tags($html));\n\n        return $text;\n    }\n}\n"
  },
  {
    "path": "app/Models/MaxDeployment.php",
    "content": "<?php\n\nnamespace App\\Models;\n\nclass MaxDeployment extends BaseModel\n{\n    protected $table = 'max_deployments';\n\n    protected $fillable = ['project_id', 'number'];\n\n    protected $casts = [\n        'number' => 'integer',\n    ];\n}\n"
  },
  {
    "path": "app/Models/Project.php",
    "content": "<?php\n\nnamespace App\\Models;\n\nuse App\\Specifications\\DeploymentSpecification;\nuse Ngmy\\EloquentSerializedLob\\SerializedLobTrait;\nuse Illuminate\\Support\\Collection;\nuse DateTime;\n\nclass Project extends BaseModel\n{\n    use SerializedLobTrait;\n\n    protected $table = 'projects';\n\n    protected $fillable = [\n        'name',\n        'stage',\n        'repository',\n        'server_id',\n        'email_notification_recipient',\n        'attributes',\n        'days_to_keep_deployments',\n        'max_number_of_deployments_to_keep',\n        'keep_last_deployment',\n        'github_webhook_secret',\n        'github_webhook_user_id',\n    ];\n\n    public function setStageAttribute($value)\n    {\n        $this->attributes['stage'] = $this->nullIfBlank($value);\n    }\n\n    public function setEmailNotificationRecipientAttribute($value)\n    {\n        $this->attributes['email_notification_recipient'] = $this->nullIfBlank($value);\n    }\n\n    public function setDaysToKeepDeploymentsAttribute($value)\n    {\n        $this->attributes['days_to_keep_deployments'] = $this->nullIfBlank($value);\n    }\n\n    public function setMaxNumberOfDeploymentsToKeepAttribute($value)\n    {\n        $this->attributes['max_number_of_deployments_to_keep'] = $this->nullIfBlank($value);\n    }\n\n    public function setGithubWebhookSecretAttribute($value)\n    {\n        $this->attributes['github_webhook_secret'] = $this->nullIfBlank($value);\n    }\n\n    public function setGithubWebhookUserIdAttribute($value)\n    {\n        $this->attributes['github_webhook_user_id'] = $this->nullIfBlank($value);\n    }\n\n    public function maxDeployment()\n    {\n        return $this->hasOne('App\\Models\\MaxDeployment');\n    }\n\n    public function deployments()\n    {\n        return $this->hasMany('App\\Models\\Deployment');\n    }\n\n    public function recipes()\n    {\n        return $this->belongsToMany('App\\Models\\Recipe');\n    }\n\n    public function githubWebhookUser()\n    {\n        return $this->belongsTo('App\\Models\\User', 'github_webhook_user_id');\n    }\n\n    public function getGithubWebhookUser()\n    {\n        return $this->githubWebhookUser()->first();\n    }\n\n    public function getMaxDeployment()\n    {\n        return $this->maxDeployment()->lockForUpdate()->first();\n    }\n\n    public function getLastDeployment()\n    {\n        return $this->deployments()->orderBy('number', 'desc')->first();\n    }\n\n    public function getDeploymentByNumber($number)\n    {\n        return $this->deployments()->where('number', $number)->first();\n    }\n\n    public function getDeploymentsByPage($page = 1, $limit = 10)\n    {\n        return $this->deployments()\n            ->orderBy('deployments.created_at', 'desc')\n            ->skip($limit * ($page - 1))\n            ->take($limit)\n            ->paginate($limit);\n    }\n\n    public function getDeployments()\n    {\n        return $this->deployments()->orderBy('number', 'desc')->get();\n    }\n\n    public function deleteDeployments(Collection $deployments)\n    {\n        foreach ($deployments as $deployment) {\n            $deploymentIds[] = $deployment->id;\n        }\n\n        return $this->deployments()\n            ->whereIn('id', $deploymentIds)\n            ->delete();\n    }\n\n    public function getRecipes()\n    {\n        return $this->recipes()->orderBy('recipe_order')->get();\n    }\n\n    public function addMaxDeployment(array $data = [])\n    {\n        return $this->maxDeployment()->create($data);\n    }\n\n    public function addDeployment(array $data)\n    {\n        return $this->deployments()->create($data);\n    }\n\n    public function updateDeployment(array $data)\n    {\n        return $this->deployments()\n            ->where('number', $data['number'])\n            ->update($data);\n    }\n\n    public function syncRecipes(array $data)\n    {\n        foreach ($data as $i => $recipeId) {\n            $syncRecipeIds[$recipeId] = ['recipe_order' => $i + 1];\n        }\n\n        return $this->recipes()->sync($syncRecipeIds);\n    }\n\n    public function updateMaxDeployment(array $data)\n    {\n        return $this->maxDeployment()->update($data);\n    }\n\n    public function getDeploymentsWhereCreatedAtBefore(DateTime $date)\n    {\n        return $this->deployments()\n            ->orderBy('number', 'desc')\n            ->where('created_at', '<', $date)\n            ->get();\n    }\n\n    public function getDeploymentsWhereNumberBefore($number)\n    {\n        return $this->deployments()\n            ->orderBy('number', 'desc')\n            ->where('number', '<', $number)\n            ->get();\n    }\n\n    public function getSatisfyingDeployments(DeploymentSpecification $spec)\n    {\n        return $spec->satisfyingElementsFrom($this);\n    }\n\n    protected function serializedLobColumn()\n    {\n        return 'attributes';\n    }\n\n    protected function serializedLobSerializer()\n    {\n        return \\Ngmy\\EloquentSerializedLob\\Serializer\\JsonSerializer::class;\n    }\n\n    protected function serializedLobDeserializeType()\n    {\n        return \\App\\Entities\\ProjectAttribute\\ProjectAttributeEntity::class;\n    }\n}\n"
  },
  {
    "path": "app/Models/Recipe.php",
    "content": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Recipe extends BaseModel\n{\n    protected $table = 'recipes';\n\n    protected $fillable = [\n        'name',\n        'description',\n        'body',\n    ];\n\n    public function projects()\n    {\n        return $this->belongsToMany('App\\Models\\Project');\n    }\n\n    public function getProjects()\n    {\n        return $this->projects()->orderBy('name')->get();\n    }\n}\n"
  },
  {
    "path": "app/Models/Server.php",
    "content": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Server extends BaseModel\n{\n    protected $table = 'servers';\n\n    protected $fillable = [\n        'name',\n        'description',\n        'body',\n    ];\n}\n"
  },
  {
    "path": "app/Models/Setting.php",
    "content": "<?php\n\nnamespace App\\Models;\n\nuse Ngmy\\EloquentSerializedLob\\SerializedLobTrait;\n\nclass Setting extends BaseModel\n{\n    use SerializedLobTrait;\n\n    protected $table = 'settings';\n\n    protected $fillable = [\n        'type',\n        'attributes',\n    ];\n\n    protected function serializedLobColumn()\n    {\n        return 'attributes';\n    }\n\n    protected function serializedLobSerializer()\n    {\n        return \\Ngmy\\EloquentSerializedLob\\Serializer\\JsonSerializer::class;\n    }\n\n    protected function serializedLobDeserializeType()\n    {\n        if ($this->type === 'mail') {\n            return \\App\\Entities\\Setting\\MailSettingEntity::class;\n        }\n    }\n}\n"
  },
  {
    "path": "app/Models/User.php",
    "content": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Auth\\Authenticatable;\nuse Illuminate\\Auth\\Passwords\\CanResetPassword;\nuse Illuminate\\Foundation\\Auth\\Access\\Authorizable;\nuse Illuminate\\Contracts\\Auth\\Authenticatable as AuthenticatableContract;\nuse Illuminate\\Contracts\\Auth\\Access\\Authorizable as AuthorizableContract;\nuse Illuminate\\Contracts\\Auth\\CanResetPassword as CanResetPasswordContract;\n\nuse Kodeine\\Acl\\Traits\\HasRole;\n\nclass User extends BaseModel implements AuthenticatableContract, AuthorizableContract, CanResetPasswordContract\n{\n    use Authenticatable, CanResetPassword, HasRole;\n\n    /**\n     * The database table used by the model.\n     *\n     * @var string\n     */\n    protected $table = 'users';\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'email',\n        'password',\n        'api_token',\n    ];\n\n    /**\n     * The attributes excluded from the model's JSON form.\n     *\n     * @var array\n     */\n    protected $hidden = [\n        'password',\n        'remember_token',\n        'api_token',\n    ];\n}\n"
  },
  {
    "path": "app/Policies/.gitkeep",
    "content": ""
  },
  {
    "path": "app/Providers/AppServiceProvider.php",
    "content": "<?php\n\nnamespace App\\Providers;\n\nuse App\\Services\\Deployment\\QueueDeployCommander;\nuse App\\Services\\Deployment\\DeployerFile;\nuse App\\Services\\Deployment\\DeployerDeploymentFileBuilder;\nuse App\\Services\\Deployment\\DeployerRecipeFileBuilder;\nuse App\\Services\\Deployment\\DeployerServerListFileBuilder;\nuse App\\Services\\Form\\Project\\ProjectForm;\nuse App\\Services\\Form\\Project\\ProjectFormLaravelValidator;\nuse App\\Services\\Form\\Deployment\\DeploymentForm;\nuse App\\Services\\Form\\Deployment\\DeploymentFormLaravelValidator;\nuse App\\Services\\Form\\Recipe\\RecipeForm;\nuse App\\Services\\Form\\Recipe\\RecipeFormLaravelValidator;\nuse App\\Services\\Form\\Server\\ServerForm;\nuse App\\Services\\Form\\Server\\ServerFormLaravelValidator;\nuse App\\Services\\Form\\User\\UserForm;\nuse App\\Services\\Form\\User\\UserFormLaravelValidator;\nuse App\\Services\\Form\\Setting\\MailSettingForm;\nuse App\\Services\\Form\\Setting\\MailSettingFormLaravelValidator;\nuse App\\Services\\Notification\\MailNotifier;\nuse App\\Services\\Config\\DotenvReader;\nuse App\\Services\\Config\\DotenvWriter;\nuse App\\Services\\Filesystem\\LaravelFilesystem;\nuse App\\Services\\Api\\JsonRpc;\nuse Illuminate\\Support\\ServiceProvider;\nuse Symfony\\Component\\Process\\ProcessBuilder;\nuse Symfony\\Component\\Yaml\\Parser;\nuse Symfony\\Component\\Yaml\\Dumper;\n\nclass AppServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap any application services.\n     *\n     * @return void\n     */\n    public function boot()\n    {\n        // HACK `artisan optimize` and `phpunit` doesn't work with PHP 7.4 due to ErrorException.\n        $isArtisanOptimize = php_sapi_name() == 'cli' && $_SERVER['argv'][0] == 'artisan' && in_array('optimize', $_SERVER['argv']);\n        if (version_compare(phpversion(), '7.4.0', '>=') && ($isArtisanOptimize || $this->app->runningUnitTests())) {\n            error_reporting(E_ALL ^ E_DEPRECATED ^ E_NOTICE);\n        }\n    }\n\n    /**\n     * Register any application services.\n     *\n     * This service provider is a great spot to register your various container\n     * bindings with the application. As you can see, we are registering our\n     * \"Registrar\" implementation here. You can add your own bindings too!\n     *\n     * @return void\n     */\n    public function register()\n    {\n        $this->app->bind(\n            'Illuminate\\Contracts\\Auth\\Registrar',\n            'App\\Services\\Registrar'\n        );\n\n        $this->app->bind('App\\Services\\Deployment\\DeployCommanderInterface', function ($app) {\n            return new QueueDeployCommander(\n                $app->make('Illuminate\\Contracts\\Bus\\Dispatcher')\n            );\n        });\n\n        $this->app->bind('App\\Services\\Form\\Project\\ProjectForm', function ($app) {\n            return new ProjectForm(\n                new ProjectFormLaravelValidator($app['validator']),\n                $app->make('App\\Repositories\\Project\\ProjectInterface')\n            );\n        });\n\n        $this->app->bind('App\\Services\\Form\\Deployment\\DeploymentForm', function ($app) {\n            return new DeploymentForm(\n                new DeploymentFormLaravelValidator($app['validator']),\n                $app->make('App\\Repositories\\Project\\ProjectInterface'),\n                $app->make('App\\Services\\Deployment\\DeployCommanderInterface')\n            );\n        });\n\n        $this->app->bind('App\\Services\\Form\\Recipe\\RecipeForm', function ($app) {\n            return new RecipeForm(\n                new RecipeFormLaravelValidator($app['validator']),\n                $app->make('App\\Repositories\\Recipe\\RecipeInterface')\n            );\n        });\n\n        $this->app->bind('App\\Services\\Form\\Server\\ServerForm', function ($app) {\n            return new ServerForm(\n                new ServerFormLaravelValidator($app['validator']),\n                $app->make('App\\Repositories\\Server\\ServerInterface')\n            );\n        });\n\n        $this->app->bind('App\\Services\\Form\\User\\UserForm', function ($app) {\n            return new UserForm(\n                new UserFormLaravelValidator($app['validator']),\n                $app->make('App\\Repositories\\User\\UserInterface')\n            );\n        });\n\n        $this->app->bind('App\\Services\\Form\\Setting\\MailSettingForm', function ($app) {\n            return new MailSettingForm(\n                new MailSettingFormLaravelValidator($app['validator']),\n                $app->make('App\\Repositories\\Setting\\SettingInterface')\n            );\n        });\n\n        $this->app->bind('App\\Services\\Notification\\NotifierInterface', function ($app) {\n            return new MailNotifier;\n        });\n\n        $this->app->bind('App\\Services\\Config\\ConfigReaderInterface', function ($app) {\n            $path = base_path('.env');\n\n            return new DotenvReader(\n                new LaravelFilesystem($app['files']),\n                $path\n            );\n        });\n\n        $this->app->bind('App\\Services\\Config\\ConfigWriterInterface', function ($app) {\n            $path = base_path('.env');\n\n            return new DotenvWriter(\n                new LaravelFilesystem($app['files']),\n                $path\n            );\n        });\n\n        $this->app->bind('App\\Services\\Deployment\\DeployerServerListFileBuilder', function ($app) {\n            return new DeployerServerListFileBuilder(\n                new LaravelFilesystem($app['files']),\n                new DeployerFile,\n                new Parser,\n                new Dumper\n            );\n        });\n        $this->app->bind('App\\Services\\Deployment\\DeployerRecipeFileBuilder', function ($app) {\n            return new DeployerRecipeFileBuilder(\n                new LaravelFilesystem($app['files']),\n                new DeployerFile\n            );\n        });\n        $this->app->bind('App\\Services\\Deployment\\DeployerDeploymentFileBuilder', function ($app) {\n            return new DeployerDeploymentFileBuilder(\n                new LaravelFilesystem($app['files']),\n                new DeployerFile\n            );\n        });\n\n        $this->app->bind('App\\Services\\Api\\JsonRpc', function ($app) {\n            return new JsonRpc(\n                $app->make('App\\Repositories\\Project\\ProjectInterface'),\n                $app->make('App\\Services\\Form\\Deployment\\DeploymentForm')\n            );\n        });\n    }\n}\n"
  },
  {
    "path": "app/Providers/AuthServiceProvider.php",
    "content": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Contracts\\Auth\\Access\\Gate as GateContract;\nuse Illuminate\\Foundation\\Support\\Providers\\AuthServiceProvider as ServiceProvider;\n\nclass AuthServiceProvider extends ServiceProvider\n{\n    /**\n     * The policy mappings for the application.\n     *\n     * @var array\n     */\n    protected $policies = [\n        'App\\Model' => 'App\\Policies\\ModelPolicy',\n    ];\n\n    /**\n     * Register any application authentication / authorization services.\n     *\n     * @param  \\Illuminate\\Contracts\\Auth\\Access\\Gate  $gate\n     * @return void\n     */\n    public function boot(GateContract $gate)\n    {\n        $this->registerPolicies($gate);\n\n        //\n    }\n}\n"
  },
  {
    "path": "app/Providers/EventServiceProvider.php",
    "content": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Contracts\\Events\\Dispatcher as DispatcherContract;\nuse Illuminate\\Foundation\\Support\\Providers\\EventServiceProvider as ServiceProvider;\n\nclass EventServiceProvider extends ServiceProvider\n{\n    /**\n     * The event handler mappings for the application.\n     *\n     * @var array\n     */\n    protected $listen = [\n        'event.name' => [\n            'EventListener',\n        ],\n    ];\n\n    /**\n     * Register any other events for your application.\n     *\n     * @param  \\Illuminate\\Contracts\\Events\\Dispatcher  $events\n     * @return void\n     */\n    public function boot(DispatcherContract $events)\n    {\n        parent::boot($events);\n\n        //\n    }\n}\n"
  },
  {
    "path": "app/Providers/RepositoryServiceProvider.php",
    "content": "<?php\n\nnamespace App\\Providers;\n\nuse App\\Models\\Project;\nuse App\\Models\\Recipe;\nuse App\\Models\\Server;\nuse App\\Models\\Setting;\nuse App\\Models\\User;\nuse App\\Repositories\\Project\\EloquentProject;\nuse App\\Repositories\\Recipe\\EloquentRecipe;\nuse App\\Repositories\\Server\\EloquentServer;\nuse App\\Repositories\\User\\EloquentUser;\nuse App\\Repositories\\Role\\EloquentRole;\nuse App\\Repositories\\Setting\\ConfigAppSetting;\nuse App\\Repositories\\Setting\\ConfigDbSetting;\nuse App\\Repositories\\Setting\\EloquentSetting;\n\nuse Kodeine\\Acl\\Models\\Eloquent\\Role;\n\nuse Illuminate\\Support\\ServiceProvider;\n\nclass RepositoryServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap the application services.\n     *\n     * @return void\n     */\n    public function boot()\n    {\n        //\n    }\n\n    /**\n     * Register the application services.\n     *\n     * @return void\n     */\n    public function register()\n    {\n        $this->app->bind('App\\Repositories\\Project\\ProjectInterface', function ($app) {\n            return new EloquentProject(new Project);\n        });\n\n        $this->app->bind('App\\Repositories\\Recipe\\RecipeInterface', function ($app) {\n            return new EloquentRecipe(new Recipe);\n        });\n\n        $this->app->bind('App\\Repositories\\Server\\ServerInterface', function ($app) {\n            return new EloquentServer(new Server);\n        });\n\n        $this->app->bind('App\\Repositories\\User\\UserInterface', function ($app) {\n            return new EloquentUser(new User);\n        });\n\n        $this->app->bind('App\\Repositories\\Role\\RoleInterface', function ($app) {\n            return new EloquentRole(new Role);\n        });\n\n        $this->app->bind('App\\Repositories\\Setting\\SettingInterface', function ($app) {\n            return new EloquentSetting(new Setting);\n        });\n\n        $this->app->bind('App\\Repositories\\Setting\\DbSettingInterface', function ($app) {\n            return new ConfigDbSetting(\n                $app->make('App\\Services\\Config\\ConfigReaderInterface'),\n                $app->make('App\\Services\\Config\\ConfigWriterInterface')\n            );\n        });\n\n        $this->app->bind('App\\Repositories\\Setting\\AppSettingInterface', function ($app) {\n            return new ConfigAppSetting(\n                $app->make('App\\Services\\Config\\ConfigReaderInterface'),\n                $app->make('App\\Services\\Config\\ConfigWriterInterface')\n            );\n        });\n    }\n}\n"
  },
  {
    "path": "app/Providers/RouteServiceProvider.php",
    "content": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Foundation\\Support\\Providers\\RouteServiceProvider as ServiceProvider;\n\nuse Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException;\n\nclass RouteServiceProvider extends ServiceProvider\n{\n    /**\n     * This namespace is applied to the controller routes in your routes file.\n     *\n     * In addition, it is set as the URL generator's root namespace.\n     *\n     * @var string\n     */\n    protected $namespace = 'App\\Http\\Controllers';\n\n    /**\n     * Define your route model bindings, pattern filters, etc.\n     *\n     * @param  \\Illuminate\\Routing\\Router  $router\n     * @return void\n     */\n    public function boot(Router $router)\n    {\n        parent::boot($router);\n\n        //\n        $router->bind('projects', function ($id) {\n            $projectRepository = $this->app->make('App\\Repositories\\Project\\ProjectInterface');\n\n            $project = $projectRepository->byId($id);\n\n            if (is_null($project)) {\n                throw new NotFoundHttpException;\n            }\n\n            return $project;\n        });\n\n        $router->bind('deployments', function ($num, $route) {\n            $project = $route->parameter('projects');\n\n            $deployment = $project->getDeploymentByNumber($num);\n\n            if (is_null($deployment)) {\n                throw new NotFoundHttpException;\n            }\n\n            return $deployment;\n        });\n\n        $router->bind('recipes', function ($id) {\n            $recipeRepository = $this->app->make('App\\Repositories\\Recipe\\RecipeInterface');\n\n            $recipe = $recipeRepository->byId($id);\n\n            if (is_null($recipe)) {\n                throw new NotFoundHttpException;\n            }\n\n            return $recipe;\n        });\n\n        $router->bind('servers', function ($id) {\n            $serverRepository = $this->app->make('App\\Repositories\\Server\\ServerInterface');\n\n            $server = $serverRepository->byId($id);\n\n            if (is_null($server)) {\n                throw new NotFoundHttpException;\n            }\n\n            return $server;\n        });\n\n        $router->bind('users', function ($id) {\n            $userRepository = $this->app->make('App\\Repositories\\User\\UserInterface');\n\n            $user = $userRepository->byId($id);\n\n            if (is_null($user)) {\n                throw new NotFoundHttpException;\n            }\n\n            return $user;\n        });\n    }\n\n    /**\n     * Define the routes for the application.\n     *\n     * @param  \\Illuminate\\Routing\\Router  $router\n     * @return void\n     */\n    public function map(Router $router)\n    {\n        $router->group(['namespace' => $this->namespace], function ($router) {\n            require app_path('Http/routes.php');\n        });\n    }\n}\n"
  },
  {
    "path": "app/Repositories/AbstractConfigRepository.php",
    "content": "<?php\n\nnamespace App\\Repositories;\n\nuse App\\Services\\Config\\ConfigReaderInterface;\nuse App\\Services\\Config\\ConfigWriterInterface;\n\nabstract class AbstractConfigRepository implements RepositoryInterface\n{\n    protected $reader;\n\n    protected $writer;\n\n    /**\n     * Create a new repository instance.\n     *\n     * @param \\App\\Services\\Config\\ConfigReaderInterface $reader\n     * @param \\App\\Services\\Config\\ConfigWriterInterface $writer\n     * @return void\n     */\n    public function __construct(ConfigReaderInterface $reader, ConfigWriterInterface $writer)\n    {\n        $this->reader = $reader;\n        $this->writer = $writer;\n    }\n\n    public function byId($id)\n    {\n    }\n\n    public function byPage($page = 1, $limi = 10)\n    {\n    }\n\n    public function all()\n    {\n    }\n\n    public function create(array $data)\n    {\n    }\n\n    public function update(array $data)\n    {\n    }\n\n    public function delete($id)\n    {\n    }\n}\n"
  },
  {
    "path": "app/Repositories/AbstractEloquentRepository.php",
    "content": "<?php\n\nnamespace App\\Repositories;\n\nabstract class AbstractEloquentRepository implements RepositoryInterface\n{\n    protected $model;\n\n    /**\n     * Get a model by id.\n     *\n     * @param int $id Model id\n     * @return \\Illuminate\\Database\\Eloquent\\Model\n     */\n    public function byId($id)\n    {\n        return $this->model->find($id);\n    }\n\n    /**\n     * Get paginated models.\n     *\n     * @param int $page  Page number\n     * @param int $limit Number of models per page\n     * @return \\Illuminate\\Pagination\\LengthAwarePaginator\n     */\n    public function byPage($page = 1, $limit = 10)\n    {\n        $models = $this->model\n            ->skip($limit * ($page - 1))\n            ->take($limit)\n            ->paginate($limit);\n\n        return $models;\n    }\n\n    /**\n     * Get all models.\n     *\n     * @return \\Illuminate\\Database\\Eloquent\\Collection\n     */\n    public function all()\n    {\n        return $this->model->all();\n    }\n\n    /**\n     * Create a new model.\n     *\n     * @param array $data Data to create a model\n     * @return \\Illuminate\\Database\\Eloquent\\Model\n     */\n    public function create(array $data)\n    {\n        $model = $this->model->create($data);\n\n        return $model;\n    }\n\n    /**\n     * Update an existing model.\n     *\n     * @param array $data Data to update a model\n     * @return boolean\n     */\n    public function update(array $data)\n    {\n        $model = $this->model->find($data['id']);\n\n        $model->update($data);\n\n        return true;\n    }\n\n    /**\n     * Delete an existing model.\n     *\n     * @param int $id Model id\n     * @return boolean\n     */\n    public function delete($id)\n    {\n        $model = $this->model->find($id);\n\n        $model->delete();\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "app/Repositories/Project/EloquentProject.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Project;\n\nuse App\\Repositories\\AbstractEloquentRepository;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass EloquentProject extends AbstractEloquentRepository implements ProjectInterface\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @param \\Illuminate\\Database\\Eloquent\\Model $project\n     * @return void\n     */\n    public function __construct(Model $project)\n    {\n        $this->model = $project;\n    }\n\n    /**\n     * Get paginated projects.\n     *\n     * @param int $page  Page number\n     * @param int $limit Number of projects per page\n     * @return \\Illuminate\\Pagination\\LengthAwarePaginator\n     */\n    public function byPage($page = 1, $limit = 10)\n    {\n        $projects = $this->model->with(['deployments' => function ($query) {\n            $query->orderBy('number', 'desc');\n        }])->orderBy('name')\n            ->skip($limit * ($page - 1))\n            ->take($limit)\n            ->paginate($limit);\n\n        return $projects;\n    }\n}\n"
  },
  {
    "path": "app/Repositories/Project/ProjectInterface.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Project;\n\nuse App\\Repositories\\RepositoryInterface;\n\ninterface ProjectInterface extends RepositoryInterface\n{\n}\n"
  },
  {
    "path": "app/Repositories/Recipe/EloquentRecipe.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Recipe;\n\nuse App\\Repositories\\AbstractEloquentRepository;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass EloquentRecipe extends AbstractEloquentRepository implements RecipeInterface\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @param \\Illuminate\\Database\\Eloquent\\Model $recipe\n     * @return void\n     */\n    public function __construct(Model $recipe)\n    {\n        $this->model = $recipe;\n    }\n\n    /**\n     * Get paginated recipes.\n     *\n     * @param int $page  Page number\n     * @param int $limit Number of recipes per page\n     * @return \\Illuminate\\Pagination\\LengthAwarePaginator\n     */\n    public function byPage($page = 1, $limit = 10)\n    {\n        $recipes = $this->model->orderBy('name')\n            ->skip($limit * ($page - 1))\n            ->take($limit)\n            ->paginate($limit);\n\n        return $recipes;\n    }\n}\n"
  },
  {
    "path": "app/Repositories/Recipe/RecipeInterface.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Recipe;\n\nuse App\\Repositories\\RepositoryInterface;\n\ninterface RecipeInterface extends RepositoryInterface\n{\n}\n"
  },
  {
    "path": "app/Repositories/RepositoryInterface.php",
    "content": "<?php\n\nnamespace App\\Repositories;\n\ninterface RepositoryInterface\n{\n    /**\n     * Get a model by id.\n     *\n     * @param int $id Model id\n     * @return mixed\n     */\n    public function byId($id);\n\n    /**\n     * Get paginated models.\n     *\n     * @param int $page  Page number\n     * @param int $limit Number of models per page\n     * @return mixed\n     */\n    public function byPage($page = 1, $limit = 10);\n\n    /**\n     * Get all models.\n     *\n     * @return mixed\n     */\n    public function all();\n\n    /**\n     * Create a new model.\n     *\n     * @param array $data Data to create a model\n     * @return mixed\n     */\n    public function create(array $data);\n\n    /**\n     * Update an existing model.\n     *\n     * @param array $data Data to update a model\n     * @return mixed\n     */\n    public function update(array $data);\n\n    /**\n     * Delete an existing model.\n     *\n     * @param int $id Model id\n     * @return mixed\n     */\n    public function delete($id);\n}\n"
  },
  {
    "path": "app/Repositories/Role/EloquentRole.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Role;\n\nuse App\\Repositories\\AbstractEloquentRepository;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass EloquentRole extends AbstractEloquentRepository implements RoleInterface\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @param \\Illuminate\\Database\\Eloquent\\Model $role\n     * @return void\n     */\n    public function __construct(Model $role)\n    {\n        $this->model = $role;\n    }\n\n    /**\n     * Get paginated roles.\n     *\n     * @param int $page  Page number\n     * @param int $limit Number of roles per page\n     * @return \\Illuminate\\Pagination\\LengthAwarePaginator\n     */\n    public function byPage($page = 1, $limit = 10)\n    {\n        $roles = $this->model->orderBy('name')\n            ->skip($limit * ($page - 1))\n            ->take($limit)\n            ->paginate($limit);\n\n        return $roles;\n    }\n}\n"
  },
  {
    "path": "app/Repositories/Role/RoleInterface.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Role;\n\nuse App\\Repositories\\RepositoryInterface;\n\ninterface RoleInterface extends RepositoryInterface\n{\n}\n"
  },
  {
    "path": "app/Repositories/Server/EloquentServer.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Server;\n\nuse App\\Repositories\\AbstractEloquentRepository;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass EloquentServer extends AbstractEloquentRepository implements ServerInterface\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @param \\Illuminate\\Database\\Eloquent\\Model $server\n     * @return void\n     */\n    public function __construct(Model $server)\n    {\n        $this->model = $server;\n    }\n\n    /**\n     * Get paginated servers.\n     *\n     * @param int $page  Page number\n     * @param int $limit Number of servers per page\n     * @return \\Illuminate\\Pagination\\LengthAwarePaginator\n     */\n    public function byPage($page = 1, $limit = 10)\n    {\n        $servers = $this->model->orderBy('name')\n            ->skip($limit * ($page - 1))\n            ->take($limit)\n            ->paginate($limit);\n\n        return $servers;\n    }\n}\n"
  },
  {
    "path": "app/Repositories/Server/ServerInterface.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Server;\n\nuse App\\Repositories\\RepositoryInterface;\n\ninterface ServerInterface extends RepositoryInterface\n{\n}\n"
  },
  {
    "path": "app/Repositories/Setting/AppSettingInterface.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Setting;\n\nuse App\\Repositories\\Setting\\SettingInterface;\n\ninterface AppSettingInterface extends SettingInterface\n{\n}\n\n"
  },
  {
    "path": "app/Repositories/Setting/ConfigAppSetting.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Setting;\n\nuse App\\Services\\Config\\ConfigReaderInterface;\nuse App\\Services\\Config\\ConfigWriterInterface;\nuse App\\Entities\\Setting\\AppSettingEntity;\nuse App\\Repositories\\AbstractConfigRepository;\nuse App\\Repositories\\Setting\\AppSettingInterface;\n\nclass ConfigAppSetting extends AbstractConfigRepository implements AppSettingInterface\n{\n    public function all()\n    {\n        $url = $this->reader->getConfig('APP_URL');\n\n        $appSetting = new AppSettingEntity;\n        $appSetting->setUrl($url);\n\n        return $appSetting;\n    }\n\n    public function update(array $data)\n    {\n        $this->writer->setConfig('APP_URL', $data['url']);\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "app/Repositories/Setting/ConfigDbSetting.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Setting;\n\nuse App\\Services\\Config\\ConfigReaderInterface;\nuse App\\Services\\Config\\ConfigWriterInterface;\nuse App\\Entities\\Setting\\DbSettingEntity;\nuse App\\Repositories\\AbstractConfigRepository;\nuse App\\Repositories\\Setting\\DbSettingInterface;\n\nclass ConfigDbSetting extends AbstractConfigRepository implements DbSettingInterface\n{\n    public function all()\n    {\n        $driver   = $this->reader->getConfig('DB_DRIVER');\n        $host     = $this->reader->getConfig('DB_HOST');\n        $database = $this->reader->getConfig('DB_DATABASE');\n        $username = $this->reader->getConfig('DB_USERNAME');\n        $password = $this->reader->getConfig('DB_PASSWORD');\n\n        $dbSetting = new DbSettingEntity;\n        $dbSetting->setDriver($driver)\n            ->setHost($host)\n            ->setDatabase($database)\n            ->setUsername($username)\n            ->setPassword($password);\n\n        return $dbSetting;\n    }\n\n    public function update(array $data)\n    {\n        $this->writer->setConfig('DB_DRIVER',   $data['driver']);\n        $this->writer->setConfig('DB_HOST',     $data['host']);\n        $this->writer->setConfig('DB_DATABASE', $data['database']);\n        $this->writer->setConfig('DB_USERNAME', $data['username']);\n        $this->writer->setConfig('DB_PASSWORD', $data['password']);\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "app/Repositories/Setting/ConfigMailSetting.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Setting;\n\nuse App\\Services\\Config\\ConfigReaderInterface;\nuse App\\Services\\Config\\ConfigWriterInterface;\nuse App\\Entities\\Setting\\MailSettingEntity;\nuse App\\Repositories\\AbstractConfigRepository;\nuse App\\Repositories\\Setting\\MailSettingInterface;\n\nclass ConfigMailSetting extends AbstractConfigRepository implements MailSettingInterface\n{\n    public function all()\n    {\n        $driver          = $this->reader->getConfig('MAIL_DRIVER');\n        $fromAddress     = $this->reader->getConfig('MAIL_FROM_ADDRESS');\n        $fromName        = $this->reader->getConfig('MAIL_FROM_NAME');\n        $smtpHost        = $this->reader->getConfig('MAIL_HOST');\n        $smtpPort        = $this->reader->getConfig('MAIL_PORT');\n        $smtpEncryption  = $this->reader->getConfig('MAIL_ENCRYPTION');\n        $smtpUsername    = $this->reader->getConfig('MAIL_USERNAME');\n        $smtpPassword    = $this->reader->getConfig('MAIL_PASSWORD');\n        $sendmailPath    = $this->reader->getConfig('MAIL_SENDMAIL');\n\n        $from = [\n            'address' => $fromAddress,\n            'name'    => $fromName,\n        ];\n\n        $mailSetting = new MailSettingEntity;\n        $mailSetting->setDriver($driver)\n            ->setFrom($from)\n            ->setSmtpHost($smtpHost)\n            ->setSmtpPort($smtpPort)\n            ->setSmtpEncryption($smtpEncryption)\n            ->setSmtpUsername($smtpUsername)\n            ->setSmtpPassword($smtpPassword)\n            ->setSendmailPath($sendmailPath);\n\n        return $mailSetting;\n    }\n\n    public function update(array $data)\n    {\n        $this->writer->setConfig('MAIL_DRIVER',       $data['driver']);\n        $this->writer->setConfig('MAIL_FROM_ADDRESS', $data['from_address']);\n        $this->writer->setConfig('MAIL_FROM_NAME',    $data['from_name']);\n        $this->writer->setConfig('MAIL_HOST',         $data['smtp_host']);\n        $this->writer->setConfig('MAIL_PORT',         $data['smtp_port']);\n        $this->writer->setConfig('MAIL_ENCRYPTION',   $data['smtp_encryption']);\n        $this->writer->setConfig('MAIL_USERNAME',     $data['smtp_username']);\n        $this->writer->setConfig('MAIL_PASSWORD',     $data['smtp_password']);\n        $this->writer->setConfig('MAIL_SENDMAIL',     $data['sendmail_path']);\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "app/Repositories/Setting/DbSettingInterface.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Setting;\n\nuse App\\Repositories\\Setting\\SettingInterface;\n\ninterface DbSettingInterface extends SettingInterface\n{\n}\n\n"
  },
  {
    "path": "app/Repositories/Setting/EloquentSetting.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Setting;\n\nuse App\\Repositories\\AbstractEloquentRepository;\nuse App\\Repositories\\Setting\\SettingInterface;\nuse App\\Entities\\Setting\\MailSettingEntity;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass EloquentSetting extends AbstractEloquentRepository implements SettingInterface\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @param \\Illuminate\\Database\\Eloquent\\Model $setting\n     * @return void\n     */\n    public function __construct(Model $setting)\n    {\n        $this->model = $setting;\n    }\n\n    /**\n     * Get a model by setting type. If a model does not exist, create a new model.\n     *\n     * @param string $id Setting type\n     * @return \\Illuminate\\Database\\Eloquent\\Model\n     */\n    public function byType($type)\n    {\n        $setting = $this->model->where('type', $type)->first();\n\n        if (!is_null($setting)) {\n            return $setting;\n        }\n\n        if ($type === 'mail') {\n            $attributes = new MailSettingEntity;\n            $attributes->setDriver('smtp');\n            $attributes->setFrom([\n                'address' => 'webloyer@example.com',\n                'name'    => 'Webloyer',\n            ]);\n            $attributes->setSmtpHost('smtp.mailgun.org');\n            $attributes->setSmtpPort(587);\n            $attributes->setSmtpEncryption('tls');\n            $attributes->setSendmailPath('/usr/sbin/sendmail -bs');\n        }\n\n        return $this->model->create([\n            'type'       => $type,\n            'attributes' => $attributes,\n        ]);\n    }\n\n    /**\n     * Update an existing model has a same type.\n     *\n     * @param array $data Data to update a model\n     * @return boolean\n     */\n    public function updateByType(array $data)\n    {\n        $setting = $this->model->where('type', $data['type'])->first();\n\n        $setting->update($data);\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "app/Repositories/Setting/MailSettingInterface.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Setting;\n\nuse App\\Repositories\\Setting\\SettingInterface;\n\ninterface MailSettingInterface extends SettingInterface\n{\n}\n\n"
  },
  {
    "path": "app/Repositories/Setting/SettingInterface.php",
    "content": "<?php\n\nnamespace App\\Repositories\\Setting;\n\nuse App\\Repositories\\RepositoryInterface;\n\ninterface SettingInterface extends RepositoryInterface\n{\n}\n"
  },
  {
    "path": "app/Repositories/User/EloquentUser.php",
    "content": "<?php\n\nnamespace App\\Repositories\\User;\n\nuse App\\Repositories\\AbstractEloquentRepository;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass EloquentUser extends AbstractEloquentRepository implements UserInterface\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @param \\Illuminate\\Database\\Eloquent\\Model $user\n     * @return void\n     */\n    public function __construct(Model $user)\n    {\n        $this->model = $user;\n    }\n\n    /**\n     * Get paginated users.\n     *\n     * @param int $page  Page number\n     * @param int $limit Number of users per page\n     * @return \\Illuminate\\Pagination\\LengthAwarePaginator\n     */\n    public function byPage($page = 1, $limit = 10)\n    {\n        $users = $this->model->orderBy('name')\n            ->skip($limit * ($page - 1))\n            ->take($limit)\n            ->paginate($limit);\n\n        return $users;\n    }\n}\n"
  },
  {
    "path": "app/Repositories/User/UserInterface.php",
    "content": "<?php\n\nnamespace App\\Repositories\\User;\n\nuse App\\Repositories\\RepositoryInterface;\n\ninterface UserInterface extends RepositoryInterface\n{\n}\n"
  },
  {
    "path": "app/Services/Api/JsonRpc.php",
    "content": "<?php\n\nnamespace App\\Services\\Api;\n\nuse App\\Repositories\\Project\\ProjectInterface;\nuse App\\Services\\Form\\Deployment\\DeploymentForm;\nuse Auth;\nuse InvalidArgumentException;\n\nclass JsonRpc\n{\n    protected $project;\n\n    protected $deploymentForm;\n\n    /**\n     * Create a new controller instance.\n     *\n     * @param \\App\\Repositories\\Project\\ProjectInterface   $project\n     * @param \\App\\Services\\Form\\Deployment\\DeploymentForm $deploymentForm\n     * @return void\n     */\n    public function __construct(ProjectInterface $project, DeploymentForm $deploymentForm)\n    {\n        $this->project        = $project;\n        $this->deploymentForm = $deploymentForm;\n    }\n\n    /**\n     * Deploy a project.\n     *\n     * @param int $project_id\n     * @return \\App\\Models\\Deployment\n     */\n    public function deploy($project_id)\n    {\n        $input = [\n            'status'     => null,\n            'message'    => null,\n            'project_id' => $project_id,\n            'user_id'    => Auth::guard('api')->user()->id,\n            'task'       => 'deploy',\n        ];\n\n        if ($this->deploymentForm->save($input)) {\n            $project = $this->project->byId($project_id);\n            $deployment = $project->getLastDeployment();\n            return $deployment;\n        } else {\n            throw new InvalidArgumentException($this->deploymentForm->errors());\n        }\n    }\n\n    /**\n     * Roll back a deployment.\n     *\n     * @param int $project_id\n     * @return \\App\\Models\\Deployment\n     */\n    public function rollback($project_id)\n    {\n        $input = [\n            'status'     => null,\n            'message'    => null,\n            'project_id' => $project_id,\n            'user_id'    => Auth::guard('api')->user()->id,\n            'task'       => 'rollback',\n        ];\n\n        if ($this->deploymentForm->save($input)) {\n            $project = $this->project->byId($project_id);\n            $deployment = $project->getLastDeployment();\n            return $deployment;\n        } else {\n            throw new InvalidArgumentException($this->deploymentForm->errors());\n        }\n    }\n}\n"
  },
  {
    "path": "app/Services/Api/Middleware/Authenticate.php",
    "content": "<?php\n\nnamespace App\\Services\\Api\\Middleware;\n\nuse JsonRPC\\MiddlewareInterface;\nuse JsonRPC\\Exception\\AuthenticationFailureException;\nuse Illuminate\\Http\\Request;\nuse Auth;\n\nclass Authenticate implements MiddlewareInterface\n{\n    protected $request;\n\n    public function __construct(Request $request)\n    {\n        $this->request = $request;\n    }\n\n    public function execute($username, $password, $procedureName)\n    {\n        $user = Auth::guard('api')->setRequest($this->request)->user();\n\n        if (is_null($user)) {\n            throw new AuthenticationFailureException('Wrong credentials!');\n        }\n    }\n}\n"
  },
  {
    "path": "app/Services/Config/ConfigReaderInterface.php",
    "content": "<?php\n\nnamespace App\\Services\\Config;\n\ninterface ConfigReaderInterface\n{\n    /**\n     * Get configuration.\n     *\n     * @param string $name Configuration name\n     * @return mixed\n     */\n    public function getConfig($name);\n}\n\n"
  },
  {
    "path": "app/Services/Config/ConfigWriterInterface.php",
    "content": "<?php\n\nnamespace App\\Services\\Config;\n\ninterface ConfigWriterInterface\n{\n    /**\n     * Set configuration.\n     *\n     * @param string $name  Configuration name\n     * @param string $value Configuration value\n     * @return mixed\n     */\n    public function setConfig($name, $value);\n}\n"
  },
  {
    "path": "app/Services/Config/DotenvReader.php",
    "content": "<?php\n\nnamespace App\\Services\\Config;\n\nuse App\\Services\\Config\\ConfigReaderInterface;\nuse App\\Services\\Filesystem\\FilesystemInterface;\n\nclass DotenvReader implements ConfigReaderInterface\n{\n    protected $fs;\n\n    protected $path;\n\n    public function __construct(FilesystemInterface $fs, $path)\n    {\n        $this->fs   = $fs;\n        $this->path = $path;\n    }\n\n    /**\n     * Get configuration from a .env file.\n     *\n     * @param string $name Configuration name\n     * @return string|null\n     */\n    public function getConfig($name)\n    {\n        $contents = $this->fs->get($this->path);\n\n        if (preg_match(\"/^$name=(.*)$/m\", $contents, $matches)) {\n            $value = $matches[1];\n            $value = $this->nullIfBlank($value);\n        } else {\n            $value = null;\n        }\n\n        return $value;\n    }\n\n    protected function nullIfBlank($value)\n    {\n        return trim($value) !== '' ? $value : null;\n    }\n}\n"
  },
  {
    "path": "app/Services/Config/DotenvWriter.php",
    "content": "<?php\n\nnamespace App\\Services\\Config;\n\nuse App\\Services\\Config\\ConfigWriterInterface;\nuse App\\Services\\Filesystem\\FilesystemInterface;\n\nclass DotenvWriter implements ConfigWriterInterface\n{\n    protected $fs;\n\n    protected $path;\n\n    public function __construct(FilesystemInterface $fs, $path)\n    {\n        $this->fs   = $fs;\n        $this->path = $path;\n    }\n\n    /**\n     * Set configuration to a .env file.\n     *\n     * @param string $name  Configuration name\n     * @param string $value Configuration value\n     * @return mixed\n     */\n    public function setConfig($name, $value)\n    {\n        $contents = $this->fs->get($this->path);\n\n        if (preg_match(\"/^$name=.*$/m\", $contents)) {\n            $contents = preg_replace(\"/^$name=.*$/m\", \"$name=$value\", $contents);\n        } else {\n            $contents .= \"$name=$value\".PHP_EOL;\n        }\n\n        return $this->fs->put($this->path, $contents);\n    }\n}\n"
  },
  {
    "path": "app/Services/Deployment/DeployCommanderInterface.php",
    "content": "<?php\n\nnamespace App\\Services\\Deployment;\n\ninterface DeployCommanderInterface\n{\n    /**\n     * Give the command to deploy\n     *\n     * @param mixed $deployment\n     * @return boolean\n     */\n    public function deploy($deployment);\n\n    /**\n     * Give the command to rollback\n     *\n     * @param mixed $deployment\n     * @return boolean\n     */\n    public function rollback($deployment);\n}\n"
  },
  {
    "path": "app/Services/Deployment/DeployerDeploymentFileBuilder.php",
    "content": "<?php\n\nnamespace App\\Services\\Deployment;\n\nuse App\\Services\\Deployment\\DeployerFile;\nuse App\\Services\\Filesystem\\FilesystemInterface;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass DeployerDeploymentFileBuilder implements DeployerFileBuilderInterface\n{\n    protected $fs;\n\n    protected $deployerFile;\n\n    protected $project;\n\n    protected $serverListFile;\n\n    protected $recipeFile;\n\n    public function __construct(FilesystemInterface $fs, DeployerFile $deployerFile)\n    {\n        $this->fs           = $fs;\n        $this->deployerFile = $deployerFile;\n    }\n\n    public function __destruct()\n    {\n        $this->fs->delete($this->deployerFile->getFullPath());\n    }\n\n    /**\n     * Set a deployment file path info.\n     *\n     * @return \\App\\Services\\Deployment\\DeployerDeploymentFileBuilder $this\n     */\n    public function pathInfo()\n    {\n        $id = md5(uniqid(rand(), true));\n\n        $baseName = \"deploy_$id.php\";\n        $fullPath = storage_path(\"app/$baseName\");\n\n        $this->deployerFile->setBaseName($baseName);\n        $this->deployerFile->setFullPath($fullPath);\n\n        return $this;\n    }\n\n    /**\n     * Put a deployment file.\n     *\n     * @return \\App\\Services\\Deployment\\DeployerDeploymentFileBuilder $this\n     */\n    public function put()\n    {\n        $fullPath = $this->deployerFile->getFullPath();\n        $contents[] = '<?php';\n\n        // Declare a namespace\n        $contents[] = 'namespace Deployer;';\n\n        // Include recipe files\n        foreach ($this->recipeFile as $recipeFile) {\n            $contents[] = \"require '{$recipeFile->getFullPath()}';\";\n        }\n\n        // Set a repository\n        $contents[] = \"set('repository', '{$this->project->repository}');\";\n\n        // Load a server list file\n        $contents[] = \"serverList('{$this->serverListFile->getFullPath()}');\";\n\n        $this->fs->put($fullPath, implode(PHP_EOL, $contents));\n\n        return $this;\n    }\n\n    /**\n     * Get a deployment file instance.\n     *\n     * @return \\App\\Services\\Deployment\\DeployerFile\n     */\n    public function getResult()\n    {\n        return $this->deployerFile;\n    }\n\n    /**\n     * Set a project model instance.\n     *\n     * @param \\Illuminate\\Database\\Eloquent\\Model $project\n     * @return \\App\\Services\\Deployment\\DeployerDeploymentFileBuilder $this\n     */\n    public function setProject(Model $project)\n    {\n        $this->project = $project;\n\n        return $this;\n    }\n\n    /**\n     * Set a server list file instance.\n     *\n     * @param \\App\\Services\\Deployment\\DeployerFile $serverListFile\n     * @return \\App\\Services\\Deployment\\DeployerDeploymentFileBuilder $this\n     */\n    public function setServerListFile(DeployerFile $serverListFile)\n    {\n        $this->serverListFile = $serverListFile;\n\n        return $this;\n    }\n\n    /**\n     * Set recipe file instances.\n     *\n     * @param array $recipeFile\n     * @return \\App\\Services\\Deployment\\DeployerDeploymentFileBuilder $this\n     */\n    public function setRecipeFile(array $recipeFile)\n    {\n        $this->recipeFile = $recipeFile;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "app/Services/Deployment/DeployerFile.php",
    "content": "<?php\n\nnamespace App\\Services\\Deployment;\n\nclass DeployerFile\n{\n    protected $baseName;\n\n    protected $fullPath;\n\n    /**\n     * Get a base name.\n     *\n     * @return string\n     */\n    public function getBaseName()\n    {\n        return $this->baseName;\n    }\n\n    /**\n     * Get a full path.\n     *\n     * @return string\n     */\n    public function getFullPath()\n    {\n        return $this->fullPath;\n    }\n\n    /**\n     * Set a base name.\n     *\n     * @param string Base name\n     * @return \\App\\Services\\Deployment\\DeployerFile $this\n     */\n    public function setBaseName($baseName)\n    {\n        $this->baseName = $baseName;\n\n        return $this;\n    }\n\n    /**\n     * Set a full path.\n     *\n     * @param string Full path\n     * @return \\App\\Services\\Deployment\\DeployerFile $this\n     */\n    public function setFullPath($fullPath)\n    {\n        $this->fullPath = $fullPath;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "app/Services/Deployment/DeployerFileBuilderInterface.php",
    "content": "<?php\n\nnamespace App\\Services\\Deployment;\n\ninterface DeployerFileBuilderInterface\n{\n    /**\n     * Set a deployer file path info.\n     *\n     * @return \\App\\Services\\Deployment\\DeployerFileBuilderInterface $this\n     */\n    public function pathInfo();\n\n    /**\n     * Put a deployer file.\n     *\n     * @return \\App\\Services\\Deployment\\DeployerFileBuilderInterface $this\n     */\n    public function put();\n\n    /**\n     * Get a deployer file instance.\n     *\n     * @return \\App\\Services\\Deployment\\DeployerFile\n     */\n    public function getResult();\n}\n"
  },
  {
    "path": "app/Services/Deployment/DeployerFileDirector.php",
    "content": "<?php\n\nnamespace App\\Services\\Deployment;\n\nclass DeployerFileDirector\n{\n    protected $fileBuilder;\n\n    public function __construct(DeployerFileBuilderInterface $fileBuilder)\n    {\n        $this->fileBuilder = $fileBuilder;\n    }\n\n    /**\n     * Construct a deployer file instance.\n     *\n     * @return \\App\\Services\\Deployment\\DeployerFile\n     */\n    public function construct()\n    {\n        $this->fileBuilder->pathInfo();\n        $this->fileBuilder->put();\n\n        return $this->fileBuilder->getResult();\n    }\n}\n"
  },
  {
    "path": "app/Services/Deployment/DeployerRecipeFileBuilder.php",
    "content": "<?php\n\nnamespace App\\Services\\Deployment;\n\nuse App\\Services\\Deployment\\DeployerFile;\nuse App\\Services\\Filesystem\\FilesystemInterface;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass DeployerRecipeFileBuilder implements DeployerFileBuilderInterface\n{\n    protected $fs;\n\n    protected $deployerFile;\n\n    protected $recipe;\n\n    public function __construct(FilesystemInterface $fs, DeployerFile $deployerFile)\n    {\n        $this->fs           = $fs;\n        $this->deployerFile = $deployerFile;\n    }\n\n    public function __destruct()\n    {\n        $this->fs->delete($this->deployerFile->getFullPath());\n    }\n\n    /**\n     * Set a recipe file path info.\n     *\n     * @return \\App\\Services\\Deployment\\DeployerRecipeFileBuilder $this\n     */\n    public function pathInfo()\n    {\n        $id = md5(uniqid(rand(), true));\n\n        $baseName = \"recipe_$id.php\";\n        $fullPath = storage_path(\"app/$baseName\");\n\n        $this->deployerFile->setBaseName($baseName);\n        $this->deployerFile->setFullPath($fullPath);\n\n        return $this;\n    }\n\n    /**\n     * Put a recipe file.\n     *\n     * @return \\App\\Services\\Deployment\\DeployerRecipeFileBuilder $this\n     */\n    public function put()\n    {\n        $fullPath = $this->deployerFile->getFullPath();\n        $contents = $this->recipe->body;\n\n        $this->fs->put($fullPath, $contents);\n\n        return $this;\n    }\n\n    /**\n     * Get a recipe file instance.\n     *\n     * @return \\App\\Services\\Deployment\\DeployerFile\n     */\n    public function getResult()\n    {\n        return $this->deployerFile;\n    }\n\n    /**\n     * Set a recipe model instance.\n     *\n     * @param \\Illuminate\\Database\\Eloquent\\Model $recipe\n     * @return \\App\\Services\\Deployment\\DeployerRecipeFileBuilder $this\n     */\n    public function setRecipe(Model $recipe)\n    {\n        $this->recipe = $recipe;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "app/Services/Deployment/DeployerServerListFileBuilder.php",
    "content": "<?php\n\nnamespace App\\Services\\Deployment;\n\nuse App\\Services\\Deployment\\DeployerFile;\nuse App\\Services\\Filesystem\\FilesystemInterface;\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Symfony\\Component\\Yaml\\Parser;\nuse Symfony\\Component\\Yaml\\Dumper;\n\nclass DeployerServerListFileBuilder implements DeployerFileBuilderInterface\n{\n    protected $fs;\n\n    protected $deployerFile;\n\n    protected $yamlParser;\n\n    protected $yamlDumper;\n\n    protected $server;\n\n    protected $project;\n\n    public function __construct(FilesystemInterface $fs, DeployerFile $deployerFile, Parser $parser, Dumper $dumper)\n    {\n        $this->fs           = $fs;\n        $this->deployerFile = $deployerFile;\n        $this->yamlParser   = $parser;\n        $this->yamlDumper   = $dumper;\n    }\n\n    public function __destruct()\n    {\n        $this->fs->delete($this->deployerFile->getFullPath());\n    }\n\n    /**\n     * Set a server list file path info.\n     *\n     * @return \\App\\Services\\ServerList\\DeployerServerListFileBuilder $this\n     */\n    public function pathInfo()\n    {\n        $id = md5(uniqid(rand(), true));\n\n        $baseName = \"server_$id.yml\";\n        $fullPath = storage_path(\"app/$baseName\");\n\n        $this->deployerFile->setBaseName($baseName);\n        $this->deployerFile->setFullPath($fullPath);\n\n        return $this;\n    }\n\n    /**\n     * Put a server list file.\n     *\n     * @return \\App\\Services\\ServerList\\DeployerServerListFileBuilder $this\n     */\n    public function put()\n    {\n        $fullPath = $this->deployerFile->getFullPath();\n        $contents = $this->server->body;\n\n        // Override settings in a server list file\n        $serverList = $this->yamlParser->parse($contents);\n        $projectAttributes = $this->project->attributes;\n        if (!is_null($projectAttributes)) {\n            foreach ($serverList as $i => $server) {\n                if (!is_null($projectAttributes->getDeployPath())) {\n                    $serverList[$i]['deploy_path'] = $projectAttributes->getDeployPath();\n                }\n            }\n        }\n        $newContents = $this->yamlDumper->dump($serverList);\n\n        $this->fs->put($fullPath, $newContents);\n\n        return $this;\n    }\n\n    /**\n     * Get a server list file instance.\n     *\n     * @return \\App\\Services\\Deployment\\DeployerFile\n     */\n    public function getResult()\n    {\n        return $this->deployerFile;\n    }\n\n    /**\n     * Set a server model instance.\n     *\n     * @param \\Illuminate\\Database\\Eloquent\\Model $server\n     * @return \\App\\Services\\ServerList\\DeployerServerListFileBuilder $this\n     */\n    public function setServer(Model $server)\n    {\n        $this->server = $server;\n\n        return $this;\n    }\n\n    /**\n     * Set a project model instance.\n     *\n     * @param \\Illuminate\\Database\\Eloquent\\Model $project\n     * @return \\App\\Services\\ServerList\\DeployerServerListFileBuilder $this\n     */\n    public function setProject(Model $project)\n    {\n        $this->project = $project;\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "app/Services/Deployment/QueueDeployCommander.php",
    "content": "<?php\n\nnamespace App\\Services\\Deployment;\n\nuse App\\Jobs\\Deploy;\nuse App\\Jobs\\Rollback;\n\nuse Illuminate\\Contracts\\Bus\\Dispatcher;\n\nclass QueueDeployCommander implements DeployCommanderInterface\n{\n    protected $dispatcher;\n\n    public function __construct(Dispatcher $dispatcher)\n    {\n        $this->dispatcher = $dispatcher;\n    }\n\n    /**\n     * Give the command to deploy\n     *\n     * @param mixed $deployment\n     * @return boolean\n     */\n    public function deploy($deployment)\n    {\n        $this->dispatcher->dispatch(\n            new Deploy($deployment)\n        );\n    }\n\n    /**\n     * Give the command to rollback\n     *\n     * @param mixed $deployment\n     * @return boolean\n     */\n    public function rollback($deployment)\n    {\n        $this->dispatcher->dispatch(\n            new Rollback($deployment)\n        );\n    }\n}\n"
  },
  {
    "path": "app/Services/Deployment/StorageDeployCommander.php",
    "content": "<?php\n\nnamespace App\\Services\\Deployment;\n\nuse Storage;\n\nclass StorageDeployCommander implements DeployCommanderInterface\n{\n    /**\n     * Give the command to deploy\n     *\n     * @param mixed $deployment\n     * @return boolean\n     */\n    public function deploy($deployment)\n    {\n        if (!Storage::put('deploy.json', $deployment)) {\n            return false;\n        } else {\n            return true;\n        }\n    }\n\n    /**\n     * Give the command to rollback\n     *\n     * @param mixed $deployment\n     * @return boolean\n     */\n    public function rollback($deployment)\n    {\n        if (!Storage::put('rollback.json', $deployment)) {\n            return false;\n        } else {\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "app/Services/Filesystem/FilesystemInterface.php",
    "content": "<?php\n\nnamespace App\\Services\\Filesystem;\n\ninterface FilesystemInterface\n{\n    /**\n     * Write a file.\n     *\n     * @param string $path     File path\n     * @param string $contents Contents to write a file\n     * @return mixed\n     */\n    public function put($path, $contents);\n\n    /**\n     * Read a file.\n     *\n     * @param string $path File path\n     * @return string Contents\n     */\n    public function get($path);\n}\n"
  },
  {
    "path": "app/Services/Filesystem/LaravelFilesystem.php",
    "content": "<?php\n\nnamespace App\\Services\\Filesystem;\n\nuse App\\Services\\Filesystem\\FilesystemInterface;\n\nuse Illuminate\\Filesystem\\Filesystem;\n\nclass LaravelFilesystem implements FilesystemInterface\n{\n    protected $fs;\n\n    public function __construct(Filesystem $fs)\n    {\n        $this->fs = $fs;\n    }\n\n    /**\n     * Write a file.\n     *\n     * @param string $path     File path\n     * @param string $contents Contents to write a file\n     * @return mixed\n     */\n    public function put($path, $contents)\n    {\n        return $this->fs->put($path, $contents);\n    }\n\n    /**\n     * Read a file.\n     *\n     * @param string $path File path\n     * @return string Contents\n     */\n    public function get($path)\n    {\n        return $this->fs->get($path);\n    }\n\n    /**\n     * Delete a file.\n     *\n     * @param string $path File path\n     * @return boolean\n     */\n    public function delete($path)\n    {\n        return $this->fs->delete($path);\n    }\n}\n"
  },
  {
    "path": "app/Services/Form/Deployment/DeploymentForm.php",
    "content": "<?php\n\nnamespace App\\Services\\Form\\Deployment;\n\nuse App\\Services\\Validation\\ValidableInterface;\nuse App\\Services\\Deployment\\DeployCommanderInterface;\nuse App\\Repositories\\Project\\ProjectInterface;\nuse DB;\n\nclass DeploymentForm\n{\n    protected $validator;\n\n    protected $project;\n\n    protected $deployCommander;\n\n    /**\n     * Create a new form service instance.\n     *\n     * @param \\App\\Services\\Validation\\ValidableInterface       $validator\n     * @param \\App\\Repositories\\Project\\ProjectInterface        $project\n     * @param \\App\\Services\\Deployment\\DeployCommanderInterface $deployCommander\n     * @return void\n     */\n    public function __construct(ValidableInterface $validator, ProjectInterface $project, DeployCommanderInterface $deployCommander)\n    {\n        $this->validator       = $validator;\n        $this->project         = $project;\n        $this->deployCommander = $deployCommander;\n    }\n\n    /**\n     * Create a new deployment.\n     *\n     * @param array $input Data to create a deployment\n     * @return boolean\n     */\n    public function save(array $input)\n    {\n        if (!$this->valid($input)) {\n            return false;\n        }\n\n        $deployment = DB::transaction(function () use ($input) {\n            $project = $this->project->byId($input['project_id']);\n\n            $maxDeployment = $project->getMaxDeployment();\n            $input['number'] = $maxDeployment->number + 1;\n\n            $project->addDeployment($input);\n            $project->updateMaxDeployment(['number' => $input['number']]);\n\n            $deployment = $project->getDeploymentByNumber($input['number']);\n\n            return $deployment;\n        });\n\n        if (!$deployment) {\n            return false;\n        }\n\n        $this->deployCommander->{$input['task']}($deployment);\n\n        return true;\n    }\n\n    /**\n     * Return validation errors.\n     *\n     * @return array\n     */\n    public function errors()\n    {\n        return $this->validator->errors();\n    }\n\n    /**\n     * Test whether form validator passes.\n     *\n     * @return boolean\n     */\n    protected function valid(array $input)\n    {\n        return $this->validator->with($input)->passes();\n    }\n}\n"
  },
  {
    "path": "app/Services/Form/Deployment/DeploymentFormLaravelValidator.php",
    "content": "<?php\n\nnamespace App\\Services\\Form\\Deployment;\n\nuse App\\Services\\Validation\\AbstractLaravelValidator;\n\nclass DeploymentFormLaravelValidator extends AbstractLaravelValidator\n{\n    protected $rules = [\n        'project_id' => 'required|exists:projects,id',\n        'task'       => 'required|in:deploy,rollback',\n        'user_id'    => 'required|exists:users,id',\n    ];\n}\n"
  },
  {
    "path": "app/Services/Form/Project/ProjectForm.php",
    "content": "<?php\n\nnamespace App\\Services\\Form\\Project;\n\nuse App\\Services\\Validation\\ValidableInterface;\nuse App\\Repositories\\Project\\ProjectInterface;\nuse DB;\n\nclass ProjectForm\n{\n    protected $validator;\n\n    protected $project;\n\n    /**\n     * Create a new form service instance.\n     *\n     * @param \\App\\Services\\Validation\\ValidableInterface $validator\n     * @param \\App\\Repositories\\Project\\ProjectInterface  $project\n     * @return void\n     */\n    public function __construct(ValidableInterface $validator, ProjectInterface $project)\n    {\n        $this->validator = $validator;\n        $this->project   = $project;\n    }\n\n    /**\n     * Create a new project.\n     *\n     * @param array $input Data to create a project\n     * @return boolean\n     */\n    public function save(array $input)\n    {\n        $input['recipe_id'] = explode(',', $input['recipe_id_order']);\n\n        if (!$this->valid($input)) {\n            return false;\n        }\n\n        DB::transaction(function () use ($input) {\n            $projectAttribute = new \\App\\Entities\\ProjectAttribute\\ProjectAttributeEntity;\n            if (!empty($input['deploy_path'])) {\n                $projectAttribute->setDeployPath($input['deploy_path']);\n            }\n            $input['attributes'] = $projectAttribute;\n\n            if (isset($input['keep_last_deployment'])) {\n                $input['keep_last_deployment'] = true;\n            } else {\n                $input['keep_last_deployment'] = false;\n            }\n\n            $project = $this->project->create($input);\n\n            $project->addMaxDeployment();\n            $project->syncRecipes($input['recipe_id']);\n        });\n\n        return true;\n    }\n\n    /**\n     * Update an existing project.\n     *\n     * @param array $input Data to update a project\n     * @return boolean\n     */\n    public function update(array $input)\n    {\n        $input['recipe_id'] = explode(',', $input['recipe_id_order']);\n\n        if (!$this->valid($input)) {\n            return false;\n        }\n\n        DB::transaction(function () use ($input) {\n            $project = $this->project->byId($input['id']);\n\n            $project->syncRecipes($input['recipe_id']);\n\n            $projectAttribute = new \\App\\Entities\\ProjectAttribute\\ProjectAttributeEntity;\n            if (!empty($input['deploy_path'])) {\n                $projectAttribute->setDeployPath($input['deploy_path']);\n            }\n            $input['attributes'] = $projectAttribute;\n\n            if (isset($input['keep_last_deployment'])) {\n                $input['keep_last_deployment'] = true;\n            } else {\n                $input['keep_last_deployment'] = false;\n            }\n\n            $this->project->update($input);\n        });\n\n        return true;\n    }\n\n    /**\n     * Return validation errors.\n     *\n     * @return array\n     */\n    public function errors()\n    {\n        return $this->validator->errors();\n    }\n\n    /**\n     * Test whether form validator passes.\n     *\n     * @return boolean\n     */\n    protected function valid(array $input)\n    {\n        return $this->validator->with($input)->passes();\n    }\n}\n"
  },
  {
    "path": "app/Services/Form/Project/ProjectFormLaravelValidator.php",
    "content": "<?php\n\nnamespace App\\Services\\Form\\Project;\n\nuse App\\Services\\Validation\\AbstractLaravelValidator;\n\nclass ProjectFormLaravelValidator extends AbstractLaravelValidator\n{\n    protected $rules = [\n        'name'                              => 'required',\n        'stage'                             => 'required',\n        'recipe_id'                         => 'required',\n        'server_id'                         => 'required|exists:servers,id',\n        'repository'                        => 'required|url',\n        'deploy_path'                       => 'string',\n        'email_notification_recipient'      => 'email',\n        'days_to_keep_deployments'          => 'integer|min:1',\n        'max_number_of_deployments_to_keep' => 'integer|min:1',\n        'keep_last_deployment'              => 'boolean',\n        'github_webhook_secret'             => 'string',\n    ];\n\n    protected function rules()\n    {\n        $rules = [];\n\n        if (isset($this->data['recipe_id'])) {\n            foreach ($this->data['recipe_id'] as $key => $val) {\n                $rules[\"recipe_id.$key\"] = 'required|exists:recipes,id';\n            }\n        }\n\n        // HACK Laravel 5.2 URL validation doesn't work with PHP 7.3 due to preg_match() error.\n        if (version_compare(phpversion(), '7.3.0', '>=')) {\n            $rules['repository'] = 'required';\n        }\n\n        return $rules;\n    }\n}\n"
  },
  {
    "path": "app/Services/Form/Recipe/RecipeForm.php",
    "content": "<?php\n\nnamespace App\\Services\\Form\\Recipe;\n\nuse App\\Services\\Validation\\ValidableInterface;\nuse App\\Repositories\\Recipe\\RecipeInterface;\n\nclass RecipeForm\n{\n    protected $validator;\n\n    protected $recipe;\n\n    /**\n     * Create a new form service instance.\n     *\n     * @param \\App\\Services\\Validation\\ValidableInterface $validator\n     * @param \\App\\Repositories\\Recipe\\RecipeInterface    $recipe\n     * @return void\n     */\n    public function __construct(ValidableInterface $validator, RecipeInterface $recipe)\n    {\n        $this->validator = $validator;\n        $this->recipe    = $recipe;\n    }\n\n    /**\n     * Create a new recipe.\n     *\n     * @param array $input Data to create a recipe\n     * @return boolean\n     */\n    public function save(array $input)\n    {\n        if (!$this->valid($input)) {\n            return false;\n        }\n\n        return $this->recipe->create($input);\n    }\n\n    /**\n     * Update an existing recipe.\n     *\n     * @param array $input Data to update a recipe\n     * @return boolean\n     */\n    public function update(array $input)\n    {\n        if (!$this->valid($input)) {\n            return false;\n        }\n\n        return $this->recipe->update($input);\n    }\n\n    /**\n     * Return validation errors.\n     *\n     * @return array\n     */\n    public function errors()\n    {\n        return $this->validator->errors();\n    }\n\n    /**\n     * Test whether form validator passes.\n     *\n     * @return boolean\n     */\n    protected function valid(array $input)\n    {\n        return $this->validator->with($input)->passes();\n    }\n}\n"
  },
  {
    "path": "app/Services/Form/Recipe/RecipeFormLaravelValidator.php",
    "content": "<?php\n\nnamespace App\\Services\\Form\\Recipe;\n\nuse App\\Services\\Validation\\AbstractLaravelValidator;\n\nclass RecipeFormLaravelValidator extends AbstractLaravelValidator\n{\n    protected $rules = [\n        'name' => 'required',\n        'body' => 'required',\n    ];\n}\n"
  },
  {
    "path": "app/Services/Form/Server/ServerForm.php",
    "content": "<?php\n\nnamespace App\\Services\\Form\\Server;\n\nuse App\\Services\\Validation\\ValidableInterface;\nuse App\\Repositories\\Server\\ServerInterface;\n\nclass ServerForm\n{\n    protected $validator;\n\n    protected $server;\n\n    /**\n     * Create a new form service instance.\n     *\n     * @param \\App\\Services\\Validation\\ValidableInterface $validator\n     * @param \\App\\Repositories\\Server\\ServerInterface    $server\n     * @return void\n     */\n    public function __construct(ValidableInterface $validator, ServerInterface $server)\n    {\n        $this->validator = $validator;\n        $this->server    = $server;\n    }\n\n    /**\n     * Create a new server.\n     *\n     * @param array $input Data to create a server\n     * @return boolean\n     */\n    public function save(array $input)\n    {\n        if (!$this->valid($input)) {\n            return false;\n        }\n\n        return $this->server->create($input);\n    }\n\n    /**\n     * Update an existing server.\n     *\n     * @param array $input Data to update a server\n     * @return boolean\n     */\n    public function update(array $input)\n    {\n        if (!$this->valid($input)) {\n            return false;\n        }\n\n        return $this->server->update($input);\n    }\n\n    /**\n     * Return validation errors.\n     *\n     * @return array\n     */\n    public function errors()\n    {\n        return $this->validator->errors();\n    }\n\n    /**\n     * Test whether form validator passes.\n     *\n     * @return boolean\n     */\n    protected function valid(array $input)\n    {\n        return $this->validator->with($input)->passes();\n    }\n}\n"
  },
  {
    "path": "app/Services/Form/Server/ServerFormLaravelValidator.php",
    "content": "<?php\n\nnamespace App\\Services\\Form\\Server;\n\nuse App\\Services\\Validation\\AbstractLaravelValidator;\n\nclass ServerFormLaravelValidator extends AbstractLaravelValidator\n{\n    protected $rules = [\n        'name' => 'required',\n        'body' => 'required',\n    ];\n}\n"
  },
  {
    "path": "app/Services/Form/Setting/MailSettingForm.php",
    "content": "<?php\n\nnamespace App\\Services\\Form\\Setting;\n\nuse App\\Services\\Validation\\ValidableInterface;\nuse App\\Repositories\\Setting\\SettingInterface;\n\nclass MailSettingForm\n{\n    protected $validator;\n\n    protected $setting;\n\n    /**\n     * Create a new form service instance.\n     *\n     * @param \\App\\Services\\Validation\\ValidableInterface $validator\n     * @param \\App\\Repositories\\Setting\\SettingInterface  $setting\n     * @return void\n     */\n    public function __construct(ValidableInterface $validator, SettingInterface $setting)\n    {\n        $this->validator = $validator;\n        $this->setting   = $setting;\n    }\n\n    /**\n     * Update an existing setting.\n     *\n     * @param array $input Data to update a setting\n     * @return boolean\n     */\n    public function update(array $input)\n    {\n        if (!$this->valid($input)) {\n            return false;\n        }\n\n        foreach ($input as $key => $value) {\n            if ($value === '') {\n                $input[$key] = null;\n            }\n        }\n\n        $mailSetting = new \\App\\Entities\\Setting\\MailSettingEntity;\n        $mailSetting->setDriver($input['driver']);\n        $mailSetting->setFrom([\n            'address' => $input['from_address'],\n            'name'    => $input['from_name'],\n        ]);\n        $mailSetting->setSmtpHost($input['smtp_host']);\n        $mailSetting->setSmtpPort($input['smtp_port']);\n        $mailSetting->setSmtpEncryption($input['smtp_encryption']);\n        $mailSetting->setSmtpUsername($input['smtp_username']);\n        $mailSetting->setSmtpPassword($input['smtp_password']);\n        $mailSetting->setSendmailPath($input['sendmail_path']);\n\n        $input['attributes'] = $mailSetting;\n        $input['type'] = 'mail';\n\n        $this->setting->updateByType($input);\n\n        return true;\n    }\n\n    /**\n     * Return validation errors.\n     *\n     * @return array\n     */\n    public function errors()\n    {\n        return $this->validator->errors();\n    }\n\n    /**\n     * Test whether form validator passes.\n     *\n     * @return boolean\n     */\n    protected function valid(array $input)\n    {\n        return $this->validator->with($input)->passes();\n    }\n}\n"
  },
  {
    "path": "app/Services/Form/Setting/MailSettingFormLaravelValidator.php",
    "content": "<?php\n\nnamespace App\\Services\\Form\\Setting;\n\nuse App\\Services\\Validation\\AbstractLaravelValidator;\n\nclass MailSettingFormLaravelValidator extends AbstractLaravelValidator\n{\n    protected $rules = [\n        'driver'            => 'required|in:smtp,mail,sendmail',\n        'from_address'      => 'required|email',\n        'from_name'         => 'sometimes',\n        'smtp_host'         => 'sometimes',\n        'smtp_port'         => 'sometimes|integer|min:0|max:65535',\n        'smtp_encryption'   => 'sometimes|in:tls,ssl',\n        'smtp_username'     => 'sometimes',\n        'smtp_password'     => 'sometimes',\n        'sendmail_path'     => 'sometimes',\n    ];\n}\n"
  },
  {
    "path": "app/Services/Form/User/UserForm.php",
    "content": "<?php\n\nnamespace App\\Services\\Form\\User;\n\nuse DB;\nuse Hash;\nuse App\\Services\\Validation\\ValidableInterface;\nuse App\\Repositories\\User\\UserInterface;\n\nclass UserForm\n{\n    protected $validator;\n\n    protected $user;\n\n    /**\n     * Create a new form service instance.\n     *\n     * @param \\App\\Services\\Validation\\ValidableInterface $validator\n     * @param \\App\\Repositories\\User\\UserInterface        $user\n     * @return void\n     */\n    public function __construct(ValidableInterface $validator, UserInterface $user)\n    {\n        $this->validator = $validator;\n        $this->user      = $user;\n    }\n\n    /**\n     * Create a new user.\n     *\n     * @param array $input Data to create a user\n     * @return boolean\n     */\n    public function save(array $input)\n    {\n        if (!$this->valid($input)) {\n            return false;\n        }\n\n        if (isset($input['password'])) {\n            $input['password'] = Hash::make($input['password']);\n        }\n\n        $input['api_token'] = str_random(60);\n\n        DB::transaction(function () use ($input) {\n            $user = $this->user->create($input);\n\n            if (isset($input['role'])) {\n                $user->assignRole($input['role']);\n            }\n        });\n\n        return true;\n    }\n\n    /**\n     * Update an existing user.\n     *\n     * @param array $input Data to update a user\n     * @return boolean\n     */\n    public function update(array $input)\n    {\n        if (!$this->valid($input)) {\n            return false;\n        }\n\n        DB::transaction(function () use ($input) {\n            $this->user->update($input);\n        });\n\n        return true;\n    }\n\n    /**\n     * Update a password of an existing user.\n     *\n     * @param array $input Data to update a user\n     * @return boolean\n     */\n    public function updatePassword(array $input)\n    {\n        if (!$this->valid($input)) {\n            return false;\n        }\n\n        $input['password'] = Hash::make($input['password']);\n\n        return $this->user->update($input);\n    }\n\n    /**\n     * Update a role of an existing user.\n     *\n     * @param array $input Data to update a user\n     * @return boolean\n     */\n    public function updateRole(array $input)\n    {\n        if (!$this->valid($input)) {\n            return false;\n        }\n\n        if (!isset($input['role'])) {\n            $input['role'] = [];\n        }\n\n        DB::transaction(function () use ($input) {\n            $user = $this->user->byId($input['id']);\n\n            $user->revokeAllRoles();\n\n            if (!empty($input['role'])) {\n                $user->assignRole($input['role']);\n            }\n        });\n\n        return true;\n    }\n\n    public function regenerateApiToken(array $input)\n    {\n        $input['api_token'] = str_random(60);\n\n        return $this->user->update($input);\n\n        return true;\n    }\n\n    /**\n     * Return validation errors.\n     *\n     * @return array\n     */\n    public function errors()\n    {\n        return $this->validator->errors();\n    }\n\n    /**\n     * Test whether form validator passes.\n     *\n     * @return boolean\n     */\n    protected function valid(array $input)\n    {\n        return $this->validator->with($input)->passes();\n    }\n}\n"
  },
  {
    "path": "app/Services/Form/User/UserFormLaravelValidator.php",
    "content": "<?php\n\nnamespace App\\Services\\Form\\User;\n\nuse App\\Services\\Validation\\AbstractLaravelValidator;\n\nclass UserFormLaravelValidator extends AbstractLaravelValidator\n{\n    protected $rules = [\n        'name'     => 'sometimes|required',\n        'password' => 'sometimes|required|min:8|confirmed',\n        'role'     => 'sometimes|required',\n    ];\n\n    protected function rules()\n    {\n        $rules = [];\n\n        // For role\n        if (isset($this->data['role'])) {\n            foreach ($this->data['role'] as $key => $val) {\n                $rules[\"role.$key\"] = 'required|exists:roles,id';\n            }\n        }\n\n        // For email\n        $unique = 'unique:users,email';\n\n        if (isset($this->data['id'])) {\n            $unique .= ','.$this->data['id'];\n        }\n\n        $rules['email'] = \"sometimes|required|email|$unique\";\n\n        return $rules;\n    }\n}\n"
  },
  {
    "path": "app/Services/Notification/MailNotifier.php",
    "content": "<?php\n\nnamespace App\\Services\\Notification;\n\nuse Mail;\n\nclass MailNotifier implements NotifierInterface\n{\n    /**\n     * Recipient of notification.\n     *\n     * @var string\n     */\n    protected $to;\n\n    /**\n     * Sender of notification.\n     *\n     * @var string\n     */\n    protected $from;\n\n    /**\n     * Recipient of notification.\n     *\n     * @param string $to The recipient\n     * @return App\\Services\\Notification\\NotifierInterface Return self for chainability\n     */\n    public function to($to)\n    {\n        $this->to = $to;\n\n        return $this;\n    }\n\n    /**\n     * Sender of notification.\n     *\n     * @param string $from The sender\n     * @return App\\Services\\Notification\\NotifierInterface Return self for chainability\n     */\n    public function from($from)\n    {\n        $this->from = $from;\n\n        return $this;\n    }\n\n    /**\n     * Send notification.\n     *\n     * @param string $subject The subject of notification\n     * @param string $message The message of notification\n     * @return void\n     */\n    public function notify($subject, $message)\n    {\n        Mail::raw($message, function ($m) use ($subject) {\n            $m->to($this->to)->subject($subject);\n        });\n    }\n}\n"
  },
  {
    "path": "app/Services/Notification/NotifierInterface.php",
    "content": "<?php\n\nnamespace App\\Services\\Notification;\n\ninterface NotifierInterface\n{\n    /**\n     * Recipient of notification.\n     *\n     * @var string\n     */\n    public function to($to);\n\n    /**\n     * Sender of notification.\n     *\n     * @param string $from The sender\n     * @return App\\Services\\Notification\\NotifierInterface Return self for chainability\n     */\n    public function from($from);\n\n    /**\n     * Send notification.\n     *\n     * @param string $subject The subject of notification\n     * @param string $message The message of notification\n     * @return void\n     */\n    public function notify($subject, $message);\n}\n"
  },
  {
    "path": "app/Services/Validation/AbstractLaravelValidator.php",
    "content": "<?php\n\nnamespace App\\Services\\Validation;\n\nuse Illuminate\\Validation\\Factory;\n\nabstract class AbstractLaravelValidator implements ValidableInterface\n{\n    protected $validator;\n\n    protected $data = [];\n\n    protected $errors = [];\n\n    protected $rules = [];\n\n    /**\n     * Create a new validator instance.\n     *\n     * @param \\Illuminate\\Validation\\Factory $validator\n     * @return void\n     */\n    public function __construct(Factory $validator)\n    {\n        $this->validator = $validator;\n    }\n\n    /**\n     * Add data to validation.\n     *\n     * @param array Data to validation\n     * @return \\App\\Services\\Validation\\ValidableInterface $this\n     */\n    public function with(array $data)\n    {\n        $this->data = $data;\n\n        return $this;\n    }\n\n    /**\n     * Test whether passes validation.\n     *\n     * @return boolean\n     */\n    public function passes()\n    {\n        $rules = array_merge($this->rules, $this->rules());\n\n        $validator = $this->validator->make($this->data, $rules);\n\n        if ($validator->fails()) {\n            $this->errors = $validator->messages();\n\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Return validation errors.\n     *\n     * @return array\n     */\n    public function errors()\n    {\n        return $this->errors;\n    }\n\n    /**\n     * Return validation rules.\n     *\n     * @return array\n     */\n    protected function rules()\n    {\n        return [];\n    }\n}\n"
  },
  {
    "path": "app/Services/Validation/ValidableInterface.php",
    "content": "<?php\n\nnamespace App\\Services\\Validation;\n\ninterface ValidableInterface\n{\n    /**\n     * Add data to validation.\n     *\n     * @param array Data to validation\n     * @return \\App\\Services\\Validation\\ValidableInterface $this\n     */\n    public function with(array $input);\n\n    /**\n     * Test whether passes validation.\n     *\n     * @return boolean\n     */\n    public function passes();\n\n    /**\n     * Return validation errors.\n     *\n     * @return array\n     */\n    public function errors();\n}\n"
  },
  {
    "path": "app/Specifications/DeploymentSpecification.php",
    "content": "<?php\n\nnamespace App\\Specifications;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass DeploymentSpecification\n{\n    /**\n     * Get elements that satisfy the specification.\n     *\n     * @param \\Illuminate\\Database\\Eloquent\\Model $project\n     * @return \\Illuminate\\Support\\Collection\n     */\n    public function satisfyingElementsFrom(Model $project)\n    {\n        return $project->getDeployments();\n    }\n}\n"
  },
  {
    "path": "app/Specifications/OldDeploymentSpecification.php",
    "content": "<?php\n\nnamespace App\\Specifications;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse DateTime;\n\nclass OldDeploymentSpecification extends DeploymentSpecification\n{\n    protected $currentDate;\n\n    public function __construct(DateTime $currentDate)\n    {\n        $this->currentDate = $currentDate;\n    }\n\n    /**\n     * Get elements that satisfy the specification.\n     *\n     * @param \\Illuminate\\Database\\Eloquent\\Model $project\n     * @return \\Illuminate\\Support\\Collection\n     */\n    public function satisfyingElementsFrom(Model $project)\n    {\n        if ($project->getDeployments()->isEmpty()) {\n            return collect([]);\n        }\n\n        $oldDeployments = collect([]);\n        $pastDaysToKeepDeployments = collect([]);\n        $pastNumToKeepDeployments = collect([]);\n\n        if (!is_null($project->days_to_keep_deployments)) {\n            $currentDate = clone $this->currentDate;\n            $date = $currentDate->modify('-'.$project->days_to_keep_deployments.' days');\n            $pastDaysToKeepDeployments = $project->getDeploymentsWhereCreatedAtBefore($date);\n\n            if ($project->keep_last_deployment && $pastDaysToKeepDeployments->contains($project->getLastDeployment())) {\n                $pastDaysToKeepDeployments->shift();\n            }\n        }\n\n        if (!is_null($project->max_number_of_deployments_to_keep)) {\n            $number = $project->getLastDeployment()->number - $project->max_number_of_deployments_to_keep + 1;\n            $pastNumToKeepDeployments = $project->getDeploymentsWhereNumberBefore($number);\n        }\n\n        return $oldDeployments->merge($pastDaysToKeepDeployments)\n            ->merge($pastNumToKeepDeployments)\n            ->sortByDesc('number')\n            ->unique('number')\n            ->values();\n    }\n}\n"
  },
  {
    "path": "app/Traits/RestExceptionHandlerTrait.php",
    "content": "<?php\n\nnamespace App\\Traits;\n\nuse Exception;\nuse Illuminate\\Http\\Request;\nuse Symfony\\Component\\HttpKernel\\Exception\\HttpException;\n\ntrait RestExceptionHandlerTrait\n{\n    /**\n     * Create a new JSON response based on exception type.\n     *\n     * @param \\Illuminate\\Http\\Request $request\n     * @param \\Exception               $e\n     * @return \\Illuminate\\Http\\JsonResponse\n     */\n    protected function getJsonResponseForException(Request $request, Exception $e)\n    {\n        if ($e instanceof HttpException) {\n            if ($e->getStatusCode() == 401) {\n                return $this->unauthorized();\n            } elseif ($e->getStatusCode() == 404) {\n                return $this->notFound();\n            } elseif ($e->getStatusCode() < 500) {\n                return $this->badRequest();\n            } else {\n                return $this->internalError();\n            }\n        } else {\n            return $this->internalError();\n        }\n    }\n\n    /**\n     * Return JSON response for bad request.\n     *\n     * @param string $message\n     * @param int    $statusCode\n     * @return \\Illuminate\\Http\\JsonResponse\n     */\n    protected function badRequest($message = 'Bad request', $statusCode = 400)\n    {\n        return $this->jsonResponse(['error' => $message], $statusCode);\n    }\n\n    /**\n     * Return JSON response for unauthorized.\n     *\n     * @param string $message\n     * @param int    $statusCode\n     * @return \\Illuminate\\Http\\JsonResponse\n     */\n    protected function unauthorized($message = 'Unauthorized', $statusCode = 401)\n    {\n        return $this->jsonResponse(['error' => $message], $statusCode);\n    }\n\n    /**\n     * Return JSON response for not found.\n     *\n     * @param string $message\n     * @param int    $statusCode\n     * @return \\Illuminate\\Http\\JsonResponse\n     */\n    protected function notFound($message = 'Not found', $statusCode = 404)\n    {\n        return $this->jsonResponse(['error' => $message], $statusCode);\n    }\n\n    /**\n     * Return JSON response for internal error.\n     *\n     * @param string $message\n     * @param int    $statusCode\n     * @return \\Illuminate\\Http\\JsonResponse\n     */\n    protected function internalError($message = 'Internal error', $statusCode = 500)\n    {\n        return $this->jsonResponse(['error' => $message], $statusCode);\n    }\n\n    /**\n     * Return JSON response.\n     *\n     * @param array|null $payload\n     * @param int        $statusCode\n     * @return \\Illuminate\\Http\\JsonResponse\n     */\n    protected function jsonResponse(array $payload = null, $statusCode = 404)\n    {\n        $payload = $payload ?: [];\n\n        return response()->json($payload, $statusCode);\n    }\n}\n"
  },
  {
    "path": "artisan",
    "content": "#!/usr/bin/env php\n<?php\n\n/*\n|--------------------------------------------------------------------------\n| Register The Auto Loader\n|--------------------------------------------------------------------------\n|\n| Composer provides a convenient, automatically generated class loader\n| for our application. We just need to utilize it! We'll require it\n| into the script here so that we do not have to worry about the\n| loading of any our classes \"manually\". Feels great to relax.\n|\n*/\n\nrequire __DIR__.'/bootstrap/autoload.php';\n\n$app = require_once __DIR__.'/bootstrap/app.php';\n\n/*\n|--------------------------------------------------------------------------\n| Run The Artisan Application\n|--------------------------------------------------------------------------\n|\n| When we run the console application, the current CLI command will be\n| executed in this console and the response sent back to a terminal\n| or another output device for the developers. Here goes nothing!\n|\n*/\n\n$kernel = $app->make('Illuminate\\Contracts\\Console\\Kernel');\n\n$status = $kernel->handle(\n    $input = new Symfony\\Component\\Console\\Input\\ArgvInput,\n    new Symfony\\Component\\Console\\Output\\ConsoleOutput\n);\n\n/*\n|--------------------------------------------------------------------------\n| Shutdown The Application\n|--------------------------------------------------------------------------\n|\n| Once Artisan has finished running. We will fire off the shutdown events\n| so that any final work may be done by the application before we shut\n| down the process. This is the last thing to happen to the request.\n|\n*/\n\n$kernel->terminate($input, $status);\n\nexit($status);\n"
  },
  {
    "path": "bootstrap/app.php",
    "content": "<?php\n\n/*\n|--------------------------------------------------------------------------\n| Create The Application\n|--------------------------------------------------------------------------\n|\n| The first thing we will do is create a new Laravel application instance\n| which serves as the \"glue\" for all the components of Laravel, and is\n| the IoC container for the system binding all of the various parts.\n|\n*/\n\n$app = new Illuminate\\Foundation\\Application(\n    realpath(__DIR__.'/../')\n);\n\n/*\n|--------------------------------------------------------------------------\n| Bind Important Interfaces\n|--------------------------------------------------------------------------\n|\n| Next, we need to bind some important interfaces into the container so\n| we will be able to resolve them when needed. The kernels serve the\n| incoming requests to this application from both the web and CLI.\n|\n*/\n\n$app->singleton(\n    'Illuminate\\Contracts\\Http\\Kernel',\n    'App\\Http\\Kernel'\n);\n\n$app->singleton(\n    'Illuminate\\Contracts\\Console\\Kernel',\n    'App\\Console\\Kernel'\n);\n\n$app->singleton(\n    'Illuminate\\Contracts\\Debug\\ExceptionHandler',\n    'App\\Exceptions\\Handler'\n);\n\n/*\n|--------------------------------------------------------------------------\n| Return The Application\n|--------------------------------------------------------------------------\n|\n| This script returns the application instance. The instance is given to\n| the calling script so we can separate the building of the instances\n| from the actual running of the application and sending responses.\n|\n*/\n\nreturn $app;\n"
  },
  {
    "path": "bootstrap/autoload.php",
    "content": "<?php\n\ndefine('LARAVEL_START', microtime(true));\n\n/*\n|--------------------------------------------------------------------------\n| Register The Composer Auto Loader\n|--------------------------------------------------------------------------\n|\n| Composer provides a convenient, automatically generated class loader\n| for our application. We just need to utilize it! We'll require it\n| into the script here so that we do not have to worry about the\n| loading of any our classes \"manually\". Feels great to relax.\n|\n*/\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/*\n|--------------------------------------------------------------------------\n| Include The Compiled Class File\n|--------------------------------------------------------------------------\n|\n| To dramatically increase your application's performance, you may use a\n| compiled class file which contains all of the classes commonly used\n| by a request. The Artisan \"optimize\" is used to create this file.\n|\n*/\n\n$compiledPath = __DIR__.'/cache/compiled.php';\n\nif (file_exists($compiledPath)) {\n    require $compiledPath;\n}\n"
  },
  {
    "path": "bootstrap/cache/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "composer.json",
    "content": "{\n    \"name\": \"ngmy/webloyer\",\n    \"description\": \"Webloyer is a Web UI for managing Deployer deployments\",\n    \"keywords\": [\"deployer\", \"deploy\", \"deployment\"],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Yuta Nagamiya\",\n            \"email\": \"y.nagamiya@gmail.com\"\n        }\n    ],\n    \"type\": \"project\",\n    \"repositories\": [\n        {\n            \"type\": \"package\",\n            \"package\": {\n                \"name\": \"ajaxorg/ace-builds\",\n                \"version\": \"1.2.0\",\n                \"source\": {\n                    \"url\": \"https://github.com/ajaxorg/ace-builds.git\",\n                    \"type\": \"git\",\n                    \"reference\": \"v1.2.0\"\n                }\n            }\n        },\n        {\n            \"type\": \"package\",\n            \"package\": {\n                \"name\": \"lou/multi-select\",\n                \"version\": \"0.9.12\",\n                \"source\": {\n                    \"url\": \"https://github.com/lou/multi-select.git\",\n                    \"type\": \"git\",\n                    \"reference\": \"0.9.12\"\n                }\n            }\n        },\n        {\n            \"type\": \"vcs\",\n            \"url\": \"https://github.com/matasarei/JsonRPC.git\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.6.0\",\n        \"laravel/framework\": \"5.2.*\",\n        \"laravelcollective/html\": \"5.2.*\",\n        \"davejamesmiller/laravel-breadcrumbs\": \"3.0.*\",\n        \"robclancy/presenter\": \"1.3.*\",\n        \"ajaxorg/ace-builds\": \"~1.2.0\",\n        \"lou/multi-select\": \"0.9.12\",\n        \"kodeine/laravel-acl\": \"~1.0@dev\",\n        \"sensiolabs/ansi-to-html\": \"~1.0\",\n        \"symfony/yaml\": \"~3.0\",\n        \"ngmy/eloquent-serialized-lob\": \"^0.1.0\",\n        \"fguillot/json-rpc\": \"~v1.2.1\",\n        \"deployer/deployer\": \"^4.0\"\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"~5.0\",\n        \"symfony/dom-crawler\": \"~3.0\",\n        \"symfony/css-selector\": \"~3.0\",\n        \"mockery/mockery\": \"dev-master\",\n        \"mikey179/vfsstream\": \"~1\",\n        \"php-coveralls/php-coveralls\": \"^2.2\"\n    },\n    \"autoload\": {\n        \"classmap\": [\n            \"database\"\n        ],\n        \"psr-4\": {\n            \"App\\\\\": \"app/\"\n        }\n    },\n    \"autoload-dev\": {\n        \"classmap\": [\n            \"tests/TestCase.php\",\n            \"tests/_helpers\"\n        ]\n    },\n    \"scripts\": {\n        \"post-install-cmd\": [\n            \"mkdir -p public/js/vendor/ajaxorg\",\n            \"ln -nfs $(pwd)/vendor/ajaxorg/ace-builds/src-min-noconflict public/js/vendor/ajaxorg/ace\",\n            \"mkdir -p public/vendor/lou/multi-select\",\n            \"cp -r $(pwd)/vendor/lou/multi-select/js public/vendor/lou/multi-select\",\n            \"cp -r $(pwd)/vendor/lou/multi-select/css public/vendor/lou/multi-select\",\n            \"cp -r $(pwd)/vendor/lou/multi-select/img public/vendor/lou/multi-select\",\n            \"php artisan clear-compiled\",\n            \"php artisan optimize\"\n        ],\n        \"post-update-cmd\": [\n            \"mkdir -p public/js/vendor/ajaxorg\",\n            \"ln -nfs $(pwd)/vendor/ajaxorg/ace-builds/src-min-noconflict public/js/vendor/ajaxorg/ace\",\n            \"mkdir -p public/vendor/lou/multi-select\",\n            \"cp -r $(pwd)/vendor/lou/multi-select/js public/vendor/lou/multi-select\",\n            \"cp -r $(pwd)/vendor/lou/multi-select/css public/vendor/lou/multi-select\",\n            \"cp -r $(pwd)/vendor/lou/multi-select/img public/vendor/lou/multi-select\",\n            \"php artisan clear-compiled\",\n            \"php artisan optimize\"\n        ],\n        \"post-create-project-cmd\": [\n            \"php -r \\\"copy('.env.example', '.env');\\\"\",\n            \"php artisan key:generate\"\n        ]\n    },\n    \"config\": {\n        \"preferred-install\": \"dist\"\n    }\n}\n"
  },
  {
    "path": "config/acl.php",
    "content": "<?php\n\nreturn [\n\n    /**\n     * Model definitions.\n     * If you want to use your own model and extend it\n     * to package's model. You can define your model here.\n     */\n\n    'role'       => 'Kodeine\\Acl\\Models\\Eloquent\\Role',\n    'permission' => 'Kodeine\\Acl\\Models\\Eloquent\\Permission',\n\n    /**\n     * NTFS right, the more permissive wins\n     * If you have multiple permission aliases assigned, each alias\n     * has a common permission, view.house => false, but one alias\n     * has it set to true. If ntfs right is enabled, true value\n     * wins the race, ie the more permissive wins.\n     */\n\n    'ntfs'       => false,\n];\n"
  },
  {
    "path": "config/app.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Environment\n    |--------------------------------------------------------------------------\n    |\n    | This value determines the \"environment\" your application is currently\n    | running in. This may determine how you prefer to configure various\n    | services your application utilizes. Set this in your \".env\" file.\n    |\n    */\n\n    'env' => env('APP_ENV', 'production'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Debug Mode\n    |--------------------------------------------------------------------------\n    |\n    | When your application is in debug mode, detailed error messages with\n    | stack traces will be shown on every error that occurs within your\n    | application. If disabled, a simple generic error page is shown.\n    |\n    */\n\n    'debug' => env('APP_DEBUG'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application URL\n    |--------------------------------------------------------------------------\n    |\n    | This URL is used by the console to properly generate URLs when using\n    | the Artisan command line tool. You should set this to the root of\n    | your application so that it is used when running Artisan tasks.\n    |\n    */\n\n    'url' => env('APP_URL', 'http://localhost'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Timezone\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the default timezone for your application, which\n    | will be used by the PHP date and date-time functions. We have gone\n    | ahead and set this to a sensible default for you out of the box.\n    |\n    */\n\n    'timezone' => 'UTC',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Locale Configuration\n    |--------------------------------------------------------------------------\n    |\n    | The application locale determines the default locale that will be used\n    | by the translation service provider. You are free to set this value\n    | to any of the locales which will be supported by the application.\n    |\n    */\n\n    'locale' => 'en',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Fallback Locale\n    |--------------------------------------------------------------------------\n    |\n    | The fallback locale determines the locale to use when the current one\n    | is not available. You may change the value to correspond to any of\n    | the language folders that are provided through your application.\n    |\n    */\n\n    'fallback_locale' => 'en',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Encryption Key\n    |--------------------------------------------------------------------------\n    |\n    | This key is used by the Illuminate encrypter service and should be set\n    | to a random, 32 character string, otherwise these encrypted strings\n    | will not be safe. Please do this before deploying an application!\n    |\n    */\n\n    'key' => env('APP_KEY', 'SomeRandomString'),\n\n    'cipher' => 'AES-256-CBC',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Logging Configuration\n    |--------------------------------------------------------------------------\n    |\n    | Here you may configure the log settings for your application. Out of\n    | the box, Laravel uses the Monolog PHP logging library. This gives\n    | you a variety of powerful log handlers / formatters to utilize.\n    |\n    | Available Settings: \"single\", \"daily\", \"syslog\", \"errorlog\"\n    |\n    */\n\n    'log' => 'daily',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Autoloaded Service Providers\n    |--------------------------------------------------------------------------\n    |\n    | The service providers listed here will be automatically loaded on the\n    | request to your application. Feel free to add your own services to\n    | this array to grant expanded functionality to your applications.\n    |\n    */\n\n    'providers' => [\n\n        /*\n         * Laravel Framework Service Providers...\n         */\n        Illuminate\\Auth\\AuthServiceProvider::class,\n        Illuminate\\Bus\\BusServiceProvider::class,\n        Illuminate\\Cache\\CacheServiceProvider::class,\n        Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider::class,\n        Illuminate\\Cookie\\CookieServiceProvider::class,\n        Illuminate\\Database\\DatabaseServiceProvider::class,\n        Illuminate\\Encryption\\EncryptionServiceProvider::class,\n        Illuminate\\Filesystem\\FilesystemServiceProvider::class,\n        Illuminate\\Foundation\\Providers\\FoundationServiceProvider::class,\n        Illuminate\\Hashing\\HashServiceProvider::class,\n        Illuminate\\Mail\\MailServiceProvider::class,\n        Illuminate\\Pagination\\PaginationServiceProvider::class,\n        Illuminate\\Pipeline\\PipelineServiceProvider::class,\n        Illuminate\\Queue\\QueueServiceProvider::class,\n        Illuminate\\Redis\\RedisServiceProvider::class,\n        Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider::class,\n        Illuminate\\Session\\SessionServiceProvider::class,\n        Illuminate\\Translation\\TranslationServiceProvider::class,\n        Illuminate\\Validation\\ValidationServiceProvider::class,\n        Illuminate\\View\\ViewServiceProvider::class,\n\n        /*\n         * Application Service Providers...\n         */\n        App\\Providers\\AppServiceProvider::class,\n        App\\Providers\\AuthServiceProvider::class,\n        App\\Providers\\EventServiceProvider::class,\n        App\\Providers\\RouteServiceProvider::class,\n\n        App\\Providers\\RepositoryServiceProvider::class,\n\n        Collective\\Html\\HtmlServiceProvider::class,\n        DaveJamesMiller\\Breadcrumbs\\ServiceProvider::class,\n        Robbo\\Presenter\\PresenterServiceProvider::class,\n        Kodeine\\Acl\\AclServiceProvider::class,\n        Ngmy\\EloquentSerializedLob\\SerializedLobTraitServiceProvider::class,\n\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Class Aliases\n    |--------------------------------------------------------------------------\n    |\n    | This array of class aliases will be registered when this application\n    | is started. However, feel free to register as many as you wish as\n    | the aliases are \"lazy\" loaded so they don't hinder performance.\n    |\n    */\n\n    'aliases' => [\n\n        'App'       => Illuminate\\Support\\Facades\\App::class,\n        'Artisan'   => Illuminate\\Support\\Facades\\Artisan::class,\n        'Auth'      => Illuminate\\Support\\Facades\\Auth::class,\n        'Blade'     => Illuminate\\Support\\Facades\\Blade::class,\n        'Bus'       => Illuminate\\Support\\Facades\\Bus::class,\n        'Cache'     => Illuminate\\Support\\Facades\\Cache::class,\n        'Config'    => Illuminate\\Support\\Facades\\Config::class,\n        'Cookie'    => Illuminate\\Support\\Facades\\Cookie::class,\n        'Crypt'     => Illuminate\\Support\\Facades\\Crypt::class,\n        'DB'        => Illuminate\\Support\\Facades\\DB::class,\n        'Eloquent'  => Illuminate\\Database\\Eloquent\\Model::class,\n        'Event'     => Illuminate\\Support\\Facades\\Event::class,\n        'File'      => Illuminate\\Support\\Facades\\File::class,\n        'Gate'      => Illuminate\\Support\\Facades\\Gate::class,\n        'Hash'      => Illuminate\\Support\\Facades\\Hash::class,\n        'Input'     => Illuminate\\Support\\Facades\\Input::class,\n        'Inspiring' => Illuminate\\Foundation\\Inspiring::class,\n        'Lang'      => Illuminate\\Support\\Facades\\Lang::class,\n        'Log'       => Illuminate\\Support\\Facades\\Log::class,\n        'Mail'      => Illuminate\\Support\\Facades\\Mail::class,\n        'Password'  => Illuminate\\Support\\Facades\\Password::class,\n        'Queue'     => Illuminate\\Support\\Facades\\Queue::class,\n        'Redirect'  => Illuminate\\Support\\Facades\\Redirect::class,\n        'Redis'     => Illuminate\\Support\\Facades\\Redis::class,\n        'Request'   => Illuminate\\Support\\Facades\\Request::class,\n        'Response'  => Illuminate\\Support\\Facades\\Response::class,\n        'Route'     => Illuminate\\Support\\Facades\\Route::class,\n        'Schema'    => Illuminate\\Support\\Facades\\Schema::class,\n        'Session'   => Illuminate\\Support\\Facades\\Session::class,\n        'Storage'   => Illuminate\\Support\\Facades\\Storage::class,\n        'URL'       => Illuminate\\Support\\Facades\\URL::class,\n        'Validator' => Illuminate\\Support\\Facades\\Validator::class,\n        'View'      => Illuminate\\Support\\Facades\\View::class,\n\n        'Form'        => Collective\\Html\\FormFacade::class,\n        'Html'        => Collective\\Html\\HtmlFacade::class,\n        'Breadcrumbs' => DaveJamesMiller\\Breadcrumbs\\Facade::class,\n\n    ],\n\n];\n"
  },
  {
    "path": "config/auth.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Authentication Defaults\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default authentication \"guard\" and password\n    | reset options for your application. You may change these defaults\n    | as required, but they're a perfect start for most applications.\n    |\n    */\n\n    'defaults' => [\n        'guard' => 'web',\n        'passwords' => 'users',\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Authentication Guards\n    |--------------------------------------------------------------------------\n    |\n    | Next, you may define every authentication guard for your application.\n    | Of course, a great default configuration has been defined for you\n    | here which uses session storage and the Eloquent user provider.\n    |\n    | All authentication drivers have a user provider. This defines how the\n    | users are actually retrieved out of your database or other storage\n    | mechanisms used by this application to persist your user's data.\n    |\n    | Supported: \"session\", \"token\"\n    |\n    */\n\n    'guards' => [\n        'web' => [\n            'driver' => 'session',\n            'provider' => 'users',\n        ],\n\n        'api' => [\n            'driver' => 'token',\n            'provider' => 'users',\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | User Providers\n    |--------------------------------------------------------------------------\n    |\n    | All authentication drivers have a user provider. This defines how the\n    | users are actually retrieved out of your database or other storage\n    | mechanisms used by this application to persist your user's data.\n    |\n    | If you have multiple user tables or models you may configure multiple\n    | sources which represent each model / table. These sources may then\n    | be assigned to any extra authentication guards you have defined.\n    |\n    | Supported: \"database\", \"eloquent\"\n    |\n    */\n\n    'providers' => [\n        'users' => [\n            'driver' => 'eloquent',\n            'model' => App\\Models\\User::class,\n        ],\n\n        // 'users' => [\n        //     'driver' => 'database',\n        //     'table' => 'users',\n        // ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Resetting Passwords\n    |--------------------------------------------------------------------------\n    |\n    | Here you may set the options for resetting passwords including the view\n    | that is your password reset e-mail. You may also set the name of the\n    | table that maintains all of the reset tokens for your application.\n    |\n    | You may specify multiple password reset configurations if you have more\n    | than one user table or model in the application and you want to have\n    | separate password reset settings based on the specific user types.\n    |\n    | The expire time is the number of minutes that the reset token should be\n    | considered valid. This security feature keeps tokens short-lived so\n    | they have less time to be guessed. You may change this as needed.\n    |\n    */\n\n    'passwords' => [\n        'users' => [\n            'provider' => 'users',\n            'email' => 'emails.password',\n            'table' => 'password_resets',\n            'expire' => 60,\n        ],\n    ],\n\n];\n"
  },
  {
    "path": "config/cache.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Cache Store\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default cache connection that gets used while\n    | using this caching library. This connection is used when another is\n    | not explicitly specified when executing a given caching function.\n    |\n    */\n\n    'default' => env('CACHE_DRIVER', 'file'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Cache Stores\n    |--------------------------------------------------------------------------\n    |\n    | Here you may define all of the cache \"stores\" for your application as\n    | well as their drivers. You may even define multiple stores for the\n    | same cache driver to group types of items stored in your caches.\n    |\n    */\n\n    'stores' => [\n\n        'apc' => [\n            'driver' => 'apc'\n        ],\n\n        'array' => [\n            'driver' => 'array'\n        ],\n\n        'database' => [\n            'driver' => 'database',\n            'table'  => 'cache',\n            'connection' => null,\n        ],\n\n        'file' => [\n            'driver' => 'file',\n            'path'   => storage_path().'/framework/cache',\n        ],\n\n        'memcached' => [\n            'driver'  => 'memcached',\n            'servers' => [\n                [\n                    'host' => '127.0.0.1', 'port' => 11211, 'weight' => 100\n                ],\n            ],\n        ],\n\n        'redis' => [\n            'driver' => 'redis',\n            'connection' => 'default',\n        ],\n\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Cache Key Prefix\n    |--------------------------------------------------------------------------\n    |\n    | When utilizing a RAM based store such as APC or Memcached, there might\n    | be other applications utilizing the same cache. So, we'll specify a\n    | value to get prefixed to all our keys so we can avoid collisions.\n    |\n    */\n\n    'prefix' => 'laravel',\n\n];\n"
  },
  {
    "path": "config/compile.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Additional Compiled Classes\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify additional classes to include in the compiled file\n    | generated by the `artisan optimize` command. These should be classes\n    | that are included on basically every request into the application.\n    |\n    */\n\n    'files' => [\n\n        realpath(__DIR__.'/../app/Providers/AppServiceProvider.php'),\n        realpath(__DIR__.'/../app/Providers/EventServiceProvider.php'),\n        realpath(__DIR__.'/../app/Providers/RouteServiceProvider.php'),\n\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Compiled File Providers\n    |--------------------------------------------------------------------------\n    |\n    | Here you may list service providers which define a \"compiles\" function\n    | that returns additional files that should be compiled, providing an\n    | easy way to get common files from any packages you are utilizing.\n    |\n    */\n\n    'providers' => [\n        //\n    ],\n\n];\n"
  },
  {
    "path": "config/database.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | PDO Fetch Style\n    |--------------------------------------------------------------------------\n    |\n    | By default, database results will be returned as instances of the PHP\n    | stdClass object; however, you may desire to retrieve records in an\n    | array format for simplicity. Here you can tweak the fetch style.\n    |\n    */\n\n    'fetch' => PDO::FETCH_CLASS,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Database Connection Name\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify which of the database connections below you wish\n    | to use as your default connection for all database work. Of course\n    | you may use many connections at once using the Database library.\n    |\n    */\n\n    'default' => env('DB_DRIVER', 'mysql'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Database Connections\n    |--------------------------------------------------------------------------\n    |\n    | Here are each of the database connections setup for your application.\n    | Of course, examples of configuring each database platform that is\n    | supported by Laravel is shown below to make development simple.\n    |\n    |\n    | All database work in Laravel is done through the PHP PDO facilities\n    | so make sure you have the driver for your particular database of\n    | choice installed on your machine before you begin development.\n    |\n    */\n\n    'connections' => [\n\n        'sqlite' => [\n            'driver'   => 'sqlite',\n            'database' => env('DB_DATABASE', storage_path().'/database.sqlite'),\n            'prefix'   => '',\n        ],\n\n        'mysql' => [\n            'driver'    => 'mysql',\n            'host'      => env('DB_HOST', 'localhost'),\n            'database'  => env('DB_DATABASE', 'forge'),\n            'username'  => env('DB_USERNAME', 'forge'),\n            'password'  => env('DB_PASSWORD', ''),\n            'charset'   => 'utf8',\n            'collation' => 'utf8_unicode_ci',\n            'prefix'    => '',\n            'strict'    => false,\n        ],\n\n        'pgsql' => [\n            'driver'   => 'pgsql',\n            'host'     => env('DB_HOST', 'localhost'),\n            'database' => env('DB_DATABASE', 'forge'),\n            'username' => env('DB_USERNAME', 'forge'),\n            'password' => env('DB_PASSWORD', ''),\n            'charset'  => 'utf8',\n            'prefix'   => '',\n            'schema'   => 'public',\n        ],\n\n        'sqlsrv' => [\n            'driver'   => 'sqlsrv',\n            'host'     => env('DB_HOST', 'localhost'),\n            'database' => env('DB_DATABASE', 'forge'),\n            'username' => env('DB_USERNAME', 'forge'),\n            'password' => env('DB_PASSWORD', ''),\n            'prefix'   => '',\n        ],\n\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Migration Repository Table\n    |--------------------------------------------------------------------------\n    |\n    | This table keeps track of all the migrations that have already run for\n    | your application. Using this information, we can determine which of\n    | the migrations on disk haven't actually been run in the database.\n    |\n    */\n\n    'migrations' => 'migrations',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Redis Databases\n    |--------------------------------------------------------------------------\n    |\n    | Redis is an open source, fast, and advanced key-value store that also\n    | provides a richer set of commands than a typical key-value systems\n    | such as APC or Memcached. Laravel makes it easy to dig right in.\n    |\n    */\n\n    'redis' => [\n\n        'cluster' => false,\n\n        'default' => [\n            'host'     => '127.0.0.1',\n            'port'     => 6379,\n            'database' => 0,\n        ],\n\n    ],\n\n];\n"
  },
  {
    "path": "config/filesystems.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Filesystem Disk\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the default filesystem disk that should be used\n    | by the framework. A \"local\" driver, as well as a variety of cloud\n    | based drivers are available for your choosing. Just store away!\n    |\n    | Supported: \"local\", \"s3\", \"rackspace\"\n    |\n    */\n\n    'default' => 'local',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Cloud Filesystem Disk\n    |--------------------------------------------------------------------------\n    |\n    | Many applications store files both locally and in the cloud. For this\n    | reason, you may specify a default \"cloud\" driver here. This driver\n    | will be bound as the Cloud disk implementation in the container.\n    |\n    */\n\n    'cloud' => 's3',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Filesystem Disks\n    |--------------------------------------------------------------------------\n    |\n    | Here you may configure as many filesystem \"disks\" as you wish, and you\n    | may even configure multiple disks of the same driver. Defaults have\n    | been setup for each driver as an example of the required options.\n    |\n    */\n\n    'disks' => [\n\n        'local' => [\n            'driver' => 'local',\n            'root'   => storage_path().'/app',\n        ],\n\n        's3' => [\n            'driver' => 's3',\n            'key'    => 'your-key',\n            'secret' => 'your-secret',\n            'region' => 'your-region',\n            'bucket' => 'your-bucket',\n        ],\n\n        'rackspace' => [\n            'driver'    => 'rackspace',\n            'username'  => 'your-username',\n            'key'       => 'your-key',\n            'container' => 'your-container',\n            'endpoint'  => 'https://identity.api.rackspacecloud.com/v2.0/',\n            'region'    => 'IAD',\n            'url_type'  => 'publicURL'\n        ],\n\n    ],\n\n];\n"
  },
  {
    "path": "config/mail.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Mail Driver\n    |--------------------------------------------------------------------------\n    |\n    | Laravel supports both SMTP and PHP's \"mail\" function as drivers for the\n    | sending of e-mail. You may specify which one you're using throughout\n    | your application here. By default, Laravel is setup for SMTP mail.\n    |\n    | Supported: \"smtp\", \"mail\", \"sendmail\", \"mailgun\", \"mandrill\", \"log\"\n    |\n    */\n\n    'driver' => env('MAIL_DRIVER', 'smtp'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | SMTP Host Address\n    |--------------------------------------------------------------------------\n    |\n    | Here you may provide the host address of the SMTP server used by your\n    | applications. A default option is provided that is compatible with\n    | the Mailgun mail service which will provide reliable deliveries.\n    |\n    */\n\n    'host' => env('MAIL_HOST', 'smtp.mailgun.org'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | SMTP Host Port\n    |--------------------------------------------------------------------------\n    |\n    | This is the SMTP port used by your application to deliver e-mails to\n    | users of the application. Like the host we have set this value to\n    | stay compatible with the Mailgun e-mail application by default.\n    |\n    */\n\n    'port' => env('MAIL_PORT', 587),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Global \"From\" Address\n    |--------------------------------------------------------------------------\n    |\n    | You may wish for all e-mails sent by your application to be sent from\n    | the same address. Here, you may specify a name and address that is\n    | used globally for all e-mails that are sent by your application.\n    |\n    */\n\n    'from' => ['address' => null, 'name' => null],\n\n    /*\n    |--------------------------------------------------------------------------\n    | E-Mail Encryption Protocol\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the encryption protocol that should be used when\n    | the application send e-mail messages. A sensible default using the\n    | transport layer security protocol should provide great security.\n    |\n    */\n\n    'encryption' => env('MAIL_ENCRYPTION', 'tls'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | SMTP Server Username\n    |--------------------------------------------------------------------------\n    |\n    | If your SMTP server requires a username for authentication, you should\n    | set it here. This will get used to authenticate with your server on\n    | connection. You may also set the \"password\" value below this one.\n    |\n    */\n\n    'username' => env('MAIL_USERNAME'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | SMTP Server Password\n    |--------------------------------------------------------------------------\n    |\n    | Here you may set the password required by your SMTP server to send out\n    | messages from your application. This will be given to the server on\n    | connection so that the application will be able to send messages.\n    |\n    */\n\n    'password' => env('MAIL_PASSWORD'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Sendmail System Path\n    |--------------------------------------------------------------------------\n    |\n    | When using the \"sendmail\" driver to send e-mails, we will need to know\n    | the path to where Sendmail lives on this server. A default path has\n    | been provided here, which will work well on most of your systems.\n    |\n    */\n\n    'sendmail' => '/usr/sbin/sendmail -bs',\n\n];\n"
  },
  {
    "path": "config/queue.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Queue Driver\n    |--------------------------------------------------------------------------\n    |\n    | The Laravel queue API supports a variety of back-ends via an unified\n    | API, giving you convenient access to each back-end using the same\n    | syntax for each one. Here you may set the default queue driver.\n    |\n    | Supported: \"null\", \"sync\", \"database\", \"beanstalkd\",\n    |            \"sqs\", \"iron\", \"redis\"\n    |\n    */\n\n    'default' => env('QUEUE_DRIVER', 'database'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Queue Connections\n    |--------------------------------------------------------------------------\n    |\n    | Here you may configure the connection information for each server that\n    | is used by your application. A default configuration has been added\n    | for each back-end shipped with Laravel. You are free to add more.\n    |\n    */\n\n    'connections' => [\n\n        'sync' => [\n            'driver' => 'sync',\n        ],\n\n        'database' => [\n            'driver' => 'database',\n            'table' => 'jobs',\n            'queue' => 'default',\n            'expire' => 60,\n        ],\n\n        'beanstalkd' => [\n            'driver' => 'beanstalkd',\n            'host'   => 'localhost',\n            'queue'  => 'default',\n            'ttr'    => 60,\n        ],\n\n        'sqs' => [\n            'driver' => 'sqs',\n            'key'    => 'your-public-key',\n            'secret' => 'your-secret-key',\n            'queue'  => 'your-queue-url',\n            'region' => 'us-east-1',\n        ],\n\n        'iron' => [\n            'driver'  => 'iron',\n            'host'    => 'mq-aws-us-east-1.iron.io',\n            'token'   => 'your-token',\n            'project' => 'your-project-id',\n            'queue'   => 'your-queue-name',\n            'encrypt' => true,\n        ],\n\n        'redis' => [\n            'driver' => 'redis',\n            'queue'  => 'default',\n            'expire' => 60,\n        ],\n\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Failed Queue Jobs\n    |--------------------------------------------------------------------------\n    |\n    | These options configure the behavior of failed queue job logging so you\n    | can control which database and table are used to store the jobs that\n    | have failed. You may change them to any database / table you wish.\n    |\n    */\n\n    'failed' => [\n        'database' => 'mysql', 'table' => 'failed_jobs',\n    ],\n\n];\n"
  },
  {
    "path": "config/services.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Third Party Services\n    |--------------------------------------------------------------------------\n    |\n    | This file is for storing the credentials for third party services such\n    | as Stripe, Mailgun, Mandrill, and others. This file provides a sane\n    | default location for this type of information, allowing packages\n    | to have a conventional place to find your various credentials.\n    |\n    */\n\n    'mailgun' => [\n        'domain' => '',\n        'secret' => '',\n    ],\n\n    'mandrill' => [\n        'secret' => '',\n    ],\n\n    'ses' => [\n        'key' => '',\n        'secret' => '',\n        'region' => 'us-east-1',\n    ],\n\n    'stripe' => [\n        'model'  => 'User',\n        'secret' => '',\n    ],\n\n];\n"
  },
  {
    "path": "config/session.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Session Driver\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default session \"driver\" that will be used on\n    | requests. By default, we will use the lightweight native driver but\n    | you may specify any of the other wonderful drivers provided here.\n    |\n    | Supported: \"file\", \"cookie\", \"database\", \"apc\",\n    |            \"memcached\", \"redis\", \"array\"\n    |\n    */\n\n    'driver' => env('SESSION_DRIVER', 'file'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Lifetime\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the number of minutes that you wish the session\n    | to be allowed to remain idle before it expires. If you want them\n    | to immediately expire on the browser closing, set that option.\n    |\n    */\n\n    'lifetime' => 120,\n\n    'expire_on_close' => false,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Encryption\n    |--------------------------------------------------------------------------\n    |\n    | This option allows you to easily specify that all of your session data\n    | should be encrypted before it is stored. All encryption will be run\n    | automatically by Laravel and you can use the Session like normal.\n    |\n    */\n\n    'encrypt' => false,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session File Location\n    |--------------------------------------------------------------------------\n    |\n    | When using the native session driver, we need a location where session\n    | files may be stored. A default has been set for you but a different\n    | location may be specified. This is only needed for file sessions.\n    |\n    */\n\n    'files' => storage_path().'/framework/sessions',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Database Connection\n    |--------------------------------------------------------------------------\n    |\n    | When using the \"database\" or \"redis\" session drivers, you may specify a\n    | connection that should be used to manage these sessions. This should\n    | correspond to a connection in your database configuration options.\n    |\n    */\n\n    'connection' => null,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Database Table\n    |--------------------------------------------------------------------------\n    |\n    | When using the \"database\" session driver, you may specify the table we\n    | should use to manage the sessions. Of course, a sensible default is\n    | provided for you; however, you are free to change this as needed.\n    |\n    */\n\n    'table' => 'sessions',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Sweeping Lottery\n    |--------------------------------------------------------------------------\n    |\n    | Some session drivers must manually sweep their storage location to get\n    | rid of old sessions from storage. Here are the chances that it will\n    | happen on a given request. By default, the odds are 2 out of 100.\n    |\n    */\n\n    'lottery' => [2, 100],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Cookie Name\n    |--------------------------------------------------------------------------\n    |\n    | Here you may change the name of the cookie used to identify a session\n    | instance by ID. The name specified here will get used every time a\n    | new session cookie is created by the framework for every driver.\n    |\n    */\n\n    'cookie' => 'laravel_session',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Cookie Path\n    |--------------------------------------------------------------------------\n    |\n    | The session cookie path determines the path for which the cookie will\n    | be regarded as available. Typically, this will be the root path of\n    | your application but you are free to change this when necessary.\n    |\n    */\n\n    'path' => '/',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Cookie Domain\n    |--------------------------------------------------------------------------\n    |\n    | Here you may change the domain of the cookie used to identify a session\n    | in your application. This will determine which domains the cookie is\n    | available to in your application. A sensible default has been set.\n    |\n    */\n\n    'domain' => null,\n\n    /*\n    |--------------------------------------------------------------------------\n    | HTTPS Only Cookies\n    |--------------------------------------------------------------------------\n    |\n    | By setting this option to true, session cookies will only be sent back\n    | to the server if the browser has a HTTPS connection. This will keep\n    | the cookie from being sent to you if it can not be done securely.\n    |\n    */\n\n    'secure' => false,\n\n];\n"
  },
  {
    "path": "config/view.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | View Storage Paths\n    |--------------------------------------------------------------------------\n    |\n    | Most templating systems load templates from disk. Here you may specify\n    | an array of paths that should be checked for your views. Of course\n    | the usual Laravel view path has already been registered for you.\n    |\n    */\n\n    'paths' => [\n        realpath(base_path('resources/views'))\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Compiled View Path\n    |--------------------------------------------------------------------------\n    |\n    | This option determines where all the compiled Blade templates will be\n    | stored for your application. Typically, this is within the storage\n    | directory. However, as usual, you are free to change this value.\n    |\n    */\n\n    'compiled' => realpath(storage_path().'/framework/views'),\n\n];\n"
  },
  {
    "path": "database/.gitignore",
    "content": "*.sqlite\n"
  },
  {
    "path": "database/migrations/.gitkeep",
    "content": ""
  },
  {
    "path": "database/migrations/2014_10_12_000000_create_users_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreateUsersTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('users', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->string('email')->unique();\n            $table->string('password', 60);\n            $table->rememberToken();\n            $table->string('api_token', 60)->unique();\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('users');\n    }\n}\n"
  },
  {
    "path": "database/migrations/2014_10_12_100000_create_password_resets_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreatePasswordResetsTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('password_resets', function (Blueprint $table) {\n            $table->string('email')->index();\n            $table->string('token')->index();\n            $table->timestamp('created_at');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('password_resets');\n    }\n}\n"
  },
  {
    "path": "database/migrations/2015_02_07_172606_create_roles_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreateRolesTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('roles', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name')->unique();\n            $table->string('slug')->unique();\n            $table->text('description')->nullable();\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('roles');\n    }\n}\n"
  },
  {
    "path": "database/migrations/2015_02_07_172633_create_role_user_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreateRoleUserTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('role_user', function (Blueprint $table) {\n            $table->increments('id');\n            $table->integer('role_id')->unsigned()->index();\n            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');\n            $table->integer('user_id')->unsigned()->index();\n            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('role_user');\n    }\n}\n"
  },
  {
    "path": "database/migrations/2015_02_07_172649_create_permissions_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreatePermissionsTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('permissions', function (Blueprint $table) {\n            $table->increments('id');\n            $table->integer('inherit_id')->unsigned()->nullable()->index();\n            $table->foreign('inherit_id')->references('id')->on('permissions');\n            $table->string('name')->index();\n            $table->string('slug')->index();\n            $table->text('description')->nullable();\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('permissions');\n    }\n}\n"
  },
  {
    "path": "database/migrations/2015_02_07_172657_create_permission_role_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreatePermissionRoleTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('permission_role', function (Blueprint $table) {\n            $table->increments('id');\n            $table->integer('permission_id')->unsigned()->index();\n            $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');\n            $table->integer('role_id')->unsigned()->index();\n            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('permission_role');\n    }\n}\n"
  },
  {
    "path": "database/migrations/2015_02_17_152439_create_permission_user_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreatePermissionUserTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('permission_user', function (Blueprint $table) {\n            $table->increments('id');\n            $table->integer('permission_id')->unsigned()->index();\n            $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');\n            $table->integer('user_id')->unsigned()->index();\n            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('permission_user');\n    }\n}\n"
  },
  {
    "path": "database/migrations/2015_02_22_123238_create_recipes_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreateRecipesTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('recipes', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->text('description');\n            $table->text('body');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('recipes');\n    }\n}\n"
  },
  {
    "path": "database/migrations/2015_02_23_123238_create_servers_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreateServersTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('servers', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->text('description');\n            $table->text('body');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('servers');\n    }\n}\n"
  },
  {
    "path": "database/migrations/2015_02_28_164641_create_projects_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreateProjectsTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('projects', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->string('stage')->nullable();\n            $table->integer('server_id')->unsigned();\n            $table->string('repository');\n            $table->string('email_notification_recipient')->nullable();\n            $table->text('attributes');\n            $table->integer('days_to_keep_deployments')->unsigned()->nullable();\n            $table->integer('max_number_of_deployments_to_keep')->unsigned()->nullable();\n            $table->tinyInteger('keep_last_deployment')->unsigned();\n            $table->string('github_webhook_secret')->nullable();\n            $table->integer('github_webhook_user_id')->unsigned()->nullable();\n            $table->timestamps();\n\n            $table->foreign('server_id')\n                ->references('id')\n                ->on('servers');\n            $table->foreign('github_webhook_user_id')\n                ->references('id')\n                ->on('users')\n                ->onDelete('set null');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('projects');\n    }\n}\n"
  },
  {
    "path": "database/migrations/2015_03_01_084552_create_deployments_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreateDeploymentsTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('deployments', function (Blueprint $table) {\n            $table->increments('id');\n            $table->integer('project_id')->unsigned();\n            $table->integer('number')->unsigned();\n            $table->string('task');\n            $table->tinyInteger('status')->unsigned()->nullable();\n            $table->text('message')->nullable();\n            $table->integer('user_id')->unsigned();\n            $table->timestamps();\n\n            $table->foreign('project_id')\n                ->references('id')\n                ->on('projects')\n                ->onDelete('cascade');\n\n            $table->unique(['project_id', 'number']);\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('deployments');\n    }\n}\n"
  },
  {
    "path": "database/migrations/2015_05_28_132914_create_max_deployments_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreateMaxDeploymentsTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('max_deployments', function (Blueprint $table) {\n            $table->increments('id');\n            $table->integer('project_id')->unsigned();\n            $table->integer('number')->unsigned()->default(0);\n            $table->timestamps();\n\n            $table->foreign('project_id')\n                ->references('id')\n                ->on('projects')\n                ->onDelete('cascade');\n\n            $table->unique('project_id');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('max_deployments');\n    }\n}\n"
  },
  {
    "path": "database/migrations/2015_06_16_143119_create_jobs_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreateJobsTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('jobs', function (Blueprint $table) {\n            $table->bigIncrements('id');\n            $table->string('queue');\n            $table->text('payload');\n            $table->tinyInteger('attempts')->unsigned();\n            $table->tinyInteger('reserved')->unsigned();\n            $table->unsignedInteger('reserved_at')->nullable();\n            $table->unsignedInteger('available_at');\n            $table->unsignedInteger('created_at');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('jobs');\n    }\n}\n"
  },
  {
    "path": "database/migrations/2015_08_10_143119_create_project_recipe_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreateProjectRecipeTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('project_recipe', function (Blueprint $table) {\n            $table->increments('id');\n            $table->integer('project_id')->unsigned();\n            $table->integer('recipe_id')->unsigned();\n            $table->tinyInteger('recipe_order')->unsigned();\n\n            $table->foreign('project_id')\n                ->references('id')\n                ->on('projects')\n                ->onDelete('cascade');\n            $table->foreign('recipe_id')\n                ->references('id')\n                ->on('recipes')\n                ->onDelete('cascade');\n\n            $table->unique(['project_id', 'recipe_id', 'recipe_order']);\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('project_recipe');\n    }\n}\n"
  },
  {
    "path": "database/migrations/2016_08_24_041250_create_settings_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreateSettingsTable extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('settings', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('type')->unique();\n            $table->text('attributes');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::drop('settings');\n    }\n}\n"
  },
  {
    "path": "database/seeds/.gitkeep",
    "content": ""
  },
  {
    "path": "database/seeds/DatabaseSeeder.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass DatabaseSeeder extends Seeder\n{\n    /**\n     * Run the database seeds.\n     *\n     * @return void\n     */\n    public function run()\n    {\n        Model::unguard();\n\n        $this->call('UserTableSeeder');\n        $this->call('RecipeTableSeeder');\n        $this->call('RoleTableSeeder');\n        $this->call('PermissionTableSeeder');\n        $this->call('PermissionRoleTableSeeder');\n        $this->call('RoleUserTableSeeder');\n    }\n}\n"
  },
  {
    "path": "database/seeds/PermissionRoleTableSeeder.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Seeder;\nuse Kodeine\\Acl\\Models\\Eloquent\\Role;\n\nclass PermissionRoleTableSeeder extends Seeder\n{\n    public function run()\n    {\n        DB::table('permission_role')->delete();\n\n        $roleAdmin = Role::where('name', 'Administrator')\n            ->where('slug', 'administrator')\n            ->first();\n        $roleAdmin->assignPermission([\n            'project',\n            'deployment',\n            'recipe',\n            'server',\n            'user',\n            'setting',\n        ]);\n\n        $roleDeveloper = Role::where('name', 'Developer')\n            ->where('slug', 'developer')\n            ->first();\n        $roleDeveloper->assignPermission([\n            'project',\n            'deployment',\n            'recipe',\n            'server',\n            'user.developer',\n            'setting.developer',\n        ]);\n\n        $roleModerator = Role::where('name', 'Moderator')\n            ->where('slug', 'moderator')\n            ->first();\n        $roleModerator->assignPermission([\n            'project.moderator',\n            'deployment',\n            'recipe.moderator',\n            'server.moderator',\n            'user.moderator',\n            'setting.moderator',\n        ]);\n    }\n}\n"
  },
  {
    "path": "database/seeds/PermissionTableSeeder.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Seeder;\nuse Kodeine\\Acl\\Models\\Eloquent\\Permission;\n\nclass PermissionTableSeeder extends Seeder\n{\n    public function run()\n    {\n        Permission::orderBy('inherit_id', 'desc')->delete();\n\n        // project\n        $permission = new Permission;\n        $permissionProject = $permission->create([\n            'name'        => 'project',\n            'slug'        => [\n                'create' => true,\n                'view'   => true,\n                'update' => true,\n                'delete' => true,\n            ],\n            'description' => 'Manage project permissions.',\n        ]);\n\n        $permission = new Permission;\n        $permissionProjectModerator = $permission->create([\n            'name'        => 'project.moderator',\n            'slug'        => [\n                'create' => false,\n                'update' => false,\n                'delete' => false,\n            ],\n            'inherit_id'  => $permissionProject->getKey(),\n            'description' => 'Moderator project permissions.',\n        ]);\n\n        // deployment\n        $permission = new Permission;\n        $permissionDeployment = $permission->create([\n            'name'        => 'deployment',\n            'slug'        => [\n                'create' => true,\n                'view'   => true,\n                'update' => true,\n                'delete' => true,\n            ],\n            'description' => 'Manage deployment permissions.',\n        ]);\n\n        // recipe\n        $permission = new Permission;\n        $permissionRecipe = $permission->create([\n            'name'        => 'recipe',\n            'slug'        => [\n                'create' => true,\n                'view'   => true,\n                'update' => true,\n                'delete' => true,\n            ],\n            'description' => 'Manage recipe permissions.',\n        ]);\n\n        $permission = new Permission;\n        $permissionRecipeModerator = $permission->create([\n            'name'        => 'recipe.moderator',\n            'slug'        => [\n                'create' => false,\n                'update' => false,\n                'delete' => false,\n            ],\n            'inherit_id'  => $permissionRecipe->getKey(),\n            'description' => 'Moderator recipe permissions.',\n        ]);\n\n        // server\n        $permission = new Permission;\n        $permissionServer = $permission->create([\n            'name'        => 'server',\n            'slug'        => [\n                'create' => true,\n                'view'   => true,\n                'update' => true,\n                'delete' => true,\n            ],\n            'description' => 'Manage server permissions.',\n        ]);\n\n        $permission = new Permission;\n        $permissionServerModerator = $permission->create([\n            'name'        => 'server.moderator',\n            'slug'        => [\n                'create' => false,\n                'update' => false,\n                'delete' => false,\n            ],\n            'inherit_id'  => $permissionServer->getKey(),\n            'description' => 'Moderator server permissions.',\n        ]);\n\n        // user\n        $permission = new Permission;\n        $permissionUser = $permission->create([\n            'name'        => 'user',\n            'slug'        => [\n                'create' => true,\n                'view'   => true,\n                'update' => true,\n                'delete' => true,\n            ],\n            'description' => 'Manage user permissions.',\n        ]);\n\n        $permission = new Permission;\n        $permissionUserDeveloper = $permission->create([\n            'name'        => 'user.developer',\n            'slug'        => [\n                'create' => false,\n                'view'   => false,\n                'update' => false,\n                'delete' => false,\n            ],\n            'inherit_id'  => $permissionUser->getKey(),\n            'description' => 'Developer user permissions.',\n        ]);\n\n        $permission = new Permission;\n        $permissionUserModerator = $permission->create([\n            'name'        => 'user.moderator',\n            'slug'        => [\n                'create' => false,\n                'view'   => false,\n                'update' => false,\n                'delete' => false,\n            ],\n            'inherit_id'  => $permissionUser->getKey(),\n            'description' => 'Moderator user permissions.',\n        ]);\n\n        // setting\n        $permission = new Permission;\n        $permissionSetting = $permission->create([\n            'name'        => 'setting',\n            'slug'        => [\n                'create' => true,\n                'view'   => true,\n                'update' => true,\n                'delete' => true,\n            ],\n            'description' => 'Manage setting permissions.',\n        ]);\n\n        $permission = new Permission;\n        $permissionSettingDeveloper = $permission->create([\n            'name'        => 'setting.developer',\n            'slug'        => [\n                'create' => false,\n                'view'   => false,\n                'update' => false,\n                'delete' => false,\n            ],\n            'inherit_id'  => $permissionSetting->getKey(),\n            'description' => 'Developer setting permissions.',\n        ]);\n\n        $permission = new Permission;\n        $permissionSettingModerator = $permission->create([\n            'name'        => 'setting.moderator',\n            'slug'        => [\n                'create' => false,\n                'view'   => false,\n                'update' => false,\n                'delete' => false,\n            ],\n            'inherit_id'  => $permissionSetting->getKey(),\n            'description' => 'Moderator setting permissions.',\n        ]);\n    }\n}\n"
  },
  {
    "path": "database/seeds/RecipeTableSeeder.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Seeder;\nuse App\\Models\\Recipe;\n\nclass RecipeTableSeeder extends Seeder\n{\n    public function run()\n    {\n        DB::table('recipes')->delete();\n\n        $deployerRecipes = [\n            'cakephp' => [\n                'name'        => 'deployer-cakephp-recipe',\n                'description' => 'This recipe is specifically for deploying CakePHP 3 projects.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/cakephp.php';\nEOF\n                ,\n            ],\n            'codeigniter' => [\n                'name'        => 'deployer-codeigniter-recipe',\n                'description' => 'This recipe is specifically for deploying CodeIgniter projects.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/codeigniter.php';\nEOF\n                ,\n            ],\n            'common' => [\n                'name'        => 'deployer-common-recipe',\n                'description' => 'This recipe is the basis of all other recipes',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/common.php';\nEOF\n                ,\n            ],\n            'composer' => [\n                'name'        => 'deployer-composer-recipe',\n                'description' => 'This recipe is specifically for deploying projects which uses composer.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/composer.php';\nEOF\n                ,\n            ],\n            'drupal7' => [\n                'name'        => 'deployer-drupal7-recipe',\n                'description' => 'This recipe is specifically for deploying Drupal 7 projects.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/drupal7.php';\nEOF\n                ,\n            ],\n            'drupal8' => [\n                'name'        => 'deployer-drupal8-recipe',\n                'description' => 'This recipe is specifically for deploying Drupal 8 projects.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/drupal8.php';\nEOF\n                ,\n            ],\n            'fuelphp' => [\n                'name'        => 'deployer-fuelphp-recipe',\n                'description' => 'This recipe is specifically for deploying FuelPHP projects.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/fuelphp.php';\nEOF\n                ,\n            ],\n            'laravel' => [\n                'name'        => 'deployer-laravel-recipe',\n                'description' => 'This recipe is specifically for deploying Laravel projects.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/laravel.php';\nEOF\n                ,\n            ],\n            'magento' => [\n                'name'        => 'deployer-magento-recipe',\n                'description' => 'This recipe is specifically for deploying Magento projects.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/magento.php';\nEOF\n                ,\n            ],\n            'symfony' => [\n                'name'        => 'deployer-symfony-recipe',\n                'description' => 'This recipe is specifically for deploying Symfony projects.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/symfony.php';\nEOF\n                ,\n            ],\n            'symfony3' => [\n                'name'        => 'deployer-symfony3-recipe',\n                'description' => 'This recipe is specifically for deploying Symfony 3 projects.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/symfony3.php';\nEOF\n                ,\n            ],\n            'wordpress' => [\n                'name'        => 'deployer-wordpress-recipe',\n                'description' => 'This recipe is specifically for deploying WordPress projects.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/wordpress.php';\nEOF\n                ,\n            ],\n            'yii' => [\n                'name'        => 'deployer-yii-recipe',\n                'description' => 'This recipe is specifically for deploying Yii projects.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/yii.php';\nEOF\n                ,\n            ],\n            'yii2-app-advanced' => [\n                'name'        => 'deployer-yii2-app-advanced-recipe',\n                'description' => 'This recipe is specifically for deploying Yii 2 Advanced Project Template projects.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/yii2-app-advanced.php';\nEOF\n                ,\n            ],\n            'yii2-app-basic' => [\n                'name'        => 'deployer-yii2-app-basic-recipe',\n                'description' => 'This recipe is specifically for deploying Yii 2 Basic Project Template projects.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/yii2-app-basic.php';\nEOF\n                ,\n            ],\n            'zend_framework' => [\n                'name'        => 'deployer-zend_framework-recipe',\n                'description' => 'This recipe is specifically for deploying Zend Framework projects.',\n                'body'        => <<<EOF\n<?php\nrequire 'recipe/zend_framework.php';\nEOF\n                ,\n            ],\n        ];\n\n        foreach ($deployerRecipes as $recipe) {\n            Recipe::create([\n                'name'        => $recipe['name'],\n                'description' => $recipe['description'],\n                'body'        => $recipe['body'],\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "database/seeds/RoleTableSeeder.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Seeder;\nuse Kodeine\\Acl\\Models\\Eloquent\\Role;\n\nclass RoleTableSeeder extends Seeder\n{\n    public function run()\n    {\n        DB::table('roles')->delete();\n\n        $role = new Role;\n        $roleAdmin = $role->create([\n            'name'        => 'Administrator',\n            'slug'        => 'administrator',\n            'description' => 'Manage administration privileges.',\n        ]);\n\n        $role = new Role;\n        $roleDeveloper = $role->create([\n            'name'        => 'Developer',\n            'slug'        => 'developer',\n            'description' => 'Manage developer privileges.',\n        ]);\n\n        $role = new Role;\n        $roleModerator = $role->create([\n            'name'        => 'Moderator',\n            'slug'        => 'moderator',\n            'description' => 'Manage moderator privileges.',\n        ]);\n    }\n}\n"
  },
  {
    "path": "database/seeds/RoleUserTableSeeder.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Seeder;\nuse App\\Models\\User;\nuse Kodeine\\Acl\\Models\\Eloquent\\RoleUser;\n\nclass RoleUserTableSeeder extends Seeder\n{\n    public function run()\n    {\n        DB::table('role_user')->delete();\n\n        $user = User::where('email', 'admin@example.com')->first();\n        $user->assignRole('administrator');\n    }\n}\n"
  },
  {
    "path": "database/seeds/UserTableSeeder.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Seeder;\nuse App\\Models\\User;\n\nclass UserTableSeeder extends Seeder\n{\n    public function run()\n    {\n        DB::table('users')->delete();\n\n        User::create([\n            'name'     => 'admin',\n            'email'    => 'admin@example.com',\n            'password' => Hash::make('admin'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "gulpfile.js",
    "content": "var elixir = require('laravel-elixir');\n\n/*\n |--------------------------------------------------------------------------\n | Elixir Asset Management\n |--------------------------------------------------------------------------\n |\n | Elixir provides a clean, fluent API for defining some basic Gulp tasks\n | for your Laravel application. By default, we are compiling the Less\n | file for our application, as well as publishing vendor resources.\n |\n */\n\nelixir(function(mix) {\n    mix.less('app.less');\n});\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"private\": true,\n  \"devDependencies\": {\n    \"gulp\": \"^3.8.8\",\n    \"laravel-elixir\": \"*\"\n  }\n}\n"
  },
  {
    "path": "phpspec.yml",
    "content": "suites:\n    main:\n        namespace: App\n        psr4_prefix: App\n        src_path: app"
  },
  {
    "path": "phpunit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit backupGlobals=\"false\"\n         backupStaticAttributes=\"false\"\n         bootstrap=\"bootstrap/autoload.php\"\n         colors=\"true\"\n         convertErrorsToExceptions=\"true\"\n         convertNoticesToExceptions=\"true\"\n         convertWarningsToExceptions=\"true\"\n         processIsolation=\"false\"\n         stopOnFailure=\"false\">\n    <testsuites>\n        <testsuite name=\"Application Test Suite\">\n            <directory suffix=\"Test.php\">./tests</directory>\n        </testsuite>\n    </testsuites>\n    <filter>\n        <whitelist processUncoveredFilesFromWhitelist=\"true\">\n            <directory suffix=\".php\">./app</directory>\n            <exclude>\n                <directory>./app/Providers</directory>\n                <directory suffix=\"Interface.php\">./app</directory>\n                <file>./app/Console/Commands/Inspire.php</file>\n                <file>./app/Console/Kernel.php</file>\n                <file>./app/Events/Event.php</file>\n                <file>./app/Exceptions/Handler.php</file>\n                <file>./app/Http/Controllers/Auth/AuthController.php</file>\n                <file>./app/Http/Controllers/Auth/PasswordController.php</file>\n                <file>./app/Http/Controllers/Controller.php</file>\n                <file>./app/Http/Controllers/HomeController.php</file>\n                <file>./app/Http/Controllers/WelcomeController.php</file>\n                <file>./app/Http/Kernel.php</file>\n                <file>./app/Http/Middleware/Authenticate.php</file>\n                <file>./app/Http/Middleware/RedirectIfAuthenticated.php</file>\n                <file>./app/Http/Middleware/VerifyCsrfToken.php</file>\n                <file>./app/Http/Requests/Request.php</file>\n                <file>./app/Http/breadcrumbs.php</file>\n                <file>./app/Http/routes.php</file>\n                <file>./app/Jobs/Job.php</file>\n            </exclude>\n        </whitelist>\n    </filter>\n    <php>\n        <env name=\"APP_ENV\" value=\"testing\"/>\n        <env name=\"APP_KEY\" value=\"base64:pMhsdiMZNN3ummMKgvJ/0efi7GheB8ybVGcMiDrqEhA=\"/>\n        <env name=\"CACHE_DRIVER\" value=\"array\"/>\n        <env name=\"SESSION_DRIVER\" value=\"array\"/>\n        <env name=\"QUEUE_DRIVER\" value=\"sync\"/>\n        <env name=\"DB_HOST\" value=\"localhost\"/>\n        <env name=\"DB_DATABASE\" value=\"webloyer_test\"/>\n        <env name=\"DB_USERNAME\" value=\"root\"/>\n        <env name=\"DB_PASSWORD\" value=\"\"/>\n    </php>\n    <logging>\n        <log type=\"coverage-clover\" target=\"build/logs/clover.xml\"/>\n    </logging>\n</phpunit>\n"
  },
  {
    "path": "public/.gitignore",
    "content": "/vendor\n"
  },
  {
    "path": "public/.htaccess",
    "content": "<IfModule mod_rewrite.c>\n    <IfModule mod_negotiation.c>\n        Options -MultiViews\n    </IfModule>\n\n    RewriteEngine On\n\n    # Redirect Trailing Slashes...\n    RewriteRule ^(.*)/$ /$1 [L,R=301]\n\n    # Handle Front Controller...\n    RewriteCond %{REQUEST_FILENAME} !-d\n    RewriteCond %{REQUEST_FILENAME} !-f\n    RewriteRule ^ index.php [L]\n</IfModule>\n"
  },
  {
    "path": "public/css/app.css",
    "content": "/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\nmark {\n  background: #ff0;\n  color: #000;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  box-sizing: content-box;\n  height: 0;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  font: inherit;\n  margin: 0;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n  border: 0;\n  padding: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    background: transparent !important;\n    color: #000 !important;\n    box-shadow: none !important;\n    text-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.glyphicon-copy:before {\n  content: \"\\e205\";\n}\n* {\n  box-sizing: border-box;\n}\n*:before,\n*:after {\n  box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Roboto\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333333;\n  background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  background-color: #fcf8e3;\n  padding: .2em;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777777;\n}\n.text-primary {\n  color: #337ab7;\n}\na.text-primary:hover {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n  margin-left: -5px;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n  text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #ffffff;\n  background-color: #333333;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.row {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0%;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0%;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n.table .table {\n  background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #dddddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n  color: #999999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n  opacity: 1;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    line-height: 34px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg {\n    line-height: 46px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-sm,\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm,\nselect.form-group-sm .form-control {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\ntextarea.form-group-sm .form-control,\nselect[multiple].input-sm,\nselect[multiple].form-group-sm .form-control {\n  height: auto;\n}\n.input-lg,\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg,\nselect.form-group-lg .form-control {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\ntextarea.form-group-lg .form-control,\nselect[multiple].input-lg,\nselect[multiple].form-group-lg .form-control {\n  height: auto;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  border-color: #3c763d;\n  background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  border-color: #8a6d3b;\n  background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  border-color: #a94442;\n  background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n    margin-bottom: 0;\n    padding-top: 7px;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 14.3px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n  }\n}\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: 300;\n  text-align: center;\n  vertical-align: middle;\n  -ms-touch-action: manipulation;\n      touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  outline: 0;\n  background-image: none;\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  pointer-events: none;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  box-shadow: none;\n}\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n.btn-default .badge {\n  color: #ffffff;\n  background-color: #333333;\n}\n.btn-primary {\n  color: #ffffff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #ffffff;\n}\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #ffffff;\n}\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #ffffff;\n}\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #ffffff;\n}\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #ffffff;\n}\n.btn-link {\n  color: #337ab7;\n  font-weight: normal;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n  visibility: hidden;\n}\n.collapse.in {\n  display: block;\n  visibility: visible;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  transition-property: height, visibility;\n  transition-duration: 0.35s;\n  transition-timing-function: ease;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  font-size: 14px;\n  text-align: left;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  outline: 0;\n  background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: not-allowed;\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  left: auto;\n  right: 0;\n}\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid;\n  content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    left: auto;\n    right: 0;\n  }\n  .navbar-right .dropdown-menu-left {\n    left: 0;\n    right: auto;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-bottom-left-radius: 4px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  float: none;\n  display: table-cell;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n  color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777777;\n  text-decoration: none;\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #337ab7;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n  visibility: hidden;\n}\n.tab-content > .active {\n  display: block;\n  visibility: visible;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: 15px;\n  padding-left: 15px;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    visibility: visible !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n  height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 15px;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  margin-left: -15px;\n  margin-right: -15px;\n  padding: 10px 15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-left: 15px;\n    margin-right: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  background-color: #e7e7e7;\n  color: #555555;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n.navbar-default .btn-link {\n  color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #cccccc;\n}\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  background-color: #080808;\n  color: #ffffff;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #9d9d9d;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  content: \"/\\00a0\";\n  padding: 0 5px;\n  color: #cccccc;\n}\n.breadcrumb > .active {\n  color: #777777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  line-height: 1.42857143;\n  text-decoration: none;\n  color: #337ab7;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-bottom-right-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #23527c;\n  background-color: #eeeeee;\n  border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n  cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777777;\n  background-color: #ffffff;\n  border-color: #dddddd;\n  cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-bottom-right-radius: 6px;\n  border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-bottom-right-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  list-style: none;\n  text-align: center;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777777;\n  background-color: #ffffff;\n  cursor: not-allowed;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #ffffff;\n  line-height: 1;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: #777777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #ffffff;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px 15px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding: 48px 0;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-left: 60px;\n    padding-right: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-left: auto;\n  margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #3c763d;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #8a6d3b;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #337ab7;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  margin-bottom: 20px;\n  padding-left: 0;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\na.list-group-item {\n  color: #555555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  color: #555555;\n  background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  background-color: #eeeeee;\n  color: #777777;\n  cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-left-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  border: 0;\n  margin-bottom: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n  border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #dddddd;\n}\n.panel-primary {\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  height: 100%;\n  width: 100%;\n  border: 0;\n}\n.embed-responsive.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n  transition: -webkit-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n  outline: 0;\n}\n.modal-backdrop {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  background-color: #000000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n  min-height: 16.42857143px;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  visibility: visible;\n  font-family: \"Roboto\", Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  font-weight: normal;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.tooltip.top {\n  margin-top: -3px;\n  padding: 5px 0;\n}\n.tooltip.right {\n  margin-left: 3px;\n  padding: 0 5px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n  padding: 5px 0;\n}\n.tooltip.left {\n  margin-left: -3px;\n  padding: 0 5px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  right: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Roboto\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  background-color: #ffffff;\n  background-clip: padding-box;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  white-space: normal;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top > .arrow:after {\n  content: \" \";\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n  content: \" \";\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom > .arrow:after {\n  content: \" \";\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n  content: \" \";\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #ffffff;\n  bottom: -10px;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    transition: -webkit-transform 0.6s ease-in-out;\n    transition: transform 0.6s ease-in-out;\n    -webkit-backface-visibility: hidden;\n            backface-visibility: hidden;\n    -webkit-perspective: 1000;\n            perspective: 1000;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n    left: 0;\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n  left: auto;\n  right: 0;\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  outline: 0;\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n  margin: 0;\n  width: 12px;\n  height: 12px;\n  background-color: #ffffff;\n}\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\n  }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  content: \" \";\n  display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n.ansi_box {\n  background-color: black;\n  overflow: auto;\n  padding: 10px 15px;\n  font-family: monospace;\n}\n.form-group.required .control-label:after {\n  content: \"*\";\n  color: red;\n}\n.list-group-item.selected {\n  font-weight: bold;\n}\n.list-group-item.selected:before {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 2px;\n  content: \"\";\n  background-color: #d26911;\n}\n.margin-bottom-xs {\n  margin-bottom: 3px !important;\n}\n.margin-bottom-sm {\n  margin-bottom: 6px !important;\n}\n.margin-bottom-md {\n  margin-bottom: 15px !important;\n}\n.margin-bottom-lg {\n  margin-bottom: 30px !important;\n}\n.green {\n  color: #5cb85c;\n}\n.red {\n  color: #d9534f;\n}\n.gray {\n  color: gray;\n}\nbody,\nlabel,\n.checkbox label {\n  font-weight: 300;\n}\n\n/*# sourceMappingURL=app.css.map */"
  },
  {
    "path": "public/index.php",
    "content": "<?php\n\n/**\n * Laravel - A PHP Framework For Web Artisans\n *\n * @package  Laravel\n * @author   Taylor Otwell <taylorotwell@gmail.com>\n */\n\n/*\n|--------------------------------------------------------------------------\n| Register The Auto Loader\n|--------------------------------------------------------------------------\n|\n| Composer provides a convenient, automatically generated class loader for\n| our application. We just need to utilize it! We'll simply require it\n| into the script here so that we don't have to worry about manual\n| loading any of our classes later on. It feels nice to relax.\n|\n*/\n\nrequire __DIR__.'/../bootstrap/autoload.php';\n\n/*\n|--------------------------------------------------------------------------\n| Turn On The Lights\n|--------------------------------------------------------------------------\n|\n| We need to illuminate PHP development, so let us turn on the lights.\n| This bootstraps the framework and gets it ready for use, then it\n| will load up this application so that we can run it and send\n| the responses back to the browser and delight our users.\n|\n*/\n\n$app = require_once __DIR__.'/../bootstrap/app.php';\n\n/*\n|--------------------------------------------------------------------------\n| Run The Application\n|--------------------------------------------------------------------------\n|\n| Once we have the application, we can handle the incoming request\n| through the kernel, and send the associated response back to\n| the client's browser allowing them to enjoy the creative\n| and wonderful application we have prepared for them.\n|\n*/\n\n$kernel = $app->make('Illuminate\\Contracts\\Http\\Kernel');\n\n$response = $kernel->handle(\n    $request = Illuminate\\Http\\Request::capture()\n);\n\n$response->send();\n\n$kernel->terminate($request, $response);\n"
  },
  {
    "path": "public/js/.gitignore",
    "content": "/vendor\n"
  },
  {
    "path": "public/robots.txt",
    "content": "User-agent: *\nDisallow:\n"
  },
  {
    "path": "resources/assets/less/app.less",
    "content": "@import \"bootstrap/bootstrap\";\n@import \"webloyer/bootstrap\";\n\n@btn-font-weight: 300;\n@font-family-sans-serif: \"Roboto\", Helvetica, Arial, sans-serif;\n\nbody, label, .checkbox label {\n    font-weight: 300;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/alerts.less",
    "content": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: @alert-padding;\n  margin-bottom: @line-height-computed;\n  border: 1px solid transparent;\n  border-radius: @alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing @headings-color\n    color: inherit;\n  }\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: @alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n  padding-right: (@alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/badges.less",
    "content": "//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: @font-size-small;\n  font-weight: @badge-font-weight;\n  color: @badge-color;\n  line-height: @badge-line-height;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: @badge-bg;\n  border-radius: @badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n  .btn-xs & {\n    top: 0;\n    padding: 1px 5px;\n  }\n\n  // Hover state, but only for links\n  a& {\n    &:hover,\n    &:focus {\n      color: @badge-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Account for badges in navs\n  .list-group-item.active > &,\n  .nav-pills > .active > a > & {\n    color: @badge-active-color;\n    background-color: @badge-active-bg;\n  }\n  .list-group-item > & {\n    float: right;\n  }\n  .list-group-item > & + & {\n    margin-right: 5px;\n  }\n  .nav-pills > li > a > & {\n    margin-left: 3px;\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/bootstrap.less",
    "content": "// Core variables and mixins\n@import \"variables.less\";\n@import \"mixins.less\";\n\n// Reset and dependencies\n@import \"normalize.less\";\n@import \"print.less\";\n@import \"glyphicons.less\";\n\n// Core CSS\n@import \"scaffolding.less\";\n@import \"type.less\";\n@import \"code.less\";\n@import \"grid.less\";\n@import \"tables.less\";\n@import \"forms.less\";\n@import \"buttons.less\";\n\n// Components\n@import \"component-animations.less\";\n@import \"dropdowns.less\";\n@import \"button-groups.less\";\n@import \"input-groups.less\";\n@import \"navs.less\";\n@import \"navbar.less\";\n@import \"breadcrumbs.less\";\n@import \"pagination.less\";\n@import \"pager.less\";\n@import \"labels.less\";\n@import \"badges.less\";\n@import \"jumbotron.less\";\n@import \"thumbnails.less\";\n@import \"alerts.less\";\n@import \"progress-bars.less\";\n@import \"media.less\";\n@import \"list-group.less\";\n@import \"panels.less\";\n@import \"responsive-embed.less\";\n@import \"wells.less\";\n@import \"close.less\";\n\n// Components w/ JavaScript\n@import \"modals.less\";\n@import \"tooltip.less\";\n@import \"popovers.less\";\n@import \"carousel.less\";\n\n// Utility classes\n@import \"utilities.less\";\n@import \"responsive-utilities.less\";\n"
  },
  {
    "path": "resources/assets/less/bootstrap/breadcrumbs.less",
    "content": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n  margin-bottom: @line-height-computed;\n  list-style: none;\n  background-color: @breadcrumb-bg;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: @breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: @breadcrumb-active-color;\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/button-groups.less",
    "content": "//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  &:extend(.clearfix all);\n\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    .border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    .box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: @caret-width-large @caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    &:extend(.clearfix all);\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    border-top-right-radius: @border-radius-base;\n    .border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    border-bottom-left-radius: @border-radius-base;\n    .border-top-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n\n  > .btn-group .dropdown-menu {\n    left: auto;\n  }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n  > .btn,\n  > .btn-group > .btn {\n    input[type=\"radio\"],\n    input[type=\"checkbox\"] {\n      position: absolute;\n      clip: rect(0,0,0,0);\n      pointer-events: none;\n    }\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/buttons.less",
    "content": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: @btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n  .user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus,\n    &.focus {\n      .tab-focus();\n    }\n  }\n\n  &:hover,\n  &:focus,\n  &.focus {\n    color: @btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n    pointer-events: none; // Future-proof disabling of clicks\n    .opacity(.65);\n    .box-shadow(none);\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: @link-color;\n  font-weight: normal;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &.active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    .box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: @btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/carousel.less",
    "content": "//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      &:extend(.img-responsive);\n      line-height: 1;\n    }\n\n    // WebKit CSS3 transforms for supported devices\n    @media all and (transform-3d), (-webkit-transform-3d) {\n      transition: transform .6s ease-in-out;\n      backface-visibility: hidden;\n      perspective: 1000;\n\n      &.next,\n      &.active.right {\n        transform: translate3d(100%, 0, 0);\n        left: 0;\n      }\n      &.prev,\n      &.active.left {\n        transform: translate3d(-100%, 0, 0);\n        left: 0;\n      }\n      &.next.left,\n      &.prev.right,\n      &.active {\n        transform: translate3d(0, 0, 0);\n        left: 0;\n      }\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev {\n    display: block;\n  }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @carousel-control-width;\n  .opacity(@carousel-control-opacity);\n  font-size: @carousel-control-font-size;\n  color: @carousel-control-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: 0;\n    color: @carousel-control-color;\n    text-decoration: none;\n    .opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n    margin-left: -10px;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n    margin-right: -10px;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    margin-top: -10px;\n    font-family: serif;\n  }\n\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid @carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: @carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: @carousel-caption-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: 30px;\n      height: 30px;\n      margin-top: -15px;\n      font-size: 30px;\n    }\n    .glyphicon-chevron-left,\n    .icon-prev {\n      margin-left: -15px;\n    }\n    .glyphicon-chevron-right,\n    .icon-next {\n      margin-right: -15px;\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/close.less",
    "content": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: (@font-size-base * 1.5);\n  font-weight: @close-font-weight;\n  line-height: 1;\n  color: @close-color;\n  text-shadow: @close-text-shadow;\n  .opacity(.2);\n\n  &:hover,\n  &:focus {\n    color: @close-color;\n    text-decoration: none;\n    cursor: pointer;\n    .opacity(.5);\n  }\n\n  // Additional properties for button version\n  // iOS requires the button element instead of an anchor tag.\n  // If you want the anchor version, it requires `href=\"#\"`.\n  button& {\n    padding: 0;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    -webkit-appearance: none;\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/code.less",
    "content": "//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @code-color;\n  background-color: @code-bg;\n  border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @kbd-color;\n  background-color: @kbd-bg;\n  border-radius: @border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n  kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none;\n  }\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: ((@line-height-computed - 1) / 2);\n  margin: 0 0 (@line-height-computed / 2);\n  font-size: (@font-size-base - 1); // 14px to 13px\n  line-height: @line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: @pre-color;\n  background-color: @pre-bg;\n  border: 1px solid @pre-border-color;\n  border-radius: @border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: @pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/component-animations.less",
    "content": "//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n  visibility: hidden;\n\n  &.in      { display: block; visibility: visible; }\n  tr&.in    { display: table-row; }\n  tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition-property(~\"height, visibility\");\n  .transition-duration(.35s);\n  .transition-timing-function(ease);\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/dropdowns.less",
    "content": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   @caret-width-base solid;\n  border-right: @caret-width-base solid transparent;\n  border-left:  @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: @font-size-base;\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  background-color: @dropdown-bg;\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\n  border: 1px solid @dropdown-border;\n  border-radius: @border-radius-base;\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @line-height-base;\n    color: @dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @dropdown-link-hover-color;\n    background-color: @dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: @dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-disabled-color;\n  }\n\n  // Nuke hover/focus effects\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    .reset-filter();\n    cursor: @cursor-disabled;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: @font-size-small;\n  line-height: @line-height-base;\n  color: @dropdown-header-color;\n  white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: @caret-width-base solid;\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 1px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      .dropdown-menu-right();\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      .dropdown-menu-left();\n    }\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/forms.less",
    "content": "//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; // IE8-9\n  line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: (@padding-base-vertical + 1);\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  background-color: @input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid @input-border;\n  border-radius: @input-border-radius;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  .form-control-focus();\n\n  // Placeholder\n  .placeholder();\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n    background-color: @input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    line-height: @input-height-base;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm {\n    line-height: @input-height-small;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg {\n    line-height: @input-height-large;\n  }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n\n  label {\n    min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  &[disabled],\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n  &.disabled,\n  fieldset[disabled] & {\n    label {\n      cursor: @cursor-disabled;\n    }\n  }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  // Size it appropriately next to real form controls\n  padding-top: (@padding-base-vertical + 1);\n  padding-bottom: (@padding-base-vertical + 1);\n  // Remove default margin from `p`\n  margin-bottom: 0;\n\n  &.input-lg,\n  &.input-sm {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm,\n.form-group-sm .form-control {\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n\n.input-lg,\n.form-group-lg .form-control {\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: (@input-height-base * 1.25);\n  }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2; // Ensure icon is above input groups\n  display: block;\n  width: @input-height-base;\n  height: @input-height-base;\n  line-height: @input-height-base;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: @input-height-large;\n  height: @input-height-large;\n  line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback {\n  width: @input-height-small;\n  height: @input-height-small;\n  line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n  & ~ .form-control-feedback {\n     top: (@line-height-computed + 5); // Height of the `label` and its margin\n  }\n  &.sr-only ~ .form-control-feedback {\n     top: 0;\n  }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n  // Kick in the inline\n  @media (min-width: @screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n\n    // Make static controls behave like regular ones\n    .form-control-static {\n      display: inline-block;\n    }\n\n    .input-group {\n      display: inline-table;\n      vertical-align: middle;\n\n      .input-group-addon,\n      .input-group-btn,\n      .form-control {\n        width: auto;\n      }\n    }\n\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match (which also avoids\n    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      vertical-align: middle;\n\n      label {\n        padding-left: 0;\n      }\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      position: relative;\n      margin-left: 0;\n    }\n\n    // Re-override the feedback icon.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of radios and checkboxes\n  //\n  // Labels also get some reset styles, but that is scoped to a media query below.\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: (@line-height-computed + (@padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    .make-row();\n  }\n\n  // Reset spacing and right align labels, but scope to media queries so that\n  // labels on narrow viewports stack the same as a default form example.\n  @media (min-width: @screen-sm-min) {\n    .control-label {\n      text-align: right;\n      margin-bottom: 0;\n      padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    right: (@grid-gutter-width / 2);\n  }\n\n  // Form group sizes\n  //\n  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n  // inputs and labels within a `.form-group`.\n  .form-group-lg {\n    @media (min-width: @screen-sm-min) {\n      .control-label {\n        padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n      }\n    }\n  }\n  .form-group-sm {\n    @media (min-width: @screen-sm-min) {\n      .control-label {\n        padding-top: (@padding-small-vertical + 1);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/glyphicons.less",
    "content": "//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('@{icon-font-path}@{icon-font-name}.eot');\n  src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n       url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n       url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n       url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\2a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur                    { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n.glyphicon-copy                   { &:before { content: \"\\e205\"; } }\n"
  },
  {
    "path": "resources/assets/less/bootstrap/grid.less",
    "content": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  .container-fixed();\n\n  @media (min-width: @screen-sm-min) {\n    width: @container-sm;\n  }\n  @media (min-width: @screen-md-min) {\n    width: @container-md;\n  }\n  @media (min-width: @screen-lg-min) {\n    width: @container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n  .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n  .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n  .make-grid(lg);\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/input-groups.less",
    "content": "//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: @input-color;\n  text-align: center;\n  background-color: @input-group-addon-bg;\n  border: 1px solid @input-group-addon-border-color;\n  border-radius: @border-radius-base;\n\n  // Sizing\n  &.input-sm {\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    border-radius: @border-radius-small;\n  }\n  &.input-lg {\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    border-radius: @border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  .border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  .border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      margin-left: -1px;\n    }\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/jumbotron.less",
    "content": "//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding: @jumbotron-padding (@jumbotron-padding / 2);\n  margin-bottom: @jumbotron-padding;\n  color: @jumbotron-color;\n  background-color: @jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: @jumbotron-heading-color;\n  }\n  p {\n    margin-bottom: (@jumbotron-padding / 2);\n    font-size: @jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  > hr {\n    border-top-color: darken(@jumbotron-bg, 10%);\n  }\n\n  .container &,\n  .container-fluid & {\n    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: @screen-sm-min) {\n    padding: (@jumbotron-padding * 1.6) 0;\n\n    .container &,\n    .container-fluid & {\n      padding-left:  (@jumbotron-padding * 2);\n      padding-right: (@jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: (@font-size-base * 4.5);\n    }\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/labels.less",
    "content": "//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: @label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // Add hover effects, but only for links\n  a& {\n    &:hover,\n    &:focus {\n      color: @label-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  .label-variant(@label-default-bg);\n}\n\n.label-primary {\n  .label-variant(@label-primary-bg);\n}\n\n.label-success {\n  .label-variant(@label-success-bg);\n}\n\n.label-info {\n  .label-variant(@label-info-bg);\n}\n\n.label-warning {\n  .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n  .label-variant(@label-danger-bg);\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/list-group.less",
    "content": "//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n  // No need to set list-style: none; since .list-group-item is block level\n  margin-bottom: 20px;\n  padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  // Place the border on the list items and negative margin up for better styling\n  margin-bottom: -1px;\n  background-color: @list-group-bg;\n  border: 1px solid @list-group-border;\n\n  // Round the first and last items\n  &:first-child {\n    .border-top-radius(@list-group-border-radius);\n  }\n  &:last-child {\n    margin-bottom: 0;\n    .border-bottom-radius(@list-group-border-radius);\n  }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n  color: @list-group-link-color;\n\n  .list-group-item-heading {\n    color: @list-group-link-heading-color;\n  }\n\n  // Hover state\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @list-group-link-hover-color;\n    background-color: @list-group-hover-bg;\n  }\n}\n\n.list-group-item {\n  // Disabled state\n  &.disabled,\n  &.disabled:hover,\n  &.disabled:focus {\n    background-color: @list-group-disabled-bg;\n    color: @list-group-disabled-color;\n    cursor: @cursor-disabled;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: @list-group-disabled-text-color;\n    }\n  }\n\n  // Active class on item itself, not parent\n  &.active,\n  &.active:hover,\n  &.active:focus {\n    z-index: 2; // Place active items above their siblings for proper border styling\n    color: @list-group-active-color;\n    background-color: @list-group-active-bg;\n    border-color: @list-group-active-border;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading,\n    .list-group-item-heading > small,\n    .list-group-item-heading > .small {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: @list-group-active-text-color;\n    }\n  }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/media.less",
    "content": ".media {\n  // Proper spacing between instances of .media\n  margin-top: 15px;\n\n  &:first-child {\n    margin-top: 0;\n  }\n}\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n\n.media-middle {\n  vertical-align: middle;\n}\n\n.media-bottom {\n  vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/alerts.less",
    "content": "// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n  background-color: @background;\n  border-color: @border;\n  color: @text-color;\n\n  hr {\n    border-top-color: darken(@border, 5%);\n  }\n  .alert-link {\n    color: darken(@text-color, 10%);\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/background-variant.less",
    "content": "// Contextual backgrounds\n\n.bg-variant(@color) {\n  background-color: @color;\n  a&:hover {\n    background-color: darken(@color, 10%);\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/border-radius.less",
    "content": "// Single side border-radius\n\n.border-top-radius(@radius) {\n  border-top-right-radius: @radius;\n   border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n  border-bottom-right-radius: @radius;\n     border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n  border-bottom-right-radius: @radius;\n   border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n  border-bottom-left-radius: @radius;\n     border-top-left-radius: @radius;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/buttons.less",
    "content": "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n  color: @color;\n  background-color: @background;\n  border-color: @border;\n\n  &:hover,\n  &:focus,\n  &.focus,\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    color: @color;\n    background-color: darken(@background, 10%);\n        border-color: darken(@border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &,\n    &:hover,\n    &:focus,\n    &.focus,\n    &:active,\n    &.active {\n      background-color: @background;\n          border-color: @border;\n    }\n  }\n\n  .badge {\n    color: @background;\n    background-color: @color;\n  }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/center-block.less",
    "content": "// Center-align a block level element\n\n.center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/clearfix.less",
    "content": "// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/forms.less",
    "content": "// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n  // Color the label and help text\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline,\n  &.radio label,\n  &.checkbox label,\n  &.radio-inline label,\n  &.checkbox-inline label  {\n    color: @text-color;\n  }\n  // Set the border and box shadow on specific inputs to match\n  .form-control {\n    border-color: @border-color;\n    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken(@border-color, 10%);\n      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n      .box-shadow(@shadow);\n    }\n  }\n  // Set validation states also for addons\n  .input-group-addon {\n    color: @text-color;\n    border-color: @border-color;\n    background-color: @background-color;\n  }\n  // Optional feedback icon\n  .form-control-feedback {\n    color: @text-color;\n  }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n  &:focus {\n    border-color: @color;\n    outline: 0;\n    .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n  }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  height: @input-height;\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n\n  select& {\n    height: @input-height;\n    line-height: @input-height;\n  }\n\n  textarea&,\n  select[multiple]& {\n    height: auto;\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/gradients.less",
    "content": "// Gradients\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  // Vertical gradient, from top to bottom\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Opera 12\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n    background-repeat: repeat-x;\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  }\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@inner-color: #555; @outer-color: #333) {\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/grid-framework.less",
    "content": "// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n  // Common styles for all sizes of grid columns, widths 1-12\n  .col(@index) { // initial\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      position: relative;\n      // Prevent columns from collapsing when empty\n      min-height: 1px;\n      // Inner gutter via padding\n      padding-left:  (@grid-gutter-width / 2);\n      padding-right: (@grid-gutter-width / 2);\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n  .col(@index) { // initial\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      float: left;\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n  .col-@{class}-@{index} {\n    width: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n  .col-@{class}-push-@{index} {\n    left: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n  .col-@{class}-push-0 {\n    left: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n  .col-@{class}-pull-@{index} {\n    right: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n  .col-@{class}-pull-0 {\n    right: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n  .col-@{class}-offset-@{index} {\n    margin-left: percentage((@index / @grid-columns));\n  }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n  .calc-grid-column(@index, @class, @type);\n  // next iteration\n  .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n  .float-grid-columns(@class);\n  .loop-grid-columns(@grid-columns, @class, width);\n  .loop-grid-columns(@grid-columns, @class, pull);\n  .loop-grid-columns(@grid-columns, @class, push);\n  .loop-grid-columns(@grid-columns, @class, offset);\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/grid.less",
    "content": "// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n  &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n  margin-left:  (@gutter / -2);\n  margin-right: (@gutter / -2);\n  &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage((@columns / @grid-columns));\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n  margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n  left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n  right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-sm-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-offset(@columns) {\n  @media (min-width: @screen-sm-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-push(@columns) {\n  @media (min-width: @screen-sm-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-pull(@columns) {\n  @media (min-width: @screen-sm-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-md-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-offset(@columns) {\n  @media (min-width: @screen-md-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-push(@columns) {\n  @media (min-width: @screen-md-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-pull(@columns) {\n  @media (min-width: @screen-md-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-lg-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-offset(@columns) {\n  @media (min-width: @screen-lg-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-push(@columns) {\n  @media (min-width: @screen-lg-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-pull(@columns) {\n  @media (min-width: @screen-lg-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/hide-text.less",
    "content": "// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n  font: ~\"0/0\" a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n  .hide-text();\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/image.less",
    "content": "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n  display: @display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n  background-image: url(\"@{file-1x}\");\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(\"@{file-2x}\");\n    background-size: @width-1x @height-1x;\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/labels.less",
    "content": "// Labels\n\n.label-variant(@color) {\n  background-color: @color;\n\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken(@color, 10%);\n    }\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/list-group.less",
    "content": "// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n  .list-group-item-@{state} {\n    color: @color;\n    background-color: @background;\n\n    a& {\n      color: @color;\n\n      .list-group-item-heading {\n        color: inherit;\n      }\n\n      &:hover,\n      &:focus {\n        color: @color;\n        background-color: darken(@background, 5%);\n      }\n      &.active,\n      &.active:hover,\n      &.active:focus {\n        color: #fff;\n        background-color: @color;\n        border-color: @color;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/nav-divider.less",
    "content": "// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n  height: 1px;\n  margin: ((@line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: @color;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/nav-vertical-align.less",
    "content": "// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n  margin-top: ((@navbar-height - @element-height) / 2);\n  margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/opacity.less",
    "content": "// Opacity\n\n.opacity(@opacity) {\n  opacity: @opacity;\n  // IE8 filter\n  @opacity-ie: (@opacity * 100);\n  filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/pagination.less",
    "content": "// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: @padding-vertical @padding-horizontal;\n      font-size: @font-size;\n    }\n    &:first-child {\n      > a,\n      > span {\n        .border-left-radius(@border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/panels.less",
    "content": "// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n  border-color: @border;\n\n  & > .panel-heading {\n    color: @heading-text-color;\n    background-color: @heading-bg-color;\n    border-color: @heading-border;\n\n    + .panel-collapse > .panel-body {\n      border-top-color: @border;\n    }\n    .badge {\n      color: @heading-bg-color;\n      background-color: @heading-text-color;\n    }\n  }\n  & > .panel-footer {\n    + .panel-collapse > .panel-body {\n      border-bottom-color: @border;\n    }\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/progress-bar.less",
    "content": "// Progress bars\n\n.progress-bar-variant(@color) {\n  background-color: @color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    #gradient > .striped();\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/reset-filter.less",
    "content": "// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/resize.less",
    "content": "// Resize anything\n\n.resizable(@direction) {\n  resize: @direction; // Options: horizontal, vertical, both\n  overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/responsive-visibility.less",
    "content": "// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n  display: block !important;\n  table&  { display: table; }\n  tr&     { display: table-row !important; }\n  th&,\n  td&     { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n  display: none !important;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/size.less",
    "content": "// Sizing shortcuts\n\n.size(@width; @height) {\n  width: @width;\n  height: @height;\n}\n\n.square(@size) {\n  .size(@size; @size);\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/tab-focus.less",
    "content": "// WebKit-style focus\n\n.tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/table-row.less",
    "content": "// Tables\n\n.table-row-variant(@state; @background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.@{state},\n    > th.@{state},\n    &.@{state} > td,\n    &.@{state} > th {\n      background-color: @background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.@{state}:hover,\n    > th.@{state}:hover,\n    &.@{state}:hover > td,\n    &:hover > .@{state},\n    &.@{state}:hover > th {\n      background-color: darken(@background, 5%);\n    }\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/text-emphasis.less",
    "content": "// Typography\n\n.text-emphasis-variant(@color) {\n  color: @color;\n  a&:hover {\n    color: darken(@color, 10%);\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/text-overflow.less",
    "content": "// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins/vendor-prefixes.less",
    "content": "// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n       -o-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n  -webkit-animation-fill-mode: @fill-mode;\n          animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: @color;\n    opacity: 1; // See https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9 only\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n  -webkit-transform: scale(@ratioX, @ratioY);\n      -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n       -o-transform: scale(@ratioX, @ratioY);\n          transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n  -webkit-transform: scaleX(@ratio);\n      -ms-transform: scaleX(@ratio); // IE9 only\n       -o-transform: scaleX(@ratio);\n          transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n  -webkit-transform: scaleY(@ratio);\n      -ms-transform: scaleY(@ratio); // IE9 only\n       -o-transform: scaleY(@ratio);\n          transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n  -webkit-transform: skewX(@x) skewY(@y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX(@x) skewY(@y);\n          transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n       -o-transform: rotateX(@degrees);\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n       -o-transform: rotateY(@degrees);\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n  -webkit-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n  -webkit-transition-timing-function: @timing-function;\n          transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/mixins.less",
    "content": "// Mixins\n// --------------------------------------------------\n\n// Utilities\n@import \"mixins/hide-text.less\";\n@import \"mixins/opacity.less\";\n@import \"mixins/image.less\";\n@import \"mixins/labels.less\";\n@import \"mixins/reset-filter.less\";\n@import \"mixins/resize.less\";\n@import \"mixins/responsive-visibility.less\";\n@import \"mixins/size.less\";\n@import \"mixins/tab-focus.less\";\n@import \"mixins/text-emphasis.less\";\n@import \"mixins/text-overflow.less\";\n@import \"mixins/vendor-prefixes.less\";\n\n// Components\n@import \"mixins/alerts.less\";\n@import \"mixins/buttons.less\";\n@import \"mixins/panels.less\";\n@import \"mixins/pagination.less\";\n@import \"mixins/list-group.less\";\n@import \"mixins/nav-divider.less\";\n@import \"mixins/forms.less\";\n@import \"mixins/progress-bar.less\";\n@import \"mixins/table-row.less\";\n\n// Skins\n@import \"mixins/background-variant.less\";\n@import \"mixins/border-radius.less\";\n@import \"mixins/gradients.less\";\n\n// Layout\n@import \"mixins/clearfix.less\";\n@import \"mixins/center-block.less\";\n@import \"mixins/nav-vertical-align.less\";\n@import \"mixins/grid-framework.less\";\n@import \"mixins/grid.less\";\n"
  },
  {
    "path": "resources/assets/less/bootstrap/modals.less",
    "content": "//\n// Modals\n// --------------------------------------------------\n\n// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n  overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal;\n  -webkit-overflow-scrolling: touch;\n\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\n  // https://github.com/twbs/bootstrap/pull/10951.\n  outline: 0;\n\n  // When fading in the modal, animate it to slide down\n  &.fade .modal-dialog {\n    .translate(0, -25%);\n    .transition-transform(~\"0.3s ease-out\");\n  }\n  &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  background-color: @modal-content-bg;\n  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n  border: 1px solid @modal-content-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 3px 9px rgba(0,0,0,.5));\n  background-clip: padding-box;\n  // Remove focus outline from opened modal\n  outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  background-color: @modal-backdrop-bg;\n  // Fade for backdrop\n  &.fade { .opacity(0); }\n  &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  padding: @modal-title-padding;\n  border-bottom: 1px solid @modal-header-border-color;\n  min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n  margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n  margin: 0;\n  line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n  padding: @modal-inner-padding;\n  text-align: right; // right align buttons\n  border-top: 1px solid @modal-footer-border-color;\n  &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n  // and override it for block buttons as well\n  .btn-block + .btn-block {\n    margin-left: 0;\n  }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n  // Automatically set modal's width for larger viewports\n  .modal-dialog {\n    width: @modal-md;\n    margin: 30px auto;\n  }\n  .modal-content {\n    .box-shadow(0 5px 15px rgba(0,0,0,.5));\n  }\n\n  // Modal sizes\n  .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n  .modal-lg { width: @modal-lg; }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/navbar.less",
    "content": "//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: @navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: @navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: @navbar-padding-horizontal;\n  padding-left:  @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  &:extend(.clearfix all);\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      visibility: visible !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  .navbar-collapse {\n    max-height: @navbar-collapse-max-height;\n\n    @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n      max-height: 200px;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -@navbar-padding-horizontal;\n    margin-left:  -@navbar-padding-horizontal;\n\n    @media (min-width: @grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: @zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: @zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n  font-size: @font-size-large;\n  line-height: @line-height-computed;\n  height: @navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  > img {\n    display: block;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: @navbar-padding-horizontal;\n  padding: 9px 10px;\n  .navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: @border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: 0;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: @line-height-computed;\n  }\n\n  @media (max-width: @grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: @line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    @navbar-padding-vertical;\n        padding-bottom: @navbar-padding-vertical;\n      }\n    }\n  }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -@navbar-padding-horizontal;\n  margin-right: -@navbar-padding-horizontal;\n  padding: 10px @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n\n  // Mixin behavior for optimum display\n  .form-inline();\n\n  .form-group {\n    @media (max-width: @grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  .navbar-vertical-align(@input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    .box-shadow(none);\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  .border-top-radius(@navbar-border-radius);\n  .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  .navbar-vertical-align(@input-height-base);\n\n  &.btn-sm {\n    .navbar-vertical-align(@input-height-small);\n  }\n  &.btn-xs {\n    .navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  .navbar-vertical-align(@line-height-computed);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin-left: @navbar-padding-horizontal;\n    margin-right: @navbar-padding-horizontal;\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-left  { .pull-left(); }\n  .navbar-right {\n    .pull-right();\n    margin-right: -@navbar-padding-horizontal;\n\n    ~ .navbar-right {\n      margin-right: 0;\n    }\n  }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: @navbar-default-bg;\n  border-color: @navbar-default-border;\n\n  .navbar-brand {\n    color: @navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-brand-hover-color;\n      background-color: @navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-hover-color;\n        background-color: @navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-active-color;\n        background-color: @navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n        background-color: @navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: @navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: @navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-default-link-active-bg;\n        color: @navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: @navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-hover-color;\n            background-color: @navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-active-color;\n            background-color: @navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-disabled-color;\n            background-color: @navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: @navbar-default-link-color;\n    &:hover {\n      color: @navbar-default-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: @navbar-default-link-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n      }\n    }\n  }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: @navbar-inverse-bg;\n  border-color: @navbar-inverse-border;\n\n  .navbar-brand {\n    color: @navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-brand-hover-color;\n      background-color: @navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-hover-color;\n        background-color: @navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-active-color;\n        background-color: @navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n        background-color: @navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: @navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken(@navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-inverse-link-active-bg;\n        color: @navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: @navbar-inverse-border;\n        }\n        .divider {\n          background-color: @navbar-inverse-border;\n        }\n        > li > a {\n          color: @navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-hover-color;\n            background-color: @navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-active-color;\n            background-color: @navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-disabled-color;\n            background-color: @navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: @navbar-inverse-link-color;\n    &:hover {\n      color: @navbar-inverse-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: @navbar-inverse-link-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/navs.less",
    "content": "//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  &:extend(.clearfix all);\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: @nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: @nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: @nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: @nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: @cursor-disabled;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: @nav-link-hover-bg;\n      border-color: @link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    .nav-divider();\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid @nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: @line-height-base;\n      border: 1px solid transparent;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n      &:hover {\n        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-tabs-active-link-hover-color;\n        background-color: @nav-tabs-active-link-hover-bg;\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    .nav-justified();\n    .nav-tabs-justified();\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: @nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-pills-active-link-hover-color;\n        background-color: @nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n    > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: @border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid @nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: @nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n    visibility: hidden;\n  }\n  > .active {\n    display: block;\n    visibility: visible;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  .border-top-radius(0);\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/normalize.less",
    "content": "/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n//    user zoom.\n//\n\nhtml {\n  font-family: sans-serif; // 1\n  -ms-text-size-adjust: 100%; // 2\n  -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n  margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; // 1\n  vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n  background-color: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n  outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n  font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n  font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n  border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n  margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n  overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n//    Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; // 1\n  font: inherit; // 2\n  margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n  overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n//    and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n//    `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n  cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n  line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; // 1\n  padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n//    (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box; // 2\n  box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n  border: 0; // 1\n  padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n  overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n  font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/pager.less",
    "content": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  &:extend(.clearfix all);\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: @pager-bg;\n      border: 1px solid @pager-border;\n      border-radius: @pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: @pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: @pager-disabled-color;\n      background-color: @pager-bg;\n      cursor: @cursor-disabled;\n    }\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/pagination.less",
    "content": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: @padding-base-vertical @padding-base-horizontal;\n      line-height: @line-height-base;\n      text-decoration: none;\n      color: @pagination-color;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        .border-left-radius(@border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      color: @pagination-hover-color;\n      background-color: @pagination-hover-bg;\n      border-color: @pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: @pagination-active-color;\n      background-color: @pagination-active-bg;\n      border-color: @pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: @pagination-disabled-color;\n      background-color: @pagination-disabled-bg;\n      border-color: @pagination-disabled-border;\n      cursor: @cursor-disabled;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/panels.less",
    "content": "//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n  margin-bottom: @line-height-computed;\n  background-color: @panel-bg;\n  border: 1px solid transparent;\n  border-radius: @panel-border-radius;\n  .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n  padding: @panel-body-padding;\n  &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n  padding: @panel-heading-padding;\n  border-bottom: 1px solid transparent;\n  .border-top-radius((@panel-border-radius - 1));\n\n  > .dropdown .dropdown-toggle {\n    color: inherit;\n  }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: ceil((@font-size-base * 1.125));\n  color: inherit;\n\n  > a {\n    color: inherit;\n  }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n  padding: @panel-footer-padding;\n  background-color: @panel-footer-bg;\n  border-top: 1px solid @panel-inner-border;\n  .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n  > .list-group,\n  > .panel-collapse > .list-group {\n    margin-bottom: 0;\n\n    .list-group-item {\n      border-width: 1px 0;\n      border-radius: 0;\n    }\n\n    // Add border top radius for first one\n    &:first-child {\n      .list-group-item:first-child {\n        border-top: 0;\n        .border-top-radius((@panel-border-radius - 1));\n      }\n    }\n    // Add border bottom radius for last one\n    &:last-child {\n      .list-group-item:last-child {\n        border-bottom: 0;\n        .border-bottom-radius((@panel-border-radius - 1));\n      }\n    }\n  }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n  .list-group-item:first-child {\n    border-top-width: 0;\n  }\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n  > .table,\n  > .table-responsive > .table,\n  > .panel-collapse > .table {\n    margin-bottom: 0;\n\n    caption {\n      padding-left: @panel-body-padding;\n      padding-right: @panel-body-padding;\n    }\n  }\n  // Add border top radius for first one\n  > .table:first-child,\n  > .table-responsive:first-child > .table:first-child {\n    .border-top-radius((@panel-border-radius - 1));\n\n    > thead:first-child,\n    > tbody:first-child {\n      > tr:first-child {\n        border-top-left-radius: (@panel-border-radius - 1);\n        border-top-right-radius: (@panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-top-left-radius: (@panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-top-right-radius: (@panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  // Add border bottom radius for last one\n  > .table:last-child,\n  > .table-responsive:last-child > .table:last-child {\n    .border-bottom-radius((@panel-border-radius - 1));\n\n    > tbody:last-child,\n    > tfoot:last-child {\n      > tr:last-child {\n        border-bottom-left-radius: (@panel-border-radius - 1);\n        border-bottom-right-radius: (@panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-bottom-left-radius: (@panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-bottom-right-radius: (@panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  > .panel-body + .table,\n  > .panel-body + .table-responsive,\n  > .table + .panel-body,\n  > .table-responsive + .panel-body {\n    border-top: 1px solid @table-border-color;\n  }\n  > .table > tbody:first-child > tr:first-child th,\n  > .table > tbody:first-child > tr:first-child td {\n    border-top: 0;\n  }\n  > .table-bordered,\n  > .table-responsive > .table-bordered {\n    border: 0;\n    > thead,\n    > tbody,\n    > tfoot {\n      > tr {\n        > th:first-child,\n        > td:first-child {\n          border-left: 0;\n        }\n        > th:last-child,\n        > td:last-child {\n          border-right: 0;\n        }\n      }\n    }\n    > thead,\n    > tbody {\n      > tr:first-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n    > tbody,\n    > tfoot {\n      > tr:last-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n  }\n  > .table-responsive {\n    border: 0;\n    margin-bottom: 0;\n  }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n  margin-bottom: @line-height-computed;\n\n  // Tighten up margin so it's only between panels\n  .panel {\n    margin-bottom: 0;\n    border-radius: @panel-border-radius;\n\n    + .panel {\n      margin-top: 5px;\n    }\n  }\n\n  .panel-heading {\n    border-bottom: 0;\n\n    + .panel-collapse > .panel-body,\n    + .panel-collapse > .list-group {\n      border-top: 1px solid @panel-inner-border;\n    }\n  }\n\n  .panel-footer {\n    border-top: 0;\n    + .panel-collapse .panel-body {\n      border-bottom: 1px solid @panel-inner-border;\n    }\n  }\n}\n\n\n// Contextual variations\n.panel-default {\n  .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n  .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n  .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n  .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n  .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n  .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/popovers.less",
    "content": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: @zindex-popover;\n  display: none;\n  max-width: @popover-max-width;\n  padding: 1px;\n  // Reset font and text propertes given new insertion method\n  font-family: @font-family-base;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: @line-height-base;\n  text-align: left;\n  background-color: @popover-bg;\n  background-clip: padding-box;\n  border: 1px solid @popover-fallback-border-color;\n  border: 1px solid @popover-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Overrides for proper insertion\n  white-space: normal;\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-top: -@popover-arrow-width; }\n  &.right   { margin-left: @popover-arrow-width; }\n  &.bottom  { margin-top: @popover-arrow-width; }\n  &.left    { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: @font-size-base;\n  background-color: @popover-title-bg;\n  border-bottom: 1px solid darken(@popover-title-bg, 5%);\n  border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n  &,\n  &:after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n  }\n}\n.popover > .arrow {\n  border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n  border-width: @popover-arrow-width;\n  content: \"\";\n}\n\n.popover {\n  &.top > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-bottom-width: 0;\n    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-top-color: @popover-arrow-outer-color;\n    bottom: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      bottom: 1px;\n      margin-left: -@popover-arrow-width;\n      border-bottom-width: 0;\n      border-top-color: @popover-arrow-color;\n    }\n  }\n  &.right > .arrow {\n    top: 50%;\n    left: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-left-width: 0;\n    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-right-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      left: 1px;\n      bottom: -@popover-arrow-width;\n      border-left-width: 0;\n      border-right-color: @popover-arrow-color;\n    }\n  }\n  &.bottom > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-top-width: 0;\n    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-bottom-color: @popover-arrow-outer-color;\n    top: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      top: 1px;\n      margin-left: -@popover-arrow-width;\n      border-top-width: 0;\n      border-bottom-color: @popover-arrow-color;\n    }\n  }\n\n  &.left > .arrow {\n    top: 50%;\n    right: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-right-width: 0;\n    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-left-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      right: 1px;\n      border-right-width: 0;\n      border-left-color: @popover-arrow-color;\n      bottom: -@popover-arrow-width;\n    }\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/print.less",
    "content": "/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n    *,\n    *:before,\n    *:after {\n        background: transparent !important;\n        color: #000 !important; // Black prints faster: h5bp.com/s\n        box-shadow: none !important;\n        text-shadow: none !important;\n    }\n\n    a,\n    a:visited {\n        text-decoration: underline;\n    }\n\n    a[href]:after {\n        content: \" (\" attr(href) \")\";\n    }\n\n    abbr[title]:after {\n        content: \" (\" attr(title) \")\";\n    }\n\n    // Don't show links that are fragment identifiers,\n    // or use the `javascript:` pseudo protocol\n    a[href^=\"#\"]:after,\n    a[href^=\"javascript:\"]:after {\n        content: \"\";\n    }\n\n    pre,\n    blockquote {\n        border: 1px solid #999;\n        page-break-inside: avoid;\n    }\n\n    thead {\n        display: table-header-group; // h5bp.com/t\n    }\n\n    tr,\n    img {\n        page-break-inside: avoid;\n    }\n\n    img {\n        max-width: 100% !important;\n    }\n\n    p,\n    h2,\n    h3 {\n        orphans: 3;\n        widows: 3;\n    }\n\n    h2,\n    h3 {\n        page-break-after: avoid;\n    }\n\n    // Bootstrap specific changes start\n    //\n    // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n    // Once fixed, we can just straight up remove this.\n    select {\n        background: #fff !important;\n    }\n\n    // Bootstrap components\n    .navbar {\n        display: none;\n    }\n    .btn,\n    .dropup > .btn {\n        > .caret {\n            border-top-color: #000 !important;\n        }\n    }\n    .label {\n        border: 1px solid #000;\n    }\n\n    .table {\n        border-collapse: collapse !important;\n\n        td,\n        th {\n            background-color: #fff !important;\n        }\n    }\n    .table-bordered {\n        th,\n        td {\n            border: 1px solid #ddd !important;\n        }\n    }\n\n    // Bootstrap specific changes end\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/progress-bars.less",
    "content": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @line-height-computed;\n  margin-bottom: @line-height-computed;\n  background-color: @progress-bg;\n  border-radius: @progress-border-radius;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: @font-size-small;\n  line-height: @line-height-computed;\n  color: @progress-bar-color;\n  text-align: center;\n  background-color: @progress-bar-bg;\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  #gradient > .striped();\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n  .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  .progress-bar-variant(@progress-bar-danger-bg);\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/responsive-embed.less",
    "content": "// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n\n  .embed-responsive-item,\n  iframe,\n  embed,\n  object,\n  video {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    height: 100%;\n    width: 100%;\n    border: 0;\n  }\n\n  // Modifier class for 16:9 aspect ratio\n  &.embed-responsive-16by9 {\n    padding-bottom: 56.25%;\n  }\n\n  // Modifier class for 4:3 aspect ratio\n  &.embed-responsive-4by3 {\n    padding-bottom: 75%;\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/responsive-utilities.less",
    "content": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n  width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n\n.visible-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-visibility();\n  }\n}\n.visible-xs-block {\n  @media (max-width: @screen-xs-max) {\n    display: block !important;\n  }\n}\n.visible-xs-inline {\n  @media (max-width: @screen-xs-max) {\n    display: inline !important;\n  }\n}\n.visible-xs-inline-block {\n  @media (max-width: @screen-xs-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-visibility();\n  }\n}\n.visible-sm-block {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: block !important;\n  }\n}\n.visible-sm-inline {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: inline !important;\n  }\n}\n.visible-sm-inline-block {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-visibility();\n  }\n}\n.visible-md-block {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: block !important;\n  }\n}\n.visible-md-inline {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: inline !important;\n  }\n}\n.visible-md-inline-block {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-visibility();\n  }\n}\n.visible-lg-block {\n  @media (min-width: @screen-lg-min) {\n    display: block !important;\n  }\n}\n.visible-lg-inline {\n  @media (min-width: @screen-lg-min) {\n    display: inline !important;\n  }\n}\n.visible-lg-inline-block {\n  @media (min-width: @screen-lg-min) {\n    display: inline-block !important;\n  }\n}\n\n.hidden-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-invisibility();\n  }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n  .responsive-invisibility();\n\n  @media print {\n    .responsive-visibility();\n  }\n}\n.visible-print-block {\n  display: none !important;\n\n  @media print {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n\n  @media print {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n\n  @media print {\n    display: inline-block !important;\n  }\n}\n\n.hidden-print {\n  @media print {\n    .responsive-invisibility();\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/scaffolding.less",
    "content": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n  .box-sizing(border-box);\n}\n*:before,\n*:after {\n  .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n  font-family: @font-family-base;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @text-color;\n  background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n\n// Links\n\na {\n  color: @link-color;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: @link-hover-decoration;\n  }\n\n  &:focus {\n    .tab-focus();\n  }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n  margin: 0;\n}\n\n\n// Images\n\nimg {\n  vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n  .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n  border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n  padding: @thumbnail-padding;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  // Keep them at most 100% wide\n  .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n  border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n  margin-top:    @line-height-computed;\n  margin-bottom: @line-height-computed;\n  border: 0;\n  border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/tables.less",
    "content": "//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: @table-bg;\n}\ncaption {\n  padding-top: @table-cell-padding;\n  padding-bottom: @table-cell-padding;\n  color: @text-muted;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid @table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: @body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid @table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-child(odd) {\n    background-color: @table-bg-accent;\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    background-color: @table-bg-hover;\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n  @media screen and (max-width: @screen-xs-max) {\n    width: 100%;\n    margin-bottom: (@line-height-computed * 0.75);\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid @table-border-color;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/theme.less",
    "content": "\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  // Reset the shadow\n  &:active,\n  &.active {\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  .badge {\n    text-shadow: none;\n  }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n  #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n  .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n  background-repeat: repeat-x;\n  border-color: darken(@btn-color, 14%);\n\n  &:hover,\n  &:focus  {\n    background-color: darken(@btn-color, 12%);\n    background-position: 0 -15px;\n  }\n\n  &:active,\n  &.active {\n    background-color: darken(@btn-color, 12%);\n    border-color: darken(@btn-color, 14%);\n  }\n\n  &:disabled,\n  &[disabled] {\n    background-color: darken(@btn-color, 12%);\n    background-image: none;\n  }\n}\n\n// Common styles\n.btn {\n  // Remove the gradient for the pressed/active state\n  &:active,\n  &.active {\n    background-image: none;\n  }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info    { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger  { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n  background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n  background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n  border-radius: @navbar-border-radius;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  .navbar-nav > .open > a,\n  .navbar-nav > .active > a {\n    #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n    .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n  }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n  #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n  .navbar-nav > .open > a,\n  .navbar-nav > .active > a {\n    #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n    .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n  }\n\n  .navbar-brand,\n  .navbar-nav > li > a {\n    text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n  }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n  .navbar .navbar-nav .open .dropdown-menu > .active > a {\n    &,\n    &:hover,\n    &:focus {\n      color: #fff;\n      #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n    }\n  }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n  text-shadow: 0 1px 0 rgba(255,255,255,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n  .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n  border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success    { .alert-styles(@alert-success-bg); }\n.alert-info       { .alert-styles(@alert-info-bg); }\n.alert-warning    { .alert-styles(@alert-warning-bg); }\n.alert-danger     { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n  #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar            { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success    { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info       { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning    { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger     { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n  #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n  border-radius: @border-radius-base;\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n  #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n  border-color: darken(@list-group-active-border, 7.5%);\n\n  .badge {\n    text-shadow: none;\n  }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n  .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading   { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading   { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading   { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading      { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading   { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading    { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n  #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n  border-color: darken(@well-bg, 10%);\n  @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/thumbnails.less",
    "content": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: @thumbnail-padding;\n  margin-bottom: @line-height-computed;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(border .2s ease-in-out);\n\n  > img,\n  a > img {\n    &:extend(.img-responsive);\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // Add a hover state for linked versions only\n  a&:hover,\n  a&:focus,\n  a&.active {\n    border-color: @link-color;\n  }\n\n  // Image captions\n  .caption {\n    padding: @thumbnail-caption-padding;\n    color: @thumbnail-caption-color;\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/tooltip.less",
    "content": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: @zindex-tooltip;\n  display: block;\n  visibility: visible;\n  // Reset font and text propertes given new insertion method\n  font-family: @font-family-base;\n  font-size: @font-size-small;\n  font-weight: normal;\n  line-height: 1.4;\n  .opacity(0);\n\n  &.in     { .opacity(@tooltip-opacity); }\n  &.top    { margin-top:  -3px; padding: @tooltip-arrow-width 0; }\n  &.right  { margin-left:  3px; padding: 0 @tooltip-arrow-width; }\n  &.bottom { margin-top:   3px; padding: @tooltip-arrow-width 0; }\n  &.left   { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: @tooltip-max-width;\n  padding: 3px 8px;\n  color: @tooltip-color;\n  text-align: center;\n  text-decoration: none;\n  background-color: @tooltip-bg;\n  border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n  &.top .tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-left .tooltip-arrow {\n    bottom: 0;\n    right: @tooltip-arrow-width;\n    margin-bottom: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-right .tooltip-arrow {\n    bottom: 0;\n    left: @tooltip-arrow-width;\n    margin-bottom: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-right-color: @tooltip-arrow-color;\n  }\n  &.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-left-color: @tooltip-arrow-color;\n  }\n  &.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-left .tooltip-arrow {\n    top: 0;\n    right: @tooltip-arrow-width;\n    margin-top: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-right .tooltip-arrow {\n    top: 0;\n    left: @tooltip-arrow-width;\n    margin-top: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/type.less",
    "content": "//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: @headings-font-family;\n  font-weight: @headings-font-weight;\n  line-height: @headings-line-height;\n  color: @headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: @headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: @line-height-computed;\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: (@line-height-computed / 2);\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: @line-height-computed;\n  font-size: floor((@font-size-base * 1.15));\n  font-weight: 300;\n  line-height: 1.4;\n\n  @media (min-width: @screen-sm-min) {\n    font-size: (@font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n  font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n  background-color: @state-warning-bg;\n  padding: .2em;\n}\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n.text-nowrap         { white-space: nowrap; }\n\n// Transformation\n.text-lowercase      { text-transform: lowercase; }\n.text-uppercase      { text-transform: uppercase; }\n.text-capitalize     { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n  color: @text-muted;\n}\n.text-primary {\n  .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n  .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n  .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n  .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n  .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n  .bg-variant(@brand-primary);\n}\n.bg-success {\n  .bg-variant(@state-success-bg);\n}\n.bg-info {\n  .bg-variant(@state-info-bg);\n}\n.bg-warning {\n  .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n  .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: ((@line-height-computed / 2) - 1);\n  margin: (@line-height-computed * 2) 0 @line-height-computed;\n  border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: (@line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n  .list-unstyled();\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n  line-height: @line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n  dd {\n    &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    dt {\n      float: left;\n      width: (@dl-horizontal-offset - 20);\n      clear: left;\n      text-align: right;\n      .text-overflow();\n    }\n    dd {\n      margin-left: @dl-horizontal-offset;\n    }\n  }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: (@line-height-computed / 2) @line-height-computed;\n  margin: 0 0 @line-height-computed;\n  font-size: @blockquote-font-size;\n  border-left: 5px solid @blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: @line-height-base;\n    color: @blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid @blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Addresses\naddress {\n  margin-bottom: @line-height-computed;\n  font-style: normal;\n  line-height: @line-height-base;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/utilities.less",
    "content": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  .clearfix();\n}\n.center-block {\n  .center-block();\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n"
  },
  {
    "path": "resources/assets/less/bootstrap/variables.less",
    "content": "//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-base:              #000;\n@gray-darker:            lighten(@gray-base, 13.5%); // #222\n@gray-dark:              lighten(@gray-base, 20%);   // #333\n@gray:                   lighten(@gray-base, 33.5%); // #555\n@gray-light:             lighten(@gray-base, 46.7%); // #777\n@gray-lighter:           lighten(@gray-base, 93.5%); // #eee\n\n@brand-primary:         darken(#428bca, 6.5%);\n@brand-success:         #5cb85c;\n@brand-info:            #5bc0de;\n@brand-warning:         #f0ad4e;\n@brand-danger:          #d9534f;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for `<body>`.\n@body-bg:               #fff;\n//** Global text color on `<body>`.\n@text-color:            @gray-dark;\n\n//** Global textual link color.\n@link-color:            @brand-primary;\n//** Link hover color set via `darken()` function.\n@link-hover-color:      darken(@link-color, 15%);\n//** Link hover decoration.\n@link-hover-decoration: underline;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n@font-family-sans-serif:  \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif:       Georgia, \"Times New Roman\", Times, serif;\n//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.\n@font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base:        @font-family-sans-serif;\n\n@font-size-base:          14px;\n@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px\n\n@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5:            @font-size-base;\n@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base:        1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px\n\n//** By default, this inherits from the `<body>`.\n@headings-font-family:    inherit;\n@headings-font-weight:    500;\n@headings-line-height:    1.1;\n@headings-color:          inherit;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n@icon-font-path:          \"../fonts/\";\n//** File name for all font files.\n@icon-font-name:          \"glyphicons-halflings-regular\";\n//** Element ID within SVG icon file.\n@icon-font-svg-id:        \"glyphicons_halflingsregular\";\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical:     6px;\n@padding-base-horizontal:   12px;\n\n@padding-large-vertical:    10px;\n@padding-large-horizontal:  16px;\n\n@padding-small-vertical:    5px;\n@padding-small-horizontal:  10px;\n\n@padding-xs-vertical:       1px;\n@padding-xs-horizontal:     5px;\n\n@line-height-large:         1.33;\n@line-height-small:         1.5;\n\n@border-radius-base:        4px;\n@border-radius-large:       6px;\n@border-radius-small:       3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color:    #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg:       @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base:          4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large:         5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for `<th>`s and `<td>`s.\n@table-cell-padding:            8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding:  5px;\n\n//** Default background color used for all tables.\n@table-bg:                      transparent;\n//** Background color used for `.table-striped`.\n@table-bg-accent:               #f9f9f9;\n//** Background color used for `.table-hover`.\n@table-bg-hover:                #f5f5f5;\n@table-bg-active:               @table-bg-hover;\n\n//** Border color for table and cell borders.\n@table-border-color:            #ddd;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight:                normal;\n\n@btn-default-color:              #333;\n@btn-default-bg:                 #fff;\n@btn-default-border:             #ccc;\n\n@btn-primary-color:              #fff;\n@btn-primary-bg:                 @brand-primary;\n@btn-primary-border:             darken(@btn-primary-bg, 5%);\n\n@btn-success-color:              #fff;\n@btn-success-bg:                 @brand-success;\n@btn-success-border:             darken(@btn-success-bg, 5%);\n\n@btn-info-color:                 #fff;\n@btn-info-bg:                    @brand-info;\n@btn-info-border:                darken(@btn-info-bg, 5%);\n\n@btn-warning-color:              #fff;\n@btn-warning-bg:                 @brand-warning;\n@btn-warning-border:             darken(@btn-warning-bg, 5%);\n\n@btn-danger-color:               #fff;\n@btn-danger-bg:                  @brand-danger;\n@btn-danger-border:              darken(@btn-danger-bg, 5%);\n\n@btn-link-disabled-color:        @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `<input>` background color\n@input-bg:                       #fff;\n//** `<input disabled>` background color\n@input-bg-disabled:              @gray-lighter;\n\n//** Text color for `<input>`s\n@input-color:                    @gray;\n//** `<input>` border color\n@input-border:                   #ccc;\n\n// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4\n//** Default `.form-control` border radius\n@input-border-radius:            @border-radius-base;\n//** Large `.form-control` border radius\n@input-border-radius-large:      @border-radius-large;\n//** Small `.form-control` border radius\n@input-border-radius-small:      @border-radius-small;\n\n//** Border color for inputs on focus\n@input-border-focus:             #66afe9;\n\n//** Placeholder text color\n@input-color-placeholder:        #999;\n\n//** Default `.form-control` height\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color:                   @gray-dark;\n@legend-border-color:            #e5e5e5;\n\n//** Background color for textual input addons\n@input-group-addon-bg:           @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n//** Disabled cursor for form controls and buttons.\n@cursor-disabled:                not-allowed;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg:                    #fff;\n//** Dropdown menu `border-color`.\n@dropdown-border:                rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border:       #ccc;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg:            #e5e5e5;\n\n//** Dropdown link text color.\n@dropdown-link-color:            @gray-dark;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color:      darken(@gray-dark, 5%);\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg:         #f5f5f5;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color:     @component-active-color;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg:        @component-active-bg;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color:   @gray-light;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color:          @gray-light;\n\n//** Deprecated `@dropdown-caret-color` as of v3.1.0\n@dropdown-caret-color:           #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar:            1000;\n@zindex-dropdown:          1000;\n@zindex-popover:           1060;\n@zindex-tooltip:           1070;\n@zindex-navbar-fixed:      1030;\n@zindex-modal:             1040;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `@screen-xs` as of v3.0.1\n@screen-xs:                  480px;\n//** Deprecated `@screen-xs-min` as of v3.2.0\n@screen-xs-min:              @screen-xs;\n//** Deprecated `@screen-phone` as of v3.0.1\n@screen-phone:               @screen-xs-min;\n\n// Small screen / tablet\n//** Deprecated `@screen-sm` as of v3.0.1\n@screen-sm:                  768px;\n@screen-sm-min:              @screen-sm;\n//** Deprecated `@screen-tablet` as of v3.0.1\n@screen-tablet:              @screen-sm-min;\n\n// Medium screen / desktop\n//** Deprecated `@screen-md` as of v3.0.1\n@screen-md:                  992px;\n@screen-md-min:              @screen-md;\n//** Deprecated `@screen-desktop` as of v3.0.1\n@screen-desktop:             @screen-md-min;\n\n// Large screen / wide desktop\n//** Deprecated `@screen-lg` as of v3.0.1\n@screen-lg:                  1200px;\n@screen-lg-min:              @screen-lg;\n//** Deprecated `@screen-lg-desktop` as of v3.0.1\n@screen-lg-desktop:          @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max:              (@screen-sm-min - 1);\n@screen-sm-max:              (@screen-md-min - 1);\n@screen-md-max:              (@screen-lg-min - 1);\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n@grid-columns:              12;\n//** Padding between columns. Gets divided in half for the left and right.\n@grid-gutter-width:         30px;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint:     @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet:             (720px + @grid-gutter-width);\n//** For `@screen-sm-min` and up.\n@container-sm:                 @container-tablet;\n\n// Medium screen / desktop\n@container-desktop:            (940px + @grid-gutter-width);\n//** For `@screen-md-min` and up.\n@container-md:                 @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop:      (1140px + @grid-gutter-width);\n//** For `@screen-lg-min` and up.\n@container-lg:                 @container-large-desktop;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height:                    50px;\n@navbar-margin-bottom:             @line-height-computed;\n@navbar-border-radius:             @border-radius-base;\n@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height:       340px;\n\n@navbar-default-color:             #777;\n@navbar-default-bg:                #f8f8f8;\n@navbar-default-border:            darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color:                #777;\n@navbar-default-link-hover-color:          #333;\n@navbar-default-link-hover-bg:             transparent;\n@navbar-default-link-active-color:         #555;\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color:       #ccc;\n@navbar-default-link-disabled-bg:          transparent;\n\n// Navbar brand label\n@navbar-default-brand-color:               @navbar-default-link-color;\n@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);\n@navbar-default-brand-hover-bg:            transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg:           #ddd;\n@navbar-default-toggle-icon-bar-bg:        #888;\n@navbar-default-toggle-border-color:       #ddd;\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color:                      lighten(@gray-light, 15%);\n@navbar-inverse-bg:                         #222;\n@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color:                 lighten(@gray-light, 15%);\n@navbar-inverse-link-hover-color:           #fff;\n@navbar-inverse-link-hover-bg:              transparent;\n@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-link-disabled-color:        #444;\n@navbar-inverse-link-disabled-bg:           transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color:                @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color:          #fff;\n@navbar-inverse-brand-hover-bg:             transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg:            #333;\n@navbar-inverse-toggle-icon-bar-bg:         #fff;\n@navbar-inverse-toggle-border-color:        #333;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding:                          10px 15px;\n@nav-link-hover-bg:                         @gray-lighter;\n\n@nav-disabled-link-color:                   @gray-light;\n@nav-disabled-link-hover-color:             @gray-light;\n\n//== Tabs\n@nav-tabs-border-color:                     #ddd;\n\n@nav-tabs-link-hover-border-color:          @gray-lighter;\n\n@nav-tabs-active-link-hover-bg:             @body-bg;\n@nav-tabs-active-link-hover-color:          @gray;\n@nav-tabs-active-link-hover-border-color:   #ddd;\n\n@nav-tabs-justified-link-border-color:            #ddd;\n@nav-tabs-justified-active-link-border-color:     @body-bg;\n\n//== Pills\n@nav-pills-border-radius:                   @border-radius-base;\n@nav-pills-active-link-hover-bg:            @component-active-bg;\n@nav-pills-active-link-hover-color:         @component-active-color;\n\n\n//== Pagination\n//\n//##\n\n@pagination-color:                     @link-color;\n@pagination-bg:                        #fff;\n@pagination-border:                    #ddd;\n\n@pagination-hover-color:               @link-hover-color;\n@pagination-hover-bg:                  @gray-lighter;\n@pagination-hover-border:              #ddd;\n\n@pagination-active-color:              #fff;\n@pagination-active-bg:                 @brand-primary;\n@pagination-active-border:             @brand-primary;\n\n@pagination-disabled-color:            @gray-light;\n@pagination-disabled-bg:               #fff;\n@pagination-disabled-border:           #ddd;\n\n\n//== Pager\n//\n//##\n\n@pager-bg:                             @pagination-bg;\n@pager-border:                         @pagination-border;\n@pager-border-radius:                  15px;\n\n@pager-hover-bg:                       @pagination-hover-bg;\n\n@pager-active-bg:                      @pagination-active-bg;\n@pager-active-color:                   @pagination-active-color;\n\n@pager-disabled-color:                 @pagination-disabled-color;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding:              30px;\n@jumbotron-color:                inherit;\n@jumbotron-bg:                   @gray-lighter;\n@jumbotron-heading-color:        inherit;\n@jumbotron-font-size:            ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text:             #3c763d;\n@state-success-bg:               #dff0d8;\n@state-success-border:           darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text:                #31708f;\n@state-info-bg:                  #d9edf7;\n@state-info-border:              darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text:             #8a6d3b;\n@state-warning-bg:               #fcf8e3;\n@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text:              #a94442;\n@state-danger-bg:                #f2dede;\n@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width:           200px;\n//** Tooltip text color\n@tooltip-color:               #fff;\n//** Tooltip background color\n@tooltip-bg:                  #000;\n@tooltip-opacity:             .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width:         5px;\n//** Tooltip arrow color\n@tooltip-arrow-color:         @tooltip-bg;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg:                          #fff;\n//** Popover maximum width\n@popover-max-width:                   276px;\n//** Popover border color\n@popover-border-color:                rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color:       #ccc;\n\n//** Popover title background color\n@popover-title-bg:                    darken(@popover-bg, 3%);\n\n//** Popover arrow width\n@popover-arrow-width:                 10px;\n//** Popover arrow color\n@popover-arrow-color:                 @popover-bg;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg:            @gray-light;\n//** Primary label background color\n@label-primary-bg:            @brand-primary;\n//** Success label background color\n@label-success-bg:            @brand-success;\n//** Info label background color\n@label-info-bg:               @brand-info;\n//** Warning label background color\n@label-warning-bg:            @brand-warning;\n//** Danger label background color\n@label-danger-bg:             @brand-danger;\n\n//** Default label text color\n@label-color:                 #fff;\n//** Default text color of a linked label\n@label-link-hover-color:      #fff;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding:         15px;\n\n//** Padding applied to the modal title\n@modal-title-padding:         15px;\n//** Modal title line-height\n@modal-title-line-height:     @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg:                             #fff;\n//** Modal content border color\n@modal-content-border-color:                   rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color:          #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg:           #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity:      .5;\n//** Modal header border color\n@modal-header-border-color:   #e5e5e5;\n//** Modal footer border color\n@modal-footer-border-color:   @modal-header-border-color;\n\n@modal-lg:                    900px;\n@modal-md:                    600px;\n@modal-sm:                    300px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding:               15px;\n@alert-border-radius:         @border-radius-base;\n@alert-link-font-weight:      bold;\n\n@alert-success-bg:            @state-success-bg;\n@alert-success-text:          @state-success-text;\n@alert-success-border:        @state-success-border;\n\n@alert-info-bg:               @state-info-bg;\n@alert-info-text:             @state-info-text;\n@alert-info-border:           @state-info-border;\n\n@alert-warning-bg:            @state-warning-bg;\n@alert-warning-text:          @state-warning-text;\n@alert-warning-border:        @state-warning-border;\n\n@alert-danger-bg:             @state-danger-bg;\n@alert-danger-text:           @state-danger-text;\n@alert-danger-border:         @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg:                 #f5f5f5;\n//** Progress bar text color\n@progress-bar-color:          #fff;\n//** Variable for setting rounded corners on progress bar.\n@progress-border-radius:      @border-radius-base;\n\n//** Default progress bar color\n@progress-bar-bg:             @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg:     @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg:     @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg:      @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg:        @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg:                 #fff;\n//** `.list-group-item` border color\n@list-group-border:             #ddd;\n//** List group border radius\n@list-group-border-radius:      @border-radius-base;\n\n//** Background color of single list items on hover\n@list-group-hover-bg:           #f5f5f5;\n//** Text color of active list items\n@list-group-active-color:       @component-active-color;\n//** Background color of active list items\n@list-group-active-bg:          @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border:      @list-group-active-bg;\n//** Text color for content within active list items\n@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);\n\n//** Text color of disabled list items\n@list-group-disabled-color:      @gray-light;\n//** Background color of disabled list items\n@list-group-disabled-bg:         @gray-lighter;\n//** Text color for content within disabled list items\n@list-group-disabled-text-color: @list-group-disabled-color;\n\n@list-group-link-color:         #555;\n@list-group-link-hover-color:   @list-group-link-color;\n@list-group-link-heading-color: #333;\n\n\n//== Panels\n//\n//##\n\n@panel-bg:                    #fff;\n@panel-body-padding:          15px;\n@panel-heading-padding:       10px 15px;\n@panel-footer-padding:        @panel-heading-padding;\n@panel-border-radius:         @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border:          #ddd;\n@panel-footer-bg:             #f5f5f5;\n\n@panel-default-text:          @gray-dark;\n@panel-default-border:        #ddd;\n@panel-default-heading-bg:    #f5f5f5;\n\n@panel-primary-text:          #fff;\n@panel-primary-border:        @brand-primary;\n@panel-primary-heading-bg:    @brand-primary;\n\n@panel-success-text:          @state-success-text;\n@panel-success-border:        @state-success-border;\n@panel-success-heading-bg:    @state-success-bg;\n\n@panel-info-text:             @state-info-text;\n@panel-info-border:           @state-info-border;\n@panel-info-heading-bg:       @state-info-bg;\n\n@panel-warning-text:          @state-warning-text;\n@panel-warning-border:        @state-warning-border;\n@panel-warning-heading-bg:    @state-warning-bg;\n\n@panel-danger-text:           @state-danger-text;\n@panel-danger-border:         @state-danger-border;\n@panel-danger-heading-bg:     @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding:           4px;\n//** Thumbnail background color\n@thumbnail-bg:                @body-bg;\n//** Thumbnail border color\n@thumbnail-border:            #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius:     @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color:     @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding:   9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg:                     #f5f5f5;\n@well-border:                 darken(@well-bg, 7%);\n\n\n//== Badges\n//\n//##\n\n@badge-color:                 #fff;\n//** Linked badge text color on hover\n@badge-link-hover-color:      #fff;\n@badge-bg:                    @gray-light;\n\n//** Badge text color in active nav link\n@badge-active-color:          @link-color;\n//** Badge background color in active nav link\n@badge-active-bg:             #fff;\n\n@badge-font-weight:           bold;\n@badge-line-height:           1;\n@badge-border-radius:         10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical:   8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg:                 #f5f5f5;\n//** Breadcrumb text color\n@breadcrumb-color:              #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color:       @gray-light;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator:          \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color:                      #fff;\n@carousel-control-width:                      15%;\n@carousel-control-opacity:                    .5;\n@carousel-control-font-size:                  20px;\n\n@carousel-indicator-active-bg:                #fff;\n@carousel-indicator-border-color:             #fff;\n\n@carousel-caption-color:                      #fff;\n\n\n//== Close\n//\n//##\n\n@close-font-weight:           bold;\n@close-color:                 #000;\n@close-text-shadow:           0 1px 0 #fff;\n\n\n//== Code\n//\n//##\n\n@code-color:                  #c7254e;\n@code-bg:                     #f9f2f4;\n\n@kbd-color:                   #fff;\n@kbd-bg:                      #333;\n\n@pre-bg:                      #f5f5f5;\n@pre-color:                   @gray-dark;\n@pre-border-color:            #ccc;\n@pre-scrollable-max-height:   340px;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n//** Text muted color\n@text-muted:                  @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color:           @gray-light;\n//** Headings small color\n@headings-small-color:        @gray-light;\n//** Blockquote small color\n@blockquote-small-color:      @gray-light;\n//** Blockquote font size\n@blockquote-font-size:        (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color:     @gray-lighter;\n//** Page header border color\n@page-header-border-color:    @gray-lighter;\n//** Width of horizontal description list titles\n@dl-horizontal-offset:        @component-offset-horizontal;\n//** Horizontal line color.\n@hr-border:                   @gray-lighter;\n"
  },
  {
    "path": "resources/assets/less/bootstrap/wells.less",
    "content": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: @well-bg;\n  border: 1px solid @well-border;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-lg {\n  padding: 24px;\n  border-radius: @border-radius-large;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: @border-radius-small;\n}\n"
  },
  {
    "path": "resources/assets/less/webloyer/bootstrap.less",
    "content": "@import \"code.less\";\n@import \"forms.less\";\n@import \"list-group.less\";\n@import \"helpers.less\";\n"
  },
  {
    "path": "resources/assets/less/webloyer/code.less",
    "content": ".ansi_box {\n    background-color: black;\n    overflow: auto;\n    padding: 10px 15px;\n    font-family: monospace;\n}\n"
  },
  {
    "path": "resources/assets/less/webloyer/forms.less",
    "content": ".form-group.required .control-label:after {\n    content: \"*\";\n    color: red;\n}\n"
  },
  {
    "path": "resources/assets/less/webloyer/helpers.less",
    "content": ".margin-bottom-xs {\n    margin-bottom: 3px !important;\n}\n\n.margin-bottom-sm {\n    margin-bottom: 6px !important;\n}\n\n.margin-bottom-md {\n    margin-bottom: 15px !important;\n}\n\n.margin-bottom-lg {\n    margin-bottom: 30px !important;\n}\n\n.green {\n    color: #5cb85c;\n}\n\n.red {\n    color: #d9534f;\n}\n\n.gray {\n    color: gray;\n}\n"
  },
  {
    "path": "resources/assets/less/webloyer/list-group.less",
    "content": ".list-group-item.selected {\n    font-weight: bold;\n}\n\n.list-group-item.selected:before {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    width: 2px;\n    content: \"\";\n    background-color: #d26911;\n}\n"
  },
  {
    "path": "resources/lang/en/pagination.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Pagination Language Lines\n    |--------------------------------------------------------------------------\n    |\n    | The following language lines are used by the paginator library to build\n    | the simple pagination links. You are free to change them to anything\n    | you want to customize your views to better match your application.\n    |\n    */\n\n    'previous' => '&laquo; Previous',\n    'next'     => 'Next &raquo;',\n\n];\n"
  },
  {
    "path": "resources/lang/en/passwords.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Password Reminder Language Lines\n    |--------------------------------------------------------------------------\n    |\n    | The following language lines are the default lines which match reasons\n    | that are given by the password broker for a password update attempt\n    | has failed, such as for an invalid token or invalid new password.\n    |\n    */\n\n    \"password\" => \"Passwords must be at least six characters and match the confirmation.\",\n    \"user\" => \"We can't find a user with that e-mail address.\",\n    \"token\" => \"This password reset token is invalid.\",\n    \"sent\" => \"We have e-mailed your password reset link!\",\n    \"reset\" => \"Your password has been reset!\",\n\n];\n"
  },
  {
    "path": "resources/lang/en/validation.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Validation Language Lines\n    |--------------------------------------------------------------------------\n    |\n    | The following language lines contain the default error messages used by\n    | the validator class. Some of these rules have multiple versions such\n    | as the size rules. Feel free to tweak each of these messages here.\n    |\n    */\n\n    \"accepted\"             => \"The :attribute must be accepted.\",\n    \"active_url\"           => \"The :attribute is not a valid URL.\",\n    \"after\"                => \"The :attribute must be a date after :date.\",\n    \"alpha\"                => \"The :attribute may only contain letters.\",\n    \"alpha_dash\"           => \"The :attribute may only contain letters, numbers, and dashes.\",\n    \"alpha_num\"            => \"The :attribute may only contain letters and numbers.\",\n    \"array\"                => \"The :attribute must be an array.\",\n    \"before\"               => \"The :attribute must be a date before :date.\",\n    \"between\"              => [\n        \"numeric\" => \"The :attribute must be between :min and :max.\",\n        \"file\"    => \"The :attribute must be between :min and :max kilobytes.\",\n        \"string\"  => \"The :attribute must be between :min and :max characters.\",\n        \"array\"   => \"The :attribute must have between :min and :max items.\",\n    ],\n    \"boolean\"              => \"The :attribute field must be true or false.\",\n    \"confirmed\"            => \"The :attribute confirmation does not match.\",\n    \"date\"                 => \"The :attribute is not a valid date.\",\n    \"date_format\"          => \"The :attribute does not match the format :format.\",\n    \"different\"            => \"The :attribute and :other must be different.\",\n    \"digits\"               => \"The :attribute must be :digits digits.\",\n    \"digits_between\"       => \"The :attribute must be between :min and :max digits.\",\n    \"email\"                => \"The :attribute must be a valid email address.\",\n    \"filled\"               => \"The :attribute field is required.\",\n    \"exists\"               => \"The selected :attribute is invalid.\",\n    \"image\"                => \"The :attribute must be an image.\",\n    \"in\"                   => \"The selected :attribute is invalid.\",\n    \"integer\"              => \"The :attribute must be an integer.\",\n    \"ip\"                   => \"The :attribute must be a valid IP address.\",\n    \"max\"                  => [\n        \"numeric\" => \"The :attribute may not be greater than :max.\",\n        \"file\"    => \"The :attribute may not be greater than :max kilobytes.\",\n        \"string\"  => \"The :attribute may not be greater than :max characters.\",\n        \"array\"   => \"The :attribute may not have more than :max items.\",\n    ],\n    \"mimes\"                => \"The :attribute must be a file of type: :values.\",\n    \"min\"                  => [\n        \"numeric\" => \"The :attribute must be at least :min.\",\n        \"file\"    => \"The :attribute must be at least :min kilobytes.\",\n        \"string\"  => \"The :attribute must be at least :min characters.\",\n        \"array\"   => \"The :attribute must have at least :min items.\",\n    ],\n    \"not_in\"               => \"The selected :attribute is invalid.\",\n    \"numeric\"              => \"The :attribute must be a number.\",\n    \"regex\"                => \"The :attribute format is invalid.\",\n    \"required\"             => \"The :attribute field is required.\",\n    \"required_if\"          => \"The :attribute field is required when :other is :value.\",\n    \"required_with\"        => \"The :attribute field is required when :values is present.\",\n    \"required_with_all\"    => \"The :attribute field is required when :values is present.\",\n    \"required_without\"     => \"The :attribute field is required when :values is not present.\",\n    \"required_without_all\" => \"The :attribute field is required when none of :values are present.\",\n    \"same\"                 => \"The :attribute and :other must match.\",\n    \"size\"                 => [\n        \"numeric\" => \"The :attribute must be :size.\",\n        \"file\"    => \"The :attribute must be :size kilobytes.\",\n        \"string\"  => \"The :attribute must be :size characters.\",\n        \"array\"   => \"The :attribute must contain :size items.\",\n    ],\n    \"unique\"               => \"The :attribute has already been taken.\",\n    \"url\"                  => \"The :attribute format is invalid.\",\n    \"timezone\"             => \"The :attribute must be a valid zone.\",\n\n    /*\n    |--------------------------------------------------------------------------\n    | Custom Validation Language Lines\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify custom validation messages for attributes using the\n    | convention \"attribute.rule\" to name the lines. This makes it quick to\n    | specify a specific custom language line for a given attribute rule.\n    |\n    */\n\n    'custom' => [\n        'attribute-name' => [\n            'rule-name' => 'custom-message',\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Custom Validation Attributes\n    |--------------------------------------------------------------------------\n    |\n    | The following language lines are used to swap attribute place-holders\n    | with something more reader friendly such as E-Mail Address instead\n    | of \"email\". This simply helps us make messages a little cleaner.\n    |\n    */\n\n    'attributes' => [],\n\n];\n"
  },
  {
    "path": "resources/lang/en/webloyer.php",
    "content": "<?php\n\nreturn [\n\n    'enter_webloyer_url' => 'Please enter your Webloyer URL (\"http://webloyer.local\" for example)',\n\n    'enter_admin_name'     => 'Please enter admin name',\n    'enter_admin_email'    => 'Please enter admin email',\n    'enter_admin_password' => 'Please enter admin password',\n\n    'enter_db_system'      => 'Please enter your DB system',\n    'enter_db_host'        => 'Please enter your DB host',\n    'enter_db_name'        => 'Please enter your DB name',\n    'enter_db_name_sqlite' => 'Please enter your DB file',\n    'enter_db_username'    => 'Please enter your DB username',\n    'enter_db_password'    => 'Please enter your DB password',\n\n];\n"
  },
  {
    "path": "resources/views/app.blade.php",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>Webloyer</title>\n\n    <link href=\"{{ asset('/css/app.css') }}\" rel=\"stylesheet\">\n\n    <!-- Fonts -->\n    <link href='//fonts.googleapis.com/css?family=Roboto:400,300' rel='stylesheet' type='text/css'>\n\n    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->\n    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->\n    <!--[if lt IE 9]>\n        <script src=\"https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js\"></script>\n        <script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n    <![endif]-->\n\n    <link href=\"{{ asset('/vendor/lou/multi-select/css/multi-select.css') }}\" rel=\"stylesheet\">\n</head>\n<body>\n    <nav class=\"navbar navbar-default\">\n        <div class=\"container-fluid\">\n            <div class=\"navbar-header\">\n                <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#bs-example-navbar-collapse-1\">\n                    <span class=\"sr-only\">Toggle Navigation</span>\n                    <span class=\"icon-bar\"></span>\n                    <span class=\"icon-bar\"></span>\n                    <span class=\"icon-bar\"></span>\n                </button>\n                <a class=\"navbar-brand\" href=\"{{ url('/') }}\">Webloyer</a>\n            </div>\n\n            <div class=\"collapse navbar-collapse\" id=\"bs-example-navbar-collapse-1\">\n                @if (!Auth::guest())\n                    <ul class=\"nav navbar-nav\">\n                        <li><a href=\"{{ url('/projects') }}\">Projects</a></li>\n                        @if (Auth::user()->can('view.recipe'))\n                            <li><a href=\"{{ url('/recipes') }}\">Recipes</a></li>\n                        @endif\n                        @if (Auth::user()->can('view.server'))\n                            <li><a href=\"{{ url('/servers') }}\">Servers</a></li>\n                        @endif\n                        @if (Auth::user()->can('view.user'))\n                            <li><a href=\"{{ url('/users') }}\">Users</a></li>\n                        @endif\n                        @if (Auth::user()->can('view.setting'))\n                            <li><a href=\"{{ url('/settings/email') }}\">Settings</a></li>\n                        @endif\n                    </ul>\n                @endif\n\n                <ul class=\"nav navbar-nav navbar-right\">\n                    @if (Auth::guest())\n                        <li><a href=\"{{ url('/auth/login') }}\">Login</a></li>\n                    @else\n                        <li class=\"dropdown\">\n                            <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\">{{ Auth::user()->name }} <span class=\"caret\"></span></a>\n                            <ul class=\"dropdown-menu\" role=\"menu\">\n                                <li><a href=\"{{ url('/auth/logout') }}\">Logout</a></li>\n                            </ul>\n                        </li>\n                    @endif\n                </ul>\n            </div>\n        </div>\n    </nav>\n\n    <div class=\"container-fluid\">\n        <div class=\"row\">\n            <div class=\"col-md-8 col-md-offset-2\">\n                {!! Breadcrumbs::renderIfExists() !!}\n            </div>\n        </div>\n    </div>\n\n    @yield('content')\n\n    <footer class=\"footer\">\n        <div class=\"container text-center\">\n            <p class=\"text-muted credit\">\n                <p>Webloyer is Copyright &copy; 2015 by Yuta Nagamiya hosted on <a href=\"https://github.com/ngmy/webloyer\">GitHub</a>.</p>\n                <p>Webloyer is a Web UI for <a href=\"http://deployer.org/\">Deployer</a>.</p>\n            </p>\n        </div>\n    </footer>\n\n    <!-- Scripts -->\n    <script src=\"//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js\"></script>\n    <script src=\"//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js\"></script>\n    <script src=\"//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js\"></script>\n    <script src=\"//cdn.jsdelivr.net/clipboard.js/1.5.3/clipboard.min.js\"></script>\n    <script src=\"{{ asset('vendor/lou/multi-select/js/jquery.multi-select.js') }}\"></script>\n    <script src=\"{{ asset('/js/vendor/ajaxorg/ace/ace.js') }}\"></script>\n    <script>\n        // Hook up ACE editor to all textareas with data-editor attribute\n        $(function () {\n            $('textarea[data-editor]').each(function () {\n                var textarea = $(this);\n\n                var mode = textarea.data('editor');\n\n                var editDiv = $('<div>', {\n                    position: 'absolute',\n                    width: textarea.closest('div').width(),\n                    height: textarea.closest('div').height(),\n                    'class': textarea.attr('class')\n                }).insertBefore(textarea);\n\n                textarea.css('display', 'none');\n\n                var editor = ace.edit(editDiv[0]);\n                editor.renderer.setShowGutter(false);\n                editor.getSession().setValue(textarea.val());\n                editor.getSession().setMode('ace/mode/' + mode);\n                editor.setTheme('ace/theme/github');\n\n                // copy back to textarea on form submit...\n                textarea.closest('form').submit(function () {\n                    textarea.val(editor.getSession().getValue());\n                })\n\n            });\n        });\n    </script>\n    <script>\n        $(function () {\n            $('form').submit(function () {\n                $(this).find(':submit').attr('disabled', 'disabled');\n            });\n        });\n    </script>\n    <script>\n        // Pre-selected\n        $(function () {\n            $('.ms-container').each(function (i, elem) {\n                var orgId = $(elem).attr('id').replace(/^ms\\-/, '');\n                var orderId = orgId + '_order';\n                var getVal = $('#' + orderId).val();\n                var getValArray = getVal.split(',');\n                var newValArray = getValArray.filter(function (x) {\n                    return x != '';\n                });\n                var selectableIdArray = newValArray.map(function (x) {\n                    var index = $('#' + orgId + ' option').index($('option[value=\"' + x + '\"]'));\n                    var id = $('.ms-elem-selectable').eq(index).attr('id');\n                    return id;\n                });\n                var selectionIdArray = selectableIdArray.map(function (x) {\n                    return x.replace(/selectable/, 'selection');\n                });\n                var ul = $('.ms-selection ul');\n                selectionIdArray.forEach(function (x) {\n                    var li = ul.find('#' + x);\n                    ul.append(li);\n                });\n            });\n        });\n    </script>\n    <script>\n        // To sortable selected list\n        $(function () {\n            $('.ms-selection ul').sortable({\n                update: function (event, ui) {\n                    var sortableIdArray = $(this).sortable('toArray');\n                    var selectionIdArray = sortableIdArray.filter(function (x) {\n                        return $('#' + x).is(':visible');\n                    });\n                    var selectableIdArray = selectionIdArray.map(function (x) {\n                        return x.replace(/selection/, 'selectable');\n                    });\n                    var orgId = $(this).closest('.ms-container').attr('id').replace(/^ms\\-/, '');\n                    var orderId = orgId + '_order';\n                    var orgValArray = selectableIdArray.map(function (x) {\n                        var index = $('.ms-elem-selectable').index($('#' + x));\n                        var orgVal = $('#' + orgId + ' option').eq(index).val();\n                        return orgVal;\n                    });\n                    var newVal = orgValArray.join(',');\n                    $('#' + orderId).val(newVal);\n                }\n            });\n        });\n    </script>\n    <script>\n        // Multiple select\n        $('.multi-select').multiSelect({\n            keepOrder: true,\n            afterSelect: function (value) {\n                var orderId = this.$container.attr('id').replace(/^ms\\-/, '') + '_order';\n                var getVal = $('#' + orderId).val();\n                var getValArray = getVal.split(',');\n                getValArray.push(value);\n                var newValArray = getValArray.filter(function (x) {\n                    return x != '';\n                });\n                var newVal = newValArray.join(',');\n                $('#' + orderId).val(newVal);\n            },\n            afterDeselect: function (value) {\n                var orderId = this.$container.attr('id').replace(/^ms\\-/, '') + '_order';\n                var getVal = $('#' + orderId).val();\n                var getValArray = getVal.split(',');\n                var newValArray = getValArray.filter(function (x) {\n                    return x != value && x != '';\n                });\n                var newVal = newValArray.join(',');\n                $('#' + orderId).val(newVal);\n            }\n        });\n    </script>\n    <script>\n        $(function () {\n            $('[data-toggle=\"tooltip\"]').tooltip();\n        });\n    </script>\n    <script>\n        $(function () {\n            var clipboard = new Clipboard('.btn');\n\n            clipboard.on('success', function (e) {\n                e.clearSelection();\n            });\n        });\n    </script>\n</body>\n</html>\n"
  },
  {
    "path": "resources/views/auth/login.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Login</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    <form class=\"form-horizontal\" role=\"form\" method=\"POST\" action=\"{{ url('/auth/login') }}\">\n                        <input type=\"hidden\" name=\"_token\" value=\"{{ csrf_token() }}\">\n\n                        <div class=\"form-group required\">\n                            <label class=\"col-md-4 control-label\">E-Mail Address</label>\n                            <div class=\"col-md-6\">\n                                <input type=\"email\" class=\"form-control\" name=\"email\" value=\"{{ old('email') }}\">\n                            </div>\n                        </div>\n\n                        <div class=\"form-group required\">\n                            <label class=\"col-md-4 control-label\">Password</label>\n                            <div class=\"col-md-6\">\n                                <input type=\"password\" class=\"form-control\" name=\"password\">\n                            </div>\n                        </div>\n\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                <div class=\"checkbox\">\n                                    <label>\n                                        <input type=\"checkbox\" name=\"remember\"> Remember Me\n                                    </label>\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                <button type=\"submit\" class=\"btn btn-primary\">Login</button>\n\n                                <a class=\"btn btn-link\" href=\"{{ url('/password/email') }}\">Forgot Your Password?</a>\n                            </div>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@endsection\n"
  },
  {
    "path": "resources/views/auth/password.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Reset Password</div>\n                <div class=\"panel-body\">\n                    @if (session('status'))\n                        <div class=\"alert alert-success\">\n                            {{ session('status') }}\n                        </div>\n                    @endif\n\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    <form class=\"form-horizontal\" role=\"form\" method=\"POST\" action=\"{{ url('/password/email') }}\">\n                        <input type=\"hidden\" name=\"_token\" value=\"{{ csrf_token() }}\">\n\n                        <div class=\"form-group required\">\n                            <label class=\"col-md-4 control-label\">E-Mail Address</label>\n                            <div class=\"col-md-6\">\n                                <input type=\"email\" class=\"form-control\" name=\"email\" value=\"{{ old('email') }}\">\n                            </div>\n                        </div>\n\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                <button type=\"submit\" class=\"btn btn-primary\">\n                                    Send Password Reset Link\n                                </button>\n                            </div>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@endsection\n"
  },
  {
    "path": "resources/views/auth/register.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Register</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    <form class=\"form-horizontal\" role=\"form\" method=\"POST\" action=\"{{ url('/auth/register') }}\">\n                        <input type=\"hidden\" name=\"_token\" value=\"{{ csrf_token() }}\">\n\n                        <div class=\"form-group required\">\n                            <label class=\"col-md-4 control-label\">Name</label>\n                            <div class=\"col-md-6\">\n                                <input type=\"text\" class=\"form-control\" name=\"name\" value=\"{{ old('name') }}\">\n                            </div>\n                        </div>\n\n                        <div class=\"form-group required\">\n                            <label class=\"col-md-4 control-label\">E-Mail Address</label>\n                            <div class=\"col-md-6\">\n                                <input type=\"email\" class=\"form-control\" name=\"email\" value=\"{{ old('email') }}\">\n                            </div>\n                        </div>\n\n                        <div class=\"form-group required\">\n                            <label class=\"col-md-4 control-label\">Password</label>\n                            <div class=\"col-md-6\">\n                                <input type=\"password\" class=\"form-control\" name=\"password\">\n                            </div>\n                        </div>\n\n                        <div class=\"form-group required\">\n                            <label class=\"col-md-4 control-label\">Confirm Password</label>\n                            <div class=\"col-md-6\">\n                                <input type=\"password\" class=\"form-control\" name=\"password_confirmation\">\n                            </div>\n                        </div>\n\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                <button type=\"submit\" class=\"btn btn-primary\">\n                                    Register\n                                </button>\n                            </div>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@endsection\n"
  },
  {
    "path": "resources/views/auth/reset.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Reset Password</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    <form class=\"form-horizontal\" role=\"form\" method=\"POST\" action=\"{{ url('/password/reset') }}\">\n                        <input type=\"hidden\" name=\"_token\" value=\"{{ csrf_token() }}\">\n                        <input type=\"hidden\" name=\"token\" value=\"{{ $token }}\">\n\n                        <div class=\"form-group required\">\n                            <label class=\"col-md-4 control-label\">E-Mail Address</label>\n                            <div class=\"col-md-6\">\n                                <input type=\"email\" class=\"form-control\" name=\"email\" value=\"{{ old('email') }}\">\n                            </div>\n                        </div>\n\n                        <div class=\"form-group required\">\n                            <label class=\"col-md-4 control-label\">Password</label>\n                            <div class=\"col-md-6\">\n                                <input type=\"password\" class=\"form-control\" name=\"password\">\n                            </div>\n                        </div>\n\n                        <div class=\"form-group required\">\n                            <label class=\"col-md-4 control-label\">Confirm Password</label>\n                            <div class=\"col-md-6\">\n                                <input type=\"password\" class=\"form-control\" name=\"password_confirmation\">\n                            </div>\n                        </div>\n\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                <button type=\"submit\" class=\"btn btn-primary\">\n                                    Reset Password\n                                </button>\n                            </div>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@endsection\n"
  },
  {
    "path": "resources/views/deployments/index.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            @if (Session::has('status'))\n                <div class=\"alert alert-success alert-dismissible\" role=\"alert\">\n                    <button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                    {!! Session::get('status') !!}\n                </div>\n            @endif\n\n            <h1 class=\"page-header\">Deployments</h1>\n\n            <div class=\"pull-right margin-bottom-lg\">\n                {!! Form::open(['route' => ['projects.deployments.store', $project], 'method' => 'post', 'style' => 'display:inline']) !!}\n                {!! Form::hidden('task', 'deploy') !!}\n                {!! Form::submit('Deploy', ['class' => 'btn btn-primary btn-lg']) !!}\n                {!! Form::close() !!}\n                {!! Form::open(['route' => ['projects.deployments.store', $project], 'method' => 'post', 'style' => 'display:inline']) !!}\n                {!! Form::hidden('task', 'rollback') !!}\n                {!! Form::submit('Rollback', ['class' => 'btn btn-danger btn-lg']) !!}\n                {!! Form::close() !!}\n            </div>\n\n            <table class=\"table table-striped\">\n                <thead>\n                    <tr>\n                        <th><div align=\"center\"></div></th>\n                        <th><div align=\"center\">#</div></th>\n                        <th><div align=\"center\">Task</div></th>\n                        <th><div align=\"center\">Started At</div></th>\n                        <th><div align=\"center\">Finished At</div></th>\n                        <th><div align=\"center\">Executed By</div></th>\n                        <th></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    @foreach ($deployments as $deployment)\n                        <tr>\n                            <td>{!! $deployment->status() !!}</td>\n                            <td>{{ $deployment->number }}</td>\n                            <td>{{ $deployment->task }}</td>\n                            <td>{{ $deployment->created_at }}</td>\n                            <td>{{ $deployment->updated_at }}</td>\n                            <td>{{ is_null($deployment->user) ? '' : $deployment->user->email }}</td>\n                            <td>\n                                {!! link_to_route('projects.deployments.show', 'Show', [$project, $deployment->number], ['class' => 'btn btn-default']) !!}\n                            </td>\n                        </tr>\n                    @endforeach\n                </tbody>\n            </table>\n            <div class=\"text-center\">\n                {!! $deployments->render() !!}\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/deployments/show.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <table class=\"table\">\n                <tbody>\n                    <tr>\n                        <th>#</th>\n                        <td>{{ $deployment->number }}</td>\n                    </tr>\n                    <tr>\n                        <th>Task</th>\n                        <td>{{ $deployment->task }}</td>\n                    </tr>\n                    <tr>\n                        <th>Status</th>\n                        <td>{{ $deployment->statusText() }}</td>\n                    </tr>\n                    <tr>\n                        <th>Message</th>\n                        <td><pre class=\"ansi_box\"><code>{!! $deployment->message() !!}</code></pre></td>\n                    </tr>\n                    <tr>\n                        <th>Started At</th>\n                        <td>{{ $deployment->created_at }}</td>\n                    </tr>\n                    <tr>\n                        <th>Finished At</th>\n                        <td>{{ $deployment->updated_at }}</td>\n                    </tr>\n                    <tr>\n                        <th>Executed By</th>\n                        <td>{{ is_null($deployment->user) ? '' : $deployment->user->email }}</td>\n                    </tr>\n                </tbody>\n            </table>\n            {!! link_to_route('projects.deployments.index', 'Back', [$deployment->project_id], ['class' => 'btn btn-danger']) !!}\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/emails/notification.blade.php",
    "content": "Deployment of {{ $project->name }} #{{ $deployment->number }} finished\n\nTask: {{ $deployment->task }}\n\nStatus: {{ $deployment->statusText() }}\n\nStarted At: {{ $deployment->created_at }}\n\nFinished At: {{ $deployment->updated_at }}\n\n\nExecuted By: {{ is_null($deployment->user) ? '' : $deployment->user->email }}\n\n\nDeployment URL: {{ route('projects.deployments.show', [$project->id, $deployment->number]) }}\n\n\nLog:\n\n{!! $deployment->messageText() !!}\n"
  },
  {
    "path": "resources/views/emails/password.blade.php",
    "content": "Click here to reset your password: {{ url('password/reset/'.$token) }}\n"
  },
  {
    "path": "resources/views/errors/503.blade.php",
    "content": "<html>\n    <head>\n        <link href='//fonts.googleapis.com/css?family=Lato:100' rel='stylesheet' type='text/css'>\n\n        <style>\n            body {\n                margin: 0;\n                padding: 0;\n                width: 100%;\n                height: 100%;\n                color: #B0BEC5;\n                display: table;\n                font-weight: 100;\n                font-family: 'Lato';\n            }\n\n            .container {\n                text-align: center;\n                display: table-cell;\n                vertical-align: middle;\n            }\n\n            .content {\n                text-align: center;\n                display: inline-block;\n            }\n\n            .title {\n                font-size: 72px;\n                margin-bottom: 40px;\n            }\n        </style>\n    </head>\n    <body>\n        <div class=\"container\">\n            <div class=\"content\">\n                <div class=\"title\">Be right back.</div>\n            </div>\n        </div>\n    </body>\n</html>\n"
  },
  {
    "path": "resources/views/home.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container\">\n    <div class=\"row\">\n        <div class=\"col-md-10 col-md-offset-1\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Home</div>\n\n                <div class=\"panel-body\">\n                    You are logged in!\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@endsection\n"
  },
  {
    "path": "resources/views/projects/create.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Create Project</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    {!! Form::open(['route' => 'projects.store', 'method' => 'post', 'role' => 'form','class' => 'form-horizontal']) !!}\n                        <div class=\"form-group required\">\n                            <label for=\"name\" class=\"col-md-4 control-label\">Project Name</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('name', null, ['class' => 'form-control', 'id' => 'name']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"recipe_id\" class=\"col-md-4 control-label\">Recipe</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::select('recipe_id[]', $recipes, null, ['class' => 'form-control multi-select', 'id' => 'recipe_id', 'multiple' => 'multiple']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"server_id\" class=\"col-md-4 control-label\">Server</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::select('server_id', $servers, null, ['class' => 'form-control', 'id' => 'server_id']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"repository\" class=\"col-md-4 control-label\">Repository URL</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('repository', null, ['class' => 'form-control', 'id' => 'repository']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"stage\" class=\"col-md-4 control-label\">Stage</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('stage', null, ['class' => 'form-control', 'id' => 'stage']) !!}\n                            </div>\n                        </div>\n                        <hr>\n                        <h5>Overriding Server Definition</h5>\n                        <div class=\"form-group\">\n                            <label for=\"deploy_path\" class=\"col-md-4 control-label\">Deploy Path</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('deploy_path', null, ['class' => 'form-control', 'id' => 'deploy_path']) !!}\n                            </div>\n                        </div>\n                        <hr>\n                        <h5>E-Mail Notification</h5>\n                        <div class=\"form-group\">\n                            <label for=\"email_notification_recipient\" class=\"col-md-4 control-label\">Recipient</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::email('email_notification_recipient', null, ['class' => 'form-control', 'id' => 'email_notification_recipient']) !!}\n                            </div>\n                        </div>\n                        <hr>\n                        <h5>Discard Old Deployments</h5>\n                        <div class=\"form-group\">\n                            <label for=\"days_to_keep_deployments\" class=\"col-md-4 control-label\">Days To Keep Deployments</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('days_to_keep_deployments', null, ['class' => 'form-control', 'id' => 'days_to_keep_deployments']) !!}\n                            </div>\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                <div class=\"checkbox\">\n                                    <label class\"col-md-4\">\n                                        {!! Form::checkbox('keep_last_deployment', true) !!}\n                                        Keep Last Deployment\n                                    </label>\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"max_number_of_deployments_to_keep\" class=\"col-md-4 control-label\">Max # Of Deployments To Keep</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('max_number_of_deployments_to_keep', null, ['class' => 'form-control', 'id' => 'max_number_of_deployments_to_keep']) !!}\n                            </div>\n                        </div>\n                        <hr>\n                        <h5>GitHub Webhook</h5>\n                        <div class=\"form-group\">\n                            <label for=\"github_webhook_secret\" class=\"col-md-4 control-label\">Secret</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('github_webhook_secret', null, ['class' => 'form-control', 'id' => 'github_webhook_secret']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"github_webhook_user_id\" class=\"col-md-4 control-label\">Execute By</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::select('github_webhook_user_id', $users, null, ['class' => 'form-control', 'id' => 'github_webhook_user_id']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                {!! link_to_route('projects.index', 'Cancel', [], ['class' => 'btn btn-danger']) !!}\n                                {!! Form::submit('Store', ['class' => 'btn btn-primary']) !!}\n                            </div>\n                        </div>\n                        {!! Form::hidden('recipe_id_order', null, ['id' => 'recipe_id_order']) !!}\n                    {!! Form::close() !!}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/projects/edit.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Edit Project</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    {!! Form::open(['route' => ['projects.update', $project->id], 'method' => 'put', 'role' => 'form','class' => 'form-horizontal']) !!}\n                        <div class=\"form-group required\">\n                            <label for=\"name\" class=\"col-md-4 control-label\">Project Name</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('name', $project->name, ['class' => 'form-control', 'id' => 'name']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"recipe_id\" class=\"col-md-4 control-label\">Recipe</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::select('recipe_id[]', $recipes, $projectRecipe, ['class' => 'form-control multi-select', 'id' => 'recipe_id', 'multiple' => 'multiple']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"server_id\" class=\"col-md-4 control-label\">Server</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::select('server_id', $servers, $project->server_id, ['class' => 'form-control', 'id' => 'server_id']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"repository\" class=\"col-md-4 control-label\">Repository URL</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('repository', $project->repository, ['class' => 'form-control', 'id' => 'repository']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"stage\" class=\"col-md-4 control-label\">Stage</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('stage', $project->stage, ['class' => 'form-control', 'id' => 'stage']) !!}\n                            </div>\n                        </div>\n                        <hr>\n                        <h5>Overriding Server Definition</h5>\n                        <div class=\"form-group\">\n                            <label for=\"deploy_path\" class=\"col-md-4 control-label\">Deploy Path</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('deploy_path', $project->attributes->getDeployPath(), ['class' => 'form-control', 'id' => 'deploy_path']) !!}\n                            </div>\n                        </div>\n                        <hr>\n                        <h5>E-Mail Notification</h5>\n                        <div class=\"form-group\">\n                            <label for=\"email_notification_recipient\" class=\"col-md-4 control-label\">Recipient</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::email('email_notification_recipient', $project->email_notification_recipient, ['class' => 'form-control', 'id' => 'email_notification_recipient']) !!}\n                            </div>\n                        </div>\n                        <hr>\n                        <h5>Discard Old Deployments</h5>\n                        <div class=\"form-group\">\n                            <label for=\"days_to_keep_deployments\" class=\"col-md-4 control-label\">Days To Keep Deployments</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('days_to_keep_deployments', $project->days_to_keep_deployments, ['class' => 'form-control', 'id' => 'days_to_keep_deployments']) !!}\n                            </div>\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                <div class=\"checkbox\">\n                                    <label class\"col-md-4\">\n                                        {!! Form::checkbox('keep_last_deployment', $project->keep_last_deployment, $project->keep_last_deployment) !!}\n                                        Keep Last Deployment\n                                    </label>\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"max_number_of_deployments_to_keep\" class=\"col-md-4 control-label\">Max # Of Deployments To Keep</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('max_number_of_deployments_to_keep', $project->max_number_of_deployments_to_keep, ['class' => 'form-control', 'id' => 'max_number_of_deployments_to_keep']) !!}\n                            </div>\n                        </div>\n                        <hr>\n                        <h5>GitHub Webhook</h5>\n                        <div class=\"form-group\">\n                            <label for=\"github_webhook_secret\" class=\"col-md-4 control-label\">Secret</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('github_webhook_secret', $project->github_webhook_secret, ['class' => 'form-control', 'id' => 'github_webhook_secret']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"github_webhook_user_id\" class=\"col-md-4 control-label\">Execute By</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::select('github_webhook_user_id', $users, $project->github_webhook_user_id, ['class' => 'form-control', 'id' => 'github_webhook_user_id']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                {!! link_to_route('projects.index', 'cancel', [], ['class' => 'btn btn-danger']) !!}\n                                {!! form::submit('update', ['class' => 'btn btn-primary']) !!}\n                            </div>\n                        </div>\n                        {!! Form::hidden('recipe_id_order', implode(',', $projectRecipe), ['id' => 'recipe_id_order']) !!}\n                    {!! Form::close() !!}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/projects/index.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <h1 class=\"page-header\">Projects</h1>\n\n            @if (Auth::user()->can('create.project'))\n                <div class=\"pull-right margin-bottom-lg\">\n                    {!! link_to_route('projects.create', 'Create', [], ['class' => 'btn btn-primary btn-lg']) !!}\n                </div>\n            @endif\n\n            <table class=\"table table-striped\">\n                <thead>\n                    <tr>\n                        <th><div align=\"center\"></div></th>\n                        <th><div align=\"center\">Name</div></th>\n                        <th><div align=\"center\">Last Deployment</div></th>\n                        <th><div align=\"center\">Created At</div></th>\n                        <th><div align=\"center\">Updated At</div></th>\n                        <th></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    @foreach ($projects as $project)\n                        <tr>\n                            <td>\n                                @if (!empty($project->getLastDeployment()))\n                                    {!! $project->getLastDeployment()->getPresenter()->status() !!}\n                                @endif\n                            </td>\n                            <td>{{ $project->name }}</td>\n                            <td>\n                                @if (!empty($project->getLastDeployment()))\n                                    {{ $project->getLastDeployment()->updated_at }}\n                                    ({!! link_to_route('projects.deployments.show', \"#{$project->getLastDeployment()->number}\", [$project->id,  $project->getLastDeployment()->number]) !!})\n                                @endif\n                            </td>\n                            <td>{{ $project->created_at }}</td>\n                            <td>{{ $project->updated_at }}</td>\n                            <td>\n                                {!! link_to_route('projects.deployments.index', 'Deployments', [$project->id], ['class' => 'btn btn-default']) !!}\n                                {!! link_to_route('projects.show', 'Show', [$project->id], ['class' => 'btn btn-default']) !!}\n                                @if (Auth::user()->can('edit.project'))\n                                    {!! link_to_route('projects.edit', 'Edit', [$project->id], ['class' => 'btn btn-default']) !!}\n                                @endif\n                                @if (Auth::user()->can('delete.project'))\n                                    {!! Form::open(['route' => ['projects.destroy', $project->id], 'method' => 'delete', 'style' => 'display:inline']) !!}\n                                    {!! Form::submit('Destroy', ['class' => 'btn btn-danger']) !!}\n                                    {!! Form::close() !!}\n                                @endif\n                            </td>\n                        </tr>\n                    @endforeach\n                </tbody>\n            </table>\n            <div class=\"text-center\">\n                {!! $projects->render() !!}\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/projects/show.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <table class=\"table\">\n                <tbody>\n                    <tr>\n                        <th>Project Name</th>\n                        <td>{{ $project->name }}</td>\n                    </tr>\n                    @foreach ($projectRecipe as $i => $recipe)\n                        <tr>\n                            @if ($i === 0)\n                                <th rowspan=\"{{ count($projectRecipe) }}\">Recipe</th>\n                            @endif\n                            <td>{{ $recipe['name'] }}</td>\n                        </tr>\n                    @endforeach\n                    <tr>\n                        <th>Server</th>\n                        <td>{{ $projectServer->name }}</td>\n                    </tr>\n                    <tr>\n                        <th>Repository URL</th>\n                        <td>{{ $project->repository }}</td>\n                    </tr>\n                    <tr>\n                        <th>Stage</th>\n                        <td>{{ $project->stage }}</td>\n                    </tr>\n                    <tr>\n                        <th>Deploy Path</th>\n                        <td>{{ $project->attributes->getDeployPath() }}</td>\n                    </tr>\n                    <tr>\n                        <th>E-Mail Notification Recipient</th>\n                        <td>{{ $project->email_notification_recipient }}</td>\n                    </tr>\n                    <tr>\n                        <th>Days To Keep Deployments</th>\n                        <td>{{ $project->days_to_keep_deployments }}</td>\n                    </tr>\n                    <tr>\n                        <th>Keep Last Deployment</th>\n                        <td>{{ $project->keep_last_deployment }}</td>\n                    </tr>\n                    <tr>\n                        <th>Max # Of Deployments To Keep</th>\n                        <td>{{ $project->max_number_of_deployments_to_keep }}</td>\n                    </tr>\n                    <tr>\n                        <th>GitHub Webhook Secret</th>\n                        <td>{{ $project->github_webhook_secret }}</td>\n                    </tr>\n                    <tr>\n                        <th>GitHub Webhook Execute By</th>\n                        <td>{{ is_null($project->getGithubWebhookUser()) ? '' : $project->getGithubWebhookUser()->email }}</td>\n                    </tr>\n                </tbody>\n            </table>\n            {!! link_to_route('projects.index', 'Back', [], ['class' => 'btn btn-danger']) !!}\n            @if (Auth::user()->can('update.project'))\n                {!! link_to_route('projects.edit', 'Edit', [$project->id], ['class' => 'btn btn-primary']) !!}\n            @endif\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/recipes/create.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Create Recipe</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    {!! Form::open(['route' => 'recipes.store', 'method' => 'post', 'role' => 'form','class' => 'form-horizontal']) !!}\n                        <div class=\"form-group required\">\n                            <label for=\"name\" class=\"col-md-4 control-label\">Name</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('name', null, ['class' => 'form-control', 'id' => 'name']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"description\" class=\"col-md-4 control-label\">Description</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::textarea('description', null, ['class' => 'form-control', 'id' => 'description']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"body\" class=\"col-md-4 control-label\">Body</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::textarea('body', null, ['class' => 'form-control', 'id' => 'body', 'data-editor' => 'php']) !!}\n                                <p class=\"help-block\">You can define a <a href=\"http://deployer.org/docs/recipes\">recipe PHP file</a> here.</p>\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                {!! link_to_route('recipes.index', 'Cancel', [], ['class' => 'btn btn-danger']) !!}\n                                {!! Form::submit('Store', ['class' => 'btn btn-primary']) !!}\n                            </div>\n                        </div>\n                    {!! Form::close() !!}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/recipes/edit.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Edit Recipe</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    {!! Form::open(['route' => ['recipes.update', $recipe->id], 'method' => 'put', 'role' => 'form','class' => 'form-horizontal']) !!}\n                        <div class=\"form-group required\">\n                            <label for=\"name\" class=\"col-md-4 control-label\">Name</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('name', $recipe->name, ['class' => 'form-control', 'id' => 'name']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"description\" class=\"col-md-4 control-label\">Description</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::textarea('description', $recipe->description, ['class' => 'form-control', 'id' => 'description']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"body\" class=\"col-md-4 control-label\">Body</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::textarea('body', $recipe->body, ['class' => 'form-control', 'id' => 'body', 'data-editor' => 'php']) !!}\n                                <p class=\"help-block\">You can define a <a href=\"http://deployer.org/docs/recipes\">recipe PHP file</a> here.</p>\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                {!! link_to_route('recipes.index', 'Cancel', [], ['class' => 'btn btn-danger']) !!}\n                                {!! Form::submit('Update', ['class' => 'btn btn-primary']) !!}\n                            </div>\n                        </div>\n                    {!! Form::close() !!}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/recipes/index.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <h1 class=\"page-header\">Recipes</h1>\n\n            @if (Auth::user()->can('create.recipe'))\n                <div class=\"pull-right margin-bottom-lg\">\n                    {!! link_to_route('recipes.create', 'Create', [], ['class' => 'btn btn-primary btn-lg']) !!}\n                </div>\n            @endif\n\n            <table class=\"table table-striped\">\n                <thead>\n                    <tr>\n                        <th><div align=\"center\">Name</div></th>\n                        <th><div align=\"center\">Users</div></th>\n                        <th><div align=\"center\">Created At</div></th>\n                        <th><div align=\"center\">Updated At</div></th>\n                        <th></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    @foreach ($recipes as $recipe)\n                        <tr>\n                            <td>{{ $recipe->name }}</td>\n                            <td><div align=\"right\">{{ number_format(count($recipe->getProjects())) }}</div></td>\n                            <td>{{ $recipe->created_at }}</td>\n                            <td>{{ $recipe->updated_at }}</td>\n                            <td>\n                                {!! link_to_route('recipes.show', 'Show', [$recipe->id], ['class' => 'btn btn-default']) !!}\n                                @if (Auth::user()->can('update.recipe'))\n                                    {!! link_to_route('recipes.edit', 'Edit', [$recipe->id], ['class' => 'btn btn-default']) !!}\n                                @endif\n                                @if (Auth::user()->can('delete.recipe'))\n                                    {!! Form::open(['route' => ['recipes.destroy', $recipe->id], 'method' => 'delete', 'style' => 'display:inline']) !!}\n                                    {!! Form::submit('Destroy', ['class' => 'btn btn-danger']) !!}\n                                    {!! Form::close() !!}\n                                @endif\n                            </td>\n                        </tr>\n                    @endforeach\n                </tbody>\n            </table>\n            <div class=\"text-center\">\n                {!! $recipes->render() !!}\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/recipes/show.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <table class=\"table\">\n                <tbody>\n                    <tr>\n                        <th>Name</th>\n                        <td>{{ $recipe->name }}</td>\n                    </tr>\n                    <tr>\n                        <th>Description</th>\n                        <td>{{ $recipe->description }}</td>\n                    </tr>\n                    <tr>\n                        <th>Body</th>\n                        <td><pre><code>{{ $recipe->body }}</code></pre></td>\n                    </tr>\n                    @if (count($recipeProject) === 0)\n                        <tr>\n                            <th>Used By</th>\n                            <td></td>\n                        </tr>\n                    @else\n                        @foreach ($recipeProject as $i => $project)\n                            <tr>\n                                @if ($i === 0)\n                                    <th rowspan=\"{{ count($recipeProject) }}\">Used By</th>\n                                @endif\n                                <td>{!! link_to_route('projects.show', $project['name'], $project['id']) !!}</td>\n                            </tr>\n                        @endforeach\n                    @endif\n                </tbody>\n            </table>\n            {!! link_to_route('recipes.index', 'Back', [], ['class' => 'btn btn-danger']) !!}\n            @if (Auth::user()->can('update.recipe'))\n                {!! link_to_route('recipes.edit', 'Edit', [$recipe->id], ['class' => 'btn btn-primary']) !!}\n            @endif\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/servers/create.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Create Server</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    {!! Form::open(['route' => 'servers.store', 'method' => 'post', 'role' => 'form','class' => 'form-horizontal']) !!}\n                        <div class=\"form-group required\">\n                            <label for=\"name\" class=\"col-md-4 control-label\">Name</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('name', null, ['class' => 'form-control', 'id' => 'name']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"description\" class=\"col-md-4 control-label\">Description</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::textarea('description', null, ['class' => 'form-control', 'id' => 'description']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"body\" class=\"col-md-4 control-label\">Body</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::textarea('body', null, ['class' => 'form-control', 'id' => 'body', 'data-editor' => 'yaml']) !!}\n                                <p class=\"help-block\">You can define a <a href=\"http://deployer.org/docs/servers\">server list YAML file</a> here.</p>\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                {!! link_to_route('servers.index', 'Cancel', [], ['class' => 'btn btn-danger']) !!}\n                                {!! Form::submit('Store', ['class' => 'btn btn-primary']) !!}\n                            </div>\n                        </div>\n                    {!! Form::close() !!}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n\n"
  },
  {
    "path": "resources/views/servers/edit.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Edit Server</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    {!! Form::open(['route' => ['servers.update', $server->id], 'method' => 'put', 'role' => 'form','class' => 'form-horizontal']) !!}\n                        <div class=\"form-group required\">\n                            <label for=\"name\" class=\"col-md-4 control-label\">Name</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('name', $server->name, ['class' => 'form-control', 'id' => 'name']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"description\" class=\"col-md-4 control-label\">Description</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::textarea('description', $server->description, ['class' => 'form-control', 'id' => 'description']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"body\" class=\"col-md-4 control-label\">Body</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::textarea('body', $server->body, ['class' => 'form-control', 'id' => 'body', 'data-editor' => 'yaml']) !!}\n                                <p class=\"help-block\">You can define a <a href=\"http://deployer.org/docs/servers\">server list YAML file</a> here.</p>\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                {!! link_to_route('servers.index', 'Cancel', [], ['class' => 'btn btn-danger']) !!}\n                                {!! Form::submit('Update', ['class' => 'btn btn-primary']) !!}\n                            </div>\n                        </div>\n                    {!! Form::close() !!}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/servers/index.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <h1 class=\"page-header\">Servers</h1>\n\n            @if (Auth::user()->can('create.server'))\n                <div class=\"pull-right margin-bottom-lg\">\n                    {!! link_to_route('servers.create', 'Create', [], ['class' => 'btn btn-primary btn-lg']) !!}\n                </div>\n            @endif\n\n            <table class=\"table table-striped\">\n                <thead>\n                    <tr>\n                        <th><div align=\"center\">Name</div></th>\n                        <th><div align=\"center\">Created At</div></th>\n                        <th><div align=\"center\">Updated At</div></th>\n                        <th></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    @foreach ($servers as $server)\n                        <tr>\n                            <td>{{ $server->name }}</td>\n                            <td>{{ $server->created_at }}</td>\n                            <td>{{ $server->updated_at }}</td>\n                            <td>\n                                {!! link_to_route('servers.show', 'Show', [$server->id], ['class' => 'btn btn-default']) !!}\n                                @if (Auth::user()->can('update.server'))\n                                    {!! link_to_route('servers.edit', 'Edit', [$server->id], ['class' => 'btn btn-default']) !!}\n                                @endif\n                                @if (Auth::user()->can('delete.server'))\n                                    {!! Form::open(['route' => ['servers.destroy', $server->id], 'method' => 'delete', 'style' => 'display:inline']) !!}\n                                    {!! Form::submit('Destroy', ['class' => 'btn btn-danger']) !!}\n                                    {!! Form::close() !!}\n                                @endif\n                            </td>\n                        </tr>\n                    @endforeach\n                </tbody>\n            </table>\n            <div class=\"text-center\">\n                {!! $servers->render() !!}\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/servers/show.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <table class=\"table\">\n                <tbody>\n                    <tr>\n                        <th>Name</th>\n                        <td>{{ $server->name }}</td>\n                    </tr>\n                    <tr>\n                        <th>Description</th>\n                        <td>{{ $server->description }}</td>\n                    </tr>\n                    <tr>\n                        <th>Body</th>\n                        <td><pre><code>{{ $server->body }}</code></pre></td>\n                    </tr>\n                </tbody>\n            </table>\n            {!! link_to_route('servers.index', 'Back', [], ['class' => 'btn btn-danger']) !!}\n            @if (Auth::user()->can('update.server'))\n                {!! link_to_route('servers.edit', 'Edit', [$server->id], ['class' => 'btn btn-primary']) !!}\n            @endif\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/settings/email.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-2 col-md-offset-0\">\n            <div class=\"list-group\">\n                {!! link_to_route('settings.email', 'E-Mail Settings', [], ['class' => 'list-group-item selected']) !!}\n            </div>\n        </div>\n\n        <div class=\"col-md-8 col-md-offset-0\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">E-Mail Settings</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    {!! Form::open(['route' => ['settings.email'], 'method' => 'post', 'role' => 'form','class' => 'form-horizontal']) !!}\n                        <div class=\"form-group required\">\n                            <label for=\"driver\" class=\"col-md-4 control-label\">Driver</label>\n                            <div class=\"col-md-6\">\n                                <label>\n                                    {!! Form::select('driver', ['smtp' => 'SMTP', 'mail' => 'PHP', 'sendmail' => 'Sendmail'], $settings->attributes->getDriver(), ['class' => 'form-control']) !!}\n                                </label>\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"from_address\" class=\"col-md-4 control-label\">From E-Mail Address</label>\n                            <div class=\"col-md-6\">\n                                @if (isset($settings->attributes->getFrom()['address']))\n                                    {!! Form::email('from_address', $settings->attributes->getFrom()['address'], ['class' => 'form-control', 'id' => 'from_address']) !!}\n                                @else\n                                    {!! Form::email('from_address', null, ['class' => 'form-control', 'id' => 'from_address']) !!}\n                                @endif\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"from_name\" class=\"col-md-4 control-label\">From Name</label>\n                            <div class=\"col-md-6\">\n                                @if (isset($settings->attributes->getFrom()['name']))\n                                    {!! Form::text('from_name', $settings->attributes->getFrom()['name'], ['class' => 'form-control', 'id' => 'from_name']) !!}\n                                @else\n                                    {!! Form::text('from_name', null, ['class' => 'form-control', 'id' => 'from_name']) !!}\n                                @endif\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"smtp_host\" class=\"col-md-4 control-label\">SMTP Host</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('smtp_host', $settings->attributes->getSmtpHost(), ['class' => 'form-control', 'id' => 'smtp_host']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"smtp_port\" class=\"col-md-4 control-label\">SMTP Port</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('smtp_port', $settings->attributes->getSmtpPort(), ['class' => 'form-control', 'id' => 'smtp_port']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"smtp_encryption\" class=\"col-md-4 control-label\">Encryption</label>\n                            <div class=\"col-md-6\">\n                                <label>\n                                    {!! Form::select('smtp_encryption', ['' => '', 'tls' => 'TLS', 'ssl' => 'SSL'], $settings->attributes->getSmtpEncryption(), ['class' => 'form-control']) !!}\n                                </label>\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"smtp_username\" class=\"col-md-4 control-label\">SMTP Username</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('smtp_username', $settings->attributes->getSmtpUsername(), ['class' => 'form-control', 'id' => 'smtp_username']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"smtp_password\" class=\"col-md-4 control-label\">SMTP Password</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('smtp_password', $settings->attributes->getSmtpPassword(), ['class' => 'form-control', 'id' => 'smtp_password', 'autocomplete' => 'off']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"sendmail_path\" class=\"col-md-4 control-label\">Sendmail Path</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('sendmail_path', $settings->attributes->getSendmailPath(), ['class' => 'form-control', 'id' => 'sendmail_path']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                {!! Form::submit('Update', ['class' => 'btn btn-primary']) !!}\n                            </div>\n                        </div>\n                    {!! Form::close() !!}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/users/change_password.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-2 col-md-offset-0\">\n            <div class=\"list-group\">\n                {!! link_to_route('users.edit', 'Edit User', [$user->id], ['class' => 'list-group-item']) !!}\n                {!! link_to_route('users.password.change', 'Change Password', [$user->id], ['class' => 'list-group-item selected']) !!}\n                {!! link_to_route('users.role.edit', 'Edit Role', [$user->id], ['class' => 'list-group-item']) !!}\n                {!! link_to_route('users.api_token.edit', 'Edit API Token', [$user->id], ['class' => 'list-group-item']) !!}\n            </div>\n        </div>\n\n        <div class=\"col-md-8 col-md-offset-0\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Change Password</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    {!! Form::open(['route' => ['users.password.update', $user->id], 'method' => 'put', 'role' => 'form','class' => 'form-horizontal']) !!}\n                        <div class=\"form-group required\">\n                            <label for=\"password\" class=\"col-md-4 control-label\">Password</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::password('password', ['class' => 'form-control', 'id' => 'password', 'data-editor' => 'php']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"password_confirmation\" class=\"col-md-4 control-label\">Confirm Password</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::password('password_confirmation', ['class' => 'form-control', 'id' => 'password_confirmation', 'data-editor' => 'php']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                {!! link_to_route('users.index', 'Cancel', [], ['class' => 'btn btn-danger']) !!}\n                                {!! Form::submit('Update', ['class' => 'btn btn-primary']) !!}\n                            </div>\n                        </div>\n                    {!! Form::close() !!}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/users/create.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Create User</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    {!! Form::open(['route' => 'users.store', 'method' => 'post', 'role' => 'form','class' => 'form-horizontal']) !!}\n                        <div class=\"form-group required\">\n                            <label for=\"name\" class=\"col-md-4 control-label\">Name</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('name', null, ['class' => 'form-control', 'id' => 'name']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"email\" class=\"col-md-4 control-label\">E-Mail Address</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::email('email', null, ['class' => 'form-control', 'id' => 'email']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"password\" class=\"col-md-4 control-label\">Password</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::password('password', ['class' => 'form-control', 'id' => 'password', 'type' => 'password']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"password_confirmation\" class=\"col-md-4 control-label\">Confirm Password</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::password('password_confirmation', ['class' => 'form-control', 'id' => 'password_confirmation', 'type' => 'password']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"role\" class=\"col-md-4 control-label\">Role</label>\n                            <div class=\"col-md-6\">\n                                @foreach ($roles as $role)\n                                    <div class=\"checkbox\">\n                                        <label>\n                                            {!! Form::checkbox('role[]', $role->id) !!}\n                                            {{ $role->name }}\n                                        </label>\n                                    </div>\n                                @endforeach\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                {!! link_to_route('users.index', 'Cancel', [], ['class' => 'btn btn-danger']) !!}\n                                {!! Form::submit('Store', ['class' => 'btn btn-primary']) !!}\n                            </div>\n                        </div>\n                    {!! Form::close() !!}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/users/edit.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-2 col-md-offset-0\">\n            <div class=\"list-group\">\n                {!! link_to_route('users.edit', 'Edit User', [$user->id], ['class' => 'list-group-item selected']) !!}\n                {!! link_to_route('users.password.change', 'Change Password', [$user->id], ['class' => 'list-group-item']) !!}\n                {!! link_to_route('users.role.edit', 'Edit Role', [$user->id], ['class' => 'list-group-item']) !!}\n                {!! link_to_route('users.api_token.edit', 'Edit API Token', [$user->id], ['class' => 'list-group-item']) !!}\n            </div>\n        </div>\n\n        <div class=\"col-md-8 col-md-offset-0\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Edit User</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    {!! Form::open(['route' => ['users.update', $user->id], 'method' => 'put', 'role' => 'form','class' => 'form-horizontal']) !!}\n                        <div class=\"form-group required\">\n                            <label for=\"name\" class=\"col-md-4 control-label\">Name</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::text('name', $user->name, ['class' => 'form-control', 'id' => 'name']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group required\">\n                            <label for=\"email\" class=\"col-md-4 control-label\">E-Mail Address</label>\n                            <div class=\"col-md-6\">\n                                {!! Form::email('email', $user->email, ['class' => 'form-control', 'id' => 'email']) !!}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                {!! link_to_route('users.index', 'Cancel', [], ['class' => 'btn btn-danger']) !!}\n                                {!! Form::submit('Update', ['class' => 'btn btn-primary']) !!}\n                            </div>\n                        </div>\n                    {!! Form::close() !!}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/users/edit_api_token.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-2 col-md-offset-0\">\n            <div class=\"list-group\">\n                {!! link_to_route('users.edit', 'Edit User', [$user->id], ['class' => 'list-group-item']) !!}\n                {!! link_to_route('users.password.change', 'Change Password', [$user->id], ['class' => 'list-group-item']) !!}\n                {!! link_to_route('users.role.edit', 'Edit Role', [$user->id], ['class' => 'list-group-item']) !!}\n                {!! link_to_route('users.api_token.edit', 'Edit API Token', [$user->id], ['class' => 'list-group-item selected']) !!}\n            </div>\n        </div>\n\n        <div class=\"col-md-8 col-md-offset-0\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Edit API Token</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    {!! Form::open(['route' => ['users.api_token.regenerate', $user->id], 'method' => 'put', 'role' => 'form','class' => 'form-horizontal']) !!}\n                        <div class=\"form-group required\">\n                            <label for=\"api_token\" class=\"col-md-4 control-label\">API Token</label>\n                            <div class=\"col-md-6 input-group\">\n                                {!! Form::text('api_token', $user->api_token, ['class' => 'form-control', 'id' => 'api_token', 'readonly' => 'readonly']) !!}\n                                <div class=\"input-group-btn\">\n                                    <button type=\"button\" class=\"btn btn-default\" aria-label=\"Copy API Token\" data-toggle=\"tooltip\" data-placement=\"bottom\" title=\"Copy API Token\", data-clipboard-target=\"#api_token\">\n                                        <span class=\"glyphicon glyphicon-copy\" aria-hidden=\"true\"></span>\n                                    </button>\n                                </div>\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                {!! link_to_route('users.index', 'Cancel', [], ['class' => 'btn btn-danger']) !!}\n                                {!! Form::submit('Regenerate', ['class' => 'btn btn-primary']) !!}\n                            </div>\n                        </div>\n                    {!! Form::close() !!}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/users/edit_role.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-2 col-md-offset-0\">\n            <div class=\"list-group\">\n                {!! link_to_route('users.edit', 'Edit User', [$user->id], ['class' => 'list-group-item']) !!}\n                {!! link_to_route('users.password.change', 'Change Password', [$user->id], ['class' => 'list-group-item']) !!}\n                {!! link_to_route('users.role.edit', 'Edit Role', [$user->id], ['class' => 'list-group-item selected']) !!}\n                {!! link_to_route('users.api_token.edit', 'Edit API Token', [$user->id], ['class' => 'list-group-item']) !!}\n            </div>\n        </div>\n\n        <div class=\"col-md-8 col-md-offset-0\">\n            <div class=\"panel panel-default\">\n                <div class=\"panel-heading\">Edit Role</div>\n                <div class=\"panel-body\">\n                    @if (count($errors) > 0)\n                        <div class=\"alert alert-danger\">\n                            <strong>Whoops!</strong> There were some problems with your input.<br><br>\n                            <ul>\n                                @foreach ($errors->all() as $error)\n                                    <li>{{ $error }}</li>\n                                @endforeach\n                            </ul>\n                        </div>\n                    @endif\n\n                    {!! Form::open(['route' => ['users.role.update', $user->id], 'method' => 'put', 'role' => 'form','class' => 'form-horizontal']) !!}\n                        <div class=\"form-group\">\n                            <label for=\"role\" class=\"col-md-4 control-label\">Role</label>\n                            <div class=\"col-md-6\">\n                                @foreach ($roles as $role)\n                                    <div class=\"checkbox\">\n                                        <label>\n                                            {!! Form::checkbox('role[]', $role->id, $user->is($role->slug)) !!}\n                                            {{ $role->name }}\n                                        </label>\n                                    </div>\n                                @endforeach\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <div class=\"col-md-6 col-md-offset-4\">\n                                {!! link_to_route('users.index', 'Cancel', [], ['class' => 'btn btn-danger']) !!}\n                                {!! Form::submit('Update', ['class' => 'btn btn-primary']) !!}\n                            </div>\n                        </div>\n                    {!! Form::close() !!}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/users/index.blade.php",
    "content": "@extends('app')\n\n@section('content')\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-md-8 col-md-offset-2\">\n            <h1 class=\"page-header\">Users</h1>\n\n            <div class=\"pull-right margin-bottom-lg\">\n                {!! link_to_route('users.create', 'Create', [], ['class' => 'btn btn-primary btn-lg']) !!}\n            </div>\n\n            <table class=\"table table-striped\">\n                <thead>\n                    <tr>\n                        <th><div align=\"center\">Name</div></th>\n                        <th><div align=\"center\">Created At</div></th>\n                        <th><div align=\"center\">Updated At</div></th>\n                        <th></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    @foreach ($users as $user)\n                        <tr>\n                            <td>{{ $user->name }}</td>\n                            <td>{{ $user->created_at }}</td>\n                            <td>{{ $user->updated_at }}</td>\n                            <td>\n                                {!! link_to_route('users.edit', 'Edit', [$user->id], ['class' => 'btn btn-default']) !!}\n                                {!! Form::open(['route' => ['users.destroy', $user->id], 'method' => 'delete', 'style' => 'display:inline']) !!}\n                                {!! Form::submit('Destroy', ['class' => 'btn btn-danger']) !!}\n                                {!! Form::close() !!}\n                            </td>\n                        </tr>\n                    @endforeach\n                </tbody>\n            </table>\n            <div class=\"text-center\">\n                {!! $users->render() !!}\n            </div>\n        </div>\n    </div>\n</div>\n@stop\n"
  },
  {
    "path": "resources/views/vendor/.gitkeep",
    "content": ""
  },
  {
    "path": "resources/views/welcome.blade.php",
    "content": "<html>\n    <head>\n        <title>Laravel</title>\n        \n        <link href='//fonts.googleapis.com/css?family=Lato:100' rel='stylesheet' type='text/css'>\n\n        <style>\n            body {\n                margin: 0;\n                padding: 0;\n                width: 100%;\n                height: 100%;\n                color: #B0BEC5;\n                display: table;\n                font-weight: 100;\n                font-family: 'Lato';\n            }\n\n            .container {\n                text-align: center;\n                display: table-cell;\n                vertical-align: middle;\n            }\n\n            .content {\n                text-align: center;\n                display: inline-block;\n            }\n\n            .title {\n                font-size: 96px;\n                margin-bottom: 40px;\n            }\n\n            .quote {\n                font-size: 24px;\n            }\n        </style>\n    </head>\n    <body>\n        <div class=\"container\">\n            <div class=\"content\">\n                <div class=\"title\">Laravel 5</div>\n                <div class=\"quote\">{{ Inspiring::quote() }}</div>\n            </div>\n        </div>\n    </body>\n</html>\n"
  },
  {
    "path": "server.php",
    "content": "<?php\n\n/**\n * Laravel - A PHP Framework For Web Artisans\n *\n * @package  Laravel\n * @author   Taylor Otwell <taylorotwell@gmail.com>\n */\n\n$uri = urldecode(\n    parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)\n);\n\n// This file allows us to emulate Apache's \"mod_rewrite\" functionality from the\n// built-in PHP web server. This provides a convenient way to test a Laravel\n// application without having installed a \"real\" web server software here.\nif ($uri !== '/' and file_exists(__DIR__.'/public'.$uri)) {\n    return false;\n}\n\nrequire_once __DIR__.'/public/index.php';\n"
  },
  {
    "path": "storage/.gitignore",
    "content": "laravel.log"
  },
  {
    "path": "storage/app/.gitignore",
    "content": "*\n!.gitignore"
  },
  {
    "path": "storage/framework/.gitignore",
    "content": "config.php\nroutes.php\nschedule-*\ncompiled.php\nservices.json\nevents.scanned.php\nroutes.scanned.php\n"
  },
  {
    "path": "storage/framework/cache/.gitignore",
    "content": "*\n!.gitignore"
  },
  {
    "path": "storage/framework/sessions/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "storage/framework/views/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "storage/logs/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "tests/Entities/Setting/AppSettingEntityTest.php",
    "content": "<?php\n\nuse App\\Entities\\Setting\\AppSettingEntity;\n\nclass AppSettingEntityTest extends TestCase\n{\n    public function test_Should_SetAndGetUrl()\n    {\n        $appSettingEntity = new AppSettingEntity;\n\n        $appSettingEntity->setUrl('http://example.com');\n\n        $url = $appSettingEntity->getUrl();\n\n        $this->assertEquals('http://example.com', $url);\n    }\n}\n"
  },
  {
    "path": "tests/Entities/Setting/DbSettingEntityTest.php",
    "content": "<?php\n\nuse App\\Entities\\Setting\\DbSettingEntity;\n\nclass DbSettingEntityTest extends TestCase\n{\n    public function test_Should_SetAndGetDriver()\n    {\n        $dbSettingEntity = new DbSettingEntity;\n\n        $dbSettingEntity->setDriver('mysql');\n\n        $driver = $dbSettingEntity->getDriver();\n\n        $this->assertEquals('mysql', $driver);\n    }\n\n    public function test_Should_SetAndGetHost()\n    {\n        $dbSettingEntity = new DbSettingEntity;\n\n        $dbSettingEntity->setHost('localhost');\n\n        $retHost = $dbSettingEntity->getHost();\n\n        $this->assertEquals('localhost', $retHost);\n    }\n\n    public function test_Should_SetAndGetDatabase()\n    {\n        $dbSettingEntity = new DbSettingEntity;\n\n        $dbSettingEntity->setDatabase('webloyer');\n\n        $database = $dbSettingEntity->getDatabase();\n\n        $this->assertEquals('webloyer', $database);\n    }\n\n    public function test_Should_SetAndGetUsername()\n    {\n        $dbSettingEntity = new DbSettingEntity;\n\n        $dbSettingEntity->setUsername('username');\n\n        $username = $dbSettingEntity->getUsername();\n\n        $this->assertEquals('username', $username);\n    }\n\n    public function test_Should_SetAndGetPassword()\n    {\n        $dbSettingEntity = new DbSettingEntity;\n\n        $dbSettingEntity->setPassword('password');\n\n        $password = $dbSettingEntity->getPassword();\n\n        $this->assertEquals('password', $password);\n    }\n}\n"
  },
  {
    "path": "tests/Entities/Setting/MailSettingEntityTest.php",
    "content": "<?php\n\nuse App\\Entities\\Setting\\MailSettingEntity;\n\nclass MailSettingEntityTest extends TestCase\n{\n    public function test_Should_SetAndGetDriver()\n    {\n        $mailSettingEntity = new MailSettingEntity;\n\n        $mailSettingEntity->setDriver('smtp');\n\n        $driver = $mailSettingEntity->getDriver();\n\n        $this->assertEquals('smtp', $driver);\n    }\n\n    public function test_Should_SetAndGetFrom()\n    {\n        $mailSettingEntity = new MailSettingEntity;\n\n        $from['address'] = 'from_address@example.com';\n        $from['name']    = 'from_name';\n\n        $mailSettingEntity->setFrom($from);\n\n        $retFrom = $mailSettingEntity->getFrom();\n\n        $this->assertEquals($from, $retFrom);\n    }\n\n    public function test_Should_SetAndGetSmtpHost()\n    {\n        $mailSettingEntity = new MailSettingEntity;\n\n        $mailSettingEntity->setSmtpHost('localhost');\n\n        $smtpHost = $mailSettingEntity->getSmtpHost();\n\n        $this->assertEquals('localhost', $smtpHost);\n    }\n\n    public function test_Should_SetAndGetSmtpPort()\n    {\n        $mailSettingEntity = new MailSettingEntity;\n\n        $mailSettingEntity->setSmtpPort(587);\n\n        $smtpPort = $mailSettingEntity->getSmtpPort();\n\n        $this->assertEquals(587, $smtpPort);\n    }\n\n    public function test_Should_SetAndGetSmtpEncryption()\n    {\n        $mailSettingEntity = new MailSettingEntity;\n\n        $mailSettingEntity->setSmtpEncryption('tls');\n\n        $smtpEncryption = $mailSettingEntity->getSmtpEncryption();\n\n        $this->assertEquals('tls', $smtpEncryption);\n    }\n\n    public function test_Should_SetAndGetSmtpUsername()\n    {\n        $mailSettingEntity = new MailSettingEntity;\n\n        $mailSettingEntity->setSmtpUsername('username@example.com');\n\n        $smtpUsername = $mailSettingEntity->getSmtpUsername();\n\n        $this->assertEquals('username@example.com', $smtpUsername);\n    }\n\n    public function test_Should_SetAndGetSmtpPassword()\n    {\n        $mailSettingEntity = new MailSettingEntity;\n\n        $mailSettingEntity->setSmtpPassword('password');\n\n        $smtpPassword = $mailSettingEntity->getSmtpPassword();\n\n        $this->assertEquals('password', $smtpPassword);\n    }\n\n    public function test_Should_SetAndGetSendmailPath()\n    {\n        $mailSettingEntity = new MailSettingEntity;\n\n        $mailSettingEntity->setSendmailPath('/usr/sbin/sendmail -bs');\n\n        $sendmailPath = $mailSettingEntity->getSendmailPath();\n\n        $this->assertEquals('/usr/sbin/sendmail -bs', $sendmailPath);\n    }\n}\n"
  },
  {
    "path": "tests/Http/Controllers/DeploymentsControllerTest.php",
    "content": "<?php\n\nuse Tests\\Helpers\\Factory;\nuse Tests\\Helpers\\DummyMiddleware;\n\nclass DeploymentsControllerTest extends TestCase\n{\n    use Tests\\Helpers\\ControllerTestHelper;\n\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockProjectRepository;\n\n    protected $mockDeploymentForm;\n\n    protected $mockProjectModel;\n\n    protected $mockDeploymentModel;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->app->instance(\\App\\Http\\Middleware\\ApplySettings::class, new DummyMiddleware);\n\n        Session::start();\n\n        $user = $this->mockPartial('App\\Models\\User');\n        $user->shouldReceive('can')\n            ->andReturn(true);\n        $this->auth($user);\n\n        $this->mockProjectRepository = $this->mock('App\\Repositories\\Project\\ProjectInterface');\n        $this->mockDeploymentForm = $this->mock('App\\Services\\Form\\Deployment\\DeploymentForm');\n        $this->mockProjectModel = $this->mockPartial('App\\Models\\Project');\n        $this->mockDeploymentModel = $this->mockPartial('App\\Models\\Deployment');\n    }\n\n    public function test_Should_DisplayIndexPage_When_IndexPageIsRequested()\n    {\n        $deployments = Factory::buildList('App\\Models\\Deployment', [\n            ['id' => 1, 'project_id' => 1, 'number' => 1, 'task' => 'deploy', 'user_id' => 1, 'created_at' => new Carbon\\Carbon, 'updated_at' => new Carbon\\Carbon, 'user' => new App\\Models\\User],\n            ['id' => 2, 'project_id' => 1, 'number' => 2, 'task' => 'deploy', 'user_id' => 1, 'created_at' => new Carbon\\Carbon, 'updated_at' => new Carbon\\Carbon, 'user' => new App\\Models\\User],\n            ['id' => 3, 'project_id' => 1, 'number' => 3, 'task' => 'deploy', 'user_id' => 1, 'created_at' => new Carbon\\Carbon, 'updated_at' => new Carbon\\Carbon, 'user' => new App\\Models\\User],\n        ]);\n\n        $perPage = 10;\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('getDeploymentsByPage')\n            ->once()\n            ->andReturn(new Illuminate\\Pagination\\Paginator($deployments, $perPage))\n            ->mock();\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->get('projects/1/deployments');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('deployments');\n        $this->assertViewHas('project');\n    }\n\n    public function test_Should_RedirectToIndexPage_When_StoreProcessSucceeds()\n    {\n        $project = $this->mockProjectModel\n            ->shouldReceive('getLastDeployment')\n            ->once()\n            ->andReturn($this->mockDeploymentModel)\n            ->mock();\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockDeploymentForm\n            ->shouldReceive('save')\n            ->once()\n            ->andReturn(true);\n\n        $params = [\n            'project_id' => 1,\n            'user_id'    => 1,\n        ];\n\n        $this->post('projects/1/deployments', $params);\n\n        $this->assertRedirectedToRoute('projects.deployments.index', [$project]);\n    }\n\n    public function test_Should_RedirectToIndexPage_When_StoreProcessFails()\n    {\n        $project = Factory::build('App\\Models\\Project', [\n            'id'         => 1,\n            'name'       => 'Project 1',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockDeploymentForm\n            ->shouldReceive('save')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockDeploymentForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn([]);\n\n        $params = [\n            'project_id' => 1,\n            'user_id'    => 1,\n        ];\n\n        $this->post('projects/1/deployments', $params);\n\n        $this->assertRedirectedToRoute('projects.deployments.index', [$project]);\n        $this->assertSessionHasErrors();\n    }\n\n    public function test_Should_DisplayShowPage_When_ShowPageIsRequestedAndResourceIsFound()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n            'user'       => new App\\Models\\User,\n        ]);\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('getDeploymentByNumber')\n            ->once()\n            ->andReturn($deployment)\n            ->mock();\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->get('projects/1/deployments/1');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('deployment');\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_ShowPageIsRequestedAndResourceIsNotFound()\n    {\n        $project = $this->mockProjectModel\n            ->shouldReceive('getDeploymentByNumber')\n            ->once()\n            ->andReturn(null)\n            ->mock();\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->get('projects/1/deployments/1');\n\n        $this->assertResponseStatus(404);\n    }\n}\n"
  },
  {
    "path": "tests/Http/Controllers/ProjectsControllerTest.php",
    "content": "<?php\n\nuse Tests\\Helpers\\Factory;\nuse Tests\\Helpers\\DummyMiddleware;\n\nclass ProjectsControllerTest extends TestCase\n{\n    use Tests\\Helpers\\ControllerTestHelper;\n\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockProjectRepository;\n\n    protected $mockProjectForm;\n\n    protected $mockRecipeRepository;\n\n    protected $mockServerRepository;\n\n    protected $mockUserRepository;\n\n    protected $mockProjectModel;\n\n    protected $mockProjectAttributeEntity;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->app->instance(\\App\\Http\\Middleware\\ApplySettings::class, new DummyMiddleware);\n\n        Session::start();\n\n        $user = $this->mockPartial('App\\Models\\User');\n        $user->shouldReceive('can')\n            ->andReturn(true);\n        $this->auth($user);\n\n        $this->mockProjectRepository = $this->mock('App\\Repositories\\Project\\ProjectInterface');\n        $this->mockProjectForm = $this->mock('App\\Services\\Form\\Project\\ProjectForm');\n        $this->mockRecipeRepository = $this->mock('App\\Repositories\\Recipe\\RecipeInterface');\n        $this->mockServerRepository = $this->mock('App\\Repositories\\Server\\ServerInterface');\n        $this->mockUserRepository = $this->mock('App\\Repositories\\User\\UserInterface');\n        $this->mockProjectModel = $this->mockPartial('App\\Models\\Project');\n        $this->mockProjectAttributeEntity = $this->mock('App\\Entities\\ProjectAttribute\\ProjectAttributeEntity');\n    }\n\n    public function test_Should_DisplayIndexPage_When_IndexPageIsRequested()\n    {\n        $project = $this->mockProjectModel\n            ->shouldReceive('getLastDeployment')\n            ->times(2)\n            ->andReturn([])\n            ->mock();\n\n        $projects = [\n            $project,\n        ];\n\n        $perPage = 10;\n\n        $this->mockProjectRepository\n            ->shouldReceive('byPage')\n            ->once()\n            ->andReturn(new Illuminate\\Pagination\\Paginator($projects, $perPage));\n\n        $this->get('projects');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('projects');\n    }\n\n    public function test_Should_DisplayCreatePage_When_CreatePageIsRequested()\n    {\n        $this->mockRecipeRepository\n            ->shouldReceive('all')\n            ->once()\n            ->andReturn(new Illuminate\\Database\\Eloquent\\Collection);\n\n        $this->mockServerRepository\n            ->shouldReceive('all')\n            ->once()\n            ->andReturn(new Illuminate\\Database\\Eloquent\\Collection);\n\n        $this->mockUserRepository\n            ->shouldReceive('all')\n            ->once()\n            ->andReturn(new Illuminate\\Database\\Eloquent\\Collection);\n\n        $this->get('projects/create');\n\n        $this->assertResponseOk();\n    }\n\n    public function test_Should_RedirectToIndexPage_When_StoreProcessSucceeds()\n    {\n        $this->mockProjectForm\n            ->shouldReceive('save')\n            ->once()\n            ->andReturn(true);\n\n        $this->post('projects');\n\n        $this->assertRedirectedToRoute('projects.index');\n    }\n\n    public function test_Should_RedirectToCreatePage_When_StoreProcessFails()\n    {\n        $this->mockProjectForm\n            ->shouldReceive('save')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockProjectForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn([]);\n\n        $this->post('projects');\n\n        $this->assertRedirectedToRoute('projects.create');\n        $this->assertSessionHasErrors();\n    }\n\n    public function test_Should_DisplayShowPage_When_ShowPageIsRequestedAndResourceIsFound()\n    {\n        $this->mockProjectAttributeEntity\n            ->shouldReceive('getDeployPath')\n            ->once();\n\n        $project = $this->mockProjectModel;\n        $project->shouldReceive('getRecipes')\n            ->once()\n            ->andReturn(new Illuminate\\Database\\Eloquent\\Collection);\n        $project->shouldReceive('getGithubWebhookUser')\n            ->twice()\n            ->andReturn(new App\\Models\\User);\n        $project->shouldReceive('getAttribute')\n            ->with('attributes')\n            ->andReturn($this->mockProjectAttributeEntity);\n\n        $server = Factory::build('App\\Models\\Server', [\n            'id'          => 1,\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n            'created_at'  => new Carbon\\Carbon,\n            'updated_at'  => new Carbon\\Carbon,\n        ]);\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($server);\n\n        $this->get('projects/1');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('project');\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_ShowPageIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->get('projects/1');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_DisplayEditPage_When_EditPageIsRequestedAndResourceIsFound()\n    {\n        $this->mockProjectAttributeEntity\n            ->shouldReceive('getDeployPath')\n            ->once();\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('getRecipes')\n            ->once()\n            ->andReturn(new Illuminate\\Database\\Eloquent\\Collection)\n            ->mock();\n        $project->shouldReceive('getAttribute')\n            ->with('attributes')\n            ->andReturn($this->mockProjectAttributeEntity);\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockRecipeRepository\n            ->shouldReceive('all')\n            ->once()\n            ->andReturn(new Illuminate\\Database\\Eloquent\\Collection);\n\n        $this->mockServerRepository\n            ->shouldReceive('all')\n            ->once()\n            ->andReturn(new Illuminate\\Database\\Eloquent\\Collection);\n\n        $this->mockUserRepository\n            ->shouldReceive('all')\n            ->once()\n            ->andReturn(new Illuminate\\Database\\Eloquent\\Collection);\n\n        $this->get('projects/1/edit');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('project');\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_EditPageIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->get('projects/1/edit');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_RedirectToIndexPage_When_UpdateProcessSucceeds()\n    {\n        $project = Factory::build('App\\Models\\Project', [\n            'id'         => 1,\n            'name'       => 'Project 1',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockProjectForm\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(true);\n\n        $this->put('projects/1');\n\n        $this->assertRedirectedToRoute('projects.index');\n    }\n\n    public function test_Should_RedirectToEditPage_When_UpdateProcessFails()\n    {\n        $project = Factory::build('App\\Models\\Project', [\n            'id'         => 1,\n            'name'       => 'Project 1',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockProjectForm\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockProjectForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn([]);\n\n        $this->put('projects/1');\n\n        $this->assertRedirectedToRoute('projects.edit', [$project]);\n        $this->assertSessionHasErrors();\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_UpdateProcessIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->put('projects/1');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_RedirectToIndexPage_When_DestroyProcessIsRequestedAndDestroyProcessSucceeds()\n    {\n        $project = Factory::build('App\\Models\\Project', [\n            'id'         => 1,\n            'name'       => 'Project 1',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockProjectRepository\n            ->shouldReceive('delete')\n            ->once();\n\n        $this->delete('projects/1');\n\n        $this->assertRedirectedToRoute('projects.index');\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_DestroyProcessIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->delete('projects/1');\n\n        $this->assertResponseStatus(404);\n    }\n}\n"
  },
  {
    "path": "tests/Http/Controllers/RecipesControllerTest.php",
    "content": "<?php\n\nuse Tests\\Helpers\\Factory;\nuse Tests\\Helpers\\DummyMiddleware;\n\nclass RecipesControllerTest extends TestCase\n{\n    use Tests\\Helpers\\ControllerTestHelper;\n\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockRecipeRepository;\n\n    protected $mockRecipeForm;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->app->instance(\\App\\Http\\Middleware\\ApplySettings::class, new DummyMiddleware);\n\n        Session::start();\n\n        $user = $this->mockPartial('App\\Models\\User');\n        $user->shouldReceive('can')\n            ->andReturn(true);\n        $this->auth($user);\n\n        $this->mockRecipeRepository = $this->mock('App\\Repositories\\Recipe\\RecipeInterface');\n        $this->mockRecipeForm = $this->mock('App\\Services\\Form\\Recipe\\RecipeForm');\n        $this->mockRecipeModel = $this->mockPartial('App\\Models\\Recipe');\n    }\n\n    public function test_Should_DisplayIndexPage_When_IndexPageIsRequested()\n    {\n        $recipes[] = $this->mockRecipeModel\n            ->shouldReceive('getProjects')\n            ->once()\n            ->andReturn(new Illuminate\\Database\\Eloquent\\Collection)\n            ->mock();\n        $recipes[] = $this->mockRecipeModel\n            ->shouldReceive('getProjects')\n            ->once()\n            ->andReturn(new Illuminate\\Database\\Eloquent\\Collection)\n            ->mock();\n\n        $perPage = 10;\n\n        $this->mockRecipeRepository\n            ->shouldReceive('byPage')\n            ->once()\n            ->andReturn(new Illuminate\\Pagination\\Paginator($recipes, $perPage));\n\n        $this->get('recipes');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('recipes');\n    }\n\n    public function test_Should_DisplayCreatePage_When_CreatePageIsRequested()\n    {\n        $this->get('recipes/create');\n\n        $this->assertResponseOk();\n    }\n\n    public function test_Should_RedirectToIndexPage_When_StoreProcessSucceeds()\n    {\n        $this->mockRecipeForm\n            ->shouldReceive('save')\n            ->once()\n            ->andReturn(true);\n\n        $this->post('recipes');\n\n        $this->assertRedirectedToRoute('recipes.index');\n    }\n\n    public function test_Should_RedirectToCreatePage_When_StoreProcessFails()\n    {\n        $this->mockRecipeForm\n            ->shouldReceive('save')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockRecipeForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn([]);\n\n        $this->post('recipes');\n\n        $this->assertRedirectedToRoute('recipes.create');\n        $this->assertSessionHasErrors();\n    }\n\n    public function test_Should_DisplayShowPage_When_ShowPageIsRequestedAndResourceIsFound()\n    {\n        $recipe = $this->mockRecipeModel\n            ->shouldReceive('getProjects')\n            ->once()\n            ->andReturn(new Illuminate\\Database\\Eloquent\\Collection)\n            ->mock();\n\n        $this->mockRecipeRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($recipe);\n\n        $this->get('recipes/1');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('recipe');\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_ShowPageIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockRecipeRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->get('recipes/1');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_DisplayEditPage_When_EditPageIsRequestedAndResourceIsFound()\n    {\n        $recipe = Factory::build('App\\Models\\Recipe', [\n            'id'          => 1,\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n            'created_at'  => new Carbon\\Carbon,\n            'updated_at'  => new Carbon\\Carbon,\n        ]);\n\n        $this->mockRecipeRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($recipe);\n\n        $this->get('recipes/1/edit');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('recipe');\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_EditPageIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockRecipeRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->get('recipes/1/edit');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_RedirectToIndexPage_When_UpdateProcessSucceeds()\n    {\n        $recipe = Factory::build('App\\Models\\Recipe', [\n            'id'          => 1,\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n            'created_at'  => new Carbon\\Carbon,\n            'updated_at'  => new Carbon\\Carbon,\n        ]);\n\n        $this->mockRecipeRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($recipe);\n\n        $this->mockRecipeForm\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(true);\n\n        $this->put('recipes/1');\n\n        $this->assertRedirectedToRoute('recipes.index');\n    }\n\n    public function test_Should_RedirectToEditPage_When_UpdateProcessFails()\n    {\n        $recipe = Factory::build('App\\Models\\Recipe', [\n            'id'          => 1,\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n            'created_at'  => new Carbon\\Carbon,\n            'updated_at'  => new Carbon\\Carbon,\n        ]);\n\n        $this->mockRecipeRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($recipe);\n\n        $this->mockRecipeForm\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockRecipeForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn([]);\n\n        $this->put('recipes/1');\n\n        $this->assertRedirectedToRoute('recipes.edit', [$recipe]);\n        $this->assertSessionHasErrors();\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_UpdateProcessIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockRecipeRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->put('recipes/1');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_RedirectToIndexPage_When_DestroyProcessIsRequestedAndDestroyProcessSucceeds()\n    {\n        $recipe = Factory::build('App\\Models\\Recipe', [\n            'id'          => 1,\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n            'created_at'  => new Carbon\\Carbon,\n            'updated_at'  => new Carbon\\Carbon,\n        ]);\n\n        $this->mockRecipeRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($recipe);\n\n        $this->mockRecipeRepository\n            ->shouldReceive('delete')\n            ->once();\n\n        $this->delete('recipes/1');\n\n        $this->assertRedirectedToRoute('recipes.index');\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_DestroyProcessIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockRecipeRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->delete('recipes/1');\n\n        $this->assertResponseStatus(404);\n    }\n}\n"
  },
  {
    "path": "tests/Http/Controllers/ServersControllerTest.php",
    "content": "<?php\n\nuse Tests\\Helpers\\Factory;\nuse Tests\\Helpers\\DummyMiddleware;\n\nclass ServersControllerTest extends TestCase\n{\n    use Tests\\Helpers\\ControllerTestHelper;\n\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockServerRepository;\n\n    protected $mockServerForm;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->app->instance(\\App\\Http\\Middleware\\ApplySettings::class, new DummyMiddleware);\n\n        Session::start();\n\n        $user = $this->mockPartial('App\\Models\\User');\n        $user->shouldReceive('can')\n            ->andReturn(true);\n        $this->auth($user);\n\n        $this->mockServerRepository = $this->mock('App\\Repositories\\Server\\ServerInterface');\n        $this->mockServerForm = $this->mock('App\\Services\\Form\\Server\\ServerForm');\n    }\n\n    public function test_Should_DisplayIndexPage_When_IndexPageIsRequested()\n    {\n        $servers = Factory::buildList('App\\Models\\Server', [\n            ['id' => 1, 'name' => 'Server 1', 'description' => '', 'body' => '', 'created_at' => new Carbon\\Carbon, 'updated_at' => new Carbon\\Carbon],\n            ['id' => 2, 'name' => 'Server 2', 'description' => '', 'body' => '', 'created_at' => new Carbon\\Carbon, 'updated_at' => new Carbon\\Carbon],\n            ['id' => 3, 'name' => 'Server 3', 'description' => '', 'body' => '', 'created_at' => new Carbon\\Carbon, 'updated_at' => new Carbon\\Carbon],\n        ]);\n\n        $perPage = 10;\n\n        $this->mockServerRepository\n            ->shouldReceive('byPage')\n            ->once()\n            ->andReturn(new Illuminate\\Pagination\\Paginator($servers, $perPage));\n\n        $this->get('servers');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('servers');\n    }\n\n    public function test_Should_DisplayCreatePage_When_CreatePageIsRequested()\n    {\n        $this->get('servers/create');\n\n        $this->assertResponseOk();\n    }\n\n    public function test_Should_RedirectToIndexPage_When_StoreProcessSucceeds()\n    {\n        $this->mockServerForm\n            ->shouldReceive('save')\n            ->once()\n            ->andReturn(true);\n\n        $this->post('servers');\n\n        $this->assertRedirectedToRoute('servers.index');\n    }\n\n    public function test_Should_RedirectToCreatePage_When_StoreProcessFails()\n    {\n        $this->mockServerForm\n            ->shouldReceive('save')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockServerForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn([]);\n\n        $this->post('servers');\n\n        $this->assertRedirectedToRoute('servers.create');\n        $this->assertSessionHasErrors();\n    }\n\n    public function test_Should_DisplayShowPage_When_ShowPageIsRequestedAndResourceIsFound()\n    {\n        $server = Factory::build('App\\Models\\Server', [\n            'id'          => 1,\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n            'created_at'  => new Carbon\\Carbon,\n            'updated_at'  => new Carbon\\Carbon,\n        ]);\n\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($server);\n\n        $this->get('servers/1');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('server');\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_ShowPageIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->get('servers/1');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_DisplayEditPage_When_EditPageIsRequestedAndResourceIsFound()\n    {\n        $server = Factory::build('App\\Models\\Server', [\n            'id'          => 1,\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n            'created_at'  => new Carbon\\Carbon,\n            'updated_at'  => new Carbon\\Carbon,\n        ]);\n\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($server);\n\n        $this->get('servers/1/edit');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('server');\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_EditPageIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->get('servers/1/edit');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_RedirectToIndexPage_When_UpdateProcessSucceeds()\n    {\n        $server = Factory::build('App\\Models\\Server', [\n            'id'          => 1,\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n            'created_at'  => new Carbon\\Carbon,\n            'updated_at'  => new Carbon\\Carbon,\n        ]);\n\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($server);\n\n        $this->mockServerForm\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(true);\n\n        $this->put('servers/1');\n\n        $this->assertRedirectedToRoute('servers.index');\n    }\n\n    public function test_Should_RedirectToEditPage_When_UpdateProcessFails()\n    {\n        $server = Factory::build('App\\Models\\Server', [\n            'id'          => 1,\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n            'created_at'  => new Carbon\\Carbon,\n            'updated_at'  => new Carbon\\Carbon,\n        ]);\n\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($server);\n\n        $this->mockServerForm\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockServerForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn([]);\n\n        $this->put('servers/1');\n\n        $this->assertRedirectedToRoute('servers.edit', [$server]);\n        $this->assertSessionHasErrors();\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_UpdateProcessIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->put('servers/1');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_RedirectToIndexPage_When_DestroyProcessIsRequestedAndDestroyProcessSucceeds()\n    {\n        $server = Factory::build('App\\Models\\Server', [\n            'id'          => 1,\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n            'created_at'  => new Carbon\\Carbon,\n            'updated_at'  => new Carbon\\Carbon,\n        ]);\n\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($server);\n\n        $this->mockServerRepository\n            ->shouldReceive('delete')\n            ->once();\n\n        $this->delete('servers/1');\n\n        $this->assertRedirectedToRoute('servers.index');\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_DestroyProcessIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->delete('servers/1');\n\n        $this->assertResponseStatus(404);\n    }\n}\n"
  },
  {
    "path": "tests/Http/Controllers/SettingsControllerTest.php",
    "content": "<?php\n\nuse Tests\\Helpers\\DummyMiddleware;\n\nclass SettingsControllerTest extends TestCase\n{\n    use Tests\\Helpers\\ControllerTestHelper;\n\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockSettingRepository;\n\n    protected $mockMailSettingForm;\n\n    protected $mockMailSettingEntity;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->app->instance(\\App\\Http\\Middleware\\ApplySettings::class, new DummyMiddleware);\n\n        Session::start();\n\n        $user = $this->mockPartial('App\\Models\\User');\n        $user->shouldReceive('can')\n            ->andReturn(true);\n        $this->auth($user);\n\n        $this->mockSettingRepository = $this->mock('App\\Repositories\\Setting\\SettingInterface');\n        $this->mockMailSettingForm = $this->mock('App\\Services\\Form\\Setting\\MailSettingForm');\n        $this->mockSettingModel = $this->mockPartial('App\\Models\\Setting');\n        $this->mockMailSettingEntity = $this->mock('App\\Entities\\Setting\\MailSettingEntity');\n    }\n\n    public function test_Should_DisplayEmailSettingPage()\n    {\n        $this->mockMailSettingEntity\n            ->shouldReceive('getDriver')\n            ->once()\n            ->shouldReceive('getFrom')\n            ->twice()\n            ->shouldReceive('getSmtpHost')\n            ->once()\n            ->shouldReceive('getSmtpPort')\n            ->once()\n            ->shouldReceive('getSmtpEncryption')\n            ->once()\n            ->shouldReceive('getSmtpUsername')\n            ->once()\n            ->shouldReceive('getSmtpPassword')\n            ->once()\n            ->shouldReceive('getSendmailPath')\n            ->once();\n        $this->mockSettingModel\n            ->shouldReceive('getAttribute')\n            ->with('attributes')\n            ->andReturn($this->mockMailSettingEntity);\n        $this->mockSettingRepository\n            ->shouldReceive('byType')\n            ->once()\n            ->andReturn($this->mockSettingModel);\n\n        $this->get('settings/email');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('settings');\n    }\n\n    public function test_Should_RedirectToEmailSettingPage_When_EmailSettingProcessIsRequestedAndEmailSettingProcessSucceeds()\n    {\n        $this->mockMailSettingForm\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(true);\n\n        $this->post('settings/email');\n\n        $this->assertRedirectedToRoute('settings.email');\n    }\n\n    public function test_Should_RedirectToEmailSettingPage_When_EmailSettingProcessIsRequestedAndEmailSettingProcessFails()\n    {\n        $this->mockMailSettingForm\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockMailSettingForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn([]);\n\n        $this->post('settings/email');\n\n        $this->assertRedirectedToRoute('settings.email');\n    }\n}\n"
  },
  {
    "path": "tests/Http/Controllers/UsersControllerTest.php",
    "content": "<?php\n\nuse Tests\\Helpers\\Factory;\nuse Tests\\Helpers\\DummyMiddleware;\n\nclass UsersControllerTest extends TestCase\n{\n    use Tests\\Helpers\\ControllerTestHelper;\n\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockUserRepository;\n\n    protected $mockRoleRepository;\n\n    protected $mockUserForm;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->app->instance(\\App\\Http\\Middleware\\ApplySettings::class, new DummyMiddleware);\n\n        Session::start();\n\n        $user = $this->mockPartial('App\\Models\\User');\n        $user->shouldReceive('can')\n            ->andReturn(true);\n        $this->auth($user);\n\n        $this->mockUserRepository = $this->mock('App\\Repositories\\User\\UserInterface');\n        $this->mockRoleRepsitory = $this->mock('App\\Repositories\\Role\\RoleInterface');\n        $this->mockUserForm = $this->mock('App\\Services\\Form\\User\\UserForm');\n    }\n\n    public function test_Should_DisplayIndexPage_When_IndexPageIsRequested()\n    {\n        $users = Factory::buildList('App\\Models\\User', [\n            ['id' => 1, 'name' => 'User 1', 'email' => 'user1@example.com', 'password' => '12345678', 'created_at' => new Carbon\\Carbon, 'updated_at' => new Carbon\\Carbon],\n            ['id' => 2, 'name' => 'User 2', 'email' => 'user2@example.com', 'password' => '12345678', 'created_at' => new Carbon\\Carbon, 'updated_at' => new Carbon\\Carbon],\n            ['id' => 3, 'name' => 'User 3', 'email' => 'user3@example.com', 'password' => '12345678', 'created_at' => new Carbon\\Carbon, 'updated_at' => new Carbon\\Carbon],\n        ]);\n\n        $perPage = 10;\n\n        $this->mockUserRepository\n            ->shouldReceive('byPage')\n            ->once()\n            ->andReturn(new Illuminate\\Pagination\\Paginator($users, $perPage));\n\n        $this->get('users');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('users');\n    }\n\n    public function test_Should_DisplayCreatePage_When_CreatePageIsRequested()\n    {\n        $this->mockRoleRepsitory\n            ->shouldReceive('all')\n            ->once()\n            ->andReturn(new Illuminate\\Database\\Eloquent\\Collection);\n\n        $this->get('users/create');\n\n        $this->assertResponseOk();\n    }\n\n    public function test_Should_RedirectToIndexPage_When_StoreProcessSucceeds()\n    {\n        $this->mockUserForm\n            ->shouldReceive('save')\n            ->once()\n            ->andReturn(true);\n\n        $this->post('users');\n\n        $this->assertRedirectedToRoute('users.index');\n    }\n\n    public function test_Should_RedirectToCreatePage_When_StoreProcessFails()\n    {\n        $this->mockUserForm\n            ->shouldReceive('save')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockUserForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn([]);\n\n        $this->post('users');\n\n        $this->assertRedirectedToRoute('users.create');\n        $this->assertSessionHasErrors();\n    }\n\n    public function test_Should_RedirectToEditPage_When_ShowPageIsRequestedAndResourceIsFound()\n    {\n        $user = Factory::build('App\\Models\\User', [\n            'id'         => 1,\n            'name'       => 'User 1',\n            'email'      => 'user1@example.com',\n            'password'   => '12345678',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($user);\n\n        $this->get('users/1');\n\n        $this->assertRedirectedToRoute('users.edit', [$user]);\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_ShowPageIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->get('users/1');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_DisplayEditPage_When_EditPageIsRequestedAndResourceIsFound()\n    {\n        $user = Factory::build('App\\Models\\User', [\n            'id'         => 1,\n            'name'       => 'User 1',\n            'email'      => 'user1@example.com',\n            'password'   => '12345678',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($user);\n\n        $this->get('users/1/edit');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('user');\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_EditPageIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->get('users/1/edit');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_RedirectToIndexPage_When_UpdateProcessSucceeds()\n    {\n        $user = Factory::build('App\\Models\\User', [\n            'id'         => 1,\n            'name'       => 'User 1',\n            'email'      => 'user1@example.com',\n            'password'   => '12345678',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($user);\n\n        $this->mockUserForm\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(true);\n\n        $this->put('users/1');\n\n        $this->assertRedirectedToRoute('users.index');\n    }\n\n    public function test_Should_RedirectToEditPage_When_UpdateProcessFails()\n    {\n        $user = Factory::build('App\\Models\\User', [\n            'id'         => 1,\n            'name'       => 'User 1',\n            'email'      => 'user1@example.com',\n            'password'   => '12345678',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($user);\n\n        $this->mockUserForm\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockUserForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn([]);\n\n        $this->put('users/1');\n\n        $this->assertRedirectedToRoute('users.edit', [$user]);\n        $this->assertSessionHasErrors();\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_UpdateProcessIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->put('users/1');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_DisplayPasswordChangePage_When_PasswordChangePageIsRequestedAndResourceIsFound()\n    {\n        $user = Factory::build('App\\Models\\User', [\n            'id'         => 1,\n            'name'       => 'User 1',\n            'email'      => 'user1@example.com',\n            'password'   => '12345678',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($user);\n\n        $this->get('users/1/password/change');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('user');\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_PasswordChangePageIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->get('users/1/password/change');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_RedirectToIndexPage_When_PasswordUpdateProcessSucceeds()\n    {\n        $user = Factory::build('App\\Models\\User', [\n            'id'         => 1,\n            'name'       => 'User 1',\n            'email'      => 'user1@example.com',\n            'password'   => '12345678',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($user);\n\n        $this->mockUserForm\n            ->shouldReceive('updatePassword')\n            ->once()\n            ->andReturn(true);\n\n        $this->put('users/1/password');\n\n        $this->assertRedirectedToRoute('users.index');\n    }\n\n    public function test_Should_RedirectToPasswordChangePage_When_PasswordUpdateProcessFails()\n    {\n        $user = Factory::build('App\\Models\\User', [\n            'id'         => 1,\n            'name'       => 'User 1',\n            'email'      => 'user1@example.com',\n            'password'   => '12345678',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($user);\n\n        $this->mockUserForm\n            ->shouldReceive('updatePassword')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockUserForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn([]);\n\n        $this->put('users/1/password');\n\n        $this->assertRedirectedToRoute('users.password.change', [$user]);\n        $this->assertSessionHasErrors();\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_PasswordUpdateProcessIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->put('users/1/password');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_DisplayEditRolePage_When_EditRolePageIsRequestedAndResourceIsFound()\n    {\n        $user = Factory::build('App\\Models\\User', [\n            'id'         => 1,\n            'name'       => 'User 1',\n            'email'      => 'user1@example.com',\n            'password'   => '12345678',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($user);\n\n        $this->mockRoleRepsitory\n            ->shouldReceive('all')\n            ->once()\n            ->andReturn(new Illuminate\\Database\\Eloquent\\Collection);\n\n        $this->get('users/1/role/edit');\n\n        $this->assertResponseOk();\n        $this->assertViewHas('user');\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_EditRolePageIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->get('users/1/role/edit');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_RedirectToIndexPage_When_RoleUpdateProcessSucceeds()\n    {\n        $user = Factory::build('App\\Models\\User', [\n            'id'         => 1,\n            'name'       => 'User 1',\n            'email'      => 'user1@example.com',\n            'password'   => '12345678',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($user);\n\n        $this->mockUserForm\n            ->shouldReceive('updateRole')\n            ->once()\n            ->andReturn(true);\n\n        $this->put('users/1/role');\n\n        $this->assertRedirectedToRoute('users.index');\n    }\n\n    public function test_Should_RedirectToEditRolePage_When_EditUpdateProcessFails()\n    {\n        $user = Factory::build('App\\Models\\User', [\n            'id'         => 1,\n            'name'       => 'User 1',\n            'email'      => 'user1@example.com',\n            'password'   => '12345678',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($user);\n\n        $this->mockUserForm\n            ->shouldReceive('updateRole')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockUserForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn([]);\n\n        $this->put('users/1/role');\n\n        $this->assertRedirectedToRoute('users.role.edit', [$user]);\n        $this->assertSessionHasErrors();\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_RoleUpdateProcessIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->put('users/1/role');\n\n        $this->assertResponseStatus(404);\n    }\n\n    public function test_Should_RedirectToIndexPage_When_DestroyProcessIsRequestedAndDestroyProcessSucceeds()\n    {\n        $user = Factory::build('App\\Models\\User', [\n            'id'         => 1,\n            'name'       => 'User 1',\n            'email'      => 'user1@example.com',\n            'password'   => '12345678',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($user);\n\n        $this->mockUserRepository\n            ->shouldReceive('delete')\n            ->once();\n\n        $this->delete('users/1');\n\n        $this->assertRedirectedToRoute('users.index');\n    }\n\n    public function test_Should_DisplayNotFoundPage_When_DestroyProcessIsRequestedAndResourceIsNotFound()\n    {\n        $this->mockUserRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn(null);\n\n        $this->delete('users/1');\n\n        $this->assertResponseStatus(404);\n    }\n}\n"
  },
  {
    "path": "tests/Http/Controllers/Webhook/Github/V1/DeploymentsControllerTest.php",
    "content": "<?php\n\nnamespace Tests\\Http\\Controllers\\Webhook\\Github\\V1;\n\nuse Tests\\Helpers\\Factory;\nuse Tests\\Helpers\\DummyMiddleware;\n\nclass DeploymentsControllerTest extends \\TestCase\n{\n    use \\Tests\\Helpers\\ControllerTestHelper;\n\n    use \\Tests\\Helpers\\MockeryHelper;\n\n    protected $mockProjectRepository;\n\n    protected $mockDeploymentForm;\n\n    protected $mockProjectModel;\n\n    protected $mockDeploymentModel;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->app->instance(\\App\\Http\\Middleware\\ApplySettings::class, new DummyMiddleware);\n\n        \\Session::start();\n\n        $user = $this->mockPartial('App\\Models\\User');\n        $user->shouldReceive('can')\n            ->andReturn(true);\n        $this->auth($user);\n\n        $this->mockProjectRepository = $this->mock('App\\Repositories\\Project\\ProjectInterface');\n        $this->mockDeploymentForm = $this->mock('App\\Services\\Form\\Deployment\\DeploymentForm');\n        $this->mockProjectModel = $this->mockPartial('App\\Models\\Project');\n        $this->mockDeploymentModel = $this->mockPartial('App\\Models\\Deployment');\n    }\n\n    public function test_Should_ReturnStatusCode200_When_StoreProcessSucceeds()\n    {\n        $project = $this->mockProjectModel\n            ->shouldReceive('getLastDeployment')\n            ->once()\n            ->andReturn($this->mockDeploymentModel)\n            ->mock();\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockDeploymentForm\n            ->shouldReceive('save')\n            ->once()\n            ->andReturn(true);\n\n        $this->post('webhook/github/v1/projects/1/deployments');\n\n        $this->assertResponseOK();\n    }\n\n    public function test_Should_ReturnStatusCode400_When_StoreProcessFails()\n    {\n        $project = Factory::build('App\\Models\\Project', [\n            'id'                     => 1,\n            'name'                   => 'Project 1',\n            'github_webhook_user_id' => 1,\n            'created_at'             => new \\Carbon\\Carbon,\n            'updated_at'             => new \\Carbon\\Carbon,\n        ]);\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockDeploymentForm\n            ->shouldReceive('save')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockDeploymentForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn(new \\Illuminate\\Support\\MessageBag);\n\n        $this->post('webhook/github/v1/projects/1/deployments');\n\n        $this->assertResponseStatus(400);\n    }\n}\n"
  },
  {
    "path": "tests/Jobs/DeployTest.php",
    "content": "<?php\n\nnamespace Tests\\Jobs;\n\nuse App\\Jobs\\Deploy;\n\nuse Tests\\Helpers\\Factory;\n\nclass DeployTest extends \\TestCase\n{\n    use \\Tests\\Helpers\\MockeryHelper;\n\n    protected $mockProjectRepository;\n\n    protected $mockServerRepository;\n\n    protected $mockProcessBuilder;\n\n    protected $mockProcess;\n\n    protected $mockDeployerFileDirector;\n\n    protected $mockServerListFileBuilder;\n\n    protected $mockRecipeFileBuilder;\n\n    protected $mockDeploymentFileBuilder;\n\n    protected $mockNotifier;\n\n    protected $mockProjectModel;\n\n    protected $mockServerModel;\n\n    protected $mockSettingRepositroy;\n\n    protected $mockMailSettingEntity;\n\n    protected $mockSettingModel;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->mockProjectRepository = $this->mock('App\\Repositories\\Project\\ProjectInterface');\n        $this->mockServerRepository = $this->mock('App\\Repositories\\Server\\ServerInterface');\n        $this->mockProcessBuilder = $this->mock('Symfony\\Component\\Process\\ProcessBuilder');\n        $this->mockProcess = $this->mockPartial('Symfony\\Component\\Process\\Process');\n        $this->mockDeployerFileDirector = $this->mock('App\\Services\\Deployment\\DeployerFileDirector');\n        $this->mockServerListFileBuilder = $this->mock('App\\Services\\Deployment\\DeployerServerListFileBuilder');\n        $this->mockRecipeFileBuilder = $this->mock('App\\Services\\Deployment\\DeployerRecipeFileBuilder');\n        $this->mockDeploymentFileBuilder = $this->mock('App\\Services\\Deployment\\DeployerDeploymentFileBuilder');\n        $this->mockNotifier = $this->mock('App\\Services\\Notification\\NotifierInterface');\n        $this->mockProjectModel = $this->mockPartial('App\\Models\\Project');\n        $this->mockServerModel = $this->mockPartial('App\\Models\\Server');\n        $this->mockSettingRepositroy = $this->mock('App\\Repositories\\Setting\\SettingInterface');\n        $this->mockMailSettingEntity = $this->mock('App\\Entities\\Setting\\MailSettingEntity');\n        $this->mockSettingModel = $this->mockPartial('App\\Models\\Setting');\n    }\n\n    public function test_Should_Work_When_DeployerIsNormalEnd()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new \\Carbon\\Carbon,\n            'updated_at' => new \\Carbon\\Carbon,\n            'user'       => new \\App\\Models\\User,\n        ]);\n\n        $recipe = Factory::build('App\\Models\\Recipe', [\n            'id'          => 1,\n            'name'        => 'Recipe 1',\n            'desctiption' => '',\n            'body'        => '',\n        ]);\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('updateDeployment')\n            ->once()\n            ->mock();\n        $project = $this->mockProjectModel\n            ->shouldReceive('getRecipes')\n            ->once()\n            ->andReturn([$recipe])\n            ->mock();\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($this->mockServerModel);\n\n        $mockDeployerFile = $this->mock('App\\Services\\Deployment\\DeployerFile')\n            ->shouldReceive('getFullPath')\n            ->once()\n            ->mock();\n\n        $this->mockDeployerFileDirector\n            ->shouldReceive('construct')\n            ->andReturn($mockDeployerFile)\n            ->times(3);\n\n        $this->mockProcess\n            ->shouldReceive('run')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('isSuccessful')\n            ->once()\n            ->andReturn(true);\n\n        $this->mockProcess\n            ->shouldReceive('getOutput')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('getExitCode')\n            ->once();\n\n        $this->mockProcessBuilder\n            ->shouldReceive('add')\n            ->times(7)\n            ->andReturn($this->mockProcessBuilder);\n\n        $this->mockProcessBuilder\n            ->shouldReceive('getProcess')\n            ->once()\n            ->andReturn($this->mockProcess);\n\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setServer')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n\n        $this->mockRecipeFileBuilder\n            ->shouldReceive('setRecipe')\n            ->once();\n\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setServerListFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setRecipeFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n\n        $job = new Deploy($deployment);\n\n        $job->handle(\n            $this->mockProjectRepository,\n            $this->mockServerRepository,\n            $this->mockProcessBuilder,\n            $this->mockNotifier,\n            $this->mockSettingRepositroy\n        );\n    }\n\n    public function test_Should_Work_When_DeployerIsAbnormalEnd()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new \\Carbon\\Carbon,\n            'updated_at' => new \\Carbon\\Carbon,\n            'user'       => new \\App\\Models\\User,\n        ]);\n\n        $recipe = Factory::build('App\\Models\\Recipe', [\n            'id'          => 1,\n            'name'        => 'Recipe 1',\n            'desctiption' => '',\n            'body'        => '',\n        ]);\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('updateDeployment')\n            ->once()\n            ->mock();\n        $project = $this->mockProjectModel\n            ->shouldReceive('getRecipes')\n            ->once()\n            ->andReturn([$recipe])\n            ->mock();\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($this->mockServerModel);\n\n        $mockDeployerFile = $this->mock('App\\Services\\Deployment\\DeployerFile')\n            ->shouldReceive('getFullPath')\n            ->once()\n            ->mock();\n\n        $this->mockDeployerFileDirector\n            ->shouldReceive('construct')\n            ->andReturn($mockDeployerFile)\n            ->times(3);\n\n        $this->mockProcess\n            ->shouldReceive('run')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('isSuccessful')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockProcess\n            ->shouldReceive('getErrorOutput')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('getExitCode')\n            ->once();\n\n        $this->mockProcessBuilder\n            ->shouldReceive('add')\n            ->times(7)\n            ->andReturn($this->mockProcessBuilder);\n\n        $this->mockProcessBuilder\n            ->shouldReceive('getProcess')\n            ->once()\n            ->andReturn($this->mockProcess);\n\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setServer')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n\n        $this->mockRecipeFileBuilder\n            ->shouldReceive('setRecipe')\n            ->once();\n\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setServerListFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setRecipeFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n\n        $job = new Deploy($deployment);\n\n        $job->handle(\n            $this->mockProjectRepository,\n            $this->mockServerRepository,\n            $this->mockProcessBuilder,\n            $this->mockNotifier,\n            $this->mockSettingRepositroy\n        );\n    }\n\n    public function test_Should_WorkAndSendNotification_When_DeployerIsNormalEndAndEmailNotificationRecipientIsSet()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new \\Carbon\\Carbon,\n            'updated_at' => new \\Carbon\\Carbon,\n            'user'       => new \\App\\Models\\User,\n        ]);\n\n        $updatedDeployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new \\Carbon\\Carbon,\n            'updated_at' => new \\Carbon\\Carbon,\n            'user'       => new \\App\\Models\\User,\n            'stauts'     => 0,\n        ]);\n\n        $recipe = Factory::build('App\\Models\\Recipe', [\n            'id'          => 1,\n            'name'        => 'Recipe 1',\n            'desctiption' => '',\n            'body'        => '',\n        ]);\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('updateDeployment')\n            ->once()\n            ->shouldReceive('getDeploymentByNumber')\n            ->once()\n            ->andReturn($updatedDeployment)\n            ->mock();\n        $project = $this->mockProjectModel\n            ->shouldReceive('getRecipes')\n            ->once()\n            ->andReturn([$recipe])\n            ->mock();\n        $project->email_notification_recipient = 'webloyer@example.com';\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($this->mockServerModel);\n\n        $mockDeployerFile = $this->mock('App\\Services\\Deployment\\DeployerFile')\n            ->shouldReceive('getFullPath')\n            ->once()\n            ->mock();\n\n        $this->mockDeployerFileDirector\n            ->shouldReceive('construct')\n            ->andReturn($mockDeployerFile)\n            ->times(3);\n\n        $this->mockProcess\n            ->shouldReceive('run')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('isSuccessful')\n            ->twice()\n            ->andReturn(true);\n\n        $this->mockProcess\n            ->shouldReceive('getOutput')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('getExitCode')\n            ->once();\n\n        $this->mockProcessBuilder\n            ->shouldReceive('add')\n            ->times(7)\n            ->andReturn($this->mockProcessBuilder);\n\n        $this->mockProcessBuilder\n            ->shouldReceive('getProcess')\n            ->once()\n            ->andReturn($this->mockProcess);\n\n        $this->mockNotifier\n            ->shouldReceive('to')\n            ->once()\n            ->andReturn($this->mockNotifier);\n\n        $this->mockNotifier\n            ->shouldReceive('notify')\n            ->once();\n\n        $this->mockMailSettingEntity\n            ->shouldReceive('getDriver')\n            ->once()\n            ->shouldReceive('getFrom')\n            ->twice()\n            ->shouldReceive('getSmtpHost')\n            ->once()\n            ->shouldReceive('getSmtpPort')\n            ->once()\n            ->shouldReceive('getSmtpEncryption')\n            ->once()\n            ->shouldReceive('getSmtpUsername')\n            ->once()\n            ->shouldReceive('getSmtpPassword')\n            ->once()\n            ->shouldReceive('getSendmailPath')\n            ->once();\n        $this->mockSettingModel\n            ->shouldReceive('getAttribute')\n            ->with('attributes')\n            ->andReturn($this->mockMailSettingEntity);\n        $this->mockSettingRepositroy\n            ->shouldReceive('byType')\n            ->once()\n            ->andReturn($this->mockSettingModel);\n\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setServer')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n\n        $this->mockRecipeFileBuilder\n            ->shouldReceive('setRecipe')\n            ->once();\n\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setServerListFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setRecipeFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n\n        $job = new Deploy($deployment);\n\n        $job->handle(\n            $this->mockProjectRepository,\n            $this->mockServerRepository,\n            $this->mockProcessBuilder,\n            $this->mockNotifier,\n            $this->mockSettingRepositroy\n        );\n    }\n\n    public function test_Should_WorkAndSendNotification_When_DeployerIsAbnormalEndAndEmailNotificationRecipientIsSet()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new \\Carbon\\Carbon,\n            'updated_at' => new \\Carbon\\Carbon,\n            'user'       => new \\App\\Models\\User,\n        ]);\n\n        $updatedDeployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new \\Carbon\\Carbon,\n            'updated_at' => new \\Carbon\\Carbon,\n            'user'       => new \\App\\Models\\User,\n            'stauts'     => 1,\n        ]);\n\n        $recipe = Factory::build('App\\Models\\Recipe', [\n            'id'          => 1,\n            'name'        => 'Recipe 1',\n            'desctiption' => '',\n            'body'        => '',\n        ]);\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('updateDeployment')\n            ->once()\n            ->shouldReceive('getDeploymentByNumber')\n            ->once()\n            ->andReturn($updatedDeployment)\n            ->mock();\n        $project = $this->mockProjectModel\n            ->shouldReceive('getRecipes')\n            ->once()\n            ->andReturn([$recipe])\n            ->mock();\n        $project->email_notification_recipient = 'webloyer@example.com';\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($this->mockServerModel);\n\n        $mockDeployerFile = $this->mock('App\\Services\\Deployment\\DeployerFile')\n            ->shouldReceive('getFullPath')\n            ->once()\n            ->mock();\n\n        $this->mockDeployerFileDirector\n            ->shouldReceive('construct')\n            ->andReturn($mockDeployerFile)\n            ->times(3);\n\n        $this->mockProcess\n            ->shouldReceive('run')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('isSuccessful')\n            ->twice()\n            ->andReturn(false);\n\n        $this->mockProcess\n            ->shouldReceive('getErrorOutput')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('getExitCode')\n            ->once();\n\n        $this->mockProcessBuilder\n            ->shouldReceive('add')\n            ->times(7)\n            ->andReturn($this->mockProcessBuilder);\n\n        $this->mockProcessBuilder\n            ->shouldReceive('getProcess')\n            ->once()\n            ->andReturn($this->mockProcess);\n\n        $this->mockNotifier\n            ->shouldReceive('to')\n            ->once()\n            ->andReturn($this->mockNotifier);\n\n        $this->mockNotifier\n            ->shouldReceive('notify')\n            ->once();\n\n        $this->mockMailSettingEntity\n            ->shouldReceive('getDriver')\n            ->once()\n            ->shouldReceive('getFrom')\n            ->twice()\n            ->shouldReceive('getSmtpHost')\n            ->once()\n            ->shouldReceive('getSmtpPort')\n            ->once()\n            ->shouldReceive('getSmtpEncryption')\n            ->once()\n            ->shouldReceive('getSmtpUsername')\n            ->once()\n            ->shouldReceive('getSmtpPassword')\n            ->once()\n            ->shouldReceive('getSendmailPath')\n            ->once();\n        $this->mockSettingModel\n            ->shouldReceive('getAttribute')\n            ->with('attributes')\n            ->andReturn($this->mockMailSettingEntity);\n        $this->mockSettingRepositroy\n            ->shouldReceive('byType')\n            ->once()\n            ->andReturn($this->mockSettingModel);\n\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setServer')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n\n        $this->mockRecipeFileBuilder\n            ->shouldReceive('setRecipe')\n            ->once();\n\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setServerListFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setRecipeFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n\n        $job = new Deploy($deployment);\n\n        $job->handle(\n            $this->mockProjectRepository,\n            $this->mockServerRepository,\n            $this->mockProcessBuilder,\n            $this->mockNotifier,\n            $this->mockSettingRepositroy\n        );\n    }\n}\n"
  },
  {
    "path": "tests/Jobs/RollbackTest.php",
    "content": "<?php\n\nnamespace Tests\\Jobs;\n\nuse App\\Jobs\\Rollback;\n\nuse Tests\\Helpers\\Factory;\n\nclass RollbackTest extends \\TestCase\n{\n    use \\Tests\\Helpers\\MockeryHelper;\n\n    protected $mockProjectRepository;\n\n    protected $mockServerRepository;\n\n    protected $mockProcessBuilder;\n\n    protected $mockProcess;\n\n    protected $mockDeployerFileDirector;\n\n    protected $mockServerListFileBuilder;\n\n    protected $mockRecipeFileBuilder;\n\n    protected $mockDeploymentFileBuilder;\n\n    protected $mockNotifier;\n\n    protected $mockProjectModel;\n\n    protected $mockServerModel;\n\n    protected $mockSettingRepositroy;\n\n    protected $mockMailSettingEntity;\n\n    protected $mockSettingModel;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->mockProjectRepository = $this->mock('App\\Repositories\\Project\\ProjectInterface');\n        $this->mockServerRepository = $this->mock('App\\Repositories\\Server\\ServerInterface');\n        $this->mockProcessBuilder = $this->mock('Symfony\\Component\\Process\\ProcessBuilder');\n        $this->mockProcess = $this->mockPartial('Symfony\\Component\\Process\\Process');\n        $this->mockDeployerFileDirector = $this->mock('App\\Services\\Deployment\\DeployerFileDirector');\n        $this->mockServerListFileBuilder = $this->mock('App\\Services\\Deployment\\DeployerServerListFileBuilder');\n        $this->mockRecipeFileBuilder = $this->mock('App\\Services\\Deployment\\DeployerRecipeFileBuilder');\n        $this->mockDeploymentFileBuilder = $this->mock('App\\Services\\Deployment\\DeployerDeploymentFileBuilder');\n        $this->mockNotifier = $this->mock('App\\Services\\Notification\\NotifierInterface');\n        $this->mockProjectModel = $this->mockPartial('App\\Models\\Project');\n        $this->mockServerModel = $this->mockPartial('App\\Models\\Server');\n        $this->mockSettingRepositroy = $this->mock('App\\Repositories\\Setting\\SettingInterface');\n        $this->mockMailSettingEntity = $this->mock('App\\Entities\\Setting\\MailSettingEntity');\n        $this->mockSettingModel = $this->mockPartial('App\\Models\\Setting');\n    }\n\n    public function test_Should_Work_When_DeployerIsNormalEnd()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new \\Carbon\\Carbon,\n            'updated_at' => new \\Carbon\\Carbon,\n            'user'       => new \\App\\Models\\User,\n        ]);\n\n        $recipe = Factory::build('App\\Models\\Recipe', [\n            'id'          => 1,\n            'name'        => 'recipe 1',\n            'desctiption' => '',\n            'body'        => '',\n        ]);\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('updateDeployment')\n            ->once()\n            ->mock();\n        $project = $this->mockProjectModel\n            ->shouldReceive('getRecipes')\n            ->once()\n            ->andReturn([$recipe])\n            ->mock();\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($this->mockServerModel);\n\n        $mockDeployerFile = $this->mock('App\\Services\\Deployment\\DeployerFile')\n            ->shouldReceive('getFullPath')\n            ->once()\n            ->mock();\n\n        $this->mockDeployerFileDirector\n            ->shouldReceive('construct')\n            ->andReturn($mockDeployerFile)\n            ->times(3);\n\n        $this->mockProcess\n            ->shouldReceive('run')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('isSuccessful')\n            ->once()\n            ->andReturn(true);\n\n        $this->mockProcess\n            ->shouldReceive('getOutput')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('getExitCode')\n            ->once();\n\n        $this->mockProcessBuilder\n            ->shouldReceive('add')\n            ->times(7)\n            ->andReturn($this->mockProcessBuilder);\n\n        $this->mockProcessBuilder\n            ->shouldReceive('getProcess')\n            ->once()\n            ->andReturn($this->mockProcess);\n\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setServer')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n\n        $this->mockRecipeFileBuilder\n            ->shouldReceive('setRecipe')\n            ->once();\n\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setServerListFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setRecipeFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n\n        $job = new Rollback($deployment);\n\n        $job->handle(\n            $this->mockProjectRepository,\n            $this->mockServerRepository,\n            $this->mockProcessBuilder,\n            $this->mockNotifier,\n            $this->mockSettingRepositroy\n        );\n    }\n\n    public function test_Should_Work_When_DeployerIsAbnormalEnd()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new \\Carbon\\Carbon,\n            'updated_at' => new \\Carbon\\Carbon,\n            'user'       => new \\App\\Models\\User,\n        ]);\n\n        $recipe = Factory::build('App\\Models\\Recipe', [\n            'id'          => 1,\n            'name'        => 'Recipe 1',\n            'desctiption' => '',\n            'body'        => '',\n        ]);\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('updateDeployment')\n            ->once()\n            ->mock();\n        $project = $this->mockProjectModel\n            ->shouldReceive('getRecipes')\n            ->once()\n            ->andReturn([$recipe])\n            ->mock();\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($this->mockServerModel);\n\n        $mockDeployerFile = $this->mock('App\\Services\\Deployment\\DeployerFile')\n            ->shouldReceive('getFullPath')\n            ->once()\n            ->mock();\n\n        $this->mockDeployerFileDirector\n            ->shouldReceive('construct')\n            ->andReturn($mockDeployerFile)\n            ->times(3);\n\n        $this->mockProcess\n            ->shouldReceive('run')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('isSuccessful')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockProcess\n            ->shouldReceive('getErrorOutput')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('getExitCode')\n            ->once();\n\n        $this->mockProcessBuilder\n            ->shouldReceive('add')\n            ->times(7)\n            ->andReturn($this->mockProcessBuilder);\n\n        $this->mockProcessBuilder\n            ->shouldReceive('getProcess')\n            ->once()\n            ->andReturn($this->mockProcess);\n\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setServer')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n\n        $this->mockRecipeFileBuilder\n            ->shouldReceive('setRecipe')\n            ->once();\n\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setServerListFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setRecipeFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n\n        $job = new Rollback($deployment);\n\n        $job->handle(\n            $this->mockProjectRepository,\n            $this->mockServerRepository,\n            $this->mockProcessBuilder,\n            $this->mockNotifier,\n            $this->mockSettingRepositroy\n        );\n    }\n\n    public function test_Should_WorkAndSendNotification_When_DeployerIsNormalEndAndEmailNotificationRecipientIsSet()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new \\Carbon\\Carbon,\n            'updated_at' => new \\Carbon\\Carbon,\n            'user'       => new \\App\\Models\\User,\n        ]);\n\n        $updatedDeployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new \\Carbon\\Carbon,\n            'updated_at' => new \\Carbon\\Carbon,\n            'user'       => new \\App\\Models\\User,\n            'status'     => 0,\n        ]);\n\n        $recipe = factory::build('app\\models\\recipe', [\n            'id'          => 1,\n            'name'        => 'recipe 1',\n            'desctiption' => '',\n            'body'        => '',\n        ]);\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('updateDeployment')\n            ->once()\n            ->shouldReceive('getDeploymentByNumber')\n            ->once()\n            ->andReturn($updatedDeployment)\n            ->mock();\n        $project = $this->mockProjectModel\n            ->shouldReceive('getRecipes')\n            ->once()\n            ->andReturn([$recipe])\n            ->mock();\n        $project->email_notification_recipient = 'webloyer@example.com';\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($this->mockServerModel);\n\n        $mockDeployerFile = $this->mock('App\\Services\\Deployment\\DeployerFile')\n            ->shouldReceive('getFullPath')\n            ->once()\n            ->mock();\n\n        $this->mockDeployerFileDirector\n            ->shouldReceive('construct')\n            ->andReturn($mockDeployerFile)\n            ->times(3);\n\n        $this->mockProcess\n            ->shouldReceive('run')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('isSuccessful')\n            ->twice()\n            ->andReturn(true);\n\n        $this->mockProcess\n            ->shouldReceive('getOutput')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('getExitCode')\n            ->once();\n\n        $this->mockProcessBuilder\n            ->shouldReceive('add')\n            ->times(7)\n            ->andReturn($this->mockProcessBuilder);\n\n        $this->mockProcessBuilder\n            ->shouldReceive('getProcess')\n            ->once()\n            ->andReturn($this->mockProcess);\n\n        $this->mockNotifier\n            ->shouldReceive('to')\n            ->once()\n            ->andReturn($this->mockNotifier);\n\n        $this->mockNotifier\n            ->shouldReceive('notify')\n            ->once();\n\n        $this->mockMailSettingEntity\n            ->shouldReceive('getDriver')\n            ->once()\n            ->shouldReceive('getFrom')\n            ->twice()\n            ->shouldReceive('getSmtpHost')\n            ->once()\n            ->shouldReceive('getSmtpPort')\n            ->once()\n            ->shouldReceive('getSmtpEncryption')\n            ->once()\n            ->shouldReceive('getSmtpUsername')\n            ->once()\n            ->shouldReceive('getSmtpPassword')\n            ->once()\n            ->shouldReceive('getSendmailPath')\n            ->once();\n        $this->mockSettingModel\n            ->shouldReceive('getAttribute')\n            ->with('attributes')\n            ->andReturn($this->mockMailSettingEntity);\n        $this->mockSettingRepositroy\n            ->shouldReceive('byType')\n            ->once()\n            ->andReturn($this->mockSettingModel);\n\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setServer')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n\n        $this->mockRecipeFileBuilder\n            ->shouldReceive('setRecipe')\n            ->once();\n\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setServerListFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setRecipeFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n\n        $job = new Rollback($deployment);\n\n        $job->handle(\n            $this->mockProjectRepository,\n            $this->mockServerRepository,\n            $this->mockProcessBuilder,\n            $this->mockNotifier,\n            $this->mockSettingRepositroy\n        );\n    }\n\n    public function test_Should_WorkAndSendNotification_When_DeployerIsAbnormalEndAndEmailNotificationRecipientIsSet()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new \\Carbon\\Carbon,\n            'updated_at' => new \\Carbon\\Carbon,\n            'user'       => new \\App\\Models\\User,\n        ]);\n\n        $updatedDeployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new \\Carbon\\Carbon,\n            'updated_at' => new \\Carbon\\Carbon,\n            'user'       => new \\App\\Models\\User,\n            'stauts'     => 1,\n        ]);\n\n        $recipe = Factory::build('App\\Models\\Recipe', [\n            'id'          => 1,\n            'name'        => 'Recipe 1',\n            'desctiption' => '',\n            'body'        => '',\n        ]);\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('updateDeployment')\n            ->once()\n            ->shouldReceive('getDeploymentByNumber')\n            ->once()\n            ->andReturn($updatedDeployment)\n            ->mock();\n        $project = $this->mockProjectModel\n            ->shouldReceive('getRecipes')\n            ->once()\n            ->andReturn([$recipe])\n            ->mock();\n        $project->email_notification_recipient = 'webloyer@example.com';\n\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockServerRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($this->mockServerModel);\n\n        $mockDeployerFile = $this->mock('App\\Services\\Deployment\\DeployerFile')\n            ->shouldReceive('getFullPath')\n            ->once()\n            ->mock();\n\n        $this->mockDeployerFileDirector\n            ->shouldReceive('construct')\n            ->andReturn($mockDeployerFile)\n            ->times(3);\n\n        $this->mockProcess\n            ->shouldReceive('run')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('isSuccessful')\n            ->twice()\n            ->andReturn(false);\n\n        $this->mockProcess\n            ->shouldReceive('getErrorOutput')\n            ->once();\n\n        $this->mockProcess\n            ->shouldReceive('getExitCode')\n            ->once();\n\n        $this->mockProcessBuilder\n            ->shouldReceive('add')\n            ->times(7)\n            ->andReturn($this->mockProcessBuilder);\n\n        $this->mockProcessBuilder\n            ->shouldReceive('getProcess')\n            ->once()\n            ->andReturn($this->mockProcess);\n\n        $this->mockNotifier\n            ->shouldReceive('to')\n            ->once()\n            ->andReturn($this->mockNotifier);\n\n        $this->mockNotifier\n            ->shouldReceive('notify')\n            ->once();\n\n        $this->mockMailSettingEntity\n            ->shouldReceive('getDriver')\n            ->once()\n            ->shouldReceive('getFrom')\n            ->twice()\n            ->shouldReceive('getSmtpHost')\n            ->once()\n            ->shouldReceive('getSmtpPort')\n            ->once()\n            ->shouldReceive('getSmtpEncryption')\n            ->once()\n            ->shouldReceive('getSmtpUsername')\n            ->once()\n            ->shouldReceive('getSmtpPassword')\n            ->once()\n            ->shouldReceive('getSendmailPath')\n            ->once();\n        $this->mockSettingModel\n            ->shouldReceive('getAttribute')\n            ->with('attributes')\n            ->andReturn($this->mockMailSettingEntity);\n        $this->mockSettingRepositroy\n            ->shouldReceive('byType')\n            ->once()\n            ->andReturn($this->mockSettingModel);\n\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setServer')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n        $this->mockServerListFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockServerListFileBuilder);\n\n        $this->mockRecipeFileBuilder\n            ->shouldReceive('setRecipe')\n            ->once();\n\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setProject')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setServerListFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n        $this->mockDeploymentFileBuilder\n            ->shouldReceive('setRecipeFile')\n            ->once()\n            ->andReturn($this->mockDeploymentFileBuilder);\n\n        $job = new Rollback($deployment);\n\n        $job->handle(\n            $this->mockProjectRepository,\n            $this->mockServerRepository,\n            $this->mockProcessBuilder,\n            $this->mockNotifier,\n            $this->mockSettingRepositroy\n        );\n    }\n}\n"
  },
  {
    "path": "tests/Models/DeploymentPresenterTest.php",
    "content": "<?php\n\nuse App\\Models\\DeploymentPresenter;\nuse SensioLabs\\AnsiConverter\\AnsiToHtmlConverter;\n\nuse Tests\\Helpers\\Factory;\n\nclass DeploymentPresenterTest extends TestCase\n{\n    public function test_Should_ConvertStatusToHtmlSnippet_When_StatusIsOK()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'status'     => 0,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n            'user'       => new App\\Models\\User,\n        ]);\n\n        $converter = new AnsiToHtmlConverter;\n        $deploymentPresenter = new DeploymentPresenter($deployment, $converter);\n\n        $html = $deploymentPresenter->status();\n\n        $this->assertEquals('<span class=\"glyphicon glyphicon-ok-circle green\" aria-hidden=\"true\"></span>', $html);\n    }\n\n    public function test_Should_ConvertStatusToHtmlSnippet_When_StatusIsNg()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'status'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n            'user'       => new App\\Models\\User,\n        ]);\n\n        $converter = new AnsiToHtmlConverter;\n        $deploymentPresenter = new DeploymentPresenter($deployment, $converter);\n\n        $html = $deploymentPresenter->status();\n\n        $this->assertEquals('<span class=\"glyphicon glyphicon-ban-circle red\" aria-hidden=\"true\"></span>', $html);\n    }\n\n    public function test_Should_ConvertStatusToHtmlSnippet_When_StatusIsUnknown()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'status'     => null,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n            'user'       => new App\\Models\\User,\n        ]);\n\n        $converter = new AnsiToHtmlConverter;\n        $deploymentPresenter = new DeploymentPresenter($deployment, $converter);\n\n        $html = $deploymentPresenter->status();\n\n        $this->assertEquals('<span></span>', $html);\n    }\n\n    public function test_Should_ConvertStatusToText_When_StatusIsOK()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'status'     => 0,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n            'user'       => new App\\Models\\User,\n        ]);\n\n        $converter = new AnsiToHtmlConverter;\n        $deploymentPresenter = new DeploymentPresenter($deployment, $converter);\n\n        $text = $deploymentPresenter->statusText();\n\n        $this->assertEquals('success', $text);\n    }\n\n    public function test_Should_ConvertStatusToText_When_StatusIsNg()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'status'     => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n            'user'       => new App\\Models\\User,\n        ]);\n\n        $converter = new AnsiToHtmlConverter;\n        $deploymentPresenter = new DeploymentPresenter($deployment, $converter);\n\n        $text = $deploymentPresenter->statusText();\n\n        $this->assertEquals('failure', $text);\n    }\n\n    public function test_Should_ConvertStatusToText_When_StatusIsNotDetermined()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'status'     => null,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n            'user'       => new App\\Models\\User,\n        ]);\n\n        $converter = new AnsiToHtmlConverter;\n        $deploymentPresenter = new DeploymentPresenter($deployment, $converter);\n\n        $text = $deploymentPresenter->statusText();\n\n        $this->assertEquals('running', $text);\n    }\n\n    public function test_Should_ConvertMessageToHtmlSnippet()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'status'     => null,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'message'    => 'Message',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n            'user'       => new App\\Models\\User,\n        ]);\n\n        $converter = new AnsiToHtmlConverter;\n        $deploymentPresenter = new DeploymentPresenter($deployment, $converter);\n\n        $html = $deploymentPresenter->message();\n\n        $this->assertEquals('<span style=\"background-color: black; color: white\">Message</span>', $html);\n    }\n\n    public function test_Should_ConvertMessageToText()\n    {\n        $deployment = Factory::build('App\\Models\\Deployment', [\n            'id'         => 1,\n            'project_id' => 1,\n            'number'     => 1,\n            'status'     => null,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n            'message'    => 'Message',\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n            'user'       => new App\\Models\\User,\n        ]);\n\n        $converter = new AnsiToHtmlConverter;\n        $deploymentPresenter = new DeploymentPresenter($deployment, $converter);\n\n        $html = $deploymentPresenter->messageText();\n\n        $this->assertEquals('Message', $html);\n    }\n}\n"
  },
  {
    "path": "tests/Models/ProjectTest.php",
    "content": "<?php\n\nuse App\\Models\\Project;\n\nuse Tests\\Helpers\\Factory;\nuse Carbon\\Carbon;\n\nclass ProjectTest extends TestCase\n{\n    protected $useDatabase = true;\n\n    public function test_Should_GetDeploymentsWhereCreatedAtBefore()\n    {\n        $arrangedServer = Factory::create('App\\Models\\Server');\n\n        $arrangedProject = Factory::create('App\\Models\\Project', [\n            'server_id' => $arrangedServer->id,\n        ]);\n\n        $arrangedDeployments1 = Factory::create('App\\Models\\Deployment', [\n            'project_id' => $arrangedProject->id,\n            'number'     => 1,\n            'created_at' => Carbon::create(2016, 8, 16, 0, 0, 0),\n        ]);\n        $arrangedDeployments2 = Factory::create('App\\Models\\Deployment', [\n            'project_id' => $arrangedProject->id,\n            'number'     => 2,\n            'created_at' => Carbon::create(2016, 8, 16, 23, 59, 59),\n        ]);\n        $arrangedDeployments3 = Factory::create('App\\Models\\Deployment', [\n            'project_id' => $arrangedProject->id,\n            'number'     => 3,\n            'created_at' => Carbon::create(2016, 8, 17, 0, 0, 0),\n        ]);\n        $arrangedDeployments4 = Factory::create('App\\Models\\Deployment', [\n            'project_id' => $arrangedProject->id,\n            'number'     => 4,\n            'created_at' => Carbon::create(2016, 8, 17, 23, 59, 59),\n        ]);\n\n        $foundDeployments = $arrangedProject->getDeploymentsWhereCreatedAtBefore(Carbon::create(2016, 8, 17, 0, 0, 0));\n\n        $this->assertEquals($arrangedDeployments2, $foundDeployments[0]);\n        $this->assertEquals($arrangedDeployments1, $foundDeployments[1]);\n    }\n\n    public function test_Should_GetDeploymentsWhereNumberBefore()\n    {\n        $arrangedServer = Factory::create('App\\Models\\Server');\n\n        $arrangedProject = Factory::create('App\\Models\\Project', [\n            'server_id' => $arrangedServer->id,\n        ]);\n\n        $arrangedDeployments1 = Factory::create('App\\Models\\Deployment', [\n            'project_id' => $arrangedProject->id,\n            'number'     => 1,\n        ]);\n        $arrangedDeployments2 = Factory::create('App\\Models\\Deployment', [\n            'project_id' => $arrangedProject->id,\n            'number'     => 2,\n        ]);\n        $arrangedDeployments3 = Factory::create('App\\Models\\Deployment', [\n            'project_id' => $arrangedProject->id,\n            'number'     => 3,\n        ]);\n        $arrangedDeployments4 = Factory::create('App\\Models\\Deployment', [\n            'project_id' => $arrangedProject->id,\n            'number'     => 4,\n        ]);\n\n        $foundDeployments = $arrangedProject->getDeploymentsWhereNumberBefore(3);\n\n        $this->assertEquals($arrangedDeployments2, $foundDeployments[0]);\n        $this->assertEquals($arrangedDeployments1, $foundDeployments[1]);\n    }\n}\n"
  },
  {
    "path": "tests/Repositories/Project/EloquentProjectTest.php",
    "content": "<?php\n\nuse App\\Repositories\\Project\\EloquentProject;\n\nuse Tests\\Helpers\\Factory;\n\nclass EloquentProjectTest extends TestCase\n{\n    protected $useDatabase = true;\n\n    public function test_Should_GetProjectById()\n    {\n        $arrangedServer = Factory::create('App\\Models\\Server', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n        $arrangedProject = Factory::create('App\\Models\\Project', [\n            'name'      => 'Project 1',\n            'server_id' => $arrangedServer->id,\n            'stage'     => 'staging',\n        ]);\n\n        $projectRepository = new EloquentProject(\n            new App\\Models\\Project,\n            new App\\Models\\MaxDeployment\n        );\n\n        $foundProject = $projectRepository->byId($arrangedProject->id);\n\n        $this->assertEquals('Project 1', $foundProject->name);\n        $this->assertEquals($arrangedProject->server_id, $foundProject->server_id);\n        $this->assertEquals('staging', $foundProject->stage);\n    }\n\n    public function test_Should_GetProjectsByPage()\n    {\n        $arrangedServer = Factory::create('App\\Models\\Server', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n        Factory::createList('App\\Models\\Project', [\n            ['name' => 'Project 1', 'server_id' => $arrangedServer->id, 'stage' => 'staging'],\n            ['name' => 'Project 2', 'server_id' => $arrangedServer->id, 'stage' => 'staging'],\n            ['name' => 'Project 3', 'server_id' => $arrangedServer->id, 'stage' => 'staging'],\n            ['name' => 'Project 4', 'server_id' => $arrangedServer->id, 'stage' => 'staging'],\n            ['name' => 'Project 5', 'server_id' => $arrangedServer->id, 'stage' => 'staging'],\n        ]);\n\n        $projectRepository = new EloquentProject(\n            new App\\Models\\Project,\n            new App\\Models\\MaxDeployment\n        );\n\n        $foundProjects = $projectRepository->byPage();\n\n        $this->assertCount(5, $foundProjects->items());\n    }\n\n    public function test_Should_CreateNewProject()\n    {\n        $projectRepository = new EloquentProject(\n            new App\\Models\\Project,\n            new App\\Models\\MaxDeployment\n        );\n\n        $arrangedServer = Factory::create('App\\Models\\Server', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n        $returnedProject = $projectRepository->create([\n            'name'      => 'Project 1',\n            'server_id' => $arrangedServer->id,\n            'stage'     => 'staging',\n        ]);\n\n        $project = new App\\Models\\Project;\n        $createdProject = $project->find($returnedProject->id);\n\n        $this->assertEquals('Project 1', $createdProject->name);\n        $this->assertEquals($arrangedServer->id, $createdProject->server_id);\n        $this->assertEquals('staging', $createdProject->stage);\n    }\n\n    public function test_Should_UpdateExistingProject()\n    {\n        $arrangedRecipe = Factory::create('App\\Models\\Recipe', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n        $arrangedServer = Factory::create('App\\Models\\Server', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n        $arrangedProject = Factory::create('App\\Models\\Project', [\n            'name'      => 'Project 1',\n            'server_id' => $arrangedServer->id,\n            'stage'     => 'staging',\n        ]);\n        $arrangedProject->recipes()->sync([\n            $arrangedRecipe->id => [\n                'recipe_order' => 1,\n            ]\n        ]);\n\n        $projectRepository = new EloquentProject(\n            new App\\Models\\Project,\n            new App\\Models\\MaxDeployment\n        );\n        $arrangedServer2 = Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 2 ',\n            'description' => '',\n            'body'        => '',\n        ]);\n        $projectRepository->update([\n            'id'        => $arrangedProject->id,\n            'name'      => 'Project 2',\n            'server_id' => $arrangedServer2->id,\n            'stage'     => 'production',\n        ]);\n\n        $project = new App\\Models\\Project;\n        $updatedProject = $project->find($arrangedProject->id);\n\n        $this->assertEquals('Project 2', $updatedProject->name);\n        $this->assertEquals($arrangedRecipe->id, $updatedProject->recipes->first()->id);\n        $this->assertEquals($arrangedServer2->id, $updatedProject->server_id);\n        $this->assertEquals('production', $updatedProject->stage);\n    }\n\n    public function test_Should_DeleteExistingProject()\n    {\n        $arrangedRecipe = Factory::create('App\\Models\\Recipe', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n        $arrangedServer = Factory::create('App\\Models\\Server', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n        $arrangedProject = Factory::create('App\\Models\\Project', [\n            'name'      => 'Project 1',\n            'server_id' => $arrangedServer->id,\n            'stage'     => 'staging',\n        ]);\n        $arrangedProject->recipes()->sync([\n            $arrangedRecipe->id => [\n                'recipe_order' => 1,\n            ]\n        ]);\n\n        $projectRepository = new EloquentProject(\n            new App\\Models\\Project,\n            new App\\Models\\MaxDeployment\n        );\n        $projectRepository->delete($arrangedProject->id);\n\n        $project = new App\\Models\\Project;\n        $deletedProject = $project->find($arrangedProject->id);\n\n        $this->assertNull($deletedProject);\n\n        $updatedProjectRecipes = $arrangedProject->recipes;\n\n        $this->assertEmpty($updatedProjectRecipes);\n    }\n}\n"
  },
  {
    "path": "tests/Repositories/Recipe/EloquentRecipeTest.php",
    "content": "<?php\n\nuse App\\Repositories\\Recipe\\EloquentRecipe;\n\nuse Tests\\Helpers\\Factory;\n\nclass EloquentRecipeTest extends TestCase\n{\n    protected $useDatabase = true;\n\n    public function test_Should_GetRecipeById()\n    {\n        $arrangedRecipe = Factory::create('App\\Models\\Recipe', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $recipeRepository = new EloquentRecipe(new App\\Models\\Recipe);\n\n        $foundRecipe = $recipeRepository->byId($arrangedRecipe->id);\n\n        $this->assertEquals('Recipe 1', $foundRecipe->name);\n        $this->assertEquals('', $foundRecipe->description);\n        $this->assertEquals('', $foundRecipe->body);\n    }\n\n    public function test_Should_GetRecipesByPage()\n    {\n        Factory::createList('App\\Models\\Recipe', [\n            ['name' => 'Recipe 1', 'description' => '', 'body' => ''],\n            ['name' => 'Recipe 2', 'description' => '', 'body' => ''],\n            ['name' => 'Recipe 3', 'description' => '', 'body' => ''],\n            ['name' => 'Recipe 4', 'description' => '', 'body' => ''],\n            ['name' => 'Recipe 5', 'description' => '', 'body' => ''],\n        ]);\n\n        $recipeRepository = new EloquentRecipe(new App\\Models\\Recipe);\n\n        $foundRecipes = $recipeRepository->byPage();\n\n        $this->assertCount(5, $foundRecipes->items());\n    }\n\n    public function test_Should_CreateNewRecipe()\n    {\n        $recipeRepository = new EloquentRecipe(new App\\Models\\Recipe);\n\n        $returnedRecipe = $recipeRepository->create([\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $recipe = new App\\Models\\Recipe;\n        $createdRecipe = $recipe->find($returnedRecipe->id);\n\n        $this->assertEquals('Recipe 1', $createdRecipe->name);\n        $this->assertEquals('', $createdRecipe->description);\n        $this->assertEquals('', $createdRecipe->body);\n    }\n\n    public function test_Should_UpdateExistingRecipe()\n    {\n        $arrangedRecipe = Factory::create('App\\Models\\Recipe', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $recipeRepository = new EloquentRecipe(new App\\Models\\Recipe);\n\n        $recipeRepository->update([\n            'id'          => $arrangedRecipe->id,\n            'name'        => 'Recipe 2',\n            'description' => 'Description',\n            'body'        => '<?php $x = 1;',\n        ]);\n\n        $recipe = new App\\Models\\Recipe;\n        $updatedRecipe = $recipe->find($arrangedRecipe->id);\n\n        $this->assertEquals('Recipe 2', $updatedRecipe->name);\n        $this->assertEquals('Description', $updatedRecipe->description);\n        $this->assertEquals('<?php $x = 1;', $updatedRecipe->body);\n    }\n\n    public function test_Should_DeleteExistingRecipe()\n    {\n        $arrangedRecipe = Factory::create('App\\Models\\Recipe', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $recipeRepository = new EloquentRecipe(new App\\Models\\Recipe);\n\n        $recipeRepository->delete($arrangedRecipe->id);\n\n        $recipe = new App\\Models\\Recipe;\n        $deletedRecipe = $recipe->find($arrangedRecipe->id);\n\n        $this->assertNull($deletedRecipe);\n    }\n}\n"
  },
  {
    "path": "tests/Repositories/Role/EloquentRoleTest.php",
    "content": "<?php\n\nuse App\\Repositories\\Role\\EloquentRole;\n\nuse Tests\\Helpers\\Factory;\n\nclass EloquentRoleTest extends TestCase\n{\n    protected $useDatabase = true;\n\n    public function test_Should_GetRoleById()\n    {\n        $arrangedRole = Factory::create('Kodeine\\Acl\\Models\\Eloquent\\Role', [\n            'name'        => 'Role 1',\n            'slug'        => 'role_1',\n            'description' => '',\n        ]);\n\n        $serverRepository = new EloquentRole(new Kodeine\\Acl\\Models\\Eloquent\\Role);\n\n        $foundRole = $serverRepository->byId($arrangedRole->id);\n\n        $this->assertEquals('Role 1', $foundRole->name);\n        $this->assertEquals('role_1', $foundRole->slug);\n        $this->assertEquals('', $foundRole->description);\n    }\n\n    public function test_Should_GetRolesByPage()\n    {\n        Factory::createList('Kodeine\\Acl\\Models\\Eloquent\\Role', [\n            ['name' => 'Role 1', 'slug' => 'role_1', 'description' => ''],\n            ['name' => 'Role 2', 'slug' => 'role_2', 'description' => ''],\n            ['name' => 'Role 3', 'slug' => 'role_3', 'description' => ''],\n            ['name' => 'Role 4', 'slug' => 'role_4', 'description' => ''],\n            ['name' => 'Role 5', 'slug' => 'role_5', 'description' => ''],\n        ]);\n\n        $serverRepository = new EloquentRole(new Kodeine\\Acl\\Models\\Eloquent\\Role);\n\n        $foundRoles = $serverRepository->byPage();\n\n        $this->assertCount(5, $foundRoles->items());\n    }\n\n    public function test_Should_CreateNewRole()\n    {\n        $serverRepository = new EloquentRole(new Kodeine\\Acl\\Models\\Eloquent\\Role);\n\n        $returnedRole = $serverRepository->create([\n            'name'        => 'Role 1',\n            'slug'        => 'role_1',\n            'description' => '',\n        ]);\n\n        $server = new Kodeine\\Acl\\Models\\Eloquent\\Role;\n        $createdRole = $server->find($returnedRole->id);\n\n        $this->assertEquals('Role 1', $createdRole->name);\n        $this->assertEquals('role_1', $createdRole->slug);\n        $this->assertEquals('', $createdRole->description);\n    }\n\n    public function test_Should_UpdateExistingRole()\n    {\n        $arrangedRole = Factory::create('Kodeine\\Acl\\Models\\Eloquent\\Role', [\n            'name'        => 'Role 1',\n            'slug'        => 'role_1',\n            'description' => '',\n        ]);\n\n        $serverRepository = new EloquentRole(new Kodeine\\Acl\\Models\\Eloquent\\Role);\n\n        $serverRepository->update([\n            'id'          => $arrangedRole->id,\n            'name'        => 'Role 2',\n            'slug'        => 'role_2',\n            'description' => 'Role 2.',\n        ]);\n\n        $server = new Kodeine\\Acl\\Models\\Eloquent\\Role;\n        $updatedRole = $server->find($arrangedRole->id);\n\n        $this->assertEquals('Role 2', $updatedRole->name);\n        $this->assertEquals('role_2', $updatedRole->slug);\n        $this->assertEquals('Role 2.', $updatedRole->description);\n    }\n\n    public function test_Should_DeleteExistingRole()\n    {\n        $arrangedRole = Factory::create('Kodeine\\Acl\\Models\\Eloquent\\Role', [\n            'name'        => 'Role 1',\n            'slug'        => 'role_1',\n            'description' => '',\n        ]);\n\n        $serverRepository = new EloquentRole(new Kodeine\\Acl\\Models\\Eloquent\\Role);\n\n        $serverRepository->delete($arrangedRole->id);\n\n        $server = new Kodeine\\Acl\\Models\\Eloquent\\Role;\n        $deletedRole = $server->find($arrangedRole->id);\n\n        $this->assertNull($deletedRole);\n    }\n}\n"
  },
  {
    "path": "tests/Repositories/Server/EloquentServerTest.php",
    "content": "<?php\n\nuse App\\Repositories\\Server\\EloquentServer;\n\nuse Tests\\Helpers\\Factory;\n\nclass EloquentServerTest extends TestCase\n{\n    protected $useDatabase = true;\n\n    public function test_Should_GetServerById()\n    {\n        $arrangedServer = Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $serverRepository = new EloquentServer(new App\\Models\\Server);\n\n        $foundServer = $serverRepository->byId($arrangedServer->id);\n\n        $this->assertEquals('Server 1', $foundServer->name);\n        $this->assertEquals('', $foundServer->description);\n        $this->assertEquals('', $foundServer->body);\n    }\n\n    public function test_Should_GetServersByPage()\n    {\n        Factory::createList('App\\Models\\Server', [\n            ['name' => 'Server 1', 'description' => '', 'body' => ''],\n            ['name' => 'Server 2', 'description' => '', 'body' => ''],\n            ['name' => 'Server 3', 'description' => '', 'body' => ''],\n            ['name' => 'Server 4', 'description' => '', 'body' => ''],\n            ['name' => 'Server 5', 'description' => '', 'body' => ''],\n        ]);\n\n        $serverRepository = new EloquentServer(new App\\Models\\Server);\n\n        $foundServers = $serverRepository->byPage();\n\n        $this->assertCount(5, $foundServers->items());\n    }\n\n    public function test_Should_CreateNewServer()\n    {\n        $serverRepository = new EloquentServer(new App\\Models\\Server);\n\n        $returnedServer = $serverRepository->create([\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $server = new App\\Models\\Server;\n        $createdServer = $server->find($returnedServer->id);\n\n        $this->assertEquals('Server 1', $createdServer->name);\n        $this->assertEquals('', $createdServer->description);\n        $this->assertEquals('', $createdServer->body);\n    }\n\n    public function test_Should_UpdateExistingServer()\n    {\n        $arrangedServer = Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $serverRepository = new EloquentServer(new App\\Models\\Server);\n\n        $serverRepository->update([\n            'id'          => $arrangedServer->id,\n            'name'        => 'Server 2',\n            'description' => 'Description',\n            'body'        => '<?php $x = 1;',\n        ]);\n\n        $server = new App\\Models\\Server;\n        $updatedServer = $server->find($arrangedServer->id);\n\n        $this->assertEquals('Server 2', $updatedServer->name);\n        $this->assertEquals('Description', $updatedServer->description);\n        $this->assertEquals('<?php $x = 1;', $updatedServer->body);\n    }\n\n    public function test_Should_DeleteExistingServer()\n    {\n        $arrangedServer = Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $serverRepository = new EloquentServer(new App\\Models\\Server);\n\n        $serverRepository->delete($arrangedServer->id);\n\n        $server = new App\\Models\\Server;\n        $deletedServer = $server->find($arrangedServer->id);\n\n        $this->assertNull($deletedServer);\n    }\n}\n"
  },
  {
    "path": "tests/Repositories/Setting/ConfigAppSettingTest.php",
    "content": "<?php\n\nuse App\\Repositories\\Setting\\ConfigAppSetting;\nuse App\\Services\\Config\\DotenvReader;\nuse App\\Services\\Config\\DotenvWriter;\nuse App\\Services\\Filesystem\\LaravelFilesystem;\n\nuse org\\bovigo\\vfs\\vfsStream;\n\nclass ConfigAppSettingTest extends TestCase\n{\n    protected $rootDir;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->rootDir = vfsStream::setup('rootDir');\n    }\n\n    public function test_Should_GetAllAppSettings()\n    {\n        $config = <<<EOF\nAPP_URL=http://example.com\n\nEOF;\n\n        $dotenv = vfsStream::newFile('.env')->at($this->rootDir)->setContent($config);\n\n        $dotenvReader = new DotenvReader(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n        $dotenvWriter = new DotenvWriter(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n\n        $configAppSettingRepository = new ConfigAppSetting(\n            $dotenvReader,\n            $dotenvWriter\n        );\n\n        $appSettings = $configAppSettingRepository->all();\n\n        $this->assertEquals('http://example.com', $appSettings->getUrl());\n    }\n\n    public function test_Should_UpdateExistingAppSettings()\n    {\n        vfsStream::newFile('.env')->at($this->rootDir);\n\n        $dotenvReader = new DotenvReader(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n        $dotenvWriter = new DotenvWriter(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n\n        $configAppSettingRepository = new ConfigAppSetting(\n            $dotenvReader,\n            $dotenvWriter\n        );\n\n        $configAppSettingRepository->update([\n            'url' => 'http://example.com',\n        ]);\n\n        $this->assertEquals('http://example.com', $dotenvReader->getConfig('APP_URL'));\n    }\n}\n"
  },
  {
    "path": "tests/Repositories/Setting/ConfigDbSettingTest.php",
    "content": "<?php\n\nuse App\\Repositories\\Setting\\ConfigDbSetting;\nuse App\\Services\\Config\\DotenvReader;\nuse App\\Services\\Config\\DotenvWriter;\nuse App\\Services\\Filesystem\\LaravelFilesystem;\n\nuse org\\bovigo\\vfs\\vfsStream;\n\nclass ConfigDbSettingTest extends TestCase\n{\n    protected $rootDir;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->rootDir = vfsStream::setup('rootDir');\n    }\n\n    public function test_Should_GetAllDbSettings()\n    {\n        $config = <<<EOF\nDB_DRIVER=mysql\nDB_HOST=localhost\nDB_DATABASE=database\nDB_USERNAME=username\nDB_PASSWORD=password\n\nEOF;\n\n        $dotenv = vfsStream::newFile('.env')->at($this->rootDir)->setContent($config);\n\n        $dotenvReader = new DotenvReader(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n        $dotenvWriter = new DotenvWriter(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n\n        $configDbSettingRepository = new ConfigDbSetting(\n            $dotenvReader,\n            $dotenvWriter\n        );\n\n        $dbSettings = $configDbSettingRepository->all();\n\n        $this->assertEquals('mysql',     $dbSettings->getDriver());\n        $this->assertEquals('localhost', $dbSettings->getHost());\n        $this->assertEquals('database',  $dbSettings->getDatabase());\n        $this->assertEquals('username',  $dbSettings->getUsername());\n        $this->assertEquals('password',  $dbSettings->getPassword());\n    }\n\n    public function test_Should_UpdateExistingDbSettings()\n    {\n        vfsStream::newFile('.env')->at($this->rootDir);\n\n        $dotenvReader = new DotenvReader(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n        $dotenvWriter = new DotenvWriter(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n\n        $configDbSettingRepository = new ConfigDbSetting(\n            $dotenvReader,\n            $dotenvWriter\n        );\n\n        $configDbSettingRepository->update([\n            'driver'   => 'mysql',\n            'host'     => 'localhost',\n            'database' => 'database',\n            'username' => 'username',\n            'password' => 'password',\n        ]);\n\n        $this->assertEquals('mysql',     $dotenvReader->getConfig('DB_DRIVER'));\n        $this->assertEquals('localhost', $dotenvReader->getConfig('DB_HOST'));\n        $this->assertEquals('database',  $dotenvReader->getConfig('DB_DATABASE'));\n        $this->assertEquals('username',  $dotenvReader->getConfig('DB_USERNAME'));\n        $this->assertEquals('password',  $dotenvReader->getConfig('DB_PASSWORD'));\n    }\n}\n"
  },
  {
    "path": "tests/Repositories/Setting/ConfigMailSettingTest.php",
    "content": "<?php\n\nuse App\\Repositories\\Setting\\ConfigMailSetting;\nuse App\\Services\\Config\\DotenvReader;\nuse App\\Services\\Config\\DotenvWriter;\nuse App\\Services\\Filesystem\\LaravelFilesystem;\n\nuse org\\bovigo\\vfs\\vfsStream;\n\nclass ConfigMailSettingTest extends TestCase\n{\n    protected $rootDir;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->rootDir = vfsStream::setup('rootDir');\n    }\n\n    public function test_Should_GetAllMailSettings()\n    {\n        $config = <<<EOF\nMAIL_DRIVER=smtp\nMAIL_FROM_ADDRESS=from_address@example.com\nMAIL_FROM_NAME=from_name\nMAIL_HOST=localhost\nMAIL_PORT=587\nMAIL_ENCRYPTION=tls\nMAIL_USERNAME=username@example.com\nMAIL_PASSWORD=password\nMAIL_SENDMAIL=/usr/sbin/sendmail -bs\n\nEOF;\n\n        $dotenv = vfsStream::newFile('.env')->at($this->rootDir)->setContent($config);\n\n        $dotenvReader = new DotenvReader(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n        $dotenvWriter = new DotenvWriter(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n\n        $configMailSettingRepository = new ConfigMailSetting(\n            $dotenvReader,\n            $dotenvWriter\n        );\n\n        $mailSettings = $configMailSettingRepository->all();\n\n        $this->assertEquals('smtp',                     $mailSettings->getDriver());\n        $this->assertEquals('from_address@example.com', $mailSettings->getFrom()['address']);\n        $this->assertEquals('from_name',                $mailSettings->getFrom()['name']);\n        $this->assertEquals('localhost',                $mailSettings->getSmtpHost());\n        $this->assertEquals(587,                        $mailSettings->getSmtpPort());\n        $this->assertEquals('tls',                      $mailSettings->getSmtpEncryption());\n        $this->assertEquals('username@example.com',     $mailSettings->getSmtpUsername());\n        $this->assertEquals('password',                 $mailSettings->getSmtpPassword());\n        $this->assertEquals('/usr/sbin/sendmail -bs',   $mailSettings->getSendmailPath());\n    }\n\n    public function test_Should_UpdateExistingMailSettings()\n    {\n        vfsStream::newFile('.env')->at($this->rootDir);\n\n        $dotenvReader = new DotenvReader(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n        $dotenvWriter = new DotenvWriter(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n\n        $configMailSettingRepository = new ConfigMailSetting(\n            $dotenvReader,\n            $dotenvWriter\n        );\n\n        $configMailSettingRepository->update([\n            'driver'          => 'smtp',\n            'from_address'    => 'from_address@example.com',\n            'from_name'       => 'from_name',\n            'smtp_host'       => 'localhost',\n            'smtp_port'       => 587,\n            'smtp_encryption' => 'tls',\n            'smtp_username'   => 'username@example.com',\n            'smtp_password'   => 'password',\n            'sendmail_path'   => '/usr/sbin/sendmail -bs',\n        ]);\n\n        $this->assertEquals('smtp',                     $dotenvReader->getConfig('MAIL_DRIVER'));\n        $this->assertEquals('from_address@example.com', $dotenvReader->getConfig('MAIL_FROM_ADDRESS'));\n        $this->assertEquals('from_name',                $dotenvReader->getConfig('MAIL_FROM_NAME'));\n        $this->assertEquals('localhost',                $dotenvReader->getConfig('MAIL_HOST'));\n        $this->assertEquals(587,                        $dotenvReader->getConfig('MAIL_PORT'));\n        $this->assertEquals('tls',                      $dotenvReader->getConfig('MAIL_ENCRYPTION'));\n        $this->assertEquals('username@example.com',     $dotenvReader->getConfig('MAIL_USERNAME'));\n        $this->assertEquals('password',                 $dotenvReader->getConfig('MAIL_PASSWORD'));\n        $this->assertEquals('/usr/sbin/sendmail -bs',   $dotenvReader->getConfig('MAIL_SENDMAIL'));\n    }\n}\n"
  },
  {
    "path": "tests/Repositories/User/EloquentUserTest.php",
    "content": "<?php\n\nuse App\\Repositories\\User\\EloquentUser;\n\nuse Tests\\Helpers\\Factory;\nuse Kodeine\\Acl\\Models\\Eloquent\\Role;\n\nclass EloquentUserTest extends TestCase\n{\n    protected $useDatabase = true;\n\n    protected $role;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->role = new Role;\n    }\n\n    public function test_Should_GetUserById()\n    {\n        $arrangedUser = Factory::create('App\\Models\\User', [\n            'name'      => 'User 1',\n            'email'     => 'user1@example.com',\n            'password'  => '12345678',\n            'api_token' => '12345678',\n        ]);\n\n        $userRepository = new EloquentUser(new App\\Models\\User);\n\n        $foundUser = $userRepository->byId($arrangedUser->id);\n\n        $this->assertEquals('User 1', $foundUser->name);\n        $this->assertEquals('user1@example.com', $foundUser->email);\n        $this->assertEquals('12345678', $foundUser->password);\n        $this->assertEquals('12345678', $foundUser->api_token);\n    }\n\n    public function test_Should_GetUsersByPage()\n    {\n        Factory::createList('App\\Models\\User', [\n            ['name' => 'User 1', 'email' => 'user1@example.com', 'password' => '12345678', 'api_token' => '12345678'],\n            ['name' => 'User 2', 'email' => 'user2@example.com', 'password' => '23456789', 'api_token' => '23456789'],\n            ['name' => 'User 3', 'email' => 'user3@example.com', 'password' => '34567890', 'api_token' => '34567890'],\n            ['name' => 'User 4', 'email' => 'user4@example.com', 'password' => '4567890a', 'api_token' => '45678901'],\n            ['name' => 'User 5', 'email' => 'user5@example.com', 'password' => '567890ab', 'api_token' => '56789012'],\n        ]);\n\n        $userRepository = new EloquentUser(new App\\Models\\User);\n\n        $foundUsers = $userRepository->byPage();\n\n        $this->assertCount(5, $foundUsers->items());\n    }\n\n    public function test_Should_CreateNewUser()\n    {\n        $userRepository = new EloquentUser(new App\\Models\\User);\n\n        $returnedUser = $userRepository->create([\n            'name'      => 'User 1',\n            'email'     => 'user1@example.com',\n            'password'  => '12345678',\n            'api_token' => '12345678',\n        ]);\n\n        $user = new App\\Models\\User;\n        $createdUser = $user->find($returnedUser->id);\n\n        $this->assertEquals('User 1', $createdUser->name);\n        $this->assertEquals('user1@example.com', $createdUser->email);\n        $this->assertEquals('12345678', $createdUser->password);\n        $this->assertEquals('12345678', $createdUser->api_token);\n    }\n\n    public function test_Should_UpdateExistingUser()\n    {\n        $arrangedUser = Factory::create('App\\Models\\User', [\n            'name'      => 'User 1',\n            'email'     => 'user1@example.com',\n            'password'  => '12345678',\n            'api_token' => '12345678',\n        ]);\n\n        $userRepository = new EloquentUser(new App\\Models\\User);\n\n        $userRepository->update([\n            'id'        => $arrangedUser->id,\n            'name'      => 'User 2',\n            'email'     => 'user2@example.com',\n            'password'  => '23456789',\n            'api_token' => '23456789',\n        ]);\n\n        $user = new App\\Models\\User;\n        $updatedUser = $user->find($arrangedUser->id);\n\n        $this->assertEquals('User 2', $updatedUser->name);\n        $this->assertEquals('user2@example.com', $updatedUser->email);\n        $this->assertEquals('23456789', $updatedUser->password);\n        $this->assertEquals('23456789', $updatedUser->api_token);\n    }\n\n    public function test_Should_UpdateExistingUser_When_RoleIsSpecified()\n    {\n        $role = $this->role->create([\n            'name' => 'Role 1',\n            'slug' => 'role1',\n        ]);\n\n        $arrangedUser = Factory::create('App\\Models\\User', [\n            'name'      => 'User 1',\n            'email'     => 'user1@example.com',\n            'password'  => '12345678',\n            'api_token' => '12345678',\n        ]);\n\n        $arrangedUser->assignRole('role1');\n\n        $userRepository = new EloquentUser(new App\\Models\\User);\n\n        $userRepository->update([\n            'id'        => $arrangedUser->id,\n            'name'      => 'User 2',\n            'email'     => 'user2@example.com',\n            'password'  => '23456789',\n            'api_token' => '23456789',\n        ]);\n\n        $user = new App\\Models\\User;\n        $updatedUser = $user->find($arrangedUser->id);\n\n        $this->assertEquals('User 2', $updatedUser->name);\n        $this->assertEquals('user2@example.com', $updatedUser->email);\n        $this->assertEquals('23456789', $updatedUser->password);\n        $this->assertEquals('23456789', $updatedUser->api_token);\n        $this->assertEquals('role1', $updatedUser->getRoles()[$role->id]);\n    }\n\n    public function test_Should_UpdateExistingUser_When_RoleIsEmpty()\n    {\n        $role = $this->role->create([\n            'name' => 'Role 1',\n            'slug' => 'role1',\n        ]);\n\n        $arrangedUser = Factory::create('App\\Models\\User', [\n            'name'      => 'User 1',\n            'email'     => 'user1@example.com',\n            'password'  => '12345678',\n            'api_token' => '12345678',\n        ]);\n\n        $arrangedUser->assignRole('role1');\n\n        $userRepository = new EloquentUser(new App\\Models\\User);\n\n        $userRepository->update([\n            'id'        => $arrangedUser->id,\n            'name'      => 'User 2',\n            'email'     => 'user2@example.com',\n            'password'  => '23456789',\n            'api_token' => '23456789',\n        ]);\n\n        $user = new App\\Models\\User;\n        $updatedUser = $user->find($arrangedUser->id);\n\n        $this->assertEquals('User 2', $updatedUser->name);\n        $this->assertEquals('user2@example.com', $updatedUser->email);\n        $this->assertEquals('23456789', $updatedUser->password);\n        $this->assertEquals('23456789', $updatedUser->api_token);\n        $this->assertEquals('role1', $updatedUser->getRoles()[$role->id]);\n    }\n\n    public function test_Should_DeleteExistingUser()\n    {\n        $arrangedUser = Factory::create('App\\Models\\User', [\n            'name'      => 'User 1',\n            'email'     => 'user1@example.com',\n            'password'  => '12345678',\n            'api_token' => '12345678',\n        ]);\n\n        $userRepository = new EloquentUser(new App\\Models\\User);\n\n        $userRepository->delete($arrangedUser->id);\n\n        $user = new App\\Models\\User;\n        $deletedUser = $user->find($arrangedUser->id);\n\n        $this->assertNull($deletedUser);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Api/JsonRpcTest.php",
    "content": "<?php\n\nuse App\\Services\\Api\\JsonRpc;\n\nclass JsonRpcTest extends TestCase\n{\n    use Tests\\Helpers\\ControllerTestHelper;\n\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockProjectRepository;\n\n    protected $mockDeploymentForm;\n\n    protected $mockAuthGuard;\n\n    protected $mockProjectModel;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->mockProjectRepository = $this->mock('App\\Repositories\\Project\\ProjectInterface');\n        $this->mockDeploymentForm = $this->mock('App\\Services\\Form\\Deployment\\DeploymentForm');\n        $this->mockAuthGuard = $this->mock('Illuminate\\Contracts\\Auth\\Guard');\n        $this->mockProjectModel = $this->mockPartial('App\\Models\\Project');\n    }\n\n    public function test_Should_NotThrowWException_When_DeployProcedureSucceeds()\n    {\n        try {\n            $this->mockAuthGuard\n                ->shouldReceive('user')\n                ->andReturn(new App\\Models\\User);\n\n            Auth::shouldReceive('guard')\n                ->andReturn($this->mockAuthGuard);\n\n            $this->mockDeploymentForm\n                ->shouldReceive('save')\n                ->once()\n                ->andReturn(true);\n\n            $this->mockProjectModel\n                ->shouldReceive('getLastDeployment');\n            $this->mockProjectRepository\n                ->shouldReceive('byId')\n                ->andReturn($this->mockProjectModel);\n\n            $jsonRpc = new JsonRpc(\n                $this->mockProjectRepository,\n                $this->mockDeploymentForm\n            );\n\n            $jsonRpc->deploy(1);\n\n            $this->assertTrue(true);\n        } catch (Exception $e) {\n            $this->fail($e->getMessage());\n        }\n    }\n\n    /**\n     * @expectedException InvalidArgumentException\n     */\n    public function test_Should_ThrowWException_When_DeployProcedureFails()\n    {\n        $this->mockAuthGuard\n            ->shouldReceive('user')\n            ->andReturn(new App\\Models\\User);\n\n        Auth::shouldReceive('guard')\n            ->andReturn($this->mockAuthGuard);\n\n        $this->mockDeploymentForm\n            ->shouldReceive('save')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockDeploymentForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn(new Illuminate\\Support\\MessageBag);\n\n        $jsonRpc = new JsonRpc(\n            $this->mockProjectRepository,\n            $this->mockDeploymentForm\n        );\n\n        $jsonRpc->deploy(1);\n    }\n\n    public function test_Should_NotThrowWException_When_RollbackProcedureSucceeds()\n    {\n        try {\n            $this->mockAuthGuard\n                ->shouldReceive('user')\n                ->andReturn(new App\\Models\\User);\n\n            Auth::shouldReceive('guard')\n                ->andReturn($this->mockAuthGuard);\n\n            $this->mockDeploymentForm\n                ->shouldReceive('save')\n                ->once()\n                ->andReturn(true);\n\n            $this->mockProjectModel\n                ->shouldReceive('getLastDeployment');\n            $this->mockProjectRepository\n                ->shouldReceive('byId')\n                ->andReturn($this->mockProjectModel);\n\n            $jsonRpc = new JsonRpc(\n                $this->mockProjectRepository,\n                $this->mockDeploymentForm\n            );\n\n            $jsonRpc->deploy(1);\n\n            $this->assertTrue(true);\n        } catch (Exception $e) {\n            $this->fail($e->getMessage());\n        }\n    }\n\n    /**\n     * @expectedException InvalidArgumentException\n     */\n    public function test_Should_ThrowWException_When_RollbackProcedureFails()\n    {\n        $this->mockAuthGuard\n            ->shouldReceive('user')\n            ->andReturn(new App\\Models\\User);\n\n        Auth::shouldReceive('guard')\n            ->andReturn($this->mockAuthGuard);\n\n        $this->mockDeploymentForm\n            ->shouldReceive('save')\n            ->once()\n            ->andReturn(false);\n\n        $this->mockDeploymentForm\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn(new Illuminate\\Support\\MessageBag);\n\n        $jsonRpc = new JsonRpc(\n            $this->mockProjectRepository,\n            $this->mockDeploymentForm\n        );\n\n        $jsonRpc->rollback(1);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Config/DotenvReaderTest.php",
    "content": "<?php\n\nuse App\\Services\\Config\\DotenvReader;\nuse App\\Services\\Filesystem\\LaravelFilesystem;\n\nuse org\\bovigo\\vfs\\vfsStream;\n\nclass DotenvReaderTest extends TestCase\n{\n    protected $rootDir;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->rootDir = vfsStream::setup('rootDir');\n    }\n\n    public function test_Should_GetConfigValue_When_ConfigExistsAndValueIsNotEmpty()\n    {\n        $contents = <<<EOF\nNAME1=value1\nNAME2='value2'\nNAME3= v a l u e 3 \nNAME4=\n\nEOF;\n\n        $dotenv = vfsStream::newFile('.env')->at($this->rootDir)->setContent($contents);\n\n        $dotenvReader = new DotenvReader(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n        $value = $dotenvReader->getConfig('NAME1');\n\n        $this->assertEquals('value1', $value);\n    }\n\n    public function test_Should_GetConfigValue_When_ConfigExistsAndValueIsSingleQuoted()\n    {\n        $contents = <<<EOF\nNAME1=value1\nNAME2='value2'\nNAME3= v a l u e 3 \nNAME4=\n\nEOF;\n\n        $dotenv = vfsStream::newFile('.env')->at($this->rootDir)->setContent($contents);\n\n        $dotenvReader = new DotenvReader(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n        $value = $dotenvReader->getConfig('NAME2');\n\n        $this->assertEquals(\"'value2'\", $value);\n    }\n\n    public function test_Should_GetConfigValue_When_ConfigExistsAndValueHasWhitespaces()\n    {\n        $contents = <<<EOF\nNAME1=value1\nNAME2='value2'\nNAME3= v a l u e 3 \nNAME4=\n\nEOF;\n\n        $dotenv = vfsStream::newFile('.env')->at($this->rootDir)->setContent($contents);\n\n        $dotenvReader = new DotenvReader(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n        $value = $dotenvReader->getConfig('NAME3');\n\n        $this->assertEquals(' v a l u e 3 ', $value);\n    }\n\n    public function test_Should_GetNull_When_ConfigExistsAndValueIsEmpty()\n    {\n        $contents = <<<EOF\nNAME1=value1\nNAME2='value2'\nNAME3= v a l u e 3 \nNAME4=\n\nEOF;\n\n        $dotenv = vfsStream::newFile('.env')->at($this->rootDir)->setContent($contents);\n\n        $dotenvReader = new DotenvReader(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n        $value = $dotenvReader->getConfig('NAME4');\n\n        $this->assertNull($value);\n    }\n\n    public function test_Should_GetNull_When_ConfigDoesNotExist()\n    {\n        $contents = <<<EOF\nNAME1=value1\nNAME2='value2'\nNAME3= v a l u e 3 \nNAME4=\n\nEOF;\n\n        $dotenv = vfsStream::newFile('.env')->at($this->rootDir)->setContent($contents);\n\n        $dotenvReader = new DotenvReader(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n        $value = $dotenvReader->getConfig('NAME5');\n\n        $this->assertNull($value);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Config/DotenvWriterTest.php",
    "content": "<?php\n\nuse App\\Services\\Config\\DotenvWriter;\nuse App\\Services\\Filesystem\\LaravelFilesystem;\n\nuse org\\bovigo\\vfs\\vfsStream;\n\nclass DotenvWriterTest extends TestCase\n{\n    protected $rootDir;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->rootDir = vfsStream::setup('rootDir');\n    }\n\n    public function test_Should_UpdateExistingConfig_When_ConfigExists()\n    {\n        $contentsBefore = <<<EOF\nNAME1=value1\nNAME2=value2\n\nEOF;\n\n        $contentsAfter = <<<EOF\nNAME1=value1a\nNAME2=value2\n\nEOF;\n\n        $dotenv = vfsStream::newFile('.env')->at($this->rootDir)->setContent($contentsBefore);\n\n        $dotenvWriter = new DotenvWriter(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n        $dotenvWriter->setConfig('NAME1', 'value1a');\n\n        $this->assertEquals($contentsAfter, $dotenv->getContent());\n    }\n\n    public function test_Should_AddNewConfig_When_ConfigDoesNotExist()\n    {\n        $contentsBefore = <<<EOF\nNAME1=value1\nNAME2=value2\n\nEOF;\n\n        $contentsAfter = <<<EOF\nNAME1=value1\nNAME2=value2\nNAME3=value3\n\nEOF;\n\n        $dotenv = vfsStream::newFile('.env')->at($this->rootDir)->setContent($contentsBefore);\n\n        $dotenvWriter = new DotenvWriter(\n            new LaravelFilesystem($this->app['files']),\n            vfsStream::url('rootDir/.env')\n        );\n        $dotenvWriter->setConfig('NAME3', 'value3');\n\n        $this->assertEquals($contentsAfter, $dotenv->getContent());\n    }\n}\n"
  },
  {
    "path": "tests/Services/Deployment/DeployerDeploymentFileBuilderTest.php",
    "content": "<?php\n\nuse App\\Services\\Deployment\\DeployerDeploymentFileBuilder;\nuse App\\Services\\Deployment\\DeployerFile;\nuse App\\Services\\Filesystem\\LaravelFilesystem;\n\nclass DeployerDeploymentFileBuilderTest extends TestCase\n{\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockProjectModel;\n\n    protected $mockFilesystem;\n\n    protected $mockRecipeFile;\n\n    protected $mockServerListFile;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->mockProjectModel = $this->mockPartial('App\\Models\\Project');\n        $this->mockFilesystem = $this->mock('App\\Services\\Filesystem\\FilesystemInterface');\n        $this->mockRecipeFile = $this->mock('App\\Services\\Deployment\\DeployerFile');\n        $this->mockServerListFile = $this->mock('App\\Services\\Deployment\\DeployerFile');\n    }\n\n    public function test_Should_BuildDeployerDeploymentFile()\n    {\n        $this->mockFilesystem\n            ->shouldReceive('delete')\n            ->once();\n        $this->mockFilesystem\n            ->shouldReceive('put')\n            ->once();\n\n        $mockRecipeFile = $this->mockRecipeFile\n            ->shouldReceive('getFullPath')\n            ->once()\n            ->mock();\n        $mockRecipeFiles = [$mockRecipeFile];\n\n        $mockServerListFile = $this->mockServerListFile\n            ->shouldReceive('getFullPath')\n            ->once()\n            ->mock();\n\n        $deploymentFileBuilder = new DeployerDeploymentFileBuilder(\n            $this->mockFilesystem,\n            new DeployerFile\n        );\n        $deploymentFileBuilder->setProject($this->mockProjectModel)\n            ->setServerListFile($mockServerListFile)\n            ->setRecipeFile($mockRecipeFiles);\n        $result = $deploymentFileBuilder\n            ->pathInfo()\n            ->put()\n            ->getResult();\n\n        $this->assertStringMatchesFormat('deploy_%x.php', $result->getBaseName());\n        $this->assertStringMatchesFormat(storage_path(\"app/deploy_%x.php\"), $result->getFullPath());\n    }\n}\n"
  },
  {
    "path": "tests/Services/Deployment/DeployerRecipeFileBuilderTest.php",
    "content": "<?php\n\nuse App\\Services\\Deployment\\DeployerRecipeFileBuilder;\nuse App\\Services\\Deployment\\DeployerFile;\nuse App\\Services\\Filesystem\\LaravelFilesystem;\n\nclass DeployerRecipeFileBuilderTest extends TestCase\n{\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockRecipeModel;\n\n    protected $mockFilesystem;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->mockRecipeModel = $this->mockPartial('App\\Models\\Recipe');\n        $this->mockFilesystem = $this->mock('App\\Services\\Filesystem\\FilesystemInterface');\n    }\n\n    public function test_Should_BuildDeployerRecipeFile()\n    {\n        $this->mockFilesystem\n            ->shouldReceive('delete')\n            ->once();\n        $this->mockFilesystem\n            ->shouldReceive('put')\n            ->once();\n\n        $recipeFileBuilder = new DeployerRecipeFileBuilder(\n            $this->mockFilesystem,\n            new DeployerFile\n        );\n        $recipeFileBuilder->setRecipe($this->mockRecipeModel);\n        $result = $recipeFileBuilder\n            ->pathInfo()\n            ->put()\n            ->getResult();\n\n        $this->assertStringMatchesFormat('recipe_%x.php', $result->getBaseName());\n        $this->assertStringMatchesFormat(storage_path(\"app/recipe_%x.php\"), $result->getFullPath());\n    }\n}\n"
  },
  {
    "path": "tests/Services/Deployment/DeployerServerListFileBuilderTest.php",
    "content": "<?php\n\nuse App\\Services\\Deployment\\DeployerServerListFileBuilder;\nuse App\\Services\\Deployment\\DeployerFile;\nuse App\\Services\\Filesystem\\LaravelFilesystem;\nuse org\\bovigo\\vfs\\vfsStream;\nuse Symfony\\Component\\Yaml\\Dumper;\nuse Symfony\\Component\\Yaml\\Parser;\nuse Symfony\\Component\\Yaml\\Yaml;\n\nclass DeployerServerListFileBuilderTest extends TestCase\n{\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockProjectModel;\n\n    protected $mockProjectAttributeEntity;\n\n    protected $mockServerModel;\n\n    protected $mockFilesystem;\n\n    protected $mockYamlParser;\n\n    protected $mockYamlDumper;\n\n    protected $mockDeployerFile;\n\n    protected $rootDir;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->mockProjectModel = $this->mockPartial('App\\Models\\Project');\n        $this->mockProjectAttributeEntity = $this->mock('App\\Entities\\ProjectAttribute\\ProjectAttributeEntity');\n        $this->mockServerModel = $this->mockPartial('App\\Models\\Server');\n        $this->mockFilesystem = $this->mock('App\\Services\\Filesystem\\FilesystemInterface');\n        $this->mockYamlParser = $this->mock('Symfony\\Component\\Yaml\\Parser');\n        $this->mockYamlDumper = $this->mock('Symfony\\Component\\Yaml\\Dumper');\n        $this->mockDeployerFile = $this->mock('App\\Services\\Deployment\\DeployerFile');\n\n        $this->rootDir = vfsStream::setup('rootDir');\n    }\n\n    public function test_Should_BuildDeployerServerListFile()\n    {\n        $this->mockProjectModel\n            ->shouldReceive('getAttribute')\n            ->with('attributes')\n            ->andReturn($this->mockProjectAttributeEntity);\n\n        $this->mockFilesystem\n            ->shouldReceive('delete')\n            ->once();\n        $this->mockFilesystem\n            ->shouldReceive('put')\n            ->once();\n\n        $this->mockYamlParser\n            ->shouldReceive('parse')\n            ->once()\n            ->andReturn([]);\n\n        $this->mockYamlDumper\n            ->shouldReceive('dump')\n            ->once()\n            ->andReturn('');\n\n        $serverListFileBuilder = new DeployerServerListFileBuilder(\n            $this->mockFilesystem,\n            new DeployerFile,\n            $this->mockYamlParser,\n            $this->mockYamlDumper\n        );\n        $serverListFileBuilder->setServer($this->mockServerModel)\n            ->setProject($this->mockProjectModel);\n        $result = $serverListFileBuilder\n            ->pathInfo()\n            ->put()\n            ->getResult();\n\n        $this->assertStringMatchesFormat('server_%x.yml', $result->getBaseName());\n        $this->assertStringMatchesFormat(storage_path(\"app/server_%x.yml\"), $result->getFullPath());\n    }\n\n    public function test_Should_OverrideAttributeInDeployerServerListFile_When_ProjectAttributeIsSpecified()\n    {\n        $path = vfsStream::url('rootDir/server.yml');\n\n        $this->mockProjectAttributeEntity\n            ->shouldReceive('getDeployPath')\n            ->twice()\n            ->andReturn('/home/www/deploy2');\n\n        $this->mockProjectModel\n            ->shouldReceive('getAttribute')\n            ->with('attributes')\n            ->andReturn($this->mockProjectAttributeEntity);\n\n        $this->mockDeployerFile\n            ->shouldReceive('setBaseName')\n            ->once();\n        $this->mockDeployerFile\n            ->shouldReceive('setFullPath')\n            ->once();\n        $this->mockDeployerFile\n            ->shouldReceive('getFullPath')\n            ->andReturn($path);\n\n        $serverListFileBuilder = new DeployerServerListFileBuilder(\n            new LaravelFilesystem($this->app['files']),\n            $this->mockDeployerFile,\n            new Parser,\n            new Dumper\n        );\n\n        $this->mockServerModel->body = <<<EOF\ntest:\n  host: localhost\n  user: www\n  identity_file:\n    public_key: /path/to/public_key\n    private_key: /path/to/private_key\n  stage: testing\n  deploy_path: /home/www/deploy1\nEOF;\n\n        $serverListFileBuilder->setServer($this->mockServerModel)\n            ->setProject($this->mockProjectModel);\n        $result = $serverListFileBuilder\n            ->pathInfo()\n            ->put()\n            ->getResult();\n\n        $serverListFile = Yaml::parse(file_get_contents($path));\n\n        $this->assertEquals('/home/www/deploy2', $serverListFile['test']['deploy_path']);\n    }\n\n    public function test_Should_OverrideAttributeInDeployerServerListFile_When_ProjectAttributeIsNotSpecified()\n    {\n        $path = vfsStream::url('rootDir/server.yml');\n\n        $this->mockProjectAttributeEntity\n            ->shouldReceive('getDeployPath')\n            ->twice()\n            ->andReturn('/home/www/deploy2');\n\n        $this->mockProjectModel\n            ->shouldReceive('getAttribute')\n            ->with('attributes')\n            ->andReturn($this->mockProjectAttributeEntity);\n\n        $this->mockDeployerFile\n            ->shouldReceive('setBaseName')\n            ->once();\n        $this->mockDeployerFile\n            ->shouldReceive('setFullPath')\n            ->once();\n        $this->mockDeployerFile\n            ->shouldReceive('getFullPath')\n            ->andReturn($path);\n\n        $serverListFileBuilder = new DeployerServerListFileBuilder(\n            new LaravelFilesystem($this->app['files']),\n            $this->mockDeployerFile,\n            new Parser,\n            new Dumper\n        );\n\n        $this->mockServerModel->body = <<<EOF\ntest:\n  host: localhost\n  user: www\n  identity_file:\n    public_key: /path/to/public_key\n    private_key: /path/to/private_key\n  stage: testing\nEOF;\n\n        $serverListFileBuilder->setServer($this->mockServerModel)\n            ->setProject($this->mockProjectModel);\n        $result = $serverListFileBuilder\n            ->pathInfo()\n            ->put()\n            ->getResult();\n\n        $serverListFile = Yaml::parse(file_get_contents($path));\n\n        $this->assertEquals('/home/www/deploy2', $serverListFile['test']['deploy_path']);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Deployment/StorageDeployCommanderTest.php",
    "content": "<?php\n\nuse App\\Services\\Deployment\\StorageDeployCommander;\n\nclass StorageDeployCommanderTest extends TestCase\n{\n    public function test_Should_ReturnTrue_When_DeployCommandSucceeds()\n    {\n        Storage::shouldReceive('put')\n            ->once()\n            ->andReturn(1);\n\n        $deployCommander = new StorageDeployCommander;\n        $result = $deployCommander->deploy(new App\\Models\\Deployment);\n\n        $this->assertTrue($result, 'Expected deploy command to succeed.');\n    }\n\n    public function test_Should_ReturnFalse_When_DeployCommandFails()\n    {\n        Storage::shouldReceive('put')\n            ->once()\n            ->andReturn(0);\n\n        $deployCommander = new StorageDeployCommander;\n        $result = $deployCommander->deploy(new App\\Models\\Deployment);\n\n        $this->assertFalse($result, 'Expected deploy command to fail.');\n    }\n\n    public function test_Should_ReturnTrue_When_RollbackCommandSucceeds()\n    {\n        Storage::shouldReceive('put')\n            ->once()\n            ->andReturn(1);\n\n        $deployCommander = new StorageDeployCommander;\n        $result = $deployCommander->rollback(new App\\Models\\Deployment);\n\n        $this->assertTrue($result, 'Expected rollback command to succeed.');\n    }\n\n    public function test_Should_ReturnFalse_When_RollbackCommandFails()\n    {\n        Storage::shouldReceive('put')\n            ->once()\n            ->andReturn(0);\n\n        $deployCommander = new StorageDeployCommander;\n        $result = $deployCommander->rollback(new App\\Models\\Deployment);\n\n        $this->assertFalse($result, 'Expected rollback command to fail.');\n    }\n}\n"
  },
  {
    "path": "tests/Services/Filesystem/LaravelFilesystemTest.php",
    "content": "<?php\n\nuse App\\Services\\Filesystem\\LaravelFilesystem;\n\nuse org\\bovigo\\vfs\\vfsStream;\n\nclass LaravelFilesystemTest extends TestCase\n{\n    protected $rootDir;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->rootDir = vfsStream::setup('rootDir');\n    }\n\n    public function test_Should_WriteFile()\n    {\n        $fs = new LaravelFilesystem($this->app['files']);\n        $fs->put(vfsStream::url('rootDir/file'), 'contents');\n\n        $putFile = $this->rootDir->getChild('file')->getContent();\n\n        $this->assertEquals('contents', $putFile);\n    }\n\n    public function test_Should_ReadFile()\n    {\n        $file = vfsStream::newFile('file')->at($this->rootDir)->setContent('contents');\n\n        $fs = new LaravelFilesystem($this->app['files']);\n        $getFile = $fs->get(vfsStream::url('rootDir/file'));\n\n        $this->assertEquals('contents', $getFile);\n    }\n\n    public function test_Should_DeleteFile()\n    {\n        $file = vfsStream::newFile('file')->at($this->rootDir);\n\n        $fs = new LaravelFilesystem($this->app['files']);\n        $fs->delete(vfsStream::url('rootDir/file'));\n\n        $this->assertFileNotExists(vfsStream::url('rootDir/file'));\n    }\n}\n"
  },
  {
    "path": "tests/Services/Form/Deployment/DeploymentFormLaravelValidatorTest.php",
    "content": "<?php\n\nuse App\\Services\\Form\\Deployment\\DeploymentFormLaravelValidator;\n\nuse Tests\\Helpers\\Factory;\n\nclass DeploymentFormLaravelValidatorTest extends TestCase\n{\n    protected $useDatabase = true;\n\n    public function test_Should_FailToValidate_When_ProjectIdFieldIsMissing()\n    {\n        Factory::create('App\\Models\\User', [\n            'email'     => 'user@example.com',\n            'password'  => '0123456789',\n            'api_token' => '0123456789',\n        ]);\n\n        $input = [\n            'task'    => 'deploy',\n            'user_id' => 1,\n        ];\n\n        $form = new DeploymentFormLaravelValidator($this->app['validator']);\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_ProjectIdFieldIsInvalid()\n    {\n        Factory::create('App\\Models\\User', [\n            'email'     => 'user@example.com',\n            'password'  => '0123456789',\n            'api_token' => '0123456789',\n        ]);\n\n        $input = [\n            'project_id' => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n        ];\n\n        $form = new DeploymentFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_TaskFieldIsMissing()\n    {\n        $arrangedServer = Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        Factory::create('App\\Models\\Project', [\n            'name'      => 'Project 1',\n            'server_id' => $arrangedServer->id,\n            'stage'     => 'staging',\n        ]);\n\n        Factory::create('App\\Models\\User', [\n            'email'     => 'user@example.com',\n            'password'  => '0123456789',\n            'api_token' => '0123456789',\n        ]);\n\n        $input = [\n            'project_id' => 1,\n            'user_id'    => 1,\n        ];\n\n        $form = new DeploymentFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_TaskFieldIsInvalid()\n    {\n        $arrangedServer = Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        Factory::create('App\\Models\\Project', [\n            'name'      => 'Project 1',\n            'server_id' => $arrangedServer->id,\n            'stage'     => 'staging',\n        ]);\n\n        Factory::create('App\\Models\\User', [\n            'email'     => 'user@example.com',\n            'password'  => '0123456789',\n            'api_token' => '0123456789',\n        ]);\n\n        $input = [\n            'project_id' => 1,\n            'task'       => 'invalid_task',\n            'user_id'    => 1,\n        ];\n\n        $form = new DeploymentFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_UserIdFieldIsMissing()\n    {\n        $arrangedServer = Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        Factory::create('App\\Models\\Project', [\n            'name'      => 'Project 1',\n            'server_id' => $arrangedServer->id,\n            'stage'     => 'staging',\n        ]);\n\n        $input = [\n            'project_id' => 1,\n            'task'       => 'deploy',\n        ];\n\n        $form = new DeploymentFormLaravelValidator($this->app['validator']);\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_UserIdFieldIsInvalid()\n    {\n        $arrangedServer = Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        Factory::create('App\\Models\\Project', [\n            'name'      => 'Project 1',\n            'server_id' => $arrangedServer->id,\n            'stage'     => 'staging',\n        ]);\n\n        $input = [\n            'project_id' => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n        ];\n\n        $form = new DeploymentFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_PassToValidate_When_ProjectIdFieldAndTaskFieldAndUserIdFieldAreValid()\n    {\n        $arrangedServer = Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        Factory::create('App\\Models\\Project', [\n            'name'      => 'Project 1',\n            'server_id' => $arrangedServer->id,\n            'stage'     => 'staging',\n        ]);\n\n        Factory::create('App\\Models\\User', [\n            'email'     => 'user@example.com',\n            'password'  => '0123456789',\n            'api_token' => '0123456789',\n        ]);\n\n        $input = [\n            'project_id' => 1,\n            'task'       => 'deploy',\n            'user_id'    => 1,\n        ];\n\n        $form = new DeploymentFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertTrue($result, 'Expected validation to succeed.');\n        $this->assertEmpty($errors);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Form/Deployment/DeploymentFormTest.php",
    "content": "<?php\n\nuse App\\Services\\Form\\Deployment\\DeploymentForm;\nuse Tests\\Helpers\\Factory;\n\nclass DeploymentFormTest extends TestCase\n{\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockValidator;\n\n    protected $mockProjectRepository;\n\n    protected $mockDeployCommander;\n\n    protected $mockProjectModel;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->mockValidator = $this->mock('App\\Services\\Validation\\ValidableInterface');\n        $this->mockProjectRepository = $this->mock('App\\Repositories\\Project\\ProjectInterface');\n        $this->mockDeployCommander = $this->mock('App\\Services\\Deployment\\DeployCommanderInterface');\n        $this->mockProjectModel = $this->mockPartial('App\\Models\\Project');\n    }\n\n    public function test_Should_SucceedToSave_When_ValidationPasses()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $project = $this->mockProjectModel;\n        $maxDeployment = Factory::build('App\\Models\\MaxDeployment', [\n            'id'         => 1,\n            'project_id' => $project->id,\n            'number'     => 1,\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n        $project->shouldReceive('getMaxDeployment')\n            ->once()\n            ->andReturn($maxDeployment)\n            ->shouldReceive('addDeployment')\n            ->once()\n            ->shouldReceive('updateMaxDeployment')\n            ->once()\n            ->shouldReceive('getDeploymentByNumber')\n            ->once()\n            ->andReturn(true)\n            ->mock();\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockDeployCommander\n            ->shouldReceive('deploy')\n            ->once()\n            ->andReturn(true);\n\n        $form = new DeploymentForm(\n            $this->mockValidator,\n            $this->mockProjectRepository,\n            $this->mockDeployCommander\n        );\n        $result = $form->save([\n            'project_id' => $project->id,\n            'task'       => 'deploy'\n        ]);\n\n        $this->assertTrue($result, 'Expected save to succeed.');\n    }\n\n    public function test_Should_SucceedToSave_When_ValidationPassesAndSaveToDatabaseSucceeds()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $project = $this->mockProjectModel;\n        $maxDeployment = Factory::build('App\\Models\\MaxDeployment', [\n            'id'         => 1,\n            'project_id' => $project->id,\n            'number'     => 1,\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n        $project->shouldReceive('getMaxDeployment')\n            ->once()\n            ->andReturn($maxDeployment)\n            ->shouldReceive('addDeployment')\n            ->once()\n            ->shouldReceive('updateMaxDeployment')\n            ->once()\n            ->shouldReceive('getDeploymentByNumber')\n            ->once()\n            ->andReturn(true)\n            ->mock();\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $this->mockDeployCommander\n            ->shouldReceive('deploy')\n            ->once()\n            ->andReturn(true);\n\n        $form = new DeploymentForm(\n            $this->mockValidator,\n            $this->mockProjectRepository,\n            $this->mockDeployCommander\n        );\n        $result = $form->save([\n            'project_id' => $project->id,\n            'task'       => 'deploy'\n        ]);\n\n        $this->assertTrue($result, 'Expected save to succeed.');\n    }\n\n    public function test_Should_FailToSave_When_ValidationPassesAndSaveToDatabaseFails()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $project = $this->mockProjectModel;\n        $maxDeployment = Factory::build('App\\Models\\MaxDeployment', [\n            'id'         => 1,\n            'project_id' => $project->id,\n            'number'     => 1,\n            'created_at' => new Carbon\\Carbon,\n            'updated_at' => new Carbon\\Carbon,\n        ]);\n        $project->shouldReceive('getMaxDeployment')\n            ->once()\n            ->andReturn($maxDeployment)\n            ->shouldReceive('addDeployment')\n            ->once()\n            ->shouldReceive('updateMaxDeployment')\n            ->once()\n            ->shouldReceive('getDeploymentByNumber')\n            ->once()\n            ->andReturn(false)\n            ->mock();\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n\n        $form = new DeploymentForm(\n            $this->mockValidator,\n            $this->mockProjectRepository,\n            $this->mockDeployCommander\n        );\n        $result = $form->save([\n            'project_id' => $project->id,\n            'task'       => 'deploy'\n        ]);\n\n        $this->assertFalse($result, 'Expected save to fail.');\n    }\n\n    public function test_Should_FailToSave_When_ValidationFails()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(false);\n\n        $form = new DeploymentForm(\n            $this->mockValidator,\n            $this->mockProjectRepository,\n            $this->mockDeployCommander\n        );\n        $result = $form->save([]);\n\n        $this->assertFalse($result, 'Expected save to fail.');\n    }\n\n    public function test_Should_GetValidationErrors()\n    {\n        $this->mockValidator\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn(new Illuminate\\Support\\MessageBag);\n\n        $form = new DeploymentForm(\n            $this->mockValidator,\n            $this->mockProjectRepository,\n            $this->mockDeployCommander\n        );\n        $result = $form->errors();\n\n        $this->assertEmpty($result);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Form/Project/ProjectFormLaravelValidatorTest.php",
    "content": "<?php\n\nuse App\\Services\\Form\\Project\\ProjectFormLaravelValidator;\n\nuse Tests\\Helpers\\Factory;\n\nclass ProjectFormLaravelValidatorTest extends TestCase\n{\n    protected $useDatabase = true;\n\n    public function test_Should_FailToValidate_When_RecipeIdFieldIsMissing()\n    {\n        Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $input = [\n            'name'       => 'Project 1',\n            'server_id'  => 1,\n            'repository' => 'http://example.com',\n            'stage'      => 'staging',\n        ];\n\n        $form = new ProjectFormLaravelValidator($this->app['validator']);\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_NameFieldIsMissing()\n    {\n        Factory::create('App\\Models\\Recipe', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $input = [\n            'recipe_id'  => [1],\n            'server_id'  => 1,\n            'repository' => 'http://example.com',\n            'stage'      => 'staging',\n        ];\n\n        $form = new ProjectFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_ServerIdFieldIsMissing()\n    {\n        Factory::create('App\\Models\\Recipe', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $input = [\n            'name'       => 'Project 1',\n            'recipe_id'  => [1],\n            'repository' => 'http://example.com',\n            'stage'      => 'staging',\n        ];\n\n        $form = new ProjectFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_RepositoryFieldIsMissing()\n    {\n        Factory::create('App\\Models\\Recipe', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $input = [\n            'name'      => 'Project 1',\n            'recipe_id' => [1],\n            'server_id' => 1,\n            'stage'     => 'staging',\n        ];\n\n        $form = new ProjectFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_RepositoryFieldIsInvalidUrl()\n    {\n        // HACK Laravel 5.2 URL validation doesn't work with PHP 7.3 due to preg_match() error.\n        if (version_compare(phpversion(), '7.3.0', '>=')) {\n            $this->markTestIncomplete(\"Laravel 5.2 URL validation doesn't work with PHP 7.3 due to preg_match() error.\");\n        }\n\n        Factory::create('App\\Models\\Recipe', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $input = [\n            'name'       => 'Project 1',\n            'recipe_id'  => [1],\n            'server_id'  => 1,\n            'repository' => 'invalid_url',\n            'stage'      => 'staging',\n        ];\n\n        $form = new ProjectFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_StageFieldIsMissing()\n    {\n        Factory::create('App\\Models\\Recipe', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $input = [\n            'name'       => 'Project 1',\n            'recipe_id'  => [1],\n            'server_id'  => 1,\n            'repository' => 'http://example.com',\n        ];\n\n        $form = new ProjectFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_PassToValidate_When_NameFieldAndRecipeIdFieldAndServerIdFieldAndRepositoryFieldAndStageFieldAreValid()\n    {\n        Factory::create('App\\Models\\Recipe', [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        Factory::create('App\\Models\\Server', [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '',\n        ]);\n\n        $input = [\n            'name'       => 'Project 1',\n            'recipe_id'  => [1],\n            'server_id'  => 1,\n            'repository' => 'http://example.com',\n            'stage'      => 'staging',\n        ];\n\n        $form = new ProjectFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertTrue($result, 'Expected validation to succeed.');\n        $this->assertEmpty($errors);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Form/Project/ProjectFormTest.php",
    "content": "<?php\n\nuse App\\Services\\Form\\Project\\ProjectForm;\n\nclass ProjectFormTest extends TestCase\n{\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockValidator;\n\n    protected $mockProjectRepository;\n\n    protected $mockProjectModel;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->mockValidator = $this->mock('App\\Services\\Validation\\ValidableInterface');\n        $this->mockProjectRepository = $this->mock('App\\Repositories\\Project\\ProjectInterface');\n        $this->mockProjectModel = $this->mockPartial('App\\Models\\Project');\n    }\n\n    public function test_Should_SucceedToSaveAndNotAddProjectAttribute_When_ValidationPassesAndDeployPathFieldIsNotSpecified()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('addMaxDeployment')\n            ->once()\n            ->shouldReceive('syncRecipes')\n            ->once()\n            ->mock();\n        $this->mockProjectRepository\n            ->shouldReceive('create')\n            ->once()\n            ->andReturn($project);\n\n        $input = [\n            'recipe_id_order' => '3,1,2',\n            'deploy_path'     => '',\n        ];\n\n        $form = new ProjectForm($this->mockValidator, $this->mockProjectRepository);\n        $result = $form->save($input);\n\n        $this->assertTrue($result, 'Expected save to succeed.');\n    }\n\n    public function test_Should_SucceedToSaveAndAddProjectAttribute_When_ValidationPassesAndDeployPathFieldIsSpecified()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('addMaxDeployment')\n            ->once()\n            ->shouldReceive('syncRecipes')\n            ->once()\n            ->mock();\n        $this->mockProjectRepository\n            ->shouldReceive('create')\n            ->once()\n            ->andReturn($project);\n\n        $input = [\n            'recipe_id_order' => '3,1,2',\n            'deploy_path'     => '/home/www',\n        ];\n\n        $form = new ProjectForm($this->mockValidator, $this->mockProjectRepository);\n        $result = $form->save($input);\n\n        $this->assertTrue($result, 'Expected save to succeed.');\n    }\n\n    public function test_Should_FailToSave_When_ValidationFails()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(false);\n\n        $input = [\n            'recipe_id_order' => '3,1,2',\n            'deploy_path'     => '',\n        ];\n\n        $form = new ProjectForm($this->mockValidator, $this->mockProjectRepository);\n        $result = $form->save($input);\n\n        $this->assertFalse($result, 'Expected save to fail.');\n    }\n\n    public function test_Should_SucceedToUpdateAndNotAddProjectAttribute_When_ValidationPassesAndDeployPathFieldIsNotSpecified()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('syncRecipes')\n            ->once()\n            ->mock();\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n        $this->mockProjectRepository\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(true);\n\n        $input = [\n            'id'              => $project->id,\n            'recipe_id_order' => '3,1,2',\n            'deploy_path'     => '',\n        ];\n\n        $form = new ProjectForm($this->mockValidator, $this->mockProjectRepository);\n        $result = $form->update($input);\n\n        $this->assertTrue($result, 'Expected update to succeed.');\n    }\n\n    public function test_Should_SucceedToUpdateAndAddProjectAttribute_When_ValidationPassesAndDeployPathFieldIsSpecified()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $project = $this->mockProjectModel\n            ->shouldReceive('syncRecipes')\n            ->once()\n            ->mock();\n        $this->mockProjectRepository\n            ->shouldReceive('byId')\n            ->once()\n            ->andReturn($project);\n        $this->mockProjectRepository\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(true);\n\n        $input = [\n            'id'              => $project->id,\n            'recipe_id_order' => '3,1,2',\n            'deploy_path'     => '/home/www',\n        ];\n\n        $form = new ProjectForm($this->mockValidator, $this->mockProjectRepository);\n        $result = $form->update($input);\n\n        $this->assertTrue($result, 'Expected update to succeed.');\n    }\n\n    public function test_Should_FailToUpdate_When_ValidationFails()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(false);\n\n        $input = [\n            'recipe_id_order' => '3,1,2',\n            'deploy_path'     => '',\n        ];\n\n        $form = new ProjectForm($this->mockValidator, $this->mockProjectRepository);\n        $result = $form->update($input);\n\n        $this->assertFalse($result, 'Expected update to fail.');\n    }\n\n    public function test_Should_GetValidationErrors()\n    {\n        $this->mockValidator\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn(new Illuminate\\Support\\MessageBag);\n\n        $form = new ProjectForm($this->mockValidator, $this->mockProjectRepository);\n        $result = $form->errors();\n\n        $this->assertEmpty($result);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Form/Recipe/RecipeFormLaravelValidatorTest.php",
    "content": "<?php\n\nuse App\\Services\\Form\\Recipe\\RecipeFormLaravelValidator;\n\nclass RecipeFormLaravelValidatorTest extends TestCase\n{\n    public function test_Should_FailToValidate_When_NameFieldIsMissing()\n    {\n        $input = [\n            'description' => '',\n            'body'        => '<?php $x = 1;',\n        ];\n\n        $form = new RecipeFormLaravelValidator($this->app['validator']);\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_BodyFieldIsMissing()\n    {\n        $input = [\n            'name'        => 'Recipe 1',\n            'description' => '',\n        ];\n\n        $form = new RecipeFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_PassToValidate_When_NameFieldAndBodyFieldAreValid()\n    {\n        $input = [\n            'name'        => 'Recipe 1',\n            'description' => '',\n            'body'        => '<?php $x = 1;',\n        ];\n\n        $form = new RecipeFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertTrue($result, 'Expected validation to succeed.');\n        $this->assertEmpty($errors);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Form/Recipe/RecipeFormTest.php",
    "content": "<?php\n\nuse App\\Services\\Form\\Recipe\\RecipeForm;\n\nclass RecipeFormTest extends TestCase\n{\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockValidator;\n\n    protected $mockRecipeRepository;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->mockValidator = $this->mock('App\\Services\\Validation\\ValidableInterface');\n        $this->mockRecipeRepository = $this->mock('App\\Repositories\\Recipe\\RecipeInterface');\n    }\n\n    public function test_Should_SucceedToSave_When_ValidationPasses()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $this->mockRecipeRepository\n            ->shouldReceive('create')\n            ->once()\n            ->andReturn(true);\n\n        $form = new RecipeForm($this->mockValidator, $this->mockRecipeRepository);\n        $result = $form->save([]);\n\n        $this->assertTrue($result, 'Expected save to succeed.');\n    }\n\n    public function test_Should_FailToSave_When_ValidationFails()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(false);\n\n        $form = new RecipeForm($this->mockValidator, $this->mockRecipeRepository);\n        $result = $form->save([]);\n\n        $this->assertFalse($result, 'Expected save to fail.');\n    }\n\n    public function test_Should_SucceedToUpdate_When_ValidationPasses()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $this->mockRecipeRepository\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(true);\n\n        $form = new RecipeForm($this->mockValidator, $this->mockRecipeRepository);\n        $result = $form->update([]);\n\n        $this->assertTrue($result, 'Expected update to succeed.');\n    }\n\n    public function test_Should_FailToUpdate_When_ValidationFails()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(false);\n\n        $form = new RecipeForm($this->mockValidator, $this->mockRecipeRepository);\n        $result = $form->update([]);\n\n        $this->assertFalse($result, 'Expected update to fail.');\n    }\n\n    public function test_Should_GetValidationErrors()\n    {\n        $this->mockValidator\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn(new Illuminate\\Support\\MessageBag);\n\n        $form = new RecipeForm($this->mockValidator, $this->mockRecipeRepository);\n        $result = $form->errors();\n\n        $this->assertEmpty($result);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Form/Server/ServerFormLaravelValidatorTest.php",
    "content": "<?php\n\nuse App\\Services\\Form\\Server\\ServerFormLaravelValidator;\n\nclass ServerFormLaravelValidatorTest extends TestCase\n{\n    public function test_Should_FailToValidate_When_NameFieldIsMissing()\n    {\n        $input = [\n            'description' => '',\n            'body'        => '<?php $x = 1;',\n        ];\n\n        $form = new ServerFormLaravelValidator($this->app['validator']);\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_BodyFieldIsMissing()\n    {\n        $input = [\n            'name'        => 'Server 1',\n            'description' => '',\n        ];\n\n        $form = new ServerFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_PassToValidate_When_NameFieldAndBodyFieldAreValid()\n    {\n        $input = [\n            'name'        => 'Server 1',\n            'description' => '',\n            'body'        => '<?php $x = 1;',\n        ];\n\n        $form = new ServerFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertTrue($result, 'Expected validation to succeed.');\n        $this->assertEmpty($errors);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Form/Server/ServerFormTest.php",
    "content": "<?php\n\nuse App\\Services\\Form\\Server\\ServerForm;\n\nclass ServerFormTest extends TestCase\n{\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockValidator;\n\n    protected $mockServerRepository;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->mockValidator = $this->mock('App\\Services\\Validation\\ValidableInterface');\n        $this->mockServerRepository = $this->mock('App\\Repositories\\Server\\ServerInterface');\n    }\n\n    public function test_Should_SucceedToSave_When_ValidationPasses()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $this->mockServerRepository\n            ->shouldReceive('create')\n            ->once()\n            ->andReturn(true);\n\n        $form = new ServerForm($this->mockValidator, $this->mockServerRepository);\n        $result = $form->save([]);\n\n        $this->assertTrue($result, 'Expected save to succeed.');\n    }\n\n    public function test_Should_FailToSave_When_ValidationFails()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(false);\n\n        $form = new ServerForm($this->mockValidator, $this->mockServerRepository);\n        $result = $form->save([]);\n\n        $this->assertFalse($result, 'Expected save to fail.');\n    }\n\n    public function test_Should_SucceedToUpdate_When_ValidationPasses()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $this->mockServerRepository\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(true);\n\n        $form = new ServerForm($this->mockValidator, $this->mockServerRepository);\n        $result = $form->update([]);\n\n        $this->assertTrue($result, 'Expected update to succeed.');\n    }\n\n    public function test_Should_FailToUpdate_When_ValidationFails()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(false);\n\n        $form = new ServerForm($this->mockValidator, $this->mockServerRepository);\n        $result = $form->update([]);\n\n        $this->assertFalse($result, 'Expected update to fail.');\n    }\n\n    public function test_Should_GetValidationErrors()\n    {\n        $this->mockValidator\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn(new Illuminate\\Support\\MessageBag);\n\n        $form = new ServerForm($this->mockValidator, $this->mockServerRepository);\n        $result = $form->errors();\n\n        $this->assertEmpty($result);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Form/Setting/MailSettingFormLaravelValidatorTest.php",
    "content": "<?php\n\nuse App\\Services\\Form\\Setting\\MailSettingFormLaravelValidator;\n\nclass MailSettingFormLaravelValidatorTest extends TestCase\n{\n    public function test_Should_PassToValidate_When_AllFieldsIsValid()\n    {\n        $input = [\n            'driver'            => 'smtp',\n            'from_address'      => 'from_address@example.com',\n            'from_name'         => 'from_name',\n            'smtp_host'         => 'localhost',\n            'smtp_port'         => 587,\n            'smtp_encryption'   => 'tls',\n            'smtp_username'     => 'username@example.com',\n            'smtp_password'     => 'password',\n            'sendmail_path'     => '/usr/sbin/sendmail -bs',\n        ];\n\n        $form = new MailSettingFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertTrue($result, 'Expected validation to succeed.');\n        $this->assertEmpty($errors);\n    }\n\n    public function test_Should_FailToValidate_When_DriverFieldIsMissing()\n    {\n        $input = [\n            'from_address'      => 'from_address@example.com',\n            'from_name'         => 'from_name',\n            'smtp_host'         => 'localhost',\n            'smtp_port'         => 587,\n            'smtp_encryption'   => 'tls',\n            'smtp_username'     => 'username@example.com',\n            'smtp_password'     => 'password',\n            'sendmail_path'     => '/usr/sbin/sendmail -bs',\n        ];\n\n        $form = new MailSettingFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_DriverFieldIsInvalid()\n    {\n        $input = [\n            'driver'            => 'invalid',\n            'from_address'      => 'from_address@example.com',\n            'from_name'         => 'from_name',\n            'smtp_host'         => 'localhost',\n            'smtp_port'         => 587,\n            'smtp_encryption'   => 'tls',\n            'smtp_username'     => 'username@example.com',\n            'smtp_password'     => 'password',\n            'sendmail_path'     => '/usr/sbin/sendmail -bs',\n        ];\n\n        $form = new MailSettingFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_FromAddressFieldIsMissing()\n    {\n        $input = [\n            'driver'            => 'smtp',\n            'from_name'         => 'from_name',\n            'smtp_host'         => 'localhost',\n            'smtp_port'         => 587,\n            'smtp_encryption'   => 'tls',\n            'smtp_username'     => 'username@example.com',\n            'smtp_password'     => 'password',\n            'sendmail_path'     => '/usr/sbin/sendmail -bs',\n        ];\n\n        $form = new MailSettingFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_FromAddressFieldIsInvalid()\n    {\n        $input = [\n            'driver'            => 'smtp',\n            'from_address'      => 'invalid',\n            'from_name'         => 'from_name',\n            'smtp_host'         => 'localhost',\n            'smtp_port'         => 587,\n            'smtp_encryption'   => 'tls',\n            'smtp_username'     => 'username@example.com',\n            'smtp_password'     => 'password',\n            'sendmail_path'     => '/usr/sbin/sendmail -bs',\n        ];\n\n        $form = new MailSettingFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_PassToValidate_When_SmtpPortFieldIsEqualToMin()\n    {\n        $input = [\n            'driver'            => 'smtp',\n            'from_address'      => 'from_address@example.com',\n            'from_name'         => 'from_name',\n            'smtp_host'         => 'localhost',\n            'smtp_port'         => 0,\n            'smtp_encryption'   => 'tls',\n            'smtp_username'     => 'username@example.com',\n            'smtp_password'     => 'password',\n            'sendmail_path'     => '/usr/sbin/sendmail -bs',\n        ];\n\n        $form = new MailSettingFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertTrue($result, 'Expected validation to succeed.');\n        $this->assertEmpty($errors);\n    }\n\n    public function test_Should_PassToValidate_When_SmtpPortFieldIsEqualToMax()\n    {\n        $input = [\n            'driver'            => 'smtp',\n            'from_address'      => 'from_address@example.com',\n            'from_name'         => 'from_name',\n            'smtp_host'         => 'localhost',\n            'smtp_port'         => 65535,\n            'smtp_encryption'   => 'tls',\n            'smtp_username'     => 'username@example.com',\n            'smtp_password'     => 'password',\n            'sendmail_path'     => '/usr/sbin/sendmail -bs',\n        ];\n\n        $form = new MailSettingFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertTrue($result, 'Expected validation to succeed.');\n        $this->assertEmpty($errors);\n    }\n\n    public function test_Should_FailToValidate_When_SmtpPortFieldIsLessThanMin()\n    {\n        $input = [\n            'driver'            => 'smtp',\n            'from_address'      => 'from_address@example.com',\n            'from_name'         => 'from_name',\n            'smtp_host'         => 'localhost',\n            'smtp_port'         => -1,\n            'smtp_encryption'   => 'tls',\n            'smtp_username'     => 'username@example.com',\n            'smtp_password'     => 'password',\n            'sendmail_path'     => '/usr/sbin/sendmail -bs',\n        ];\n\n        $form = new MailSettingFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_SmtpPortFieldIsGreaterThanMax()\n    {\n        $input = [\n            'driver'            => 'smtp',\n            'from_address'      => 'from_address@example.com',\n            'from_name'         => 'from_name',\n            'smtp_host'         => 'localhost',\n            'smtp_port'         => 65536,\n            'smtp_encryption'   => 'tls',\n            'smtp_username'     => 'username@example.com',\n            'smtp_password'     => 'password',\n            'sendmail_path'     => '/usr/sbin/sendmail -bs',\n        ];\n\n        $form = new MailSettingFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_SmtpEncryptionFieldIsInvalid()\n    {\n        $input = [\n            'driver'            => 'smtp',\n            'from_address'      => 'from_address@example.com',\n            'from_name'         => 'from_name',\n            'smtp_host'         => 'localhost',\n            'smtp_port'         => 587,\n            'smtp_encryption'   => 'invalid',\n            'smtp_username'     => 'username@example.com',\n            'smtp_password'     => 'password',\n            'sendmail_path'     => '/usr/sbin/sendmail -bs',\n        ];\n\n        $form = new MailSettingFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Form/Setting/MailSettingFormTest.php",
    "content": "<?php\n\nuse App\\Services\\Form\\Setting\\MailSettingForm;\n\nclass MailSettingFormTest extends TestCase\n{\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockValidator;\n\n    protected $mockSettingRepository;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->mockValidator = $this->mock('App\\Services\\Validation\\ValidableInterface');\n        $this->mockSettingRepository = $this->mock('App\\Repositories\\Setting\\SettingInterface');\n    }\n\n    public function test_Should_SucceedToUpdate_When_ValidationPasses()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $this->mockSettingRepository\n            ->shouldReceive('updateByType')\n            ->once()\n            ->andReturn(true);\n\n        $form = new MailSettingForm($this->mockValidator, $this->mockSettingRepository);\n        $result = $form->update([\n            'driver'          => '',\n            'from_address'    => '',\n            'from_name'       => '',\n            'smtp_host'       => '',\n            'smtp_port'       => '',\n            'smtp_encryption' => '',\n            'smtp_username'   => '',\n            'smtp_password'   => '',\n            'sendmail_path'   => '',\n        ]);\n\n        $this->assertTrue($result, 'Expected update to succeed.');\n    }\n\n    public function test_Should_FailToUpdate_When_ValidationFails()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(false);\n\n        $form = new MailSettingForm($this->mockValidator, $this->mockSettingRepository);\n        $result = $form->update([]);\n\n        $this->assertFalse($result, 'Expected update to fail.');\n    }\n\n    public function test_Should_GetValidationErrors()\n    {\n        $this->mockValidator\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn(new Illuminate\\Support\\MessageBag);\n\n        $form = new MailSettingForm($this->mockValidator, $this->mockSettingRepository);\n        $result = $form->errors();\n\n        $this->assertEmpty($result);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Form/User/UserFormLaravelValidatorTest.php",
    "content": "<?php\n\nuse App\\Services\\Form\\User\\UserFormLaravelValidator;\n\nuse Tests\\Helpers\\Factory;\n\nclass UserFormLaravelValidatorTest extends TestCase\n{\n    protected $useDatabase = true;\n\n    public function test_Should_PassToValidate_When_NameFieldIsValid()\n    {\n        $input = [\n            'name' => 'User 1',\n        ];\n\n        $form = new UserFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertTrue($result, 'Expected validation to succeed.');\n        $this->assertEmpty($errors);\n    }\n\n    public function test_Should_PassToValidate_When_EmailFieldIsValid()\n    {\n        $input = [\n            'email' => 'user1@example.com',\n        ];\n\n        $form = new UserFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertTrue($result, 'Expected validation to succeed.');\n        $this->assertEmpty($errors);\n    }\n\n    public function test_Should_FailToValidate_When_EmailFieldIsInvalid()\n    {\n        $input = [\n            'email' => 'invalid',\n        ];\n\n        $form = new UserFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_PassToValidate_When_PasswordFieldAndPasswordConfirmationFieldAreValid()\n    {\n        $input = [\n            'password'              => '12345678',\n            'password_confirmation' => '12345678',\n        ];\n\n        $form = new UserFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertTrue($result, 'Expected validation to succeed.');\n        $this->assertEmpty($errors);\n    }\n\n    public function test_Should_FailToValidate_When_PasswordFieldAndPasswordConfirmationFieldAreInvalid()\n    {\n        $input = [\n            'password'              => '1234567',\n            'password_confirmation' => '1234567',\n        ];\n\n        $form = new UserFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_PasswordFieldAndPasswordConfirmationFieldAreDifferent()\n    {\n        $input = [\n            'password'              => '12345678',\n            'password_confirmation' => '23456789',\n        ];\n\n        $form = new UserFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_PassToValidate_When_RoleFieldIsValid()\n    {\n        Factory::create('Kodeine\\Acl\\Models\\Eloquent\\Role', [\n            'name'        => 'Role 1',\n            'slug'        => 'role_1',\n            'description' => '',\n        ]);\n\n        Factory::create('Kodeine\\Acl\\Models\\Eloquent\\Role', [\n            'name'        => 'Role 2',\n            'slug'        => 'role_2',\n            'description' => '',\n        ]);\n\n        $input = [\n            'role' => [1, 2],\n        ];\n\n        $form = new UserFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertTrue($result, 'Expected validation to succeed.');\n        $this->assertEmpty($errors);\n    }\n\n    public function test_Should_FailToValidate_When_RoleFieldIsInvalid()\n    {\n        $input = [\n            'role' => [1],\n        ];\n\n        $form = new UserFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_FailToValidate_When_EmailFieldIsNotUniqueAndIdFieldIsNotSpecified()\n    {\n        Factory::create('App\\Models\\User', [\n            'email' => 'user1@example.com',\n        ]);\n\n        $input = [\n            'email' => 'user1@example.com',\n        ];\n\n        $form = new UserFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertFalse($result, 'Expected validation to fail.');\n        $this->assertInstanceOf('Illuminate\\Support\\MessageBag', $errors);\n    }\n\n    public function test_Should_PassToValidate_When_EmailFieldIsNotUniqueAndIdFieldIsSpecified()\n    {\n        $arrangedUser = Factory::create('App\\Models\\User', [\n            'email' => 'user1@example.com',\n        ]);\n\n        $input = [\n            'id'    => $arrangedUser->id,\n            'email' => 'user1@example.com',\n        ];\n\n        $form = new UserFormLaravelValidator($this->app['validator']);\n\n        $result = $form->with($input)->passes();\n        $errors = $form->errors();\n\n        $this->assertTrue($result, 'Expected validation to succeed.');\n        $this->assertEmpty($errors);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Form/User/UserFormTest.php",
    "content": "<?php\n\nuse App\\Services\\Form\\User\\UserForm;\n\nclass UserFormTest extends TestCase\n{\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockValidator;\n\n    protected $mockUserRepository;\n\n    protected $mockUserModel;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->mockValidator = $this->mock('App\\Services\\Validation\\ValidableInterface');\n        $this->mockUserRepository = $this->mock('App\\Repositories\\User\\UserInterface');\n        $this->mockUserModel = $this->mockPartial('App\\Models\\User');\n    }\n\n    public function test_Should_SucceedToSave_When_ValidationPassesAndRoleFieldIsNotSpecified()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $this->mockUserRepository\n            ->shouldReceive('create')\n            ->once();\n\n        $form = new UserForm($this->mockValidator, $this->mockUserRepository);\n        $result = $form->save([]);\n\n        $this->assertTrue($result, 'Expected save to succeed.');\n    }\n\n    public function test_Should_SucceedToSave_When_ValidationPassesAndRoleFieldIsSpecified()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $user = $this->mockUserModel\n            ->shouldReceive('assignRole')\n            ->once()\n            ->mock();\n        $this->mockUserRepository\n            ->shouldReceive('create')\n            ->once()\n            ->andReturn($user);\n\n        $form = new UserForm($this->mockValidator, $this->mockUserRepository);\n        $result = $form->save(['role' => []]);\n\n        $this->assertTrue($result, 'Expected save to succeed.');\n    }\n\n    public function test_Should_FailToSave_When_ValidationFails()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(false);\n\n        $form = new UserForm($this->mockValidator, $this->mockUserRepository);\n        $result = $form->save([]);\n\n        $this->assertFalse($result, 'Expected save to fail.');\n    }\n\n    public function test_Should_SucceedToUpdate_When_ValidationPasses()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $this->mockUserRepository\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(true);\n\n        $form = new UserForm($this->mockValidator, $this->mockUserRepository);\n        $result = $form->update([]);\n\n        $this->assertTrue($result, 'Expected update to succeed.');\n    }\n\n    public function test_Should_FailToUpdate_When_ValidationFails()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(false);\n\n        $form = new UserForm($this->mockValidator, $this->mockUserRepository);\n        $result = $form->update([]);\n\n        $this->assertFalse($result, 'Expected update to fail.');\n    }\n\n    public function test_Should_SucceedToUpdatePassword_When_ValidationPasses()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $this->mockUserRepository\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(true);\n\n        $form = new UserForm($this->mockValidator, $this->mockUserRepository);\n        $result = $form->update([]);\n\n        $this->assertTrue($result, 'Expected update to succeed.');\n    }\n\n    public function test_Should_FailToUpdatePassword_When_ValidationFails()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(false);\n\n        $form = new UserForm($this->mockValidator, $this->mockUserRepository);\n        $result = $form->update([]);\n\n        $this->assertFalse($result, 'Expected update to fail.');\n    }\n\n    public function test_Should_SucceedToUpdateRole_When_ValidationPasses()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(true);\n\n        $this->mockUserRepository\n            ->shouldReceive('update')\n            ->once()\n            ->andReturn(true);\n\n        $form = new UserForm($this->mockValidator, $this->mockUserRepository);\n        $result = $form->update([]);\n\n        $this->assertTrue($result, 'Expected update to succeed.');\n    }\n\n    public function test_Should_FailToUpdateRole_When_ValidationFails()\n    {\n        $this->mockValidator\n            ->shouldReceive('with')\n            ->once()\n            ->andReturn($this->mockValidator);\n        $this->mockValidator\n            ->shouldReceive('passes')\n            ->once()\n            ->andReturn(false);\n\n        $form = new UserForm($this->mockValidator, $this->mockUserRepository);\n        $result = $form->update([]);\n\n        $this->assertFalse($result, 'Expected update to fail.');\n    }\n\n    public function test_Should_GetValidationErrors()\n    {\n        $this->mockValidator\n            ->shouldReceive('errors')\n            ->once()\n            ->andReturn(new Illuminate\\Support\\MessageBag);\n\n        $form = new UserForm($this->mockValidator, $this->mockUserRepository);\n        $result = $form->errors();\n\n        $this->assertEmpty($result);\n    }\n}\n"
  },
  {
    "path": "tests/Services/Notification/MailNotifierTest.php",
    "content": "<?php\n\nuse App\\Services\\Notification\\MailNotifier;\n\nclass MailNotifierTest extends TestCase\n{\n    use Tests\\Helpers\\MockeryHelper;\n\n    public function test_Should_SetFromAddressAndReturnThis()\n    {\n        $notifier = new MailNotifier;\n\n        $result = $notifier->from('from@example.com');\n\n        $this->assertEquals($notifier, $result);\n    }\n\n    public function test_Should_SetToAddressAndReturnThis()\n    {\n        $notifier = new MailNotifier;\n\n        $result = $notifier->to('to@example.com');\n\n        $this->assertEquals($notifier, $result);\n    }\n\n    public function test_Should_SendEmailNotification_When_ToAddressIsSet()\n    {\n        $mockSwiftMailer = $this->mock('Swift_Mailer');\n        $mockSwiftMailTransport = $this->mockPartial('Swift_MailTransport');\n\n        $mockSwiftMailer->shouldReceive('send');\n        $mockSwiftMailer->shouldReceive('getTransport')\n            ->andReturn($mockSwiftMailTransport);\n\n        $this->app['mailer']->setSwiftMailer($mockSwiftMailer);\n\n        $notifier = new MailNotifier;\n\n        $notifier->to('to@example.com')->notify('Subject', 'Message');\n    }\n}\n"
  },
  {
    "path": "tests/Specifications/DeploymentSpecificationTest.php",
    "content": "<?php\n\nuse App\\Specifications\\DeploymentSpecification;\n\nclass DeploymentSpecificationTest extends TestCase\n{\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockProjectModel;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->mockProjectModel = $this->mockPartial('App\\Models\\Project');\n    }\n\n    public function test_Should_GetSatisfyingElements()\n    {\n        $spec = new DeploymentSpecification;\n\n        $deployment1 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment2 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment3 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment4 = $this->mockPartial('App\\Models\\Deployment');\n\n        $deployments = collect([\n            $deployment4,\n            $deployment3,\n            $deployment2,\n            $deployment1,\n        ]);\n\n        $this->mockProjectModel\n            ->shouldReceive('getDeployments')\n            ->once()\n            ->andReturn($deployments);\n\n        $oldDeployments = $spec->satisfyingElementsFrom($this->mockProjectModel);\n\n        $this->assertEquals($deployment4, $oldDeployments[0]);\n        $this->assertEquals($deployment3, $oldDeployments[1]);\n        $this->assertEquals($deployment2, $oldDeployments[2]);\n        $this->assertEquals($deployment1, $oldDeployments[3]);\n    }\n}\n"
  },
  {
    "path": "tests/Specifications/OldDeploymentSpecificationTest.php",
    "content": "<?php\n\nuse App\\Specifications\\OldDeploymentSpecification;\n\nclass OldDeploymentSpecificationTest extends TestCase\n{\n    use Tests\\Helpers\\MockeryHelper;\n\n    protected $mockProjectModel;\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        $this->mockProjectModel = $this->mockPartial('App\\Models\\Project');\n    }\n\n    public function test_Should_GetSatisfyingElements_When_DaysToKeepDeploymentsIsSetAndKeepLastDeploymentIsFalseAndMaxNumberDeploymentsToKeepIsSet()\n    {\n        $date = new DateTime;\n        $spec = new OldDeploymentSpecification($date);\n\n        $deployment1 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment2 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment3 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment4 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment1->number = 1;\n        $deployment2->number = 2;\n        $deployment3->number = 3;\n        $deployment4->number = 4;\n\n        $deployments = collect([\n            $deployment4,\n            $deployment3,\n            $deployment2,\n            $deployment1,\n        ]);\n\n        $pastDaysToKeepDeployments = collect([\n            $deployment2,\n            $deployment1,\n        ]);\n\n        $pastNumToKeepDeployments = collect([\n            $deployment3,\n            $deployment2,\n            $deployment1,\n        ]);\n\n        $this->mockProjectModel->days_to_keep_deployments = 1;\n        $this->mockProjectModel->keep_last_deployment = 0;\n        $this->mockProjectModel->max_number_of_deployments_to_keep = 1;\n\n        $this->mockProjectModel\n            ->shouldReceive('getDeployments')\n            ->once()\n            ->andReturn($deployments)\n            ->shouldReceive('getDeploymentsWhereCreatedAtBefore')\n            ->once()\n            ->andReturn($pastDaysToKeepDeployments)\n            ->shouldReceive('getDeploymentsWhereNumberBefore')\n            ->once()\n            ->andReturn($pastNumToKeepDeployments)\n            ->shouldReceive('getLastDeployment')\n            ->once()\n            ->andReturn($deployment4);\n\n        $oldDeployments = $spec->satisfyingElementsFrom($this->mockProjectModel);\n\n        $this->assertEquals($deployment3, $oldDeployments[0]);\n        $this->assertEquals($deployment2, $oldDeployments[1]);\n        $this->assertEquals($deployment1, $oldDeployments[2]);\n    }\n\n    public function test_Should_GetSatisfyingElements_When_DaysToKeepDeploymentsIsNotSetAndKeepLastDeploymentIsFalseAndMaxNumberDeploymentsToKeepIsSet()\n    {\n        $date = new DateTime;\n        $spec = new OldDeploymentSpecification($date);\n\n        $deployment1 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment2 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment3 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment4 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment1->number = 1;\n        $deployment2->number = 2;\n        $deployment3->number = 3;\n        $deployment4->number = 4;\n\n        $deployments = collect([\n            $deployment4,\n            $deployment3,\n            $deployment2,\n            $deployment1,\n        ]);\n\n        $pastNumToKeepDeployments = collect([\n            $deployment3,\n            $deployment2,\n            $deployment1,\n        ]);\n\n        $this->mockProjectModel->days_to_keep_deployments = null;\n        $this->mockProjectModel->keep_last_deployment = 0;\n        $this->mockProjectModel->max_number_of_deployments_to_keep = 1;\n\n        $this->mockProjectModel\n            ->shouldReceive('getDeployments')\n            ->once()\n            ->andReturn($deployments)\n            ->shouldReceive('getDeploymentsWhereNumberBefore')\n            ->once()\n            ->andReturn($pastNumToKeepDeployments)\n            ->shouldReceive('getLastDeployment')\n            ->once()\n            ->andReturn($deployment4);\n\n        $oldDeployments = $spec->satisfyingElementsFrom($this->mockProjectModel);\n\n        $this->assertEquals($deployment3, $oldDeployments[0]);\n        $this->assertEquals($deployment2, $oldDeployments[1]);\n        $this->assertEquals($deployment1, $oldDeployments[2]);\n    }\n\n    public function test_Should_GetSatisfyingElements_When_DaysToKeepDeploymentsIsSetAndKeepLastDeploymentIsFalseAndMaxNumberDeploymentsToKeepIsNotSet()\n    {\n        $date = new DateTime;\n        $spec = new OldDeploymentSpecification($date);\n\n        $deployment1 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment2 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment1->number = 1;\n        $deployment2->number = 2;\n\n        $deployments = collect([\n            $deployment2,\n            $deployment1,\n        ]);\n\n        $pastDaysToKeepDeployments = collect([\n            $deployment2,\n            $deployment1,\n        ]);\n\n        $this->mockProjectModel->days_to_keep_deployments = 1;\n        $this->mockProjectModel->keep_last_deployment = 0;\n        $this->mockProjectModel->max_number_of_deployments_to_keep = null;\n\n        $this->mockProjectModel\n            ->shouldReceive('getDeployments')\n            ->once()\n            ->andReturn($deployments)\n            ->shouldReceive('getDeploymentsWhereCreatedAtBefore')\n            ->once()\n            ->andReturn($pastDaysToKeepDeployments);\n\n        $oldDeployments = $spec->satisfyingElementsFrom($this->mockProjectModel);\n\n        $this->assertEquals($deployment2, $oldDeployments[0]);\n        $this->assertEquals($deployment1, $oldDeployments[1]);\n    }\n\n    public function test_Should_GetSatisfyingElements_When_DaysToKeepDeploymentsIsSetAndKeepLastDeploymentIsTrueMaxNumberDeploymentsToKeepIsNotSet()\n    {\n        $date = new DateTime;\n        $spec = new OldDeploymentSpecification($date);\n\n        $deployment1 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment2 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment1->number = 1;\n        $deployment2->number = 2;\n\n        $deployments = collect([\n            $deployment2,\n            $deployment1,\n        ]);\n\n        $pastDaysToKeepDeployments = collect([\n            $deployment2,\n            $deployment1,\n        ]);\n\n        $this->mockProjectModel->days_to_keep_deployments = 1;\n        $this->mockProjectModel->keep_last_deployment = 1;\n        $this->mockProjectModel->max_number_of_deployments_to_keep = null;\n\n        $this->mockProjectModel\n            ->shouldReceive('getDeployments')\n            ->once()\n            ->andReturn($deployments)\n            ->shouldReceive('getDeploymentsWhereCreatedAtBefore')\n            ->once()\n            ->andReturn($pastDaysToKeepDeployments)\n            ->shouldReceive('getLastDeployment')\n            ->once()\n            ->andReturn($deployment2);\n\n        $oldDeployments = $spec->satisfyingElementsFrom($this->mockProjectModel);\n\n        $this->assertEquals($deployment1, $oldDeployments[0]);\n    }\n\n    public function test_Should_GetSatisfyingElements_When_DaysToKeepDeploymentsIsNotSetAndKeepLastDeploymentIsFalseAndMaxNumberDeploymentsToKeepIsNotSet()\n    {\n        $date = new DateTime;\n        $spec = new OldDeploymentSpecification($date);\n\n        $deployment1 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment2 = $this->mockPartial('App\\Models\\Deployment');\n        $deployment1->number = 1;\n        $deployment2->number = 2;\n\n        $deployments = collect([\n            $deployment2,\n            $deployment1,\n        ]);\n\n        $this->mockProjectModel->days_to_keep_deployments = null;\n        $this->mockProjectModel->keep_last_deployment = 0;\n        $this->mockProjectModel->max_number_of_deployments_to_keep = null;\n\n        $this->mockProjectModel\n            ->shouldReceive('getDeployments')\n            ->once()\n            ->andReturn($deployments);\n\n        $oldDeployments = $spec->satisfyingElementsFrom($this->mockProjectModel);\n\n        $this->assertEmpty($oldDeployments);\n    }\n\n    public function test_Should_GetSatisfyingElements_When_DeploymentsDoNotExists()\n    {\n        $date = new DateTime;\n        $spec = new OldDeploymentSpecification($date);\n\n        $deployments = collect([]);\n\n        $this->mockProjectModel\n            ->shouldReceive('getDeployments')\n            ->once()\n            ->andReturn($deployments);\n\n        $oldDeployments = $spec->satisfyingElementsFrom($this->mockProjectModel);\n\n        $this->assertEmpty($oldDeployments);\n    }\n}\n"
  },
  {
    "path": "tests/TestCase.php",
    "content": "<?php\n\nclass TestCase extends Illuminate\\Foundation\\Testing\\TestCase\n{\n    protected $baseUrl = 'http://localhost';\n\n    protected $useDatabase = false;\n\n    /**\n     * Creates the application.\n     *\n     * @return \\Illuminate\\Foundation\\Application\n     */\n    public function createApplication()\n    {\n        $app = require __DIR__.'/../bootstrap/app.php';\n\n        $app->make('Illuminate\\Contracts\\Console\\Kernel')->bootstrap();\n\n        return $app;\n    }\n\n    public function setUp()\n    {\n        parent::setUp();\n\n        if ($this->useDatabase) {\n            Artisan::call('migrate');\n        }\n    }\n\n    public function tearDown()\n    {\n        if ($this->useDatabase) {\n            Artisan::call('migrate:reset');\n        }\n\n        parent::tearDown();\n    }\n}\n"
  },
  {
    "path": "tests/_helpers/ConsoleCommandTestHelper.php",
    "content": "<?php\n\nnamespace Tests\\Helpers;\n\nuse Symfony\\Component\\Console\\Command\\Command;\nuse Symfony\\Component\\Console\\Tester\\CommandTester;\n\ntrait ConsoleCommandTestHelper\n{\n    protected function runConsoleCommand(Command $command, $arguments = [], $options = [])\n    {\n        $command->setLaravel($this->app);\n\n        $tester = new CommandTester($command);\n\n        return $tester->execute($arguments, $options);\n    }\n}\n"
  },
  {
    "path": "tests/_helpers/ControllerTestHelper.php",
    "content": "<?php\n\nnamespace Tests\\Helpers;\n\nuse Session;\n\ntrait ControllerTestHelper\n{\n    public function post($uri, array $data = [], array $headers = [])\n    {\n        $data = array_merge($data, ['_token' => Session::token()]);\n\n        parent::post($uri, $data, $headers);\n\n        return $this;\n    }\n\n    public function put($uri, array $data = [], array $headers = [])\n    {\n        $data = array_merge($data, ['_token' => Session::token()]);\n\n        parent::put($uri, $data, $headers);\n\n        return $this;\n    }\n\n    public function delete($uri, array $data = [], array $headers = [])\n    {\n        $data = array_merge($data, ['_token' => Session::token()]);\n\n        parent::delete($uri, $data, $headers);\n\n        return $this;\n    }\n\n    protected function auth($obj = null, $data = [])\n    {\n        if (isset($obj)) {\n            $user = $obj;\n        } else {\n            $user = new \\App\\Models\\User;\n        }\n\n        foreach ($data as $key => $val) {\n            $user->$key = $val;\n        }\n\n        $this->be($user);\n    }\n}\n"
  },
  {
    "path": "tests/_helpers/DummyMiddleware.php",
    "content": "<?php\n\nnamespace Tests\\Helpers;\n\nuse Closure;\n\nclass DummyMiddleware\n{\n    /**\n     * Handle an incoming request.\n     *\n     * @param  \\Illuminate\\Http\\Request  $request\n     * @param  \\Closure  $next\n     * @return mixed\n     */\n    public function handle($request, Closure $next)\n    {\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "tests/_helpers/Factory.php",
    "content": "<?php\n\nnamespace Tests\\Helpers;\n\nclass Factory\n{\n    public static function build($class, $data = [])\n    {\n        $instance = new static;\n\n        return $instance->getInstance($class, $data);\n    }\n\n    public static function create($class, $data = [])\n    {\n        $instance = static::build($class, $data);\n\n        $instance->save();\n\n        return $instance->find($instance->id);\n    }\n\n    public static function buildList($class, $dataList = [])\n    {\n        foreach ($dataList as $data) {\n            $instanceList[] = static::build($class, $data);\n        }\n\n        return $instanceList;\n    }\n\n    public static function createList($class, $dataList = [])\n    {\n        foreach ($dataList as $data) {\n            $instanceList[] = static::create($class, $data);\n        }\n\n        return $instanceList;\n    }\n\n    protected function getInstance($class, $data = [])\n    {\n        $instance = new $class;\n\n        foreach ($data as $key => $val) {\n            $instance->$key = $val;\n        }\n\n        return $instance;\n    }\n}\n"
  },
  {
    "path": "tests/_helpers/MockeryHelper.php",
    "content": "<?php\n\nnamespace Tests\\Helpers;\n\nuse Mockery as m;\n\ntrait MockeryHelper\n{\n    public function tearDown()\n    {\n        parent::tearDown();\n\n        m::close();\n    }\n\n    protected function mock($class)\n    {\n        $mock = m::mock($class);\n\n        $this->app->instance($class, $mock);\n\n        return $mock;\n    }\n\n    protected function mockPartial($class)\n    {\n        $mock = m::mock($class)->makePartial();\n\n        $this->app->instance($class, $mock);\n\n        return $mock;\n    }\n}\n"
  }
]