[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_style = space\nindent_size = 2\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[*.{css,js}]\nindent_size = 4\n\n[*.md]\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: CI\n\n# Controls when the workflow will run\non:\n  # Triggers the workflow on push or pull request events but only for the master branch\n  pull_request:\n    branches: [ master ]\n\n  # Allows you to run this workflow manually from the Actions tab\n  workflow_dispatch:\n\n# A workflow run is made up of one or more jobs that can run sequentially or in parallel\njobs:\n  # This workflow contains a single job called \"build\"\n  build:\n    # The type of runner that the job will run on\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [16, 18, 20]\n\n    # Steps represent a sequence of tasks that will be executed as part of the job\n    steps:\n      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it\n      - uses: actions/checkout@v2\n\n      - name: Setup Node.js environment\n        uses: actions/setup-node@v2.5.0\n        with:\n          node-version: ${{ matrix.node-version }}\n          cache: npm\n          cache-dependency-path: package-lock.json\n\n      # Runs a single command using the runners shell\n      - name: Install\n        run: npm ci\n      - name: Test\n        run: npm test\n      - name: Install Playwright Browsers\n        run: npx playwright install --with-deps\n      - name: Run Playwright tests\n        run: npm run test:e2e\n      - uses: actions/upload-artifact@v3\n        if: always()\n        with:\n          name: playwright-report\n          path: playwright-report/\n          retention-days: 30\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\n.idea\nnpm-debug.log\n.sass-cache\ntest/fixtures/files/*\ntest/fixtures/js/*\nexample.server.js\nexample.proxy.js\nexample.snippet.js\nexample.js\n.DS_store\ndoc/\n.coveralls.yml\ncoverage/\n/screenshots\ntest/fixtures/multi/\nbefore.json\nafter.json\nbs-config.js\n/lodash.custom.min.js\n/dist\n/cypress/videos\n/cypress/screenshots/*\nclient/dist/index.js\nclient/dist/index.js.map\nclient/dist/index.min.js\nclient/dist/index.min.js.map\nnode_modules/\n/test-results/\n/playwright-report/\n/playwright/.cache/\n"
  },
  {
    "path": ".travis.yml",
    "content": "git:\n  depth: 2\nlanguage: node_js\nnode_js:\n  - \"14\"\n  - \"12\"\n  - \"10\"\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to Browsersync\n\nWe'd love for you to contribute to Browsersync and help make it even better than it is\ntoday! Here are the guidelines we'd like you to follow:\n\n - [Question or Problem?](#question)\n - [Issues and Bugs](#issue)\n - [Tips for a creating a great issue report](#tips)\n - [Feature Requests](#feature)\n - [Pull Requests](#pull)\n - [Coding Rules](#rules)\n - [Thank you](#thanks)\n\n## <a name=\"question\"></a> Got a Question or Problem?\n\nIf you have questions about how to *use* Browsersync, or about your particular setup, please\nask on [Stack Overflow](http://stackoverflow.com/). We're trying to keep the Issues thread\nfor actual bugs with code & implementation.\n\n## <a name=\"issue\"></a> Found an Issue?\nOn that note, if you think you *have* found a bug in Browsersync, please report\nit via [Github Issues](https://github.com/BrowserSync/browser-sync/issues).\n\n## <a name=\"tips\"></a> Tips for a creating a great issue report\n\nWhilst we do try to look at each and every issue as soon as possible, there are certain\naspects about your report that will determine how quickly/deeply we'll delve into it. A great\nissue will contain at least the following:\n\n* Operating System + Version\n* Use case for Browsersync - are you using the built-in server, proxying your own server, or just using the snippet mode?\n* Example configuration - show us your full `gulpfile.js`, `Gruntfile.js`, `bs-config.js` or any other code related to how you're using\nBrowsersync. If we have to respond to your very first issue report with \"please provide information about how you're using Browsersync\"\nthen it's very likely to fall to the bottom of the heap. Help us out by providing as much detail as possible!\n* Provide a reduced test case. \"Browsersync is not working with my app\" is far less helpful than \"Here's a example project showing the problem\".\nAn example project might contain a single `index.html` file with some JS/CSS from CDNs & a short description of the issue. If we\n can just pull a repo/gist and see the problem for ourselves, your issue will jump straight to the top of the stack.\n* Screencast or GIF - not always appropriate, but can be very helpful where possible. (non-issue related gifs are always welcome, we'll often\nrespond with something from giphy :p)\n\n## <a name=\"feature\"></a> Want a Feature?\nYou can request a new feature by submitting an issue to our [Github Issues](https://github.com/BrowserSync/browser-sync/issues) page.\nPrefix the title of your issue with \"Feature Request:\".\n\n## <a name=\"docs\"></a> Want a Doc Fix?\nHead over to the [Browsersync Website Repo](https://github.com/BrowserSync/browsersync.github.io) & submit issues there.\n\n## <a name=\"pull\"></a> Submitting a Pull Request\nPull requests should always be branched off the main **Master** branch. (There's no guarantee that what lives on the develop\nbranch will ever make it back to master, I do a **lot** of experimentation).\n\n**Never** commit directly to the master branch, instead create a new branch and submit a PR. This applies to users who have write access also.\n\n**Note:** If your first PR is merged, you'll get write access to all Browsersync repos.\n\n## <a name=\"rules\"></a> Coding Advice\nTo ensure consistency throughout the source code, keep these rules in mind as you are working. \n\n* If you're not sure how to provide tests for a feature or bug fix, you should still submit it and we'll help you complete the PR in one of the following ways:\n  * we can advise you how to go about it\n  * we can write the test, and then explain them to you.\n* This project has a [.editorconfig](.editorconfig) file to help with code style; go to [EditorConfig.org](http://editorconfig.org) and download the plugin for your IDE.\n* Don't introduce any extra 3rd party libraries unless you're creating a brand new feature that requires it.\n* Try to keep your code simple and readable.\n* Improve my code! Browsersync has a lot of moving parts and I don't pretend to be skilled in any particular area.\nIf *you* have particular experience though, then feel free to rip my code apart and tell me a better way to do something - I'll be extremely grateful (as will the growing number of users!).\n\n## <a name=\"thanks\"></a> Thank you!\nIf you contribute to Browsersync, or any other Open Source project, you're awesome! This project has been vastly improved\n by community input & contributions and we look forward to continuing that trend.\n"
  },
  {
    "path": "ISSUE_TEMPLATE.md",
    "content": "### Issue details\n\n_Please provide issue details here_.\n\n### Steps to reproduce/test case\n\n_Please provide necessary steps for reproduction of this issue, or better the\nreduced test case (without any external dependencies)_.\n\n### Please specify which version of Browsersync, node and npm you're running\n\n- Browsersync [    ]\n- Node        [    ]\n- Npm         [    ]\n\n### Affected platforms\n\n- [ ] linux\n- [ ] windows\n- [ ] OS X\n- [ ] freebsd\n- [ ] solaris\n- [ ] other _(please specify which)_\n\n### Browsersync use-case\n\n- [ ] API\n- [ ] Gulp\n- [ ] Grunt\n- [ ] CLI\n\n### If CLI, please paste the entire command below\n\n{cli command here}\n\n### for all other use-cases, (gulp, grunt etc), please show us exactly how you're using Browsersync\n\n{Browsersync init code here}\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [2015] [Shane Osbourne]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n<a href=\"https://www.npmjs.com/package/browser-sync\" title=\"NPM version\">\n <img src=\"https://img.shields.io/npm/v/browser-sync.svg?style=flat-square\" />\n</a>\n<a href=\"https://www.npmjs.com/package/browser-sync\">\n <img src=\"https://img.shields.io/npm/dm/browser-sync.svg?style=flat-square\" />\n</a>\n</p>\n<p align=\"center\"><a href=\"https://www.browsersync.io\"><img src=\"https://raw.githubusercontent.com/BrowserSync/browsersync.github.io/master/public/img/logo-gh.png\" /></a></p>\n<p align=\"center\">Keep multiple browsers & devices in sync when building websites.</p>\n<p align=\"center\">Follow <a href=\"https://twitter.com/browsersync\">@Browsersync</a> on twitter for news & updates.</p>\n<p align=\"center\">Ask questions on <a href=\"https://discord.gg/2d2xUThp\">Discord</a></p>\n\n## Features\n\nPlease visit [browsersync.io](https://browsersync.io) for a full run-down of features\n\n## Requirements\n\nBrowsersync works by injecting an asynchronous script tag (`<script async>...</script>`) right after the `<body>` tag\nduring initial request. In order for this to work properly the `<body>` tag must be present. Alternatively you\ncan provide a custom rule for the snippet using [snippetOptions](https://www.browsersync.io/docs/options/#option-snippetOptions)\n\n## Upgrading from 1.x to 2.x ?\nProviding you haven't accessed any internal properties, everything will just work as\nthere are no breaking changes to the public API. Internally however, we now use an\nimmutable data structure for storing/retrieving options. So whereas before you could access urls like this...\n\n```js\nbrowserSync({server: true}, function(err, bs) {\n  console.log(bs.options.urls.local);\n});\n```\n\n... you now access them in the following way:\n\n```js\nbrowserSync({server: true}, function(err, bs) {\n  console.log(bs.options.getIn([\"urls\", \"local\"]));\n});\n```\n\n## Install and trouble shooting\n\n[browsersync.io docs](https://browsersync.io)\n\n## Integrations / recipes\n\n[Browsersync recipes](https://github.com/Browsersync/recipes)\n\n\n## Support\n\nIf you've found Browser-sync useful and would like to contribute to its continued development & support, please feel free to send a donation of any size - it would be greatly appreciated!\n\n[Support via PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=shakyshane%40gmail%2ecom&lc=US&item_name=browser%2dsync)\n\n## Supported by\n\nOriginally supported by [JH](https://www.wearejh.com) - they provided financial support as well as access to a professional designer to help with Branding.\n\nApache 2\nCopyright (c) 2021 Shane Osbourne\n"
  },
  {
    "path": "changelog.js",
    "content": "const {execSync} = require('child_process');\nlet [start, end] = process.argv.slice(2);\nif (!start || !end)  {\n    console.error('Must provide start and end tags');\n    console.error('  eg: v1.0 HEAD');\n    console.error('  eg: v1.0 v2.0');\n    process.exit(1);\n}\nconst separator = `===END===`;\nconst res = execSync(`git log -E --format=%H%n%s%b===END=== ${start}..${end}`);\nconst sep = res.toString().split(separator);\nconst output = sep\n    .map((item, i) => {\n        const [hash, ...body] = getParts(item, i);\n        const bodyJoined = body.join('\\n');\n        return [hash, bodyJoined];\n    })\n    // .filter(([, body]) => )\n    .map(([hash, bodyJoined]) => {\n        const hasSection = /^[\\w]+: [^ ]/.test(bodyJoined);\n        if (hasSection) {\n            const [section, body] = bodyJoined.split(/: /);\n            return [hash, section, body];\n        }\n        return [hash, 'misc', bodyJoined];\n    })\n    .reduce((acc, item) => {\n        const [, section] = item;\n        if (!acc[section]) {\n            acc[section] = [item];\n        } else {\n            acc[section].push(item);\n        }\n        return acc;\n    }, {});\n\nif (process.argv.indexOf('--json') > -1) {\n    console.log(JSON.stringify(output, null, 2));\n} else {\n    Object.keys(output)\n        .map(x => [x, output[x]])\n        .forEach(([section, items]) => {\n            const header = `**${section}**`;\n            console.log(header);\n            items.forEach(([hash, section, body]) => {\n                console.log(`- ${body} ${hash}`)\n            });\n            console.log('')\n        });\n}\n\n\n\nfunction getParts(item, index) {\n    const segs = item.split('\\n');\n    if (index === 0) return segs;\n    return segs.slice(1);\n}"
  },
  {
    "path": "examples/404.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will redirect all 404 requests to a\n * custom 404.html page\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init(\n    {\n        files: [\"app/css/*.css\"],\n        server: {\n            baseDir: \"app\"\n        }\n    },\n    function(err, bs) {\n        bs.addMiddleware(\"*\", function(req, res) {\n            res.writeHead(302, {\n                location: \"404.html\"\n            });\n            res.end(\"Redirecting!\");\n        });\n    }\n);\n"
  },
  {
    "path": "examples/basic/run.js",
    "content": "const bs = require(\"../../packages/browser-sync/dist/index\").create();\nconst path = require(\"path\");\nconst serverDir = path.join(__dirname, \"..\", \"..\", \"packages/browser-sync/test/fixtures\");\n\nbs.init(\n    {\n        server: serverDir,\n        open: false,\n        watch: true,\n        online: false\n    },\n    (err, bs) => {\n        const message = {\n            kind: \"ready\",\n            urls: bs.options.get(\"urls\").toJS(),\n            cwd: serverDir\n        };\n        if (process.send) {\n            process.send(message);\n        } else {\n            console.log(message);\n        }\n    }\n);\n"
  },
  {
    "path": "examples/callback.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example shows how you can access information about Browsersync when it's running\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nvar config = {\n    proxy: \"localhost:8000\",\n    files: [\"app/css/*.css\"]\n};\n\nbrowserSync.init(config, function(err, bs) {\n    // Full access to Browsersync object here\n    console.log(bs.getOption(\"urls\"));\n});\n"
  },
  {
    "path": "examples/express.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync express\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a server & use the `app` directory as the root\n *  + use any custom routes you have registered with Express\n *\n */\n\n\"use strict\";\n\nvar bs = require(\"browser-sync\").create();\nvar express = require(\"express\");\nvar router = express.Router();\nvar app = express();\n\n/**\n * Catch a route like /user/2324\n * and send a JSON response\n */\nrouter.get(\"/user/:id\", function(req, res) {\n    res.send({\n        name: \"shane\",\n        pets: [\"cat\", \"hippo\"],\n        id: req.params.id\n    });\n});\n\n/**\n * Register the route with Express\n */\napp.use(router);\n\n/**\n * Start the Browsersync server and\n * load the express app as middleware\n */\nbs.init({\n    server: \"./app\",\n    middleware: [app]\n});\n"
  },
  {
    "path": "examples/less.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will serve .less files\n * and allow them to be injected as a css file would be.\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    server: [\"test/fixtures\"],\n    open: false,\n    watch: true,\n    injectFileTypes: [\"css\", \"less\"],\n    middleware: [\n        (req, res, next) => {\n            if (req.url.indexOf(\"bootstrap.less\") > -1) {\n                res.setHeader(\"content-type\", \"text/css\");\n            }\n            next();\n        }\n    ]\n});\n"
  },
  {
    "path": "examples/middleware.css.injection.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync less\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will process less files on the file and auto-inject them into\n * all browsers.\n *\n * Instead of .css, use <link rel='stylesheet' href='main.less'> with the following\n * Configuration to enable a super-fast development workflow.\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    /**\n     * Which files to watch for changes\n     */\n    files: \"src/*.less\",\n    /**\n     * Base directory\n     */\n    server: \"app\",\n    /**\n     * Add .less to the list of files that will cause injection (instead of reload)\n     */\n    injectFileTypes: [\"less\"],\n    /**\n     * Catch all requests, if any are for .less files, recompile on the fly and\n     * send back a CSS response\n     */\n    middleware: function(req, res, next) {\n        var parsed = require(\"url\").parse(req.url);\n        if (parsed.pathname.match(/\\.less$/)) {\n            return less(parsed.pathname).then(function(o) {\n                res.setHeader(\"Content-Type\", \"text/css\");\n                res.end(o.css);\n            });\n        }\n        next();\n    }\n});\n\nfunction less(src) {\n    var f = require(\"fs\")\n        .readFileSync(\"src/\" + src)\n        .toString();\n    return require(\"less\").render(f);\n}\n"
  },
  {
    "path": "examples/notify-styles.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"../\").create();\n\nbrowserSync.init({\n    open: false, // Stop auto open browser\n    notify: {\n        styles: [\n            \"display: none;\",\n            \"padding: 6px 15px 3px;\",\n            \"position: fixed;\",\n            \"font-size: 40px;\",\n            \"z-index: 9999;\",\n            \"left: 0px;\",\n            \"bottom: 0px;\",\n            \"color: rgb(74, 74, 74);\",\n            \"background-color: rgb(17, 17, 17);\",\n            \"color: rgb(229, 229, 229);\"\n        ]\n    },\n    server: {\n        baseDir: \"test/fixtures\"\n    }\n});\n"
  },
  {
    "path": "examples/options.snippetOptions.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example shows how you can place the snippet anywhere.\n */\n\n\"use strict\";\n\nvar path = require(\"path\");\nvar browserSync = require(\"../packages/browser-sync\").create();\nvar cwd = path.join(__dirname, \"..\");\nvar fixtures_dir = path.join(cwd, \"packages/browser-sync/test/fixtures\");\n\nbrowserSync.init({\n    files: [path.join(fixtures_dir, \"css/*.css\")],\n    server: fixtures_dir,\n    snippetOptions: {\n        rule: {\n            match: /<\\/head>/i,\n            fn: function (snippet, match) {\n                return snippet + match;\n            },\n        },\n    },\n});\n"
  },
  {
    "path": "examples/proxy.gzip.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync compression\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will proxy to your existing vhost\n * and serve gzipped responses\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\nvar compression = require(\"compression\");\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    proxy: {\n        target: \"http://yourlocal.dev\",\n        middleware: compression()\n    }\n});\n"
  },
  {
    "path": "examples/proxy.headers.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example shows how to specify the proxy headers for each request\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    proxy: {\n        target: \"localhost:8000\",\n        reqHeaders: function(config) {\n            /**\n             * These are the default headers as a guide for you.\n             * You can set whatever you want here.\n             */\n            return {\n                host: config.urlObj.host,\n                \"accept-encoding\": \"identity\",\n                agent: false\n            };\n        }\n    }\n});\n"
  },
  {
    "path": "examples/proxy.localhost.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will wrap your existing server in a proxy url.\n * Use the new Proxy url to access your site.\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    proxy: \"localhost:8000\"\n});\n"
  },
  {
    "path": "examples/proxy.middleware.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a proxy server and run middlewares\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    proxy: {\n        target: \"http://yourlocal.dev\",\n        middleware: function(req, res, next) {\n            console.log(req.url);\n            next();\n        }\n    },\n    https: true\n});\n"
  },
  {
    "path": "examples/proxy.middleware.multi.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a proxy server and run middlewares\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nvar fn1 = function(req, res, next) {\n    console.log(req.url);\n    next();\n};\n\nvar fn2 = function(req, res, next) {\n    console.log(req.headers);\n    next();\n};\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    proxy: {\n        target: \"http://yourlocal.dev\",\n        middleware: [fn1, fn2]\n    },\n    https: true\n});\n"
  },
  {
    "path": "examples/proxy.proxyRes.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will proxy http://www.bbc.co.uk and\n * add headers to the response *after* it's returned from\n * the server.\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    proxy: {\n        target: \"http://www.bbc.co.uk\",\n        proxyRes: [\n            function(res) {\n                res.headers[\"cache-control\"] = \"private\";\n            }\n        ]\n    }\n});\n"
  },
  {
    "path": "examples/proxy.rewriteRules.advanced.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync serve-static\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will\n *  1. create a proxy server for a live magento website\n *  2. serve static assets from your local `assets` directory\n *  3. rewrite HTML on the fly to make the live site use your local assets\n *\n *      eg:      <link rel=\"stylesheet\" href=\"http://www.magento-site.com/skin/frontend/rwd/assets/css/core.min.css\"></link>\n *      becomes: <link rel=\"stylesheet\" href=\"//localhost:3000/assets/css/core.css\"></link>\n *\n *      eg:      <script src=\"http://www.magento-site.com/skin/frontend/rwd/assets/js/dist.js\"></script>\n *      becomes: <script src=\"//localhost:3000/assets/js/dist.js\"></script>\n *\n *  4. watch files in the assets directory and reload/inject when anything changes\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    proxy: \"http://www.magento-site.com\",\n    files: [\"assets\"],\n    middleware: require(\"serve-static\")(\".\"),\n    rewriteRules: [\n        {\n            match: new RegExp(\"skin/frontend/rwd/(.+?)(?=['\\\"])\", \"g\"),\n            replace: \"assets/$1\"\n        }\n    ]\n});\n"
  },
  {
    "path": "examples/proxy.rewriteRules.simple.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync serve-static\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will\n *  1. create a proxy server for a live magento website\n *  2. serve static assets from your local `assets` directory\n *  3. rewrite HTML on the fly to make the live site use your local assets/css/core.css file\n *\n *      eg:      <link rel=\"stylesheet\" href=\"http://www.magento-site.com/skin/frontend/rwd/assets/css/core.min.css\"></link>\n *      becomes: <link rel=\"stylesheet\" href=\"//localhost:3000/assets/css/core.css\"></link>\n *\n *  4. watch files in the assets directory and reload/inject when anything changes\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    proxy: \"http://www.magento-site.com\",\n    files: [\"assets\"],\n    middleware: require(\"serve-static\")(\".\"),\n    rewriteRules: [\n        {\n            match: \"skin/frontend/rwd/assets/css/core.min.css\",\n            replace: \"assets/css/core.css\"\n        }\n    ]\n});\n"
  },
  {
    "path": "examples/proxy.secure.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a proxy server using https\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    proxy: \"https://yourlocal.dev\"\n});\n"
  },
  {
    "path": "examples/proxy.vhost.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will wrap your existing server in a proxy url.\n * Use the new Proxy url to access your site.\n *\n */\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    files: \"app/css/*.css\",\n    proxy: \"yourvhost.dev\"\n});\n"
  },
  {
    "path": "examples/server.basedir.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a server & use the `app` directory as the root\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    server: {\n        baseDir: \"app\"\n    }\n});\n"
  },
  {
    "path": "examples/server.basedir.mulitple.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a server & use the `app` & `dist` directories for serving files\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    server: {\n        baseDir: [\"app\", \"dist\"]\n    }\n});\n"
  },
  {
    "path": "examples/server.default.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a server in the cwd.\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    server: true\n});\n"
  },
  {
    "path": "examples/server.gzip.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync compression\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a server with gzip enabled\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\nvar compression = require(\"compression\");\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    server: {\n        baseDir: \"app\",\n        middleware: compression()\n    }\n});\n"
  },
  {
    "path": "examples/server.http2.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync http2\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a server using http2 using the default information & use the `app` directory as the root\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    server: {\n        baseDir: \"app\"\n    },\n    https: true,\n    httpModule: \"http2\"\n});\n"
  },
  {
    "path": "examples/server.latency.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a server & use the `app` directory as the root\n *  - any requests beginning with /json will have fake latency applied\n *  - for 3 seconds\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nfunction fakeLatency(req, res, next) {\n    if (req.url.match(/^\\/json/)) {\n        setTimeout(next, 3000);\n    } else {\n        next();\n    }\n}\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    server: \"app\",\n    middleware: [fakeLatency]\n});\n"
  },
  {
    "path": "examples/server.middleware.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a server & use the `app` directory as the root\n *  + use your custom middleware. Note: middleware will be added before\n *  any Browsersync middlewares\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    server: {\n        baseDir: \"app\",\n        middleware: function(req, res, next) {\n            console.log(\"hi from the middleware\");\n            next();\n        }\n    }\n});\n"
  },
  {
    "path": "examples/server.middleware.multiple.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a server & use the `app` directory as the root\n *  + use your custom middleware. Note: middleware will be added before\n *  any Browsersync middlewares\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    server: {\n        baseDir: \"app\",\n        middleware: [\n            function(req, res, next) {\n                console.log(\"hi from the first middleware\");\n                next();\n            },\n            function(req, res, next) {\n                console.log(\"hi from the second middleware\");\n                next();\n            }\n        ]\n    }\n});\n"
  },
  {
    "path": "examples/server.proxy.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync express http-proxy-middleware\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a server in the cwd whilst proxying requests\n * to /api to a backend\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\nvar express = require('express');\nvar proxy = require('http-proxy-middleware');\n\nvar app = express();\n\napp.use('/api', proxy({target: 'http://www.example.org', changeOrigin: true}));\n\nbrowserSync.init({\n    server: \".\",\n    watch: true,\n    middleware: [app]\n});\n"
  },
  {
    "path": "examples/server.secure.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a server using https using the default information & use the `app` directory as the root\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    server: {\n        baseDir: \"app\"\n    },\n    https: true\n});\n"
  },
  {
    "path": "examples/server.secure.pfx.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a server using https using a PFX certificate & use the `app` directory as the root\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    files: [\"app/css/*.css\"],\n    server: {\n        baseDir: \"app\"\n    },\n    https: {\n        pfx: \"certs/browsersync.pfx\"\n    }\n});\n"
  },
  {
    "path": "examples/server.watch.js",
    "content": "/**\n *\n * Install:\n *      npm install browser-sync\n *\n * Run:\n *      node <yourfile.js>\n *\n * This example will create a server using https using the default information & use the `app` directory as the root\n *\n */\n\n\"use strict\";\n\nvar browserSync = require(\"browser-sync\").create();\n\nbrowserSync.init({\n    server: \"test/fixtures\",\n    watch: true\n});\n"
  },
  {
    "path": "examples/snippet/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"UTF-8\" />\n        <meta\n            name=\"viewport\"\n            content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\"\n        />\n        <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\" />\n        <title>Document</title>\n    </head>\n    <body>\n        <h1>Hello world</h1>\n    </body>\n</html>\n"
  },
  {
    "path": "examples/snippet/run.js",
    "content": "const bs = require(\"../../packages/browser-sync/dist/index\").create();\nbs.init(\n    {\n        server: \".\",\n        open: false,\n        notify: false,\n        watch: true,\n        snippetOptions: {\n            rule: {\n                match: /<\\/head>/i,\n                fn: function(snippet, match) {\n                    return snippet + match;\n                }\n            }\n        }\n    },\n    (err, bs) => {\n        const message = {\n            kind: \"ready\",\n            urls: bs.options.get(\"urls\").toJS(),\n            cwd: __dirname\n        };\n        if (process.send) {\n            process.send(message);\n        } else {\n            console.log(message);\n        }\n    }\n);\n"
  },
  {
    "path": "lerna.json",
    "content": "{\n  \"packages\": [\n    \"packages/*\"\n  ],\n  \"version\": \"3.0.4\"\n}\n"
  },
  {
    "path": "nx.json",
    "content": "{\n  \"tasksRunnerOptions\": {\n    \"default\": {\n      \"runner\": \"nx/tasks-runners/default\",\n      \"options\": {\n        \"cacheableOperations\": [\n          \"build\"\n        ]\n      }\n    }\n  },\n  \"targetDefaults\": {\n    \"build\": {\n      \"dependsOn\": [\n        \"^build\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n\t\"private\": true,\n\t\"name\": \"browser-sync-mono\",\n\t\"scripts\": {\n\t\t\"bootstrap\": \"lerna bootstrap\",\n\t\t\"postinstall\": \"npm run bootstrap\",\n\t\t\"test\": \"lerna run build && lerna run test --scope browser-sync\",\n\t\t\"test:e2e\": \"echo skipping cypress\",\n\t\t\"test:playwright\": \"playwright test\"\n\t},\n\t\"devDependencies\": {\n\t\t\"lerna\": \"^6.1.0\"\n\t},\n\t\"dependencies\": {\n\t\t\"@playwright/test\": \"^1.43.0\",\n\t\t\"rxjs\": \"^7.5.4\",\n\t\t\"zod\": \"^3.22.2\"\n\t},\n\t\"nx\": {}\n}\n"
  },
  {
    "path": "packages/browser-sync/.gitignore",
    "content": "/dist/*\n"
  },
  {
    "path": "packages/browser-sync/.prettierignore",
    "content": ""
  },
  {
    "path": "packages/browser-sync/certs/gen.sh",
    "content": "openssl genrsa -des3 -out server.key 2048\nopenssl req -new -key server.key -out server.csr\nopenssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt\ncp server.key server.key.copy\nopenssl rsa -in server.key.copy -out server.key\nrm server.key.copy\n"
  },
  {
    "path": "packages/browser-sync/certs/server.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDBjCCAe4CCQCir/8eGDIE/jANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJH\nQjETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0\ncyBQdHkgTHRkMB4XDTE3MDQxMDExNDcyNloXDTI3MDQwODExNDcyNlowRTELMAkG\nA1UEBhMCR0IxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0\nIFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nAMRLR2crKB4X/9pM3gR641iDscZWW3aqo70nUDxzo5Bhk8uupqz0EfdRoCLCUeQi\nxVp3HJ1HqnilMW7dETGGkDHKdxJRjrkBrYHhE3Kw/LCC4tEb400F6Ikm6OudVPIB\nP+CuwfNAw70KHSx/CtIrbTz0HhDC6XN0azp39pDLRBnWWluz3iU+rFLMx7YT2Q8k\n1nQAwcXkzLjeU7txAt2pYGQUgvBQETO5RI7QQ0CmwaV4gfHWGABBTX34WQun7g1Q\nYukrG3/4fVeNLzGW787FKCvL07BTymJTwXXbTTPXg4chw9p+YkLLPrr+AOVe/PF1\nMJppDT3gKdKMHFo3vMycUf0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAEVmUYRrT\nfCQmBDox3evqj4n8dJVStjgdw/7BPkm49SmGtaxsST/eUSGwT7dTvZBLov6BK/OW\n+arhHZIvUY/DXlsV4NfCM4TK8KVefrwgd8ZsfQJW73L+FB0IOAY/6s+YKHm/wQGF\nptSOycJvEltsqfIegtYcvvD6c6SkSOvqApaF+Ai10+yiLe20KyOvM3PefZLV7mFE\n0zCNyglZ75HftvHHV0wh82T2Et/R+txH+6dTwh065Dd6rrDzljtcAd2HC7B26ERK\ndA2zJd9Y4eMz8osacmG/afVuR9rqtFGwdyZ1Kb5xQRzGWlrjvSmAFUx9W9iA4Ilv\n3+56a5njSTFYKw==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "packages/browser-sync/certs/server.csr",
    "content": "-----BEGIN CERTIFICATE REQUEST-----\nMIICoTCCAYkCAQAwRTELMAkGA1UEBhMCR0IxEzARBgNVBAgMClNvbWUtU3RhdGUx\nITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN\nAQEBBQADggEPADCCAQoCggEBAMRLR2crKB4X/9pM3gR641iDscZWW3aqo70nUDxz\no5Bhk8uupqz0EfdRoCLCUeQixVp3HJ1HqnilMW7dETGGkDHKdxJRjrkBrYHhE3Kw\n/LCC4tEb400F6Ikm6OudVPIBP+CuwfNAw70KHSx/CtIrbTz0HhDC6XN0azp39pDL\nRBnWWluz3iU+rFLMx7YT2Q8k1nQAwcXkzLjeU7txAt2pYGQUgvBQETO5RI7QQ0Cm\nwaV4gfHWGABBTX34WQun7g1QYukrG3/4fVeNLzGW787FKCvL07BTymJTwXXbTTPX\ng4chw9p+YkLLPrr+AOVe/PF1MJppDT3gKdKMHFo3vMycUf0CAwEAAaAXMBUGCSqG\nSIb3DQEJBzEIDAYxMjM0NTYwDQYJKoZIhvcNAQELBQADggEBABlVUaWK/UUovgPZ\n+rqNG8/j6aggSCCye9CkauLB/WqhQFfLl9lWTYdUVmWweNU0SJwDU9lWF/TngipF\nRZs6501DkXKxaDT9/3JYg4lRz6zHLy+a77pavJOeN0+cFAPZZuGyxZvYHFYPVSVH\nEeJL6bO/nZ/ARgIp0YNkQblDarxq1ARj7YT1Z24D5KgO1kQ55+fCY/wtct8TLGk9\nujvWBbFEBSrJCDjRQeSctlP5qG8yfeJqZwZzo4PQMUwABhNLGUz0z0ceK8W1QnOm\nT+nCN5Fni04wO4dAZvYPp6wmU0Gpi2XBihbFl9CT3B5AmJmM8hQVpuQlmXeXT0FO\npOZFpko=\n-----END CERTIFICATE REQUEST-----\n"
  },
  {
    "path": "packages/browser-sync/certs/server.key",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAxEtHZysoHhf/2kzeBHrjWIOxxlZbdqqjvSdQPHOjkGGTy66m\nrPQR91GgIsJR5CLFWnccnUeqeKUxbt0RMYaQMcp3ElGOuQGtgeETcrD8sILi0Rvj\nTQXoiSbo651U8gE/4K7B80DDvQodLH8K0ittPPQeEMLpc3RrOnf2kMtEGdZaW7Pe\nJT6sUszHthPZDyTWdADBxeTMuN5Tu3EC3algZBSC8FARM7lEjtBDQKbBpXiB8dYY\nAEFNffhZC6fuDVBi6Ssbf/h9V40vMZbvzsUoK8vTsFPKYlPBddtNM9eDhyHD2n5i\nQss+uv4A5V788XUwmmkNPeAp0owcWje8zJxR/QIDAQABAoIBADbeT/wvnQwkazkL\nCXg5HXltfnDRTMmz0wcZiR0MueiuzdA+ZoqrwqXeJCPzK07YxU+PQelY0fbdPh8e\nHiM42O+CB5yQPZPLO0O1tWj2vftc6qfG4tdx0lkcDjlmBguLe96DGuWy8cPSousA\nK/cpemRyXEEVKopCPYLfa4V3u/Z4be2U/39KNjVkHFhSdSYQl6ferhEfUPwTPi7O\n7l1/QUBabqN5FzNc2TeMVhhcJkXtYqF3RxGsaRfT0lK/j2hpbX7Bn2T0CfA/40jY\n2OCERqFPfZWx/ShTT52b3fyX/FEua7Nukq/MZdYZou63dDIjCQQyTJSflX6lVojO\nSuUoumECgYEA6CSkLiKcRLlTfec3LkjqkWtXR5ibL33g/H1fsZEQKFOyMbIXpUkX\nHybpku8NGeetjKynO3yRirp+NiBHGPn3cHc9WJ5GGG1ew9hRQ9QzyC3Tit15TDbu\nJ8i50/MaQHZSiUCnPQ/ceIZCNz8STcsEz87o/7utRLJKOvIIAPj+/8kCgYEA2Hd/\nv5oUroMRbtzPtMJDMHiGEQyNxEGDNqcuxgXSmiEEqPLfk2qR3yLffzA9UQOg4wkX\n/dSXsyomPriKWTvADXu1lNdkPGmW/1tk+onnHu6qgOalva30ZKhtteVjUqxEJEke\nmHhNHyIVuj6lExLw9LZhVvzoOi+aj4AD+DRS4pUCgYBEtuveOCJ3eUAMiY9c5PqB\n9vsL11FAOouJUXcs8VqOBVA+w4+aPktYzkTfWGFRZLGLbWPHCPVv0gof7Wf+Laef\no7wF6junaWBeqj5LzJlTTLVMaohIFg5iuli/Mzt3D08ZD4kxWuuQxXT+M24wlsKi\n3IU9hYkhR4EPd6sE1q9seQKBgEpQRBAgModywbJgpgH1SyHBzqzdtXGx1/0USg97\ngkCdoz7pGm4+gNOs4jOE+Rft+fbXcWAX8vh0OOsBaaWWyKkYVk9B3syKp2cFFlaY\nrzrETs6v4CiNJsDDvd5bYMzKDR6z54gKjNdqWTE2Pm+c6hHo5uP5MTSAkTxAg5xb\nQjU9AoGAaYPXlm3IKVO12FgNg/ffduooi0PKa1yRNJGnhpQKNvBQXs8eV+CQ83aK\nkQHUExuJDrOfsC2iwF/2ZywXhEfbhL7ar0aw5zrhV+r7qvYFWxu/YoLoNVMDByw5\nwAN0oIbsGWYmtIIti8+b9IcacTbAZ79ctlTLb1HCyPMosHxDkv8=\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "packages/browser-sync/cli-options/opts.init.json",
    "content": "{}"
  },
  {
    "path": "packages/browser-sync/cli-options/opts.recipe.json",
    "content": "{\n  \"output\": {\n    \"alias\": \"o\",\n    \"desc\": \"Specify an output directory\"\n  }\n}\n"
  },
  {
    "path": "packages/browser-sync/cli-options/opts.reload.json",
    "content": "{\n  \"files\": {\n    \"desc\": \"File paths to reload\",\n    \"type\": \"array\",\n    \"alias\": \"f\"\n  },\n  \"port\": {\n    \"alias\": \"p\",\n    \"type\": \"number\",\n    \"desc\": \"Target a running instance by port number\"\n  },\n  \"url\": {\n    \"alias\": \"u\",\n    \"desc\": \"Provide the full the url to the running Browsersync instance\"\n  }\n}\n"
  },
  {
    "path": "packages/browser-sync/cli-options/opts.start.json",
    "content": "{\n  \"server\": {\n    \"alias\": \"s\",\n    \"desc\": \"Run a Local server (uses your cwd as the web root)\"\n  },\n  \"cwd\": {\n    \"type\": \"string\",\n    \"desc\": \"Working directory\"\n  },\n  \"json\": {\n    \"type\": \"boolean\",\n    \"desc\": \"If true, certain logs will output as json only\"\n  },\n  \"serveStatic\": {\n    \"type\": \"array\",\n    \"alias\": \"ss\",\n    \"desc\": \"Directories to serve static files from\"\n  },\n  \"port\": {\n    \"type\": \"number\",\n    \"desc\": \"Specify a port to use\"\n  },\n  \"proxy\": {\n    \"alias\": \"p\",\n    \"desc\": \"Proxy an existing server\",\n    \"example\": \"$0 shane is cool\"\n  },\n  \"ws\": {\n    \"type\": \"boolean\",\n    \"desc\": \"Proxy mode only - enable websocket proxying\"\n  },\n  \"browser\": {\n    \"type\": \"array\",\n    \"alias\": \"b\",\n    \"desc\": \"Choose which browser should be auto-opened\"\n  },\n  \"watch\": {\n    \"type\": \"boolean\",\n    \"alias\": \"w\",\n    \"desc\": \"Watch files\"\n  },\n  \"ignore\": {\n    \"type\": \"array\",\n    \"desc\": \"Ignore patterns for file watchers\"\n  },\n  \"files\": {\n    \"type\": \"array\",\n    \"alias\": \"f\",\n    \"desc\": \"File paths to watch\"\n  },\n  \"index\": {\n    \"type\": \"string\",\n    \"desc\": \"Specify which file should be used as the index page\"\n  },\n  \"plugins\": {\n    \"type\": \"array\",\n    \"desc\": \"Load Browsersync plugins\"\n  },\n  \"extensions\": {\n    \"type\": \"array\",\n    \"desc\": \"Specify file extension fallbacks\"\n  },\n  \"startPath\": {\n    \"type\": \"string\",\n    \"desc\": \"Specify the start path for the opened browser\"\n  },\n  \"single\": {\n    \"type\": \"boolean\",\n    \"desc\": \"If true, the connect-history-api-fallback middleware will be added\"\n  },\n  \"https\": {\n    \"desc\": \"Enable SSL for local development\"\n  },\n  \"directory\": {\n    \"type\": \"boolean\",\n    \"desc\": \"Show a directory listing for the server\"\n  },\n  \"tunnel\": {\n    \"desc\": \"Use a public URL\"\n  },\n  \"open\": {\n    \"type\": \"string\",\n    \"desc\": \"Choose which URL is auto-opened (local, external or tunnel), or provide a url\"\n  },\n  \"cors\": {\n    \"type\": \"boolean\",\n    \"desc\": \"Add Access Control headers to every request\"\n  },\n  \"config\": {\n    \"type\": \"string\",\n    \"alias\": \"c\",\n    \"desc\": \"Specify a path to a configuration file\"\n  },\n  \"host\": {\n    \"desc\": \"Specify a hostname to use\"\n  },\n  \"listen\": {\n    \"desc\": \"Specify a hostname bind to (this will prevent binding to all interfaces)\"\n  },\n  \"logLevel\": {\n    \"desc\": \"Set the logger output level (silent, info or debug)\"\n  },\n  \"reload-delay\": {\n    \"type\": \"number\",\n    \"desc\": \"Time in milliseconds to delay the reload event following file changes\"\n  },\n  \"reload-debounce\": {\n    \"type\": \"number\",\n    \"desc\": \"Restrict the frequency in which browser:reload events can be emitted to connected clients\"\n  },\n  \"ui-port\": {\n    \"type\": \"number\",\n    \"desc\": \"Specify a port for the UI to use\"\n  },\n  \"watchEvents\": {\n    \"type\": \"array\",\n    \"desc\": \"Specify which file events to respond to\"\n  },\n  \"no-notify\": {\n    \"desc\": \"Disable the notify element in browsers\"\n  },\n  \"no-open\": {\n    \"desc\": \"Don't open a new browser window\"\n  },\n  \"no-snippet\": {\n    \"desc\": \"Disable the snippet injection\"\n  },\n  \"no-online\": {\n    \"desc\": \"Force offline usage\"\n  },\n  \"no-ui\": {\n    \"desc\": \"Don't start the user interface\"\n  },\n  \"no-ghost-mode\": {\n    \"desc\": \"Disable Ghost Mode\"\n  },\n  \"no-inject-changes\": {\n    \"desc\": \"Reload on every file change\"\n  },\n  \"no-reload-on-restart\": {\n    \"desc\": \"Don't auto-reload all browsers following a restart\"\n  }\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/args.js",
    "content": "\"use strict\";\n\n/**\n * The purpose of this function is\n * to handle back-backwards compatibility\n * @param {Object} args\n * @returns {{config: {}, cb: *}}\n */\nmodule.exports = function(args) {\n    var config = {};\n    var cb;\n\n    switch (args.length) {\n        case 1:\n            if (isFilesArg(args[0])) {\n                config.files = args[0];\n            } else if (typeof args[0] === \"function\") {\n                cb = args[0];\n            } else {\n                config = args[0];\n            }\n\n            break;\n\n        case 2:\n            // if second is a function, first MUST be config\n            if (typeof args[1] === \"function\") {\n                config = args[0] || {};\n                cb = args[1];\n            } else {\n                if (args[1] === null || args[1] === undefined) {\n                    config = args[0];\n                } else {\n                    // finally, second arg could be a plain object for config\n                    config = args[1] || {};\n\n                    if (!config.files) {\n                        config.files = args[0];\n                    }\n                }\n            }\n\n            break;\n\n        case 3:\n            config = args[1] || {};\n\n            if (!config.files) {\n                config.files = args[0];\n            }\n\n            cb = args[2];\n    }\n\n    return {\n        config: config,\n        cb: cb\n    };\n};\n\n/**\n * Files args were only ever strings or arrays\n * @param arg\n * @returns {*|boolean}\n */\nfunction isFilesArg(arg) {\n    return Array.isArray(arg) || typeof arg === \"string\";\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/async-tasks.js",
    "content": "var async = require(\"./async\");\n\nmodule.exports = [\n    {\n        step: \"Finding an empty port\",\n        fn: async.getEmptyPort\n    },\n    {\n        step: \"Getting an extra port for Proxy\",\n        fn: async.getExtraPortForProxy\n    },\n    {\n        step: \"Checking online status\",\n        fn: async.getOnlineStatus\n    },\n    {\n        step: \"Resolve user plugins from options\",\n        fn: async.resolveInlineUserPlugins\n    },\n    {\n        step: \"Set Urls and other options that rely on port/online status\",\n        fn: async.setOptions\n    },\n    {\n        step: \"Setting Internal Events\",\n        fn: async.setInternalEvents\n    },\n    {\n        step: \"Setting file watchers\",\n        fn: async.setFileWatchers\n    },\n    {\n        step: \"Merging middlewares from core + plugins\",\n        fn: async.mergeMiddlewares\n    },\n    {\n        step: \"Starting the Server\",\n        fn: async.startServer\n    },\n    {\n        step: \"Starting the HTTPS Tunnel\",\n        fn: async.startTunnel\n    },\n    {\n        step: \"Starting the web-socket server\",\n        fn: async.startSockets\n    },\n    {\n        step: \"Starting the UI\",\n        fn: async.startUi\n    },\n    {\n        step: \"Merge UI settings\",\n        fn: async.mergeUiSettings\n    },\n    {\n        step: \"Init user plugins\",\n        fn: async.initUserPlugins\n    }\n];\n"
  },
  {
    "path": "packages/browser-sync/lib/async.js",
    "content": "\"use strict\";\n\nvar _ = require(\"./lodash.custom\");\nvar Immutable = require(\"immutable\");\n\nvar utils = require(\"./utils\");\nvar pluginUtils = require(\"./plugins\");\nvar connectUtils = require(\"./connect-utils\");\nvar chalk       = require(\"chalk\");\n\nmodule.exports = {\n    /**\n     * BrowserSync needs at least 1 free port.\n     * It will check the one provided in config\n     * and keep incrementing until an available one is found.\n     * @param {BrowserSync} bs\n     * @param {Function} done\n     */\n    getEmptyPort: function(bs, done) {\n        utils.getPorts(bs.options, function(err, port) {\n            if (err) {\n                return utils.fail(true, err, bs.cb);\n            }\n            bs.debug(\"Found a free port: %s\", chalk.magenta(port));\n            done(null, {\n                options: {\n                    port: port\n                }\n            });\n        });\n    },\n    /**\n     * If the running mode is proxy, we'll use a separate port\n     * for the Browsersync web-socket server. This is to eliminate any issues\n     * with trying to proxy web sockets through to the users server.\n     * @param bs\n     * @param done\n     */\n    getExtraPortForProxy: function(bs, done) {\n        /**\n         * An extra port is not needed in snippet/server mode\n         */\n        if (bs.options.get(\"mode\") !== \"proxy\") {\n            return done();\n        }\n\n        /**\n         * Web socket support is disabled by default\n         */\n        if (!bs.options.getIn([\"proxy\", \"ws\"])) {\n            return done();\n        }\n\n        /**\n         * Use 1 higher than server port by default...\n         */\n        var socketPort = bs.options.get(\"port\") + 1;\n\n        /**\n         * Or use the user-defined socket.port option instead\n         */\n        if (bs.options.hasIn([\"socket\", \"port\"])) {\n            socketPort = bs.options.getIn([\"socket\", \"port\"]);\n        }\n\n        utils.getPort(\n            bs.options.get(\"listen\", \"localhost\"),\n            socketPort,\n            null,\n            function(err, port) {\n                if (err) {\n                    return utils.fail(true, err, bs.cb);\n                }\n                done(null, {\n                    optionsIn: [\n                        {\n                            path: [\"socket\", \"port\"],\n                            value: port\n                        }\n                    ]\n                });\n            }\n        );\n    },\n    /**\n     * Some features require an internet connection.\n     * If the user did not provide either `true` or `false`\n     * for the online option, we will attempt to resolve www.google.com\n     * as a way of determining network connectivity\n     * @param {BrowserSync} bs\n     * @param {Function} done\n     */\n    getOnlineStatus: function(bs, done) {\n        if (\n            _.isUndefined(bs.options.get(\"online\")) &&\n            _.isUndefined(process.env.TESTING)\n        ) {\n            require(\"dns\").resolve(\"www.google.com\", function(err) {\n                var online = false;\n                if (err) {\n                    bs.debug(\n                        \"Could not resolve www.google.com, setting %s\",\n                        chalk.magenta(\"online: false\")\n                    );\n                } else {\n                    bs.debug(\n                        \"Resolved www.google.com, setting %s\",\n                        chalk.magenta(\"online: true\")\n                    );\n                    online = true;\n                }\n                done(null, {\n                    options: {\n                        online: online\n                    }\n                });\n            });\n        } else {\n            done();\n        }\n    },\n    /**\n     * Try to load plugins that were given in options\n     * @param {BrowserSync} bs\n     * @param {Function} done\n     */\n    resolveInlineUserPlugins: function(bs, done) {\n        var plugins = bs.options\n            .get(\"plugins\")\n            .map(pluginUtils.resolvePlugin)\n            .map(pluginUtils.requirePlugin);\n\n        plugins.forEach(function(plugin) {\n            if (plugin.get(\"errors\").size) {\n                return logPluginError(plugin);\n            }\n            var jsPlugin = plugin.toJS();\n            jsPlugin.options = jsPlugin.options || {};\n            jsPlugin.options.moduleName = jsPlugin.moduleName;\n            bs.registerPlugin(jsPlugin.module, jsPlugin.options);\n        });\n\n        function logPluginError(plugin) {\n            utils.fail(true, plugin.getIn([\"errors\", 0]), bs.cb);\n        }\n\n        done();\n    },\n    /**\n     *\n     * @param {BrowserSync} bs\n     * @param {Function} done\n     */\n    setOptions: function(bs, done) {\n        done(null, {\n            options: {\n                urls: utils.getUrlOptions(bs.options),\n                snippet: connectUtils.enabled(bs.options)\n                    ? connectUtils.scriptTags(bs.options)\n                    : false,\n                scriptPaths: Immutable.fromJS(\n                    connectUtils.clientScript(bs.options, true)\n                ),\n                files: bs.pluginManager.hook(\n                    \"files:watch\",\n                    bs.options.get(\"files\"),\n                    bs.pluginManager.pluginOptions\n                )\n            }\n        });\n    },\n    /**\n     * @param {BrowserSync} bs\n     * @param {Function} done\n     */\n    setInternalEvents: function(bs, done) {\n        require(\"./internal-events\")(bs);\n        done();\n    },\n    /**\n     * @param {BrowserSync} bs\n     * @param {Function} done\n     */\n    setFileWatchers: function(bs, done) {\n        done(null, {\n            instance: {\n                watchers: bs.pluginManager.get(\"file:watcher\")(bs)\n            }\n        });\n    },\n    /**\n     * @param {BrowserSync} bs\n     * @param {Function} done\n     */\n    mergeMiddlewares: function(bs, done) {\n        done(null, {\n            options: {\n                middleware: bs.pluginManager.hook(\n                    \"server:middleware\",\n                    bs.options.get(\"middleware\")\n                )\n            }\n        });\n    },\n    /**\n     * @param {BrowserSync} bs\n     * @param {Function} done\n     */\n    startServer: function(bs, done) {\n        var server = bs.pluginManager.get(\"server\")(bs);\n\n        done(null, {\n            instance: {\n                server: server.server,\n                app: server.app\n            }\n        });\n    },\n    /**\n     * @param {BrowserSync} bs\n     * @param {Function} done\n     */\n    startTunnel: function(bs, done) {\n        if (bs.options.get(\"tunnel\") && bs.options.get(\"online\")) {\n            var localTunnel = require(\"./tunnel\");\n            localTunnel(bs, function(err, tunnel) {\n                if (err) {\n                    if (err.code === \"MODULE_NOT_FOUND\") {\n                        return utils.fail(true, err, bs.cb);\n                    }\n                    return done(err);\n                } else {\n                    return done(null, {\n                        optionsIn: [\n                            {\n                                path: [\"urls\", \"tunnel\"],\n                                value: tunnel.url\n                            }\n                        ],\n                        instance: {\n                            tunnel: tunnel\n                        }\n                    });\n                }\n            });\n        } else {\n            done();\n        }\n    },\n    /**\n     * @param {BrowserSync} bs\n     * @param {Function} done\n     */\n    startSockets: function(bs, done) {\n        var clientEvents = bs.pluginManager.hook(\n            \"client:events\",\n            bs.options.get(\"clientEvents\").toJS()\n        );\n\n        // Start the socket, needs an existing server.\n        var io = bs.pluginManager.get(\"socket\")(bs.server, clientEvents, bs);\n\n        done(null, {\n            instance: {\n                io: io\n            },\n            options: {\n                clientEvents: Immutable.fromJS(clientEvents)\n            }\n        });\n    },\n    /**\n     *\n     * @param {BrowserSync} bs\n     * @param {Function} done\n     */\n    startUi: function(bs, done) {\n        var PLUGIN_NAME = \"UI\";\n        var userPlugins = bs.getUserPlugins();\n        var ui = bs.pluginManager.get(PLUGIN_NAME);\n        var uiOpts = bs.options.get(\"ui\");\n\n        if (!uiOpts || uiOpts.get(\"enabled\") === false) {\n            return done();\n        }\n\n        // if user provided a UI, use it instead\n        if (\n            userPlugins.some(function(item) {\n                return item.name === PLUGIN_NAME;\n            })\n        ) {\n            uiOpts = bs.options\n                .get(\"ui\")\n                .mergeDeep(\n                    Immutable.fromJS(\n                        bs.pluginManager.pluginOptions[PLUGIN_NAME]\n                    )\n                );\n        }\n\n        /**\n         * Append the 'listen' option\n         */\n        const opts = uiOpts.update(uiOpts => {\n            const listen = bs.options.get(\"listen\");\n            if (listen) {\n                return uiOpts.set(\"listen\", listen);\n            }\n            return uiOpts;\n        });\n\n        return ui(opts.toJS(), bs, function(err, ui) {\n            if (err) {\n                return done(err);\n            }\n            done(null, {\n                instance: {\n                    ui: ui\n                }\n            });\n        });\n    },\n    /**\n     * @param {BrowserSync} bs\n     * @param {Function} done\n     */\n    mergeUiSettings: function(bs, done) {\n        if (!bs.ui) {\n            return done();\n        }\n\n        done(null, {\n            options: {\n                urls: bs.options.get(\"urls\").merge(bs.ui.options.get(\"urls\"))\n            }\n        });\n    },\n    /**\n     * @param {BrowserSync} bs\n     * @param {Function} done\n     */\n    initUserPlugins: function(bs, done) {\n        bs.pluginManager.initUserPlugins(bs);\n\n        done(null, {\n            options: {\n                userPlugins: bs.getUserPlugins()\n            }\n        });\n    }\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/bin.ts",
    "content": "#!/usr/bin/env node\nconst startOpts = require(\"../cli-options/opts.start.json\");\nconst reloadOpts = require(\"../cli-options/opts.reload.json\");\nconst recipeOpts = require(\"../cli-options/opts.recipe.json\");\nconst chalk      = require(\"chalk\");\nconst pkg = require(\"../package.json\");\nimport * as utils from \"./utils\";\nimport { resolve } from \"path\";\nimport { existsSync } from \"fs\";\nimport { logger } from \"./logger\";\nimport { printErrors } from \"./cli/cli-options\";\n\nexport enum BsErrorLevels {\n    Fatal = \"Fatal\"\n}\n\nexport enum BsErrorTypes {\n    PathNotFound = \"PathNotFound\",\n    HostAndListenIncompatible = \"HostAndListenIncompatible\"\n}\n\nexport type BsErrors = BsError[];\nexport interface BsError {\n    type: BsErrorTypes;\n    level: BsErrorLevels;\n    errors: BsErrorItem[];\n}\nexport interface BsErrorItem {\n    error: Error;\n    meta?(...args): string[];\n}\n\n/**\n * Handle cli input\n */\nif (!module.parent) {\n    runFromCli();\n}\n\nfunction freshYargs() {\n  return require(\"yargs\")(process.argv.slice(2));\n}\n\nfunction runFromCli() {\n    const yargs = freshYargs()\n        .command(\"start\", \"Start the server\")\n        .command(\"init\", \"Create a configuration file\")\n        .command(\"reload\", \"Send a reload event over HTTP protocol\")\n        .command(\"recipe\", \"Generate the files for a recipe\")\n        .version(pkg.version)\n        .help(false)\n        .epilogue(\n            [\n                \"For help running a certain command, type <command> --help\",\n                \"  $0 start --help\",\n                \"\",\n                \"You can run a static server by providing a path(s) directly\",\n                \"  $0 app/src app/tmp\",\n                \"\",\n                \"If the directory contains a 'index.html' file, you can omit any input\",\n                \"  $0\",\n                \"\",\n                \"You can run the proxy in this manner too\",\n                \"  $0 https://example.com\",\n                \"\",\n                \"To run a proxy, whilst also serving static files\",\n                \"  $0 https://example.com htdocs/themes/example\"\n            ].join(\"\\n\")\n        );\n\n    const argv = yargs.argv;\n    const input = argv._;\n    const command = input[0];\n    const valid = [\"start\", \"init\", \"reload\", \"recipe\"];\n\n    if (valid.indexOf(command) > -1) {\n        return handleIncoming(command, freshYargs());\n    }\n\n    if (input.length) {\n        return handleNoCommand(argv, input, freshYargs());\n    }\n\n    if (existsSync(\"index.html\")) {\n        return handleNoCommand(argv, [\".\"], freshYargs());\n    }\n\n    yargs.showHelp();\n}\n\n/**\n * Feature: If no command was specified, try to do the 'right thing'\n *\n * If paths were given, start the server\n *          eg: browser-sync app/code app/design\n * is equal to: browser-sync start --server app/code app/design\n *\n *           eg: browser-sync http://example.com\n * is equal to: browser-sync start --proxy http://example.com\n *\n *           eg: browser-sync http://example.com themes/example\n * is equal to: browser-sync start --proxy http://example.com --ss themes/example\n *\n * @param argv\n * @param input\n * @returns {any}\n */\nfunction handleNoCommand(argv, input, yargs) {\n    const processed = processStart(yargs);\n    const paths = input.map(path => {\n        const resolved = resolve(path);\n        const isUrl = /^https?:\\/\\//.test(path);\n        return {\n            isUrl,\n            userInput: path,\n            resolved,\n            errors: isUrl ? [] : pathErrors(path, resolved)\n        };\n    });\n\n    const withErrors = paths.filter(item => item.errors.length);\n    const withoutErrors = paths.filter(item => item.errors.length === 0);\n\n    if (withErrors.length) {\n        withErrors.forEach(item => {\n            logger.unprefixed(\"error\", printErrors(item.errors));\n        });\n        return process.exit(1);\n    }\n\n    const serveStaticPaths = withoutErrors\n        .filter(item => item.isUrl === false)\n        .map(item => item.resolved);\n\n    const urls = withoutErrors\n        .filter(item => item.isUrl === true)\n        .map(item => item.userInput);\n\n    /**\n     * If a URL was given, switch to proxy mode and use\n     * any other paths as serveStatic options\n     */\n    if (urls.length) {\n        const proxy = urls[0];\n        const config = {\n            ...processed,\n            proxy,\n            serveStatic: serveStaticPaths\n        };\n        return handleCli({ cli: { flags: config, input: [\"start\"] } });\n    }\n\n    /**\n     * if NO urls were given switch directly to server mode\n     * @type {{server: {baseDir: any}}}\n     */\n    const config = {\n        ...processed,\n        server: { baseDir: serveStaticPaths }\n    };\n\n    return handleCli({ cli: { flags: config, input: [\"start\"] } });\n}\n\n/**\n * @param {{cli: object, [whitelist]: array, [cb]: function}} opts\n * @returns {*}\n */\nfunction handleCli(opts) {\n    opts.cb = opts.cb || utils.defaultCallback;\n    const m = require(`./cli/command.${opts.cli.input[0]}`);\n    if (m.default) {\n        return m.default(opts);\n    }\n    return m(opts);\n}\n\nexport default handleCli;\n\nfunction processStart(yargs) {\n    return yargs\n        .usage(\"Usage: $0 start [options]\")\n        .options(startOpts)\n        .example(\"$0 start -s app\", \"- Use the App directory to serve files\")\n        .example(\"$0 start -p www.bbc.co.uk\", \"- Proxy an existing website\")\n        .default(\"cwd\", () => process.cwd())\n        .argv;\n}\n\n/**\n * @param {string} command\n * @param {object} yargs\n * @param cwd\n */\nfunction handleIncoming(command, yargs) {\n    let out;\n    if (command === \"start\") {\n        out = processStart(yargs);\n    }\n    if (command === \"init\") {\n        out = yargs\n            .usage(\"Usage: $0 init\")\n            .example(\"$0 init\")\n            .default(\"cwd\", () => process.cwd())\n            .help().argv;\n    }\n    if (command === \"reload\") {\n        out = yargs\n            .usage(\"Usage: $0 reload\")\n            .options(reloadOpts)\n            .example(\"$0 reload\")\n            .example(\"$0 reload --port 4000\")\n            .default(\"cwd\", () => process.cwd())\n            .argv;\n    }\n    if (command === \"recipe\") {\n        out = yargs\n            .usage(\"Usage: $0 recipe <recipe-name>\")\n            .option(recipeOpts)\n            .example(\"$0 recipe ls\", \"list the recipes\")\n            .example(\"$0 recipe gulp.sass\", \"use the gulp.sass recipe\")\n            .default(\"cwd\", () => process.cwd())\n            .argv;\n    }\n\n    if (out.help) {\n        return yargs.showHelp();\n    }\n\n    handleCli({ cli: { flags: out, input: out._ } });\n}\n\nfunction pathErrors(input, resolved): BsErrors {\n    if (!existsSync(resolved)) {\n        return [\n            {\n                type: BsErrorTypes.PathNotFound,\n                level: BsErrorLevels.Fatal,\n                errors: [\n                    {\n                        error: new Error(`Path not found: ${input}`),\n                        meta() {\n                            return [\n                                `Your Input:    ${chalk.yellow(input)}`,\n                                `CWD:           ${chalk.yellow(process.cwd())}`,\n                                `Resolved to:   ${chalk.yellow(resolved)}`\n                            ];\n                        }\n                    }\n                ]\n            }\n        ];\n    }\n    return [];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/browser-sync.js",
    "content": "\"use strict\";\n\nvar hooks = require(\"./hooks\");\nvar asyncTasks = require(\"./async-tasks\");\nvar config = require(\"./config\");\nvar connectUtils = require(\"./connect-utils\");\nvar utils = require(\"./utils\");\nvar logger = require(\"./logger\");\nvar chalk  = require(\"chalk\");\n\nvar eachSeries = utils.eachSeries;\nvar _ = require(\"./lodash.custom\");\nvar EE = require(\"easy-extender\");\n\n/**\n * Required internal plugins.\n * Any of these can be overridden by deliberately\n * causing a name-clash.\n */\nvar defaultPlugins = {\n    logger: logger,\n    socket: require(\"./sockets\"),\n    \"file:watcher\": require(\"./file-watcher\"),\n    server: require(\"./server\"),\n    tunnel: require(\"./tunnel\"),\n    \"client:script\": require(\"browser-sync-client\"),\n    UI: require(\"browser-sync-ui\")\n};\n\n/**\n * @constructor\n */\nvar BrowserSync = function(emitter) {\n    var bs = this;\n\n    bs.cwd = process.cwd();\n    bs.active = false;\n    bs.paused = false;\n    bs.config = config;\n    bs.utils = utils;\n    bs.events = bs.emitter = emitter;\n\n    bs._userPlugins = [];\n    bs._reloadQueue = [];\n    bs._cleanupTasks = [];\n    bs._browserReload = false;\n\n    // Plugin management\n    bs.pluginManager = new EE(defaultPlugins, hooks);\n};\n\n/**\n * Call a user-options provided callback\n * @param name\n */\nBrowserSync.prototype.callback = function(name) {\n    var bs = this;\n    var cb = bs.options.getIn([\"callbacks\", name]);\n\n    if (_.isFunction(cb)) {\n        cb.apply(bs.publicInstance, _.toArray(arguments).slice(1));\n    }\n};\n\n/**\n * @param {Map} options\n * @param {Function} cb\n * @returns {BrowserSync}\n */\nBrowserSync.prototype.init = function(options, cb) {\n    /**\n     * Safer access to `this`\n     * @type {BrowserSync}\n     */\n    var bs = this;\n\n    /**\n     * Set user-provided callback, or assign a noop\n     * @type {Function}\n     */\n    bs.cb = cb || utils.defaultCallback;\n\n    /**\n     * Verify provided config.\n     * Some options are not compatible and will cause us to\n     * end the process.\n     */\n    if (!utils.verifyConfig(options, bs.cb)) {\n        return;\n    }\n\n    /**\n     * Save a reference to the original options\n     * @type {Map}\n     * @private\n     */\n    bs._options = options;\n\n    /**\n     * Set additional options that depend on what the\n     * user may of provided\n     * @type {Map}\n     */\n    bs.options = options;\n\n    /**\n     * Kick off default plugins.\n     */\n    bs.pluginManager.init();\n\n    /**\n     * Create a base logger & debugger.\n     */\n    bs.logger = bs.pluginManager.get(\"logger\")(bs.events, bs);\n    bs.debugger = bs.logger.clone({ useLevelPrefixes: true });\n    bs.debug = bs.debugger.debug;\n\n    /**\n     * Run each setup task in sequence\n     */\n    eachSeries(asyncTasks, taskRunner(bs), tasksComplete(bs));\n\n    return this;\n};\n\n/**\n * Run 1 setup task.\n * Each task is a pure function.\n * They can return options or instance properties to set,\n * but they cannot set them directly.\n * @param {BrowserSync} bs\n * @returns {Function}\n */\nfunction taskRunner(bs) {\n    return function(item, cb) {\n        bs.debug(\"-> %s\", chalk.yellow(\"Starting Step: \" + item.step));\n\n        /**\n         * Execute the current task.\n         */\n        item.fn(bs, executeTask);\n\n        function executeTask(err, out) {\n            /**\n             * Exit early if any task returned an error.\n             */\n            if (err) {\n                return cb(err);\n            }\n\n            /**\n             * Act on return values (such as options to be set,\n             * or instance properties to be set\n             */\n            if (out) {\n                handleOut(bs, out);\n            }\n\n            bs.debug(\"+  %s\", chalk.green(\"Step Complete: \" + item.step));\n\n            cb();\n        }\n    };\n}\n\n/**\n * @param bs\n * @param out\n */\nfunction handleOut(bs, out) {\n    /**\n     * Set a single/many option.\n     */\n    if (out.options) {\n        setOptions(bs, out.options);\n    }\n\n    /**\n     * Any options returned that require path access?\n     */\n    if (out.optionsIn) {\n        out.optionsIn.forEach(function(item) {\n            bs.setOptionIn(item.path, item.value);\n        });\n    }\n\n    /**\n     * Any instance properties returned?\n     */\n    if (out.instance) {\n        Object.keys(out.instance).forEach(function(key) {\n            bs[key] = out.instance[key];\n        });\n    }\n}\n\n/**\n * Update the options Map\n * @param bs\n * @param options\n */\nfunction setOptions(bs, options) {\n    /**\n     * If multiple options were set, act on the immutable map\n     * in an efficient way\n     */\n    if (Object.keys(options).length > 1) {\n        bs.setMany(function(item) {\n            Object.keys(options).forEach(function(key) {\n                item.set(key, options[key]);\n                return item;\n            });\n        });\n    } else {\n        Object.keys(options).forEach(function(key) {\n            bs.setOption(key, options[key]);\n        });\n    }\n}\n\n/**\n * At this point, ALL async tasks have completed\n * @param {BrowserSync} bs\n * @returns {Function}\n */\nfunction tasksComplete(bs) {\n    return function(err) {\n        if (err) {\n            bs.logger.setOnce(\"useLevelPrefixes\", true).error(err.message);\n        }\n\n        /**\n         * Set active flag\n         */\n        bs.active = true;\n\n        /**\n         * @deprecated\n         */\n        bs.events.emit(\"init\", bs);\n\n        /**\n         * This is no-longer needed as the Callback now only resolves\n         * when everything (including slow things, like the tunnel) is ready.\n         * It's here purely for backwards compatibility.\n         * @deprecated\n         */\n        bs.events.emit(\"service:running\", {\n            options: bs.options,\n            baseDir: bs.options.getIn([\"server\", \"baseDir\"]),\n            type: bs.options.get(\"mode\"),\n            port: bs.options.get(\"port\"),\n            url: bs.options.getIn([\"urls\", \"local\"]),\n            urls: bs.options.get(\"urls\").toJS(),\n            tunnel: bs.options.getIn([\"urls\", \"tunnel\"])\n        });\n\n        /**\n         * Call any option-provided callbacks\n         */\n        bs.callback(\"ready\", null, bs);\n\n        /**\n         * Finally, call the user-provided callback given as last arg\n         */\n        bs.cb(null, bs);\n    };\n}\n\n/**\n * @param module\n * @param opts\n * @param cb\n */\nBrowserSync.prototype.registerPlugin = function(module, opts, cb) {\n    var bs = this;\n\n    bs.pluginManager.registerPlugin(module, opts, cb);\n\n    if (module[\"plugin:name\"]) {\n        bs._userPlugins.push(module);\n    }\n};\n\n/**\n * Get a plugin by name\n * @param name\n */\nBrowserSync.prototype.getUserPlugin = function(name) {\n    var bs = this;\n\n    var items = bs.getUserPlugins(function(item) {\n        return item[\"plugin:name\"] === name;\n    });\n\n    if (items && items.length) {\n        return items[0];\n    }\n\n    return false;\n};\n\n/**\n * @param {Function} [filter]\n */\nBrowserSync.prototype.getUserPlugins = function(filter) {\n    var bs = this;\n\n    filter =\n        filter ||\n        function() {\n            return true;\n        };\n\n    /**\n     * Transform Plugins option\n     */\n    bs.userPlugins = bs._userPlugins.filter(filter).map(function(plugin) {\n        return {\n            name: plugin[\"plugin:name\"],\n            active: plugin._enabled,\n            opts: bs.pluginManager.pluginOptions[plugin[\"plugin:name\"]]\n        };\n    });\n\n    return bs.userPlugins;\n};\n\n/**\n * Get middleware\n * @returns {*}\n */\nBrowserSync.prototype.getMiddleware = function(type) {\n    var types = {\n        connector: connectUtils.socketConnector(this.options)\n    };\n\n    if (type in types) {\n        return function(req, res) {\n            res.setHeader(\"Content-Type\", \"text/javascript\");\n            res.end(types[type]);\n        };\n    }\n};\n\n/**\n * Shortcut for pushing a file-serving middleware\n * onto the stack\n * @param {String} path\n * @param {{type: string, content: string}} props\n */\nvar _serveFileCount = 0;\nBrowserSync.prototype.serveFile = function(path, props) {\n    var bs = this;\n    var mode = bs.options.get(\"mode\");\n    var entry = {\n        handle: function(req, res) {\n            res.setHeader(\"Content-Type\", props.type);\n            res.end(props.content);\n        },\n        id: \"Browsersync - \" + _serveFileCount++,\n        route: path\n    };\n\n    bs._addMiddlewareToStack(entry);\n};\n\n/**\n * Add middlewares on the fly\n */\nBrowserSync.prototype._addMiddlewareToStack = function(entry) {\n    var bs = this;\n\n    /**\n     * additional middlewares are always appended -1,\n     * this is to allow the proxy middlewares to remain,\n     * and the directory index to remain in serveStatic/snippet modes\n     */\n    bs.app.stack.splice(bs.app.stack.length - 1, 0, entry);\n};\n\nvar _addMiddlewareCount = 0;\nBrowserSync.prototype.addMiddleware = function(route, handle, opts) {\n    var bs = this;\n\n    if (!bs.app) {\n        return;\n    }\n\n    opts = opts || {};\n\n    if (!opts.id) {\n        opts.id = \"bs-mw-\" + _addMiddlewareCount++;\n    }\n\n    if (route === \"*\") {\n        route = \"\";\n    }\n\n    var entry = {\n        id: opts.id,\n        route: route,\n        handle: handle\n    };\n\n    if (opts.override) {\n        entry.override = true;\n    }\n\n    bs.options = bs.options.update(\"middleware\", function(mw) {\n        if (bs.options.get(\"mode\") === \"proxy\") {\n            return mw.insert(mw.size - 1, entry);\n        }\n        return mw.concat(entry);\n    });\n\n    bs.resetMiddlewareStack();\n};\n\n/**\n * Remove middlewares on the fly\n * @param {String} id\n * @returns {Server}\n */\nBrowserSync.prototype.removeMiddleware = function(id) {\n    var bs = this;\n\n    if (!bs.app) {\n        return;\n    }\n\n    bs.options = bs.options.update(\"middleware\", function(mw) {\n        return mw.filter(function(mw) {\n            return mw.id !== id;\n        });\n    });\n\n    bs.resetMiddlewareStack();\n};\n\n/**\n * Middleware for socket connection (external usage)\n * @param opts\n * @returns {*}\n */\nBrowserSync.prototype.getSocketConnector = function(opts) {\n    var bs = this;\n\n    return function(req, res) {\n        res.setHeader(\"Content-Type\", \"text/javascript\");\n        res.end(bs.getExternalSocketConnector(opts));\n    };\n};\n\n/**\n * Socket connector as a string\n * @param {Object} opts\n * @returns {*}\n */\nBrowserSync.prototype.getExternalSocketConnector = function(opts) {\n    var bs = this;\n\n    return connectUtils.socketConnector(\n        bs.options.withMutations(function(item) {\n            item.set(\"socket\", item.get(\"socket\").merge(opts));\n            if (!bs.options.getIn([\"proxy\", \"ws\"])) {\n                item.set(\"mode\", \"snippet\");\n            }\n        })\n    );\n};\n\n/**\n * Callback helper\n * @param name\n */\nBrowserSync.prototype.getOption = function(name) {\n    this.debug(\"Getting option: {magenta:%s\", name);\n    return this.options.get(name);\n};\n\n/**\n * Callback helper\n * @param path\n */\nBrowserSync.prototype.getOptionIn = function(path) {\n    this.debug(\"Getting option via path: {magenta:%s\", path);\n    return this.options.getIn(path);\n};\n\n/**\n * @returns {BrowserSync.options}\n */\nBrowserSync.prototype.getOptions = function() {\n    return this.options;\n};\n\n/**\n * @returns {BrowserSync.options}\n */\nBrowserSync.prototype.getLogger = logger.getLogger;\n\n/**\n * @param {String} name\n * @param {*} value\n * @returns {BrowserSync.options|*}\n */\nBrowserSync.prototype.setOption = function(name, value, opts) {\n    var bs = this;\n\n    opts = opts || {};\n\n    bs.debug(\"Setting Option: {cyan:%s} - {magenta:%s\", name, value.toString());\n\n    bs.options = bs.options.set(name, value);\n\n    if (!opts.silent) {\n        bs.events.emit(\"options:set\", {\n            path: name,\n            value: value,\n            options: bs.options\n        });\n    }\n    return this.options;\n};\n\n/**\n * @param path\n * @param value\n * @param opts\n * @returns {Map|*|BrowserSync.options}\n */\nBrowserSync.prototype.setOptionIn = function(path, value, opts) {\n    var bs = this;\n\n    opts = opts || {};\n\n    bs.debug(\n        \"Setting Option: {cyan:%s} - {magenta:%s\",\n        path.join(\".\"),\n        value.toString()\n    );\n    bs.options = bs.options.setIn(path, value);\n    if (!opts.silent) {\n        bs.events.emit(\"options:set\", {\n            path: path,\n            value: value,\n            options: bs.options\n        });\n    }\n    return bs.options;\n};\n\n/**\n * Set multiple options with mutations\n * @param fn\n * @param opts\n * @returns {Map|*}\n */\nBrowserSync.prototype.setMany = function(fn, opts) {\n    var bs = this;\n\n    opts = opts || {};\n\n    bs.debug(\"Setting multiple Options\");\n    bs.options = bs.options.withMutations(fn);\n    if (!opts.silent) {\n        bs.events.emit(\"options:set\", { options: bs.options.toJS() });\n    }\n    return this.options;\n};\n\nBrowserSync.prototype.addRewriteRule = function(rule) {\n    var bs = this;\n\n    bs.options = bs.options.update(\"rewriteRules\", function(rules) {\n        return rules.concat(rule);\n    });\n\n    bs.resetMiddlewareStack();\n};\n\nBrowserSync.prototype.removeRewriteRule = function(id) {\n    var bs = this;\n    bs.options = bs.options.update(\"rewriteRules\", function(rules) {\n        return rules.filter(function(rule) {\n            return rule.id !== id;\n        });\n    });\n\n    bs.resetMiddlewareStack();\n};\n\nBrowserSync.prototype.setRewriteRules = function(rules) {\n    var bs = this;\n    bs.options = bs.options.update(\"rewriteRules\", function(_) {\n        return rules;\n    });\n\n    bs.resetMiddlewareStack();\n};\n\n/**\n * Add a new rewrite rule to the stack\n * @param {Object} rule\n */\nBrowserSync.prototype.resetMiddlewareStack = function() {\n    var bs = this;\n    var middlewares = require(\"./server/utils\").getMiddlewares(bs, bs.options);\n\n    bs.app.stack = middlewares;\n};\n\n/**\n * @param fn\n */\nBrowserSync.prototype.registerCleanupTask = function(fn) {\n    this._cleanupTasks.push(fn);\n};\n\n/**\n * Instance Cleanup\n */\nBrowserSync.prototype.cleanup = function(cb) {\n    var bs = this;\n    if (!bs.active) {\n        return;\n    }\n\n    // Remove all event listeners\n    if (bs.events) {\n        bs.debug(\"Removing event listeners...\");\n        bs.events.removeAllListeners();\n    }\n\n    // Close any core file watchers\n    if (bs.watchers) {\n        Object.keys(bs.watchers).forEach(function(key) {\n            bs.watchers[key].watchers.forEach(function(watcher) {\n                watcher.close();\n            });\n        });\n    }\n\n    // Run any additional clean up tasks\n    bs._cleanupTasks.forEach(function(fn) {\n        if (_.isFunction(fn)) {\n            fn(bs);\n        }\n    });\n\n    // Reset the flag\n    bs.debug(\"Setting {magenta:active: false\");\n    bs.active = false;\n    bs.paused = false;\n\n    bs.pluginManager.plugins = {};\n    bs.pluginManager.pluginOptions = {};\n    bs.pluginManager.defaultPlugins = defaultPlugins;\n\n    bs._userPlugins = [];\n    bs.userPlugins = [];\n    bs._reloadTimer = undefined;\n    bs._reloadQueue = [];\n    bs._cleanupTasks = [];\n\n    if (_.isFunction(cb)) {\n        cb(null, bs);\n    }\n};\n\nmodule.exports = BrowserSync;\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/cli-info.js",
    "content": "\"use strict\";\n\nvar config = require(\"../config\");\nvar logger = require(\"../logger\").logger;\n\nvar fs = require(\"fs\");\nvar _ = require(\"../lodash.custom\");\nvar path = require(\"path\");\nvar chalk = require(\"chalk\");\n\nvar info = {\n    /**\n     * Version info\n     * @param {Object} pjson\n     * @returns {String}\n     */\n    getVersion: function(pjson) {\n        console.log(pjson.version);\n        return pjson.version;\n    },\n    /**\n     * Retrieve the config file\n     * @returns {*}\n     * @private\n     * @param filePath\n     */\n    getConfigFile: function(filePath) {\n        return require(path.resolve(filePath));\n    },\n    /**\n     * Generate an example Config file.\n     */\n    makeConfig: function(cwd, cb) {\n        var opts = require(path.join(__dirname, \"..\", config.configFile));\n        var userOpts = {};\n\n        var ignore = [\"excludedFileTypes\", \"injectFileTypes\", \"snippetOptions\"];\n\n        Object.keys(opts).forEach(function(key) {\n            if (!_.includes(ignore, key)) {\n                userOpts[key] = opts[key];\n            }\n        });\n\n        var file = fs.readFileSync(config.template, \"utf8\");\n        file = file.replace(\"//OPTS\", JSON.stringify(userOpts, null, 4));\n\n        fs.writeFile(path.resolve(cwd, config.userFile), file, function() {\n            logger.info(\"Config file created %s\", chalk.magenta(config.userFile));\n            logger.info(\n                \"To use it, in the same directory run: \" +\n                    chalk.cyan(\"browser-sync start --config bs-config.js\")\n            );\n            cb();\n        });\n    }\n};\n\nmodule.exports = info;\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/cli-options.ts",
    "content": "import { Map, List, fromJS } from \"immutable\";\nimport { addToFilesOption } from \"./transforms/addToFilesOption\";\nimport { addDefaultIgnorePatterns } from \"./transforms/addDefaultIgnorePatterns\";\nimport { copyCLIIgnoreToWatchOptions } from \"./transforms/copyCLIIgnoreToWatchOptions\";\nimport { handleExtensionsOption } from \"./transforms/handleExtensionsOption\";\nimport { handleFilesOption } from \"./transforms/handleFilesOption\";\nimport { handleGhostModeOption } from \"./transforms/handleGhostModeOption\";\nimport { handlePortsOption } from \"./transforms/handlePortsOption\";\nimport { handleProxyOption } from \"./transforms/handleProxyOption\";\nimport { handleServerOption } from \"./transforms/handleServerOption\";\nimport { appendServerIndexOption } from \"./transforms/appendServerIndexOption\";\nimport { appendServerDirectoryOption } from \"./transforms/appendServerDirectoryOption\";\nimport { addCwdToWatchOptions } from \"./transforms/addCwdToWatchOptions\";\nimport {\n    setMode,\n    setScheme,\n    setStartPath,\n    setProxyWs,\n    setServerOpts,\n    liftExtensionsOptionFromCli,\n    setNamespace,\n    fixSnippetIgnorePaths,\n    fixSnippetIncludePaths,\n    fixRewriteRules,\n    setMiddleware,\n    setOpen,\n    setUiPort\n} from \"../options\";\nimport { BsErrors } from \"../bin\";\nimport { handleHostOption } from \"./transforms/handleHostOption\";\n\nconst _ = require(\"../lodash.custom\");\nconst defaultConfig = require(\"../default-config\");\nconst immDefs = fromJS(defaultConfig);\n\n/**\n * @param {Object} input\n * @returns {Map}\n */\nexport type BsTempOptions = Map<string, any>;\nexport type TransformResult = [BsTempOptions, BsErrors];\nexport type TransformFn = (subject: BsTempOptions) => TransformResult;\n\nexport function merge(input) {\n    const merged = immDefs.mergeDeep(input);\n    const transforms: TransformFn[] = [\n        addToFilesOption,\n        addCwdToWatchOptions,\n        addDefaultIgnorePatterns,\n        copyCLIIgnoreToWatchOptions,\n        handleServerOption,\n        appendServerIndexOption,\n        appendServerDirectoryOption,\n        handleProxyOption,\n        handlePortsOption,\n        handleHostOption,\n        handleGhostModeOption,\n        handleFilesOption,\n        handleExtensionsOption,\n        setMode,\n        setScheme,\n        setStartPath,\n        setProxyWs,\n        setServerOpts,\n        liftExtensionsOptionFromCli,\n        setNamespace,\n        fixSnippetIgnorePaths,\n        fixSnippetIncludePaths,\n        fixRewriteRules,\n        setMiddleware,\n        setOpen,\n        setUiPort\n    ];\n\n    const output = transforms.reduce(\n        (acc: TransformResult, item: TransformFn) => {\n            const [current, currentErrors] = acc;\n            const [result, errors] = item.call(null, current);\n            return [result, [...currentErrors, ...errors]];\n        },\n        [merged, []] as TransformResult\n    );\n\n    return output;\n}\n\n/**\n * @param string\n */\nexport function explodeFilesArg(string): string {\n    return string.split(\",\").map(item => item.trim());\n}\n\n/**\n * @param value\n * @returns {{globs: Array, objs: Array}}\n */\nexport function makeFilesArg(value) {\n    let globs = [];\n    let objs = [];\n\n    if (_.isString(value)) {\n        globs = globs.concat(explodeFilesArg(value));\n    }\n\n    if (List.isList(value) && value.size) {\n        value.forEach(function(value) {\n            if (_.isString(value)) {\n                globs.push(value);\n            } else {\n                if (Map.isMap(value)) {\n                    objs.push(value);\n                }\n            }\n        });\n    }\n\n    return {\n        globs: globs,\n        objs: objs\n    };\n}\n\nexport function printErrors(errors: BsErrors) {\n    return errors\n        .map(error =>\n            [\n                `Error Type:    ${error.type}`,\n                `Error Level:   ${error.level}`,\n                error.errors.map(item =>\n                    [\n                        `Error Message: ${item.error.message}`,\n                        item.meta ? item.meta().join(\"\\n\") : \"\"\n                    ]\n                        .filter(Boolean)\n                        .join(\"\\n\")\n                )\n            ].join(\"\\n\")\n        )\n        .join(\"\\n\\n\");\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/command.init.js",
    "content": "\"use strict\";\n\nvar info = require(\"./cli-info\");\n\n/**\n * $ browser-sync init\n *\n * This command will generate a configuration\n * file in the current directory\n *\n * @param opts\n */\nmodule.exports = function(opts) {\n    info.makeConfig(process.cwd(), opts.cb);\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/command.recipe.js",
    "content": "\"use strict\";\nvar logger = require(\"../logger\").logger;\nvar chalk  = require(\"chalk\");\n\n/**\n * $ browser-sync recipe <name> <options>\n *\n * This command will copy a recipe into either the current directory\n * or one given with the --output flag\n *\n * @param opts\n * @returns {Function}\n */\nmodule.exports = function(opts) {\n    var path = require(\"path\");\n    var fs = require(\"fs-extra\");\n    var input = opts.cli.input.slice(1);\n    var resolved = require.resolve(\"bs-recipes\");\n    var dir = path.dirname(resolved);\n\n    var logRecipes = function() {\n        var dirs = fs.readdirSync(path.join(dir, \"recipes\"));\n        logger.info(\n            \"Install one of the following with %s\\n\",\n            chalk.cyan('browser-sync recipe <name>')\n        );\n        dirs.forEach(function(name) {\n            console.log(\"    \" + name);\n        });\n    };\n\n    if (!input.length) {\n        logger.info(\"No recipe name provided!\");\n        logRecipes();\n        return opts.cb();\n    }\n\n    if (opts.cli.input[1] === \"ls\") {\n        logRecipes();\n        return opts.cb();\n    }\n\n    input = input[0];\n    var flags = opts.cli.flags;\n    var output = flags.output\n        ? path.resolve(flags.output)\n        : path.join(process.cwd(), input);\n    var targetDir = path.join(dir, \"recipes\", input);\n\n    if (fs.existsSync(output)) {\n        return opts.cb(\n            new Error(\"Target folder exists remove it first and then try again\")\n        );\n    }\n\n    if (fs.existsSync(targetDir)) {\n        fs.copy(targetDir, output, function(err) {\n            if (err) {\n                opts.cb(err);\n            } else {\n                logger.info(\"Recipe copied into %s\", chalk.cyan(output));\n                logger.info(\n                    \"Next, inside that folder, run %s\",\n                    chalk.cyan(\"npm i && npm start\")\n                );\n                opts.cb(null);\n            }\n        });\n    } else {\n        logger.info(\n            \"Recipe %s not found. The following are available though\",\n            chalk.cyan(input)\n        );\n        logRecipes();\n        opts.cb();\n    }\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/command.reload.js",
    "content": "\"use strict\";\n\n/**\n * $ browser-sync reload <options>\n *\n * This commands starts the Browsersync servers\n * & Optionally UI.\n *\n * @param opts\n * @returns {Function}\n */\nmodule.exports = function(opts) {\n    var flags = opts.cli.flags;\n    if (!flags.url) {\n        flags.url = \"http://localhost:\" + (flags.port || 3000);\n    }\n    var proto = require(\"../http-protocol\");\n    var scheme = flags.url.match(/^https/) ? \"https\" : \"http\";\n    var args = { method: \"reload\" };\n\n    if (flags.files) {\n        args.args = flags.files;\n    }\n\n    var url = proto.getUrl(args, flags.url);\n\n    if (scheme === \"https\") {\n        process.env.NODE_TLS_REJECT_UNAUTHORIZED = \"0\";\n    }\n\n    require(scheme)\n        .get(url, function(res) {\n            res.on(\"data\", function() {\n                if (res.statusCode === 200) {\n                    opts.cb(null, res);\n                }\n            });\n        })\n        .on(\"error\", function(err) {\n            if (err.code === \"ECONNREFUSED\") {\n                err.message = \"Browsersync not running at \" + flags.url;\n            }\n            return opts.cb(err);\n        });\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/command.start.ts",
    "content": "import * as path from \"path\";\nimport { existsSync } from \"fs\";\nimport { fromJS } from \"immutable\";\nimport * as utils from \"../utils\";\nimport { explodeFilesArg } from \"./cli-options\";\nconst _ = require(\"../lodash.custom\");\n\n/**\n * $ browser-sync start <options>\n *\n * This commands starts the Browsersync servers\n * & Optionally UI.\n *\n * @param opts\n * @returns {Function}\n */\nexport default function(opts) {\n    const flags = preprocessFlags(opts.cli.flags);\n    const cwd = flags.cwd || process.cwd();\n    const maybepkg = path.resolve(cwd, \"package.json\");\n    let input = flags;\n\n    if (flags.config) {\n        const maybeconf = path.resolve(cwd, flags.config);\n        if (existsSync(maybeconf)) {\n            const conf = require(maybeconf);\n            input = _.merge({}, conf, flags);\n        } else {\n            utils.fail(\n                true,\n                new Error(`Configuration file '${flags.config}' not found`),\n                opts.cb\n            );\n        }\n    } else {\n        if (existsSync(maybepkg)) {\n            const pkg = require(maybepkg);\n            if (pkg[\"browser-sync\"]) {\n                console.log(\"> Configuration obtained from package.json\");\n                input = _.merge({}, pkg[\"browser-sync\"], flags);\n            }\n        }\n    }\n\n    return require(\"../\")\n        .create(\"cli\")\n        .init(input, opts.cb);\n}\n\n/**\n * @param flags\n * @returns {*}\n */\nfunction preprocessFlags(flags) {\n    return [\n        stripUndefined,\n        legacyFilesArgs,\n        removeWatchBooleanWhenFalse\n    ].reduce((flags, fn) => fn.call(null, flags), flags);\n}\n\n/**\n * Incoming undefined values are problematic as\n * they interfere with Immutable.Map.mergeDeep\n * @param subject\n * @returns {*}\n */\nfunction stripUndefined(subject) {\n    return Object.keys(subject).reduce((acc, key) => {\n        const value = subject[key];\n        if (typeof value === \"undefined\") {\n            return acc;\n        }\n        acc[key] = value;\n        return acc;\n    }, {});\n}\n\n/**\n * @param flags\n * @returns {*}\n */\nfunction legacyFilesArgs(flags) {\n    if (flags.files && flags.files.length) {\n        flags.files = flags.files.reduce(\n            (acc, item) => acc.concat(explodeFilesArg(item)),\n            []\n        );\n    }\n    return flags;\n}\n\n/**\n * `watch` is a CLI boolean so should be removed if false to\n * allow config to set watch: true\n * @param flags\n * @returns {any}\n */\nfunction removeWatchBooleanWhenFalse(flags) {\n    if (flags.watch === false) {\n        return fromJS(flags)\n            .delete(\"watch\")\n            .toJS();\n    }\n    return flags;\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/transforms/addCwdToWatchOptions.ts",
    "content": "import { BsTempOptions, TransformResult } from \"../cli-options\";\n\nexport function addCwdToWatchOptions(incoming: BsTempOptions): TransformResult {\n    const output = incoming.updateIn([\"watchOptions\", \"cwd\"], watchCwd => {\n        return watchCwd || incoming.get(\"cwd\");\n    });\n\n    return [output, []];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/transforms/addDefaultIgnorePatterns.ts",
    "content": "import { List } from \"immutable\";\nimport { BsTempOptions, TransformResult } from \"../cli-options\";\n\nconst defaultIgnorePatterns = [\n    /node_modules/,\n    /bower_components/,\n    \".sass-cache\",\n    \".vscode\",\n    \".git\",\n    \".idea\"\n];\n\nexport function addDefaultIgnorePatterns(\n    incoming: BsTempOptions\n): TransformResult {\n    if (!incoming.get(\"watch\")) {\n        return [incoming, []];\n    }\n\n    const output = incoming.update(\"watchOptions\", watchOptions => {\n        const userIgnored = List([])\n            .concat(watchOptions.get(\"ignored\"))\n            .filter(Boolean)\n            .toSet();\n\n        const merged = userIgnored.merge(defaultIgnorePatterns);\n\n        return watchOptions.merge({\n            ignored: merged.toList()\n        });\n    });\n\n    return [output, []];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/transforms/addToFilesOption.ts",
    "content": "import { List, Map } from \"immutable\";\nimport { BsTempOptions, TransformResult } from \"../cli-options\";\n\nexport function addToFilesOption(incoming: BsTempOptions): TransformResult {\n    if (!incoming.get(\"watch\")) {\n        return [incoming, []];\n    }\n\n    let serverPaths = [];\n\n    const fromServeStatic = incoming.get(\"serveStatic\", List([])).toArray();\n    const ssPaths = fromServeStatic.reduce((acc, ss) => {\n        if (typeof ss === \"string\") {\n            return acc.concat(ss);\n        }\n        if (ss.dir && typeof ss.dir === \"string\") {\n            return acc.concat(ss);\n        }\n        return acc;\n    }, []);\n\n    ssPaths.forEach(p => serverPaths.push(p));\n\n    const server = incoming.get(\"server\");\n    if (server) {\n        if (server === true) {\n            serverPaths.push(\".\");\n        }\n        if (typeof server === \"string\") {\n            serverPaths.push(server);\n        }\n        if (List.isList(server) && server.every(x => typeof x === \"string\")) {\n            server.forEach(s => serverPaths.push(s));\n        }\n        if (Map.isMap(server)) {\n            const baseDirProp = server.get(\"baseDir\");\n            const baseDirs = List([])\n                .concat(baseDirProp)\n                .filter(Boolean);\n            baseDirs.forEach(s => serverPaths.push(s));\n        }\n    }\n\n    const output = incoming.update(\"files\", files => {\n        return List([])\n            .concat(files, serverPaths)\n            .filter(Boolean);\n    });\n    return [output, []];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/transforms/appendServerDirectoryOption.ts",
    "content": "import { BsTempOptions, TransformResult } from \"../cli-options\";\n\nexport function appendServerDirectoryOption(\n    incoming: BsTempOptions\n): TransformResult {\n    if (!incoming.get(\"server\")) return [incoming, []];\n    if (incoming.get(\"directory\")) {\n        return [\n            incoming.setIn([\"server\", \"directory\"], incoming.has(\"directory\")),\n            []\n        ];\n    }\n    return [incoming, []];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/transforms/appendServerIndexOption.ts",
    "content": "import { BsTempOptions, TransformResult } from \"../cli-options\";\n\nexport function appendServerIndexOption(\n    incoming: BsTempOptions\n): TransformResult {\n    if (!incoming.get(\"server\")) return [incoming, []];\n    const value = incoming.get(\"index\");\n\n    if (value) {\n        return [incoming.setIn([\"server\", \"index\"], value), []];\n    }\n\n    return [incoming, []];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/transforms/copyCLIIgnoreToWatchOptions.ts",
    "content": "import { List } from \"immutable\";\nimport { BsTempOptions, TransformResult } from \"../cli-options\";\n\nexport function copyCLIIgnoreToWatchOptions(\n    incoming: BsTempOptions\n): TransformResult {\n    if (!incoming.get(\"ignore\")) {\n        return [incoming, []];\n    }\n    const output = incoming.updateIn(\n        [\"watchOptions\", \"ignored\"],\n        List([]),\n        ignored => {\n            return List([]).concat(ignored, incoming.get(\"ignore\"));\n        }\n    );\n\n    return [output, []];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/transforms/handleExtensionsOption.ts",
    "content": "import { List } from \"immutable\";\nimport {\n    BsTempOptions,\n    explodeFilesArg,\n    TransformResult\n} from \"../cli-options\";\n\nconst _ = require(\"../../lodash.custom\");\n\nexport function handleExtensionsOption(\n    incoming: BsTempOptions\n): TransformResult {\n    const value = incoming.get(\"extensions\");\n    if (_.isString(value)) {\n        const split = explodeFilesArg(value);\n        if (split.length) {\n            return [incoming.set(\"extensions\", List(split)), []];\n        }\n    }\n    if (List.isList(value)) {\n        return [incoming.set(\"extensions\", value), []];\n    }\n    return [incoming, []];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/transforms/handleFilesOption.ts",
    "content": "import { fromJS } from \"immutable\";\nimport { BsTempOptions, makeFilesArg, TransformResult } from \"../cli-options\";\nimport { FilesNamespaces } from \"../../types\";\n\nexport function handleFilesOption(incoming: BsTempOptions): TransformResult {\n    const value = incoming.get(\"files\");\n    const namespaces: FilesNamespaces = {\n        core: {\n            globs: [],\n            objs: []\n        }\n    };\n\n    const processed = makeFilesArg(value);\n\n    if (processed.globs.length) {\n        namespaces.core.globs = processed.globs;\n    }\n\n    if (processed.objs.length) {\n        namespaces.core.objs = processed.objs;\n    }\n\n    return [incoming.set(\"files\", fromJS(namespaces)), []];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/transforms/handleGhostModeOption.ts",
    "content": "import { fromJS } from \"immutable\";\nimport { BsTempOptions, TransformResult } from \"../cli-options\";\n\nexport function handleGhostModeOption(\n    incoming: BsTempOptions\n): TransformResult {\n    const value = incoming.get(\"ghostMode\");\n    var trueAll = {\n        clicks: true,\n        scroll: true,\n        forms: {\n            submit: true,\n            inputs: true,\n            toggles: true\n        }\n    };\n\n    var falseAll = {\n        clicks: false,\n        scroll: false,\n        forms: {\n            submit: false,\n            inputs: false,\n            toggles: false\n        }\n    };\n\n    if (value === false || value === \"false\") {\n        return [incoming.set(\"ghostMode\", fromJS(falseAll)), []];\n    }\n\n    if (value === true || value === \"true\") {\n        return [incoming.set(\"ghostMode\", fromJS(trueAll)), []];\n    }\n\n    if (value.get(\"forms\") === false) {\n        return [\n            incoming.set(\n                \"ghostMode\",\n                value.withMutations(function(map) {\n                    map.set(\n                        \"forms\",\n                        fromJS({\n                            submit: false,\n                            inputs: false,\n                            toggles: false\n                        })\n                    );\n                })\n            ),\n            []\n        ];\n    }\n\n    if (value.get(\"forms\") === true) {\n        return [\n            incoming.set(\n                \"ghostMode\",\n                value.withMutations(function(map) {\n                    map.set(\n                        \"forms\",\n                        fromJS({\n                            submit: true,\n                            inputs: true,\n                            toggles: true\n                        })\n                    );\n                })\n            ),\n            []\n        ];\n    }\n\n    return [incoming, []];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/transforms/handleHostOption.ts",
    "content": "import { BsTempOptions, TransformResult } from \"../cli-options\";\nimport { BsErrorLevels, BsErrorTypes } from \"../../bin\";\n\nexport function handleHostOption(incoming: BsTempOptions): TransformResult {\n    const host: string | null = incoming.get(\"host\");\n    const listen: string | null = incoming.get(\"listen\");\n\n    if (host && listen) {\n        if (host !== listen) {\n            return [\n                incoming,\n                [\n                    {\n                        errors: [\n                            {\n                                error: new Error(\n                                    \"Cannot specify both `host` and `listen` options\"\n                                ),\n                                meta() {\n                                    return [\n                                        \"\",\n                                        \"Tip:           Use just the `listen` option *only* if you want to bind only to a particular host.\"\n                                    ];\n                                }\n                            }\n                        ],\n                        level: BsErrorLevels.Fatal,\n                        type: BsErrorTypes.HostAndListenIncompatible\n                    }\n                ]\n            ];\n        }\n\n        // whenever we have have both `host` + `listen` options,\n        // we remove the 'host' to prevent complication further down the line\n        return [incoming.delete(\"host\"), []];\n    }\n\n    return [incoming, []];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/transforms/handlePortsOption.ts",
    "content": "import { Map } from \"immutable\";\nimport { PortsOption } from \"../../types\";\nimport { BsTempOptions, TransformResult } from \"../cli-options\";\n\nexport function handlePortsOption(incoming: BsTempOptions): TransformResult {\n    const value = incoming.get(\"ports\");\n    if (!value) return [incoming, []];\n\n    const obj: PortsOption = { min: null, max: null };\n\n    if (typeof value === \"string\") {\n        if (~value.indexOf(\",\")) {\n            const segs = value.split(\",\");\n            obj.min = parseInt(segs[0], 10);\n            obj.max = parseInt(segs[1], 10);\n        } else {\n            obj.min = parseInt(value, 10);\n            obj.max = null;\n        }\n    } else {\n        obj.min = value.get(\"min\");\n        obj.max = value.get(\"max\") || null;\n    }\n\n    return [incoming.set(\"ports\", Map(obj)), []];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/transforms/handleProxyOption.ts",
    "content": "import * as url from \"url\";\nimport { Map } from \"immutable\";\nimport { BrowsersyncProxy } from \"../../types\";\nimport { BsTempOptions, TransformResult } from \"../cli-options\";\n\nexport function handleProxyOption(incoming: BsTempOptions): TransformResult {\n    let value = incoming.get(\"proxy\");\n    let mw;\n    let target;\n\n    if (!value || value === true) {\n        return [incoming, []];\n    }\n\n    if (typeof value !== \"string\") {\n        target = value.get(\"target\");\n        mw = value.get(\"middleware\");\n    } else {\n        target = value;\n        value = Map({});\n    }\n\n    if (!target.match(/^(https?):\\/\\//)) {\n        target = \"http://\" + target;\n    }\n\n    const parsedUrl = url.parse(target);\n\n    if (!parsedUrl.port) {\n        parsedUrl.port = \"80\";\n    }\n\n    const out: BrowsersyncProxy = {\n        target: parsedUrl.protocol + \"//\" + parsedUrl.host,\n        url: Map(parsedUrl)\n    };\n\n    if (mw) {\n        out.middleware = mw;\n    }\n\n    const proxyOutput = value.mergeDeep(out);\n\n    return [incoming.set(\"proxy\", proxyOutput), []];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/cli/transforms/handleServerOption.ts",
    "content": "import { IServerOption } from \"../../types\";\nimport { fromJS, List, Map } from \"immutable\";\nimport { BsTempOptions, TransformResult } from \"../cli-options\";\n\nexport function handleServerOption(incoming: BsTempOptions): TransformResult {\n    const value = incoming.get(\"server\");\n    if (value === false) {\n        return [incoming, []];\n    }\n\n    // server: true\n    if (value === true) {\n        const obj: IServerOption = {\n            baseDir: [\"./\"]\n        };\n        return [incoming.set(\"server\", fromJS(obj)), []];\n    }\n\n    // server: \"./app\"\n    if (typeof value === \"string\") {\n        const obj: IServerOption = {\n            baseDir: [value]\n        };\n        return [incoming.set(\"server\", fromJS(obj)), []];\n    }\n\n    if (List.isList(value)) {\n        const obj: IServerOption = {\n            baseDir: value\n        };\n        return [incoming.set(\"server\", fromJS(obj)), []];\n    }\n\n    if (Map.isMap(value)) {\n        const dirs = List([])\n            .concat(value.get(\"baseDir\", \"./\"))\n            .filter(Boolean);\n\n        const merged = value.merge({ baseDir: dirs });\n\n        return [incoming.set(\"server\", merged), []];\n    }\n\n    return [incoming, []];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/config.js",
    "content": "\"use strict\";\n\nvar path = require(\"path\");\n/**\n * @type {{controlPanel: {jsFile: string, baseDir: *}, socketIoScript: string, configFile: string, client: {shims: string}}}\n */\nmodule.exports = {\n    controlPanel: {\n        jsFile: \"/js/app.js\",\n        baseDir: path.join(__dirname, \"control-panel\")\n    },\n    templates: {\n        scriptTag: path.join(__dirname, \"..\", \"templates/script-tags.html\"),\n        scriptTagSimple: path.join(\n            __dirname,\n            \"..\",\n            \"templates/script-tags-simple.html\"\n        ),\n        connector: path.join(__dirname, \"..\", \"templates/connector.tmpl\")\n    },\n    socketIoScript: \"/public/socket.io.min.1.6.0.js\",\n    configFile: \"default-config.js\",\n    userFile: \"bs-config.js\",\n    template: path.join(__dirname, \"..\", \"templates/cli-template.js\"),\n    httpProtocol: {\n        path: \"/__browser_sync__\"\n    },\n    client: {\n        shims: \"/client/client-shims.js\"\n    },\n    errors: {\n        \"server+proxy\":\n            \"Invalid config. You cannot specify both server & proxy options.\",\n        \"proxy+https\":\n            \"Invalid config. You set https: true, but your proxy target doesn't reflect this.\"\n    }\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/connect-utils.js",
    "content": "\"use strict\";\n\nvar _ = require(\"./lodash.custom\");\nvar fs = require(\"fs\");\nvar config = require(\"./config\");\n\nfunction getPath(options, relative, port) {\n    if (options.get(\"mode\") === \"snippet\") {\n        return options.get(\"scheme\") + \"://HOST:\" + port + relative;\n    } else {\n        return \"//HOST:\" + port + relative;\n    }\n}\n\nvar connectUtils = {\n    /**\n     * Allow users to disable the Browsersync snippet\n     * @param {Immutable.Map} options\n     * @returns {Boolean}\n     */\n    enabled: function(options) {\n        const userValue = options.get(\"snippet\");\n        if (typeof userValue === \"boolean\") {\n            return userValue\n        }\n        return true\n    },\n    /**\n     * @param {Immutable.Map} options\n     * @returns {String}\n     */\n    scriptTags: function(options) {\n        var scriptPath = this.clientScript(options);\n        var async = options.getIn([\"snippetOptions\", \"async\"]);\n        var scriptDomain = options.getIn([\"script\", \"domain\"]);\n\n        /**\n         * Generate the [src] attribute based on user options\n         */\n        var scriptSrc = (function() {\n            if (options.get(\"localOnly\")) {\n                return [\n                    options.get(\"scheme\"),\n                    \"://localhost:\",\n                    options.get(\"port\"),\n                    scriptPath\n                ].join(\"\");\n            }\n\n            /**\n             * First, was \"scriptPath\" set? if so the user wanted full control over the\n             * script tag output\n             *\n             */\n            if (_.isFunction(options.get(\"scriptPath\"))) {\n                return options\n                    .get(\"scriptPath\")\n                    .apply(null, getScriptArgs(options, scriptPath));\n            }\n\n            /**\n             * Next, if \"script.domain\" was given, allow that + the path to the JS file\n             * eg:\n             *  script.domain=localhost:3000\n             * -> localhost:3000/browser-sync/browser-sync-client.js\n             */\n            if (scriptDomain) {\n                if (_.isFunction(scriptDomain)) {\n                    return scriptDomain.call(null, options) + scriptPath;\n                }\n                if (scriptDomain.match(/\\{port\\}/)) {\n                    return (\n                        scriptDomain.replace(\"{port}\", options.get(\"port\")) +\n                        scriptPath\n                    );\n                }\n                return scriptDomain + scriptPath;\n            }\n\n            /**\n             * Now if server or proxy, use dynamic script\n             * eg:\n             *  browser-sync start --server\n             * ->\n             *  \"HOST:3000/browser-sync/browser-sync-client.js\".replace(\"HOST\", location.hostname)\n             */\n            if (options.get(\"server\") || options.get(\"proxy\")) {\n                return scriptPath;\n            }\n\n            /**\n             * Final use case is snippet mode\n             * -> \"http://HOST:3000/browser-sync/browser-sync-client.js\".replace(\"HOST\", location.hostname)\n             * -> \"//HOST:3000/browser-sync/browser-sync-client.js\".replace(\"HOST\", location.hostname)\"\n             */\n            return getPath(options, scriptPath, options.get(\"port\"));\n        })();\n\n        /**\n         * Decide which template shall be used to generate the script tags\n         */\n        var template = (function() {\n            if (scriptDomain || options.get(\"localOnly\")) {\n                return config.templates.scriptTagSimple;\n            }\n            return config.templates.scriptTag;\n        })();\n\n        /**\n         * Finally read the template file from disk and replace\n         * the dynamic values.\n         */\n        return fs\n            .readFileSync(template, \"utf8\")\n            .replace(\"%script%\", scriptSrc)\n            .replace(\"%async%\", async ? \"async\" : \"\");\n    },\n    /**\n     * @param {Map} options\n     * @returns {String}\n     */\n    socketConnector: function(options) {\n        var socket = options.get(\"socket\");\n        var template = fs.readFileSync(config.templates.connector, \"utf-8\");\n        var url = connectUtils.getConnectionUrl(options);\n\n        /**\n         * ***Backwards compatibility***. While `socket.path` is technically a\n         * socketIoClientConfig property, it's been documented previously\n         * as a top-level option, so must stay.\n         */\n        var clientConfig = socket.get(\"socketIoClientConfig\").merge({\n            path: socket.get(\"path\")\n        });\n\n        template = template\n            .replace(\"%config%\", JSON.stringify(clientConfig.toJS()))\n            .replace(\"%options%\", JSON.stringify(options))\n            .replace(\"%url%\", url);\n\n        return template;\n    },\n    /**\n     * @param {Object} socketOpts\n     * @param {Map} options\n     * @returns {String|Function}\n     */\n    getNamespace: function(socketOpts, options) {\n        var namespace = socketOpts.namespace;\n\n        if (typeof namespace === \"function\") {\n            return namespace(options);\n        }\n\n        if (!namespace.match(/^\\//)) {\n            namespace = \"/\" + namespace;\n        }\n\n        return namespace;\n    },\n    /**\n     * @param {Map} options\n     * @returns {string}\n     */\n    getConnectionUrl: function(options) {\n        var socketOpts = options.get(\"socket\").toJS();\n        var namespace = connectUtils.getNamespace(socketOpts, options);\n\n        var protocol = \"\";\n        var withHostnamePort =\n            \"'{protocol}' + location.hostname + ':{port}{ns}'\";\n        var withHost = \"'{protocol}' + location.host + '{ns}'\";\n        var withDomain = \"'{domain}{ns}'\";\n        var port = options.get(\"port\");\n\n        // default use-case is server/proxy\n        var string = withHost;\n\n        if (options.get(\"mode\") !== \"server\") {\n            protocol = options.get(\"scheme\") + \"://\";\n            string = withHostnamePort;\n        }\n\n        if (options.get(\"mode\") === \"proxy\" && options.getIn([\"proxy\", \"ws\"])) {\n            port = options.getIn([\"socket\", \"port\"]);\n        }\n\n        /**\n         * Ensure socket.domain is always a string (for noop replacements later)\n         */\n        socketOpts.domain = (function() {\n            if (options.get(\"localOnly\")) {\n                string = withDomain;\n                return [\n                    options.get(\"scheme\"),\n                    \"://localhost:\",\n                    options.get(\"port\")\n                ].join(\"\");\n            }\n            if (socketOpts.domain) {\n                string = withDomain;\n                /**\n                 * User provided a function\n                 */\n                if (_.isFunction(socketOpts.domain)) {\n                    return socketOpts.domain.call(null, options);\n                }\n                /**\n                 * User provided a string\n                 */\n                if (_.isString(socketOpts.domain)) {\n                    return socketOpts.domain;\n                }\n            }\n            return \"\";\n        })();\n\n        return string\n            .replace(\"{protocol}\", protocol)\n            .replace(\"{port}\", port)\n            .replace(\"{domain}\", socketOpts.domain.replace(\"{port}\", port))\n            .replace(\"{ns}\", namespace);\n    },\n    /**\n     * @param {Object} [options]\n     * @param {Boolean} [both]\n     */\n    clientScript: function(options, both) {\n        var prefix = options.getIn([\"socket\", \"clientPath\"]);\n        var script = prefix + \"/browser-sync-client.js\";\n        var versioned =\n            prefix + \"/browser-sync-client.js?v=\" + options.get(\"version\");\n\n        if (both) {\n            return {\n                path: script,\n                versioned: versioned\n            };\n        }\n\n        return versioned;\n    }\n};\n\n/**\n * @param options\n * @returns {*[]}\n */\nfunction getScriptArgs(options, scriptPath) {\n    var abspath =\n        options.get(\"scheme\") + \"://HOST:\" + options.get(\"port\") + scriptPath;\n    return [scriptPath, options.get(\"port\"), options.set(\"absolute\", abspath)];\n}\n\nmodule.exports = connectUtils;\n"
  },
  {
    "path": "packages/browser-sync/lib/default-config.js",
    "content": "/**\n * @module BrowserSync.options\n */\nmodule.exports = {\n    /**\n     * Browsersync includes a user-interface that is accessed via a separate port.\n     * The UI allows to controls all devices, push sync updates and much more.\n     * @property ui\n     * @type Object\n     * @param {Number} [port=3001]\n     * @since 2.0.0\n     * @default false\n     */\n    ui: {\n        port: 3001\n    },\n\n    /**\n     * Browsersync can watch your files as you work. Changes you make will either\n     * be injected into the page (CSS & images) or will cause all browsers to do\n     * a full-page refresh.\n     * @property files\n     * @type Array|String\n     * @default false\n     */\n    files: false,\n\n    /**\n     * Specify which file events to respond to.\n     * Available events: `add`, `change`, `unlink`, `addDir`, `unlinkDir`\n     * @property watchEvents\n     * @type Array\n     * @default [\"change\"]\n     * @since 2.18.8\n     */\n    watchEvents: [\"change\"],\n\n    /**\n     * Watch files automatically - this should be used as an\n     * alternative to the `files` option. When this option is used, some directories\n     * will be ignored automatically such as `node_modules` `bower_components` `.sass-cache`\n     * `.vscode` `.git` `.idea`\n     *\n     * @property watch\n     * @type Boolean\n     * @default false\n     * @since 2.23.0\n     */\n    watch: false,\n\n    /**\n     * Patterns for any watchers to ignore. Anything provided here\n     * will end up inside `watchOptions.ignored`\n     * @property ignore\n     * @type Array\n     * @default []\n     * @since 2.23.0\n     */\n    ignore: [],\n\n    /**\n     * Serve an index.html file for all non-asset routes. Useful\n     * when using client-routers\n     * @property single\n     * @type Boolean\n     * @default false\n     * @since 2.23.0\n     */\n    single: false,\n\n    /**\n     * File watching options that get passed along to [Chokidar](https://github.com/paulmillr/chokidar).\n     * Check their docs for available options\n     * @property watchOptions\n     * @type Object\n     * @default undefined\n     * @since 2.6.0\n     */\n    watchOptions: {\n        ignoreInitial: true\n        /*\n         persistent: true,\n\n         ignored: '*.txt',\n         followSymlinks: true,\n         cwd: '.',\n\n         usePolling: true,\n         alwaysStat: false,\n         depth: undefined,\n         interval: 100,\n\n         ignorePermissionErrors: false,\n         atomic: true\n         */\n    },\n\n    /**\n     * Use the built-in static server for basic HTML/JS/CSS websites.\n     * @property server\n     * @type Object|Boolean\n     * @default false\n     */\n    server: false,\n\n    /**\n     * Proxy an EXISTING vhost. Browsersync will wrap your vhost with a proxy URL to view your site.\n     * @property proxy\n     * @type String|Object|Boolean\n     * @param {String} [target]\n     * @param {Boolean} [ws] - Enable websocket proxying\n     * @param {Function|Array} [middleware]\n     * @param {Function} [reqHeaders]\n     * @param {Array} [proxyReq]\n     * @param {Array} [proxyRes]\n     * @default false\n     */\n    proxy: false,\n\n    /**\n     * @property port\n     * @type Number\n     * @default 3000\n     */\n    port: 3000,\n\n    /**\n     * @property middleware\n     * @type Function|Array\n     * @default false\n     */\n    middleware: false,\n\n    /**\n     * Add additional directories from which static\n     * files should be served. Should only be used in `proxy` or `snippet`\n     * mode.\n     * @property serveStatic\n     * @type Array\n     * @default []\n     * @since 2.8.0\n     */\n    serveStatic: [],\n\n    /**\n     * Options that are passed to the serve-static middleware\n     * when you use the string[] syntax: eg: `serveStatic: ['./app']`. Please see\n     * [serve-static](https://github.com/expressjs/serve-static) for details\n     *\n     * @property serveStaticOptions\n     * @type Object\n     * @since 2.17.0\n     */\n\n    /**\n     * Enable https for localhost development. **Note** - this is not needed for proxy\n     * option as it will be inferred from your target url.\n     * @property https\n     * @type Boolean\n     * @default undefined\n     * @since 1.3.0\n     */\n\n    /**\n     * Override http module to allow using 3rd party server modules (such as http2)\n     * *Note*: these modules are not included in the Browsersync package - you need\n     * to 'npm install' any that you'd like to use.\n     * @property httpModule\n     * @type string\n     * @default undefined\n     * @since 2.18.0\n     */\n\n    /**\n     * Current working directory\n     * @property cwd\n     * @type String\n     * @since 2.23.0\n     */\n\n    /**\n     * Register callbacks via a regular option - this can be used\n     * to get access the Browsersync instance in situations where you\n     * cannot provide a callback via the normal API (for example, in a Gruntfile)\n     *\n     * **Note**: Only the `ready` callback is currently supported here.\n     *\n     * @property callbacks\n     * @type Object\n     * @param {Function} ready\n     */\n\n    /**\n     * Clicks, Scrolls & Form inputs on any device will be mirrored to all others.\n     * @property ghostMode\n     * @param {Boolean} [clicks=true]\n     * @param {Boolean} [scroll=true]\n     * @param {Boolean} [location=true]\n     * @param {Boolean} [forms=true]\n     * @param {Boolean} [forms.submit=true]\n     * @param {Boolean} [forms.inputs=true]\n     * @param {Boolean} [forms.toggles=true]\n     * @type Object\n     */\n    ghostMode: {\n        clicks: true,\n        scroll: true,\n        location: true,\n        forms: {\n            submit: true,\n            inputs: true,\n            toggles: true\n        }\n    },\n\n    /**\n     * Can be either \"info\", \"debug\", \"warn\", or \"silent\"\n     * @property logLevel\n     * @type String\n     * @default info\n     */\n    logLevel: \"info\",\n\n    /**\n     * Change the console logging prefix. Useful if you're creating your\n     * own project based on Browsersync\n     * @property logPrefix\n     * @type String\n     * @default Browsersync\n     * @since 1.5.1\n     */\n    logPrefix: \"Browsersync\",\n\n    /**\n     * @property logConnections\n     * @type Boolean\n     * @default false\n     */\n    logConnections: false,\n\n    /**\n     * @property logFileChanges\n     * @type Boolean\n     * @default true\n     */\n    logFileChanges: true,\n\n    /**\n     * Log the snippet to the console when you're in snippet mode (no proxy/server)\n     * @property logSnippet\n     * @type: Boolean\n     * @default true\n     * @since 1.5.2\n     */\n    logSnippet: true,\n\n    /**\n     * You can prevent Browsersync from injecting the connection snippet\n     * by passing `snippet: false`.\n     * @property snippet\n     * @type Boolean\n     * @default undefined\n     */\n\n    /**\n     * You can control how the snippet is injected\n     * onto each page via a custom regex + function.\n     * You can also provide patterns for certain urls\n     * that should be ignored from the snippet injection.\n     * @property snippetOptions\n     * @since 2.0.0\n     * @param {Boolean} [async] - should the script tags have the async attribute?\n     * @param {Array} [blacklist]\n     * @param {Array} [whitelist]\n     * @param {RegExp} [rule.match=/$/]\n     * @param {Function} [rule.fn=Function]\n     * @type Object\n     */\n    snippetOptions: {\n        async: true,\n        whitelist: [],\n        blacklist: [],\n        rule: {\n            match: /<body[^>]*>/i,\n            fn: function(snippet, match) {\n                return match + snippet;\n            }\n        }\n    },\n\n    /**\n     * Add additional HTML rewriting rules.\n     * @property rewriteRules\n     * @since 2.4.0\n     * @type Array\n     * @default false\n     */\n    rewriteRules: [],\n\n    /**\n     * @property tunnel\n     * @type String|Boolean\n     * @default null\n     */\n\n    /**\n     * Decide which URL to open automatically when Browsersync starts. Defaults to \"local\" if none set.\n     * Can be `true`, `local`, `external`, `ui`, `ui-external`, `tunnel` or `false`\n     * @property open\n     * @type Boolean|String\n     * @default true\n     */\n    open: \"local\",\n\n    /**\n     * @property browser\n     * @type String|Array\n     * @default default\n     */\n    browser: \"default\",\n\n    /**\n     * Add HTTP access control (CORS) headers to assets served by Browsersync.\n     * @property cors\n     * @type boolean\n     * @default false\n     * @since 2.16.0\n     */\n    cors: false,\n\n    hostnameSuffix: false,\n\n    /**\n     * Reload each browser when Browsersync is restarted.\n     * @property reloadOnRestart\n     * @type Boolean\n     * @default false\n     */\n    reloadOnRestart: false,\n\n    /**\n     * The small pop-over notifications in the browser are not always needed/wanted.\n     * @property notify\n     * @type Boolean\n     * @default true\n     */\n    notify: true,\n\n    /**\n     * @property scrollProportionally\n     * @type Boolean\n     * @default true\n     */\n    scrollProportionally: true,\n\n    /**\n     * @property scrollThrottle\n     * @type Number\n     * @default 0\n     */\n    scrollThrottle: 0,\n\n    /**\n     * Decide which technique should be used to restore\n     * scroll position following a reload.\n     * Can be `window.name` or `cookie`\n     * @property scrollRestoreTechnique\n     * @type String\n     * @default 'window.name'\n     */\n    scrollRestoreTechnique: \"window.name\",\n\n    /**\n     * Sync the scroll position of any element\n     * on the page. Add any amount of CSS selectors\n     * @property scrollElements\n     * @type Array\n     * @default []\n     * @since 2.9.0\n     */\n    scrollElements: [],\n\n    /**\n     * Sync the scroll position of any element\n     * on the page - where any scrolled element\n     * will cause all others to match scroll position.\n     * This is helpful when a breakpoint alters which element\n     * is actually scrolling\n     * @property scrollElementMapping\n     * @type Array\n     * @default []\n     * @since 2.9.0\n     */\n    scrollElementMapping: [],\n\n    /**\n     * Time, in milliseconds, to wait before\n     * instructing the browser to reload/inject following a\n     * file change event\n     * @property reloadDelay\n     * @type Number\n     * @default 0\n     */\n    reloadDelay: 0,\n\n    /**\n     * Wait for a specified window of event-silence before\n     * sending any reload events.\n     * @property reloadDebounce\n     * @type Number\n     * @default 0\n     * @since 2.6.0\n     */\n    reloadDebounce: 500,\n\n    /**\n     * Emit only the first event during sequential time windows\n     * of a specified duration.\n     * @property reloadThrottle\n     * @type Number\n     * @default 0\n     * @since 2.13.0\n     */\n    reloadThrottle: 0,\n\n    /**\n     * User provided plugins\n     * @property plugins\n     * @type Array\n     * @default []\n     * @since 2.6.0\n     */\n    plugins: [],\n\n    /**\n     * @property injectChanges\n     * @type Boolean\n     * @default true\n     */\n    injectChanges: true,\n\n    /**\n     * @property startPath\n     * @type String|Null\n     * @default null\n     */\n    startPath: null,\n\n    /**\n     * Whether to minify client script, or not.\n     * @property minify\n     * @type Boolean\n     * @default true\n     */\n    minify: true,\n\n    /**\n     * @property host\n     * @type String\n     * @default null\n     */\n    host: null,\n\n    /**\n     * Specify a host to listen on. Use this if you want to\n     * prevent binding to all interfaces.\n     *\n     * Note: When you specify this option, it overrides the 'host' option\n     * @property listen\n     * @type String\n     * @default undefined\n     */\n\n    /**\n     * Support environments where dynamic hostnames are not required\n     * (ie: electron)\n     * @property localOnly\n     * @type Boolean\n     * @default false\n     * @since 2.14.0\n     */\n    localOnly: false,\n\n    /**\n     * @property codeSync\n     * @type Boolean\n     * @default true\n     */\n    codeSync: true,\n\n    /**\n     * @property timestamps\n     * @type Boolean\n     * @default true\n     */\n    timestamps: true,\n\n    clientEvents: [\n        \"scroll\",\n        \"scroll:element\",\n        \"input:text\",\n        \"input:toggles\",\n        \"form:submit\",\n        \"form:reset\",\n        \"click\"\n    ],\n\n    /**\n     * Alter the script path for complete control over where the Browsersync\n     * Javascript is served from. Whatever you return from this function\n     * will be used as the script path.\n     * @property scriptPath\n     * @default undefined\n     * @since 1.5.0\n     * @type Function\n     */\n\n    /**\n     * Configure the Socket.IO path and namespace & domain to avoid collisions.\n     * @property socket\n     * @param {String} [path=\"/browser-sync/socket.io\"]\n     * @param {String} [clientPath=\"/browser-sync\"]\n     * @param {String|Function} [namespace=\"/browser-sync\"]\n     * @param {String|Function} [domain=undefined]\n     * @param {String|Function} [port=undefined]\n     * @param {Object} [clients.heartbeatTimeout=5000]\n     * @since 1.6.2\n     * @type Object\n     */\n    socket: {\n        socketIoOptions: {\n            log: false\n        },\n        socketIoClientConfig: {\n            reconnectionAttempts: 50\n        },\n        path: \"/browser-sync/socket.io\",\n        clientPath: \"/browser-sync\",\n        namespace: \"/browser-sync\",\n        clients: {\n            heartbeatTimeout: 5000\n        }\n    },\n\n    /**\n     * Configure the script domain\n     * @property script\n     * @param {String|Function} [domain=undefined]\n     * @since 2.14.0\n     * @type Object\n     */\n\n    tagNames: {\n        less: \"link\",\n        scss: \"link\",\n        css: \"link\",\n        jpg: \"img\",\n        jpeg: \"img\",\n        png: \"img\",\n        svg: \"img\",\n        gif: \"img\",\n        js: \"script\"\n    },\n\n    injectFileTypes: [\"css\", \"png\", \"jpg\", \"jpeg\", \"svg\", \"gif\", \"webp\", \"map\"],\n    injectNotification: false, // console | overlay\n    excludedFileTypes: [\n        \"js\",\n        \"css\",\n        \"pdf\",\n        \"map\",\n        \"svg\",\n        \"ico\",\n        \"woff\",\n        \"json\",\n        \"eot\",\n        \"ttf\",\n        \"png\",\n        \"jpg\",\n        \"jpeg\",\n        \"webp\",\n        \"gif\",\n        \"mp4\",\n        \"mp3\",\n        \"3gp\",\n        \"ogg\",\n        \"ogv\",\n        \"webm\",\n        \"m4a\",\n        \"flv\",\n        \"wmv\",\n        \"avi\",\n        \"swf\",\n        \"scss\"\n    ]\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/file-event-handler.js",
    "content": "var utils = require(\"./utils\");\n\n/**\n * Apply the operators that apply to the 'file:changed' event\n * @param {Rx.Observable} subject\n * @param options\n * @return {Rx.Observable<{type: string, files: Array<any>}>}\n */\nfunction fileChanges(subject, options) {\n    const operators = [\n        {\n            option: \"reloadThrottle\",\n            fnName: \"throttle\"\n        },\n        {\n            option: \"reloadDelay\",\n            fnName: \"delay\"\n        }\n    ];\n\n    const scheduler = options.getIn([\"debug\", \"scheduler\"]);\n\n    /**\n     * Create a stream buffered/debounced stream of events\n     */\n    const initial = getAggregatedDebouncedStream(subject, options, scheduler);\n\n    return applyOperators(operators, initial, options, scheduler).map(function(\n        items\n    ) {\n        const paths = items.map(x => x.path);\n\n        if (\n            utils.willCauseReload(paths, options.get(\"injectFileTypes\").toJS())\n        ) {\n            return {\n                type: \"reload\",\n                files: items\n            };\n        }\n        return {\n            type: \"inject\",\n            files: items\n        };\n    });\n}\nmodule.exports.fileChanges = fileChanges;\n\n/**\n * Apply the operators that apply to the 'browser:reload' event\n * @param {Rx.Observable} subject\n * @param options\n * @returns {Rx.Observable}\n */\nfunction applyReloadOperators(subject, options) {\n    var operators = [\n        {\n            option: \"reloadDebounce\",\n            fnName: \"debounce\"\n        },\n        {\n            option: \"reloadThrottle\",\n            fnName: \"throttle\"\n        },\n        {\n            option: \"reloadDelay\",\n            fnName: \"delay\"\n        }\n    ];\n\n    return applyOperators(\n        operators,\n        subject,\n        options,\n        options.getIn([\"debug\", \"scheduler\"])\n    );\n}\nmodule.exports.applyReloadOperators = applyReloadOperators;\n\n/**\n * @param items\n * @param subject\n * @param options\n * @param scheduler\n */\nfunction applyOperators(items, subject, options, scheduler) {\n    return items.reduce(function(subject, item) {\n        var value = options.get(item.option);\n        if (value > 0) {\n            return subject[item.fnName].call(subject, value, scheduler);\n        }\n        return subject;\n    }, subject);\n}\n\n/**\n * @param subject\n * @param options\n * @param scheduler\n */\nfunction getAggregatedDebouncedStream(subject, options, scheduler) {\n    return subject\n        .filter(function(x) {\n            return options.get(\"watchEvents\").indexOf(x.event) > -1;\n        })\n        .buffer(subject.debounce(options.get(\"reloadDebounce\"), scheduler));\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/file-utils.js",
    "content": "\"use strict\";\n\nvar _ = require(\"./lodash.custom\");\n\nvar fileUtils = {\n    /**\n     * React to file-change events that occur on \"core\" namespace only\n     * @param bs\n     * @param data\n     */\n    changedFile: function(bs, data) {\n        /**\n         * If the event property is undefined, infer that it's a 'change'\n         * event due the fact this handler is for emitter.emit(\"file:changed\")\n         */\n        if (_.isUndefined(data.event)) {\n            data.event = \"change\";\n        }\n        /**\n         * Chokidar always sends an 'event' property - which could be\n         * `add` `unlink` etc etc so we need to check for that and only\n         * respond to 'change', for now.\n         */\n        if (bs.options.get(\"watchEvents\").indexOf(data.event) > -1) {\n            if (!bs.paused && data.namespace === \"core\") {\n                bs.events.emit(\n                    \"file:reload\",\n                    fileUtils.getFileInfo(data, bs.options)\n                );\n            }\n        }\n    },\n    /**\n     * @param data\n     * @param options\n     * @returns {{assetFileName: *, fileExtension: String}}\n     */\n    getFileInfo: function(data, options) {\n        data.ext = require(\"path\")\n            .extname(data.path)\n            .slice(1);\n        data.basename = require(\"path\").basename(data.path);\n\n        var obj = {\n            ext: data.ext,\n            path: data.path,\n            basename: data.basename,\n            event: data.event,\n            type: \"inject\"\n        };\n\n        // RELOAD page\n        if (!_.includes(options.get(\"injectFileTypes\").toJS(), obj.ext)) {\n            obj.url = obj.path;\n            obj.type = \"reload\";\n        }\n\n        obj.path = data.path;\n        obj.log = data.log;\n\n        return obj;\n    }\n};\n\nmodule.exports = fileUtils;\n"
  },
  {
    "path": "packages/browser-sync/lib/file-watcher.js",
    "content": "\"use strict\";\n\nvar _ = require(\"./lodash.custom\");\nvar utils = require(\"./utils\");\nvar Rx = require(\"rx\");\n\n/**\n * Plugin interface\n * @returns {*|function(this:exports)}\n */\nmodule.exports.plugin = function(bs) {\n    var options = bs.options;\n    var emitter = bs.emitter;\n\n    var defaultWatchOptions = options.get(\"watchOptions\").toJS();\n\n    return options.get(\"files\").reduce(function(map, glob, namespace) {\n        /**\n         * Default CB when not given\n         * @param event\n         * @param path\n         */\n        var fn = function(event, path) {\n            emitter.emit(\"file:changed\", {\n                event: event,\n                path: path,\n                namespace: namespace\n            });\n        };\n\n        var jsItem = glob.toJS();\n\n        if (jsItem.globs.length) {\n            var watcher = watch(jsItem.globs, defaultWatchOptions, fn);\n            map[namespace] = {\n                watchers: [watcher]\n            };\n        }\n\n        if (jsItem.objs.length) {\n            jsItem.objs.forEach(function(item) {\n                if (!_.isFunction(item.fn)) {\n                    item.fn = fn;\n                }\n                var watcher = watch(\n                    item.match,\n                    item.options || defaultWatchOptions,\n                    item.fn.bind(bs.publicInstance)\n                );\n                if (!map[namespace]) {\n                    map[namespace] = {\n                        watchers: [watcher]\n                    };\n                } else {\n                    map[namespace].watchers.push(watcher);\n                }\n            });\n        }\n\n        return map;\n    }, {});\n};\n\n/**\n * @param patterns\n * @param opts\n * @param cb\n * @returns {*}\n */\nfunction watch(patterns, opts, cb) {\n    if (typeof opts === \"function\") {\n        cb = opts;\n        opts = {};\n    }\n\n    var watcher = require(\"chokidar\").watch(patterns, opts);\n\n    if (_.isFunction(cb)) {\n        watcher.on(\"all\", cb);\n    }\n\n    // watcher.on('ready', () => {\n    //     console.log(watcher.getWatched());\n    // });\n\n    return watcher;\n}\n\nmodule.exports.watch = watch;\n"
  },
  {
    "path": "packages/browser-sync/lib/hooks.js",
    "content": "\"use strict\";\n\nvar _ = require(\"./lodash.custom\");\nvar Immutable = require(\"immutable\");\nvar snippetUtils = require(\"./snippet\").utils;\n\nmodule.exports = {\n    /**\n     *\n     * @this {BrowserSync}\n     * @returns {String}\n     */\n    \"client:js\": function(hooks, data) {\n        var js = snippetUtils.getClientJs(data.port, data.options);\n\n        return hooks.reduce(\n            function(acc, hook) {\n                if (typeof hook === \"function\") {\n                    return acc.concat(hook);\n                }\n                return acc.concat(String(hook));\n            },\n            [js]\n        );\n    },\n    /**\n     * @this {BrowserSync}\n     * @returns {Array}\n     */\n    \"client:events\": function(hooks, clientEvents) {\n        hooks.forEach(function(hook) {\n            var result = hook(this);\n\n            if (Array.isArray(result)) {\n                clientEvents = _.union(clientEvents, result);\n            } else {\n                clientEvents.push(result);\n            }\n        }, this);\n\n        return clientEvents;\n    },\n    /**\n     * @returns {Array}\n     */\n    \"server:middleware\": function(hooks, initial) {\n        initial = initial || [];\n\n        _.each(\n            hooks,\n            function(hook) {\n                var result = hook(this);\n\n                if (Array.isArray(result)) {\n                    result.forEach(function(res) {\n                        if (_.isFunction(res)) {\n                            initial = initial.push(res);\n                        }\n                    });\n                } else {\n                    if (_.isFunction(result)) {\n                        initial = initial.push(result);\n                    }\n                }\n            },\n            this\n        );\n\n        return initial;\n    },\n    /**\n     * @param {Array} hooks\n     * @param {Map|List} initial\n     * @param pluginOptions\n     * @returns {any}\n     */\n    \"files:watch\": function(hooks, initial, pluginOptions) {\n        var opts;\n\n        if (pluginOptions) {\n            opts = Immutable.fromJS(pluginOptions);\n            opts.forEach(function(value, key) {\n                if (!value) {\n                    return;\n                }\n                var files = value.get(\"files\");\n                if (files) {\n                    var fileArg = require(\"./cli/cli-options\").makeFilesArg(\n                        files\n                    );\n                    if (fileArg) {\n                        initial = initial.set(key, Immutable.fromJS(fileArg));\n                    }\n                }\n            });\n        }\n\n        return initial;\n    }\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/http-protocol.js",
    "content": "\"use strict\";\n\nvar proto = exports;\nvar instanceMethods = [\"exit\", \"notify\", \"pause\", \"resume\"];\nvar getBody = require(\"raw-body\");\nconst { parseParams, serializeParams } = require(\"./utils\");\nconst permittedSocketEvents = [\n    \"file:reload\",\n    \"browser:reload\",\n    \"browser:notify\",\n    \"browser:location\",\n    \"options:set\"\n];\n\n/**\n * Does the requested method expect an instance of BrowserSync\n * or raw access to the emitter?\n * @param method\n * @returns {boolean}\n */\nfunction methodRequiresInstance(method) {\n    return instanceMethods.indexOf(method) > -1;\n}\n\n/**\n * Use BrowserSync options + querystring to create a\n * full HTTP/HTTTPS url.\n *\n * Eg. http://localhost:3000/__browser_sync__?method=reload\n * Eg. http://localhost:3000/__browser_sync__?method=reload&args=core.css\n * Eg. http://localhost:3000/__browser_sync__?method=reload&args=core.css&args=core.min\n *\n * @param args\n * @param url\n * @returns {string}\n */\nproto.getUrl = function(args, url) {\n    return [\n        url,\n        require(\"./config\").httpProtocol.path,\n        \"?\",\n        serializeParams(args).toString()\n    ].join(\"\");\n};\n\n/**\n * Return a middleware for handling the requests\n * @param {BrowserSync} bs\n * @returns {Function}\n */\nproto.middleware = function(bs) {\n    return function(req, res) {\n        if (req.method === \"POST\") {\n            return getBody(req, function(err, body) {\n                if (err) {\n                    const output = [\"Error: could not parse JSON.\"];\n                    res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n                    return res.end(output.join(\"\\n\"));\n                }\n                try {\n                    const [name, payload] = JSON.parse(body.toString());\n                    bs.io.sockets.emit(name, payload);\n                    return res.end(\n                        `Browsersync HTTP Protocol received: ${name} ${JSON.stringify(\n                            payload\n                        )}`\n                    );\n                } catch (e) {\n                    const output = [`Error: ${e.message}`];\n                    res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n                    return res.end(output.join(\"\\n\"));\n                }\n            });\n        }\n        var split = req.url.split(\"?\");\n        var params = parseParams(split[1]);\n        var output;\n\n        if (!Object.keys(params).length) {\n            output = [\n                \"Error: No Parameters were provided.\",\n                \"Example: http://localhost:3000/__browser_sync__?method=reload&args=core.css\"\n            ];\n            res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n            res.end(output.join(\"\\n\"));\n            return;\n        }\n\n        try {\n            var bsOrEmitter = methodRequiresInstance(params.method)\n                ? bs\n                : bs.events;\n\n            require(\"./public/\" + params.method)(bsOrEmitter).apply(null, [\n                params.args\n            ]);\n\n            output = [\n                \"Called public API method `.%s()`\".replace(\"%s\", params.method),\n                \"With args: \" + JSON.stringify(params.args)\n            ];\n\n            res.end(output.join(\"\\n\"));\n        } catch (e) {\n            res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n            res.write(\"Public API method `\" + params.method + \"` not found.\");\n            res.end();\n\n            return;\n        }\n    };\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/index.js",
    "content": "#! /usr/bin/env node\n\"use strict\";\n\n/**\n * @module BrowserSync\n */\nvar pjson = require(\"../package.json\");\nvar BrowserSync = require(\"./browser-sync\");\nvar publicUtils = require(\"./public/public-utils\");\nvar events = require(\"events\");\nvar chalk  = require(\"chalk\");\nvar PassThrough = require(\"stream\").PassThrough;\nvar logger = require(\"eazy-logger\").Logger({\n    useLevelPrefixes: true\n});\n\nvar singleton = false;\nvar singletonPlugins = [];\nvar instances = [];\n\n/**\n * @type {boolean|EventEmitter}\n */\nvar singletonEmitter = false;\n\nmodule.exports = initSingleton;\n\n/**\n * Create a Browsersync instance\n * @method create\n * @param {String} name an identifier that can used for retrieval later\n */\n\n/**\n * Get a single instance by name. This is useful if you have your\n * build scripts in separate files\n * @method get\n * @param {String} name\n * @returns {Object|Boolean}\n */\nmodule.exports.get = function(name) {\n    var instance = getSingle(name);\n    if (instance) {\n        return instance;\n    }\n    throw new Error(\n        \"An instance with the name `%s` was not found.\".replace(\"%s\", name)\n    );\n};\n\n/**\n * Check if an instance has been created.\n * @method has\n * @param {String} name\n * @returns {Boolean}\n */\nmodule.exports.has = function(name) {\n    var instance = getSingle(name);\n    if (instance) {\n        return true;\n    }\n    return false;\n};\n\n/**\n * Start the Browsersync service. This will launch a server, proxy or start the snippet\n * mode depending on your use-case.\n * @method init\n * @param {Object} [config] This is the main configuration for your Browsersync instance and can contain any of the [available options]({{site.links.options}})\n *  If you do not pass a config an argument for configuration, Browsersync will still run; but it will be in the `snippet` mode\n * @param {Function} [cb] If you pass a callback function, it will be called when Browsersync has completed all setup tasks and is ready to use. This\n * is useful when you need to wait for information (for example: urls, port etc) or perform other tasks synchronously.\n * @returns {BrowserSync}\n */\nmodule.exports.init = initSingleton;\n\n/**\n * Register a plugin. Must implement at least a 'plugin' method that returns a\n * callable function.\n *\n * @method use\n * @param {String} name The name of the plugin\n * @param {Object} module The object to be `required`.\n * @param {Function} [cb] A callback function that will return any errors.\n */\nmodule.exports.use = function() {\n    var args = Array.prototype.slice.call(arguments);\n    singletonPlugins.push({\n        args: args\n    });\n};\n\n/**\n * The `reload` method will inform all browsers about changed files and will either cause the browser to refresh, or inject the files where possible.\n *\n * @method reload\n * @param {String|Array|Object} [arg] The file or files to be reloaded.\n * @returns {*}\n */\nmodule.exports.reload = noop(\"reload\");\n\n/**\n * The `stream` method returns a transform stream and can act once or on many files.\n *\n * @method stream\n * @param {Object} [opts] Configuration for the stream method\n * @param {Object} [opts.match] Resulting files to reload. The path is from the\n * root of the site (not the root of your project).  You can use '**' to recurse\n * directories.\n * @param {Object} [opts.once] Only reload on the first changed file in the stream.\n * @since 2.6.0\n * @returns {*}\n */\nmodule.exports.stream = noop(\"stream\");\n\n/**\n * Helper method for browser notifications\n *\n * @method notify\n * @param {String|HTML} msg Can be a simple message such as 'Connected' or HTML\n * @param {Number} [timeout] How long the message will remain in the browser. @since 1.3.0\n */\nmodule.exports.notify = noop(\"notify\");\n\n/**\n * This method will close any running server, stop file watching & exit the current process.\n *\n * @method exit\n */\nmodule.exports.exit = noop(\"exit\");\n\n/**\n * Stand alone file-watcher. Use this along with Browsersync to create your own, minimal build system\n * @method watch\n * @param {string} patterns Glob patterns for files to watch\n * @param {object} [opts] Options to be passed to Chokidar - check what's available in [their docs](https://github.com/paulmillr/chokidar#getting-started)\n * @param {function} [fn] Callback function for each event.\n * @since 2.6.0\n */\nmodule.exports.watch = noop(\"watch\");\n\n/**\n * Method to pause file change events\n *\n * @method pause\n */\nmodule.exports.pause = noop(\"pause\");\n\n/**\n * Method to resume paused watchers\n *\n * @method resume\n */\nmodule.exports.resume = noop(\"resume\");\n\n/**\n * Add properties fo\n */\nObject.defineProperties(module.exports, {\n    /**\n     * The internal Event Emitter used by the running Browsersync instance (if there is one).\n     * You can use this to emit your own events, such as changed files, logging etc.\n     *\n     * @property emitter\n     */\n    emitter: {\n        get: function() {\n            if (!singletonEmitter) {\n                singletonEmitter = newEmitter();\n                return singletonEmitter;\n            }\n            return singletonEmitter;\n        }\n    },\n    /**\n     * A simple true/false flag that you can use to determine if there's a currently-running Browsersync instance.\n     *\n     * @property active\n     */\n    active: {\n        get: getSingletonValue.bind(null, \"active\")\n    },\n    /**\n     * A simple true/false flag to determine if the current instance is paused\n     *\n     * @property paused\n     */\n    paused: {\n        get: getSingletonValue.bind(null, \"paused\")\n    }\n});\n\n/**\n * Event emitter factory\n * @returns {EventEmitter}\n */\nfunction newEmitter() {\n    var emitter = new events.EventEmitter();\n    emitter.setMaxListeners(20);\n    return emitter;\n}\n\n/**\n * Get the singleton's emitter, or a new one.\n * @returns {EventEmitter}\n */\nfunction getSingletonEmitter() {\n    if (singletonEmitter) {\n        return singletonEmitter;\n    }\n    singletonEmitter = newEmitter();\n    return singletonEmitter;\n}\n\n/**\n * Helper to allow methods to be called on the module export\n * before there's a running instance\n * @param {String} name\n * @returns {Function}\n */\nfunction noop(name) {\n    return function() {\n        var args = Array.prototype.slice.call(arguments);\n        if (singleton) {\n            return singleton[name].apply(singleton, args);\n        } else {\n            if (publicUtils.isStreamArg(name, args)) {\n                return new PassThrough({ objectMode: true });\n            }\n        }\n    };\n}\n\n/**\n * Create a single instance when module export is used directly via browserSync({});\n * This is mostly for back-compatibility, for also for the nicer api.\n * This will never be removed to ensure we never break user-land, but\n * we should discourage it's use.\n * @returns {*}\n */\nfunction initSingleton() {\n    var instance;\n    if (instances.length) {\n        instance = instances.filter(function(item) {\n            return item.name === \"singleton\";\n        });\n        if (instance.length) {\n            logger.error(\n                chalk.yellow(\"You tried to start Browsersync twice!\"),\n                \"To create multiple instances, use\",\n                chalk.cyan(\"browserSync.create().init()\")\n            );\n            return instance;\n        }\n    }\n    var args = Array.prototype.slice.call(arguments);\n    singleton = create(\"singleton\", getSingletonEmitter());\n\n    if (singletonPlugins.length) {\n        singletonPlugins.forEach(function(obj) {\n            singleton.instance.registerPlugin.apply(\n                singleton.instance,\n                obj.args\n            );\n        });\n    }\n\n    singleton.init.apply(null, args);\n    return singleton;\n}\n\n/**\n * @param {String} prop\n * @returns {Object|Boolean}\n */\nfunction getSingletonValue(prop) {\n    var single = getSingle(\"singleton\");\n    if (single) {\n        return single[prop];\n    }\n    return false;\n}\n\n/**\n * Get a single instance by name\n * @param {String} name\n * @returns {Object|Boolean}\n */\nfunction getSingle(name) {\n    if (instances.length) {\n        var match = instances.filter(function(item) {\n            return item.name === name;\n        });\n        if (match.length) {\n            return match[0];\n        }\n    }\n    return false;\n}\n\n/**\n * Create an instance of Browsersync\n * @param {String} [name]\n * @param {EventEmitter} [emitter]\n * @returns {{init: *, exit: (exit|exports), notify: *, reload: *, cleanup: *, emitter: (Browsersync.events|*), use: *}}\n */\n\n/**\n * Reset the state of the module.\n * (should only be needed for test environments)\n */\nmodule.exports.reset = function() {\n    instances.forEach(function(item) {\n        item.cleanup();\n    });\n    instances = [];\n    singletonPlugins = [];\n    singletonEmitter = false;\n    singleton = false;\n};\n\n/**\n * @type {Array}\n */\nmodule.exports.instances = instances;\n\n/**\n * Create an instance of Browsersync\n * @param {String} [name]\n * @param {EventEmitter} [emitter]\n * @returns {{init: *, exit: (exit|exports), notify: *, reload: *, cleanup: *, emitter: (Browsersync.events|*), use: *}}\n */\nmodule.exports.create = create;\nfunction create(name, emitter) {\n    name = name || new Date().getTime();\n    emitter = emitter || newEmitter();\n\n    var browserSync = new BrowserSync(emitter);\n\n    var instance = {\n        name: name,\n        instance: browserSync,\n        exit: require(\"./public/exit\")(browserSync),\n        notify: require(\"./public/notify\")(browserSync),\n        pause: require(\"./public/pause\")(browserSync),\n        resume: require(\"./public/resume\")(browserSync),\n        reload: require(\"./public/reload\")(emitter),\n        stream: require(\"./public/stream\")(emitter),\n        cleanup: browserSync.cleanup.bind(browserSync),\n        use: browserSync.registerPlugin.bind(browserSync),\n        getOption: browserSync.getOption.bind(browserSync),\n        emitter: browserSync.events,\n        watch: require(\"./file-watcher\").watch\n    };\n\n    browserSync.publicInstance = instance;\n    instance.init = require(\"./public/init\")(browserSync, name, pjson);\n\n    Object.defineProperty(instance, \"active\", {\n        get: function() {\n            return browserSync.active;\n        }\n    });\n\n    Object.defineProperty(instance, \"paused\", {\n        get: function() {\n            return browserSync.paused;\n        }\n    });\n\n    /**\n     * Access to client-side socket for emitting events\n     *\n     * @property sockets\n     */\n    Object.defineProperty(instance, \"sockets\", {\n        get: function() {\n            if (!browserSync.active) {\n                return {\n                    emit: function() {},\n                    on: function() {}\n                };\n            } else {\n                return browserSync.io.sockets;\n            }\n        }\n    });\n\n    instances.push(instance);\n\n    return instance;\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/internal-events.js",
    "content": "\"use strict\";\n\nvar utils = require(\"./utils\");\nvar fileUtils = require(\"./file-utils\");\nvar Rx = require(\"rx\");\nvar fromEvent = Rx.Observable.fromEvent;\nvar fileHandler = require(\"./file-event-handler\");\n\nmodule.exports = function(bs) {\n    var events = {\n        /**\n         * File reloads\n         * @param data\n         */\n        \"file:reload\": function(data) {\n            bs.io.sockets.emit(\"file:reload\", data);\n        },\n        /**\n         * Browser Reloads\n         */\n        \"browser:reload\": function() {\n            bs.io.sockets.emit(\"browser:reload\");\n        },\n        /**\n         * Browser Notify\n         * @param data\n         */\n        \"browser:notify\": function(data) {\n            bs.io.sockets.emit(\"browser:notify\", data);\n        },\n        /**\n         * Things that happened after the service is running\n         * @param data\n         */\n        \"service:running\": function(data) {\n            var mode = bs.options.get(\"mode\");\n            var open = bs.options.get(\"open\");\n\n            if (\n                mode === \"proxy\" ||\n                mode === \"server\" ||\n                open === \"ui\" ||\n                open === \"ui-external\"\n            ) {\n                utils.openBrowser(data.url, bs.options, bs);\n            }\n\n            // log about any file watching\n            if (bs.watchers) {\n                bs.events.emit(\"file:watching\", bs.watchers);\n            }\n        },\n        /**\n         * Option setting\n         * @param data\n         */\n        \"options:set\": function(data) {\n            if (bs.io) {\n                bs.io.sockets.emit(\"options:set\", data);\n            }\n        },\n        /**\n         * Plugin configuration setting\n         * @param data\n         */\n        \"plugins:configure\": function(data) {\n            if (data.active) {\n                bs.pluginManager.enablePlugin(data.name);\n            } else {\n                bs.pluginManager.disablePlugin(data.name);\n            }\n            bs.setOption(\"userPlugins\", bs.getUserPlugins());\n        },\n        \"plugins:opts\": function(data) {\n            if (bs.pluginManager.pluginOptions[data.name]) {\n                bs.pluginManager.pluginOptions[data.name] = data.opts;\n                bs.setOption(\"userPlugins\", bs.getUserPlugins());\n            }\n        }\n    };\n\n    Object.keys(events).forEach(function(event) {\n        bs.events.on(event, events[event]);\n    });\n\n    var reloader = fileHandler\n        .applyReloadOperators(\n            fromEvent(bs.events, \"_browser:reload\"),\n            bs.options\n        )\n        .subscribe(function() {\n            bs.events.emit(\"browser:reload\");\n        });\n\n    var coreNamespacedWatchers = fromEvent(bs.events, \"file:changed\")\n        .filter(function() {\n            return bs.options.get(\"codeSync\");\n        })\n        .filter(function(x) {\n            return x.namespace === \"core\";\n        });\n\n    var handler = fileHandler\n        .fileChanges(coreNamespacedWatchers, bs.options)\n        .subscribe(function(x) {\n            if (x.type === \"reload\") {\n                bs.events.emit(\"browser:reload\", x);\n            }\n            if (x.type === \"inject\") {\n                x.files.forEach(function(data) {\n                    if (!bs.paused && data.namespace === \"core\") {\n                        bs.events.emit(\n                            \"file:reload\",\n                            fileUtils.getFileInfo(data, bs.options)\n                        );\n                    }\n                });\n            }\n        });\n\n    bs.registerCleanupTask(function() {\n        handler.dispose();\n        reloader.dispose();\n    });\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/lodash.custom.js",
    "content": "/**\n * @license\n * Lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash include=\"isUndefined,isFunction,toArray,includes,union,each,isString,merge,isObject,set\" exports=\"node\"`\n * Copyright JS Foundation and other contributors <https://js.foundation/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n(function() {\n    /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n    var undefined;\n\n    /** Used as the semantic version number. */\n    var VERSION = \"4.17.4\";\n\n    /** Used as the size to enable large array optimizations. */\n    var LARGE_ARRAY_SIZE = 200;\n\n    /** Error message constants. */\n    var FUNC_ERROR_TEXT = \"Expected a function\";\n\n    /** Used to stand-in for `undefined` hash values. */\n    var HASH_UNDEFINED = \"__lodash_hash_undefined__\";\n\n    /** Used as the maximum memoize cache size. */\n    var MAX_MEMOIZE_SIZE = 500;\n\n    /** Used to compose bitmasks for cloning. */\n    var CLONE_DEEP_FLAG = 1,\n        CLONE_FLAT_FLAG = 2,\n        CLONE_SYMBOLS_FLAG = 4;\n\n    /** Used to compose bitmasks for value comparisons. */\n    var COMPARE_PARTIAL_FLAG = 1,\n        COMPARE_UNORDERED_FLAG = 2;\n\n    /** Used to detect hot functions by number of calls within a span of milliseconds. */\n    var HOT_COUNT = 800,\n        HOT_SPAN = 16;\n\n    /** Used as references for various `Number` constants. */\n    var INFINITY = 1 / 0,\n        MAX_SAFE_INTEGER = 9007199254740991,\n        MAX_INTEGER = 1.7976931348623157e308,\n        NAN = 0 / 0;\n\n    /** `Object#toString` result references. */\n    var argsTag = \"[object Arguments]\",\n        arrayTag = \"[object Array]\",\n        asyncTag = \"[object AsyncFunction]\",\n        boolTag = \"[object Boolean]\",\n        dateTag = \"[object Date]\",\n        errorTag = \"[object Error]\",\n        funcTag = \"[object Function]\",\n        genTag = \"[object GeneratorFunction]\",\n        mapTag = \"[object Map]\",\n        numberTag = \"[object Number]\",\n        nullTag = \"[object Null]\",\n        objectTag = \"[object Object]\",\n        promiseTag = \"[object Promise]\",\n        proxyTag = \"[object Proxy]\",\n        regexpTag = \"[object RegExp]\",\n        setTag = \"[object Set]\",\n        stringTag = \"[object String]\",\n        symbolTag = \"[object Symbol]\",\n        undefinedTag = \"[object Undefined]\",\n        weakMapTag = \"[object WeakMap]\";\n\n    var arrayBufferTag = \"[object ArrayBuffer]\",\n        dataViewTag = \"[object DataView]\",\n        float32Tag = \"[object Float32Array]\",\n        float64Tag = \"[object Float64Array]\",\n        int8Tag = \"[object Int8Array]\",\n        int16Tag = \"[object Int16Array]\",\n        int32Tag = \"[object Int32Array]\",\n        uint8Tag = \"[object Uint8Array]\",\n        uint8ClampedTag = \"[object Uint8ClampedArray]\",\n        uint16Tag = \"[object Uint16Array]\",\n        uint32Tag = \"[object Uint32Array]\";\n\n    /** Used to match property names within property paths. */\n    var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n        reIsPlainProp = /^\\w*$/,\n        reLeadingDot = /^\\./,\n        rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n    /**\n     * Used to match `RegExp`\n     * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n     */\n    var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n    /** Used to match leading and trailing whitespace. */\n    var reTrim = /^\\s+|\\s+$/g;\n\n    /** Used to match backslashes in property paths. */\n    var reEscapeChar = /\\\\(\\\\)?/g;\n\n    /** Used to match `RegExp` flags from their coerced string values. */\n    var reFlags = /\\w*$/;\n\n    /** Used to detect bad signed hexadecimal string values. */\n    var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n    /** Used to detect binary string values. */\n    var reIsBinary = /^0b[01]+$/i;\n\n    /** Used to detect host constructors (Safari). */\n    var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n    /** Used to detect octal string values. */\n    var reIsOctal = /^0o[0-7]+$/i;\n\n    /** Used to detect unsigned integer values. */\n    var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n    /** Used to compose unicode character classes. */\n    var rsAstralRange = \"\\\\ud800-\\\\udfff\",\n        rsComboMarksRange = \"\\\\u0300-\\\\u036f\",\n        reComboHalfMarksRange = \"\\\\ufe20-\\\\ufe2f\",\n        rsComboSymbolsRange = \"\\\\u20d0-\\\\u20ff\",\n        rsComboRange =\n            rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n        rsVarRange = \"\\\\ufe0e\\\\ufe0f\";\n\n    /** Used to compose unicode capture groups. */\n    var rsAstral = \"[\" + rsAstralRange + \"]\",\n        rsCombo = \"[\" + rsComboRange + \"]\",\n        rsFitz = \"\\\\ud83c[\\\\udffb-\\\\udfff]\",\n        rsModifier = \"(?:\" + rsCombo + \"|\" + rsFitz + \")\",\n        rsNonAstral = \"[^\" + rsAstralRange + \"]\",\n        rsRegional = \"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",\n        rsSurrPair = \"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",\n        rsZWJ = \"\\\\u200d\";\n\n    /** Used to compose unicode regexes. */\n    var reOptMod = rsModifier + \"?\",\n        rsOptVar = \"[\" + rsVarRange + \"]?\",\n        rsOptJoin =\n            \"(?:\" +\n            rsZWJ +\n            \"(?:\" +\n            [rsNonAstral, rsRegional, rsSurrPair].join(\"|\") +\n            \")\" +\n            rsOptVar +\n            reOptMod +\n            \")*\",\n        rsSeq = rsOptVar + reOptMod + rsOptJoin,\n        rsSymbol =\n            \"(?:\" +\n            [\n                rsNonAstral + rsCombo + \"?\",\n                rsCombo,\n                rsRegional,\n                rsSurrPair,\n                rsAstral\n            ].join(\"|\") +\n            \")\";\n\n    /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n    var reUnicode = RegExp(\n        rsFitz + \"(?=\" + rsFitz + \")|\" + rsSymbol + rsSeq,\n        \"g\"\n    );\n\n    /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n    var reHasUnicode = RegExp(\n        \"[\" + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + \"]\"\n    );\n\n    /** Used to identify `toStringTag` values of typed arrays. */\n    var typedArrayTags = {};\n    typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[\n        int8Tag\n    ] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[\n        uint8Tag\n    ] = typedArrayTags[uint8ClampedTag] = typedArrayTags[\n        uint16Tag\n    ] = typedArrayTags[uint32Tag] = true;\n    typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[\n        arrayBufferTag\n    ] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[\n        dateTag\n    ] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[\n        mapTag\n    ] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[\n        regexpTag\n    ] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[\n        weakMapTag\n    ] = false;\n\n    /** Used to identify `toStringTag` values supported by `_.clone`. */\n    var cloneableTags = {};\n    cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[\n        arrayBufferTag\n    ] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[\n        dateTag\n    ] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[\n        int8Tag\n    ] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[\n        mapTag\n    ] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[\n        regexpTag\n    ] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[\n        symbolTag\n    ] = cloneableTags[uint8Tag] = cloneableTags[\n        uint8ClampedTag\n    ] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n    cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[\n        weakMapTag\n    ] = false;\n\n    /** Built-in method references without a dependency on `root`. */\n    var freeParseInt = parseInt;\n\n    /** Detect free variable `global` from Node.js. */\n    var freeGlobal =\n        typeof global == \"object\" &&\n        global &&\n        global.Object === Object &&\n        global;\n\n    /** Detect free variable `self`. */\n    var freeSelf =\n        typeof self == \"object\" && self && self.Object === Object && self;\n\n    /** Used as a reference to the global object. */\n    var root = freeGlobal || freeSelf || Function(\"return this\")();\n\n    /** Detect free variable `exports`. */\n    var freeExports =\n        typeof exports == \"object\" && exports && !exports.nodeType && exports;\n\n    /** Detect free variable `module`. */\n    var freeModule =\n        freeExports &&\n        typeof module == \"object\" &&\n        module &&\n        !module.nodeType &&\n        module;\n\n    /** Detect the popular CommonJS extension `module.exports`. */\n    var moduleExports = freeModule && freeModule.exports === freeExports;\n\n    /** Detect free variable `process` from Node.js. */\n    var freeProcess = moduleExports && freeGlobal.process;\n\n    /** Used to access faster Node.js helpers. */\n    var nodeUtil = (function() {\n        try {\n            return (\n                freeProcess &&\n                freeProcess.binding &&\n                freeProcess.binding(\"util\")\n            );\n        } catch (e) {}\n    })();\n\n    /* Node.js helper references. */\n    var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n    /*--------------------------------------------------------------------------*/\n\n    /**\n     * Adds the key-value `pair` to `map`.\n     *\n     * @private\n     * @param {Object} map The map to modify.\n     * @param {Array} pair The key-value pair to add.\n     * @returns {Object} Returns `map`.\n     */\n    function addMapEntry(map, pair) {\n        // Don't return `map.set` because it's not chainable in IE 11.\n        map.set(pair[0], pair[1]);\n        return map;\n    }\n\n    /**\n     * Adds `value` to `set`.\n     *\n     * @private\n     * @param {Object} set The set to modify.\n     * @param {*} value The value to add.\n     * @returns {Object} Returns `set`.\n     */\n    function addSetEntry(set, value) {\n        // Don't return `set.add` because it's not chainable in IE 11.\n        set.add(value);\n        return set;\n    }\n\n    /**\n     * A faster alternative to `Function#apply`, this function invokes `func`\n     * with the `this` binding of `thisArg` and the arguments of `args`.\n     *\n     * @private\n     * @param {Function} func The function to invoke.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} args The arguments to invoke `func` with.\n     * @returns {*} Returns the result of `func`.\n     */\n    function apply(func, thisArg, args) {\n        switch (args.length) {\n            case 0:\n                return func.call(thisArg);\n            case 1:\n                return func.call(thisArg, args[0]);\n            case 2:\n                return func.call(thisArg, args[0], args[1]);\n            case 3:\n                return func.call(thisArg, args[0], args[1], args[2]);\n        }\n        return func.apply(thisArg, args);\n    }\n\n    /**\n     * A specialized version of `_.forEach` for arrays without support for\n     * iteratee shorthands.\n     *\n     * @private\n     * @param {Array} [array] The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns `array`.\n     */\n    function arrayEach(array, iteratee) {\n        var index = -1,\n            length = array == null ? 0 : array.length;\n\n        while (++index < length) {\n            if (iteratee(array[index], index, array) === false) {\n                break;\n            }\n        }\n        return array;\n    }\n\n    /**\n     * A specialized version of `_.filter` for arrays without support for\n     * iteratee shorthands.\n     *\n     * @private\n     * @param {Array} [array] The array to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function arrayFilter(array, predicate) {\n        var index = -1,\n            length = array == null ? 0 : array.length,\n            resIndex = 0,\n            result = [];\n\n        while (++index < length) {\n            var value = array[index];\n            if (predicate(value, index, array)) {\n                result[resIndex++] = value;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * A specialized version of `_.includes` for arrays without support for\n     * specifying an index to search from.\n     *\n     * @private\n     * @param {Array} [array] The array to inspect.\n     * @param {*} target The value to search for.\n     * @returns {boolean} Returns `true` if `target` is found, else `false`.\n     */\n    function arrayIncludes(array, value) {\n        var length = array == null ? 0 : array.length;\n        return !!length && baseIndexOf(array, value, 0) > -1;\n    }\n\n    /**\n     * This function is like `arrayIncludes` except that it accepts a comparator.\n     *\n     * @private\n     * @param {Array} [array] The array to inspect.\n     * @param {*} target The value to search for.\n     * @param {Function} comparator The comparator invoked per element.\n     * @returns {boolean} Returns `true` if `target` is found, else `false`.\n     */\n    function arrayIncludesWith(array, value, comparator) {\n        var index = -1,\n            length = array == null ? 0 : array.length;\n\n        while (++index < length) {\n            if (comparator(value, array[index])) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * A specialized version of `_.map` for arrays without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} [array] The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function arrayMap(array, iteratee) {\n        var index = -1,\n            length = array == null ? 0 : array.length,\n            result = Array(length);\n\n        while (++index < length) {\n            result[index] = iteratee(array[index], index, array);\n        }\n        return result;\n    }\n\n    /**\n     * Appends the elements of `values` to `array`.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to append.\n     * @returns {Array} Returns `array`.\n     */\n    function arrayPush(array, values) {\n        var index = -1,\n            length = values.length,\n            offset = array.length;\n\n        while (++index < length) {\n            array[offset + index] = values[index];\n        }\n        return array;\n    }\n\n    /**\n     * A specialized version of `_.reduce` for arrays without support for\n     * iteratee shorthands.\n     *\n     * @private\n     * @param {Array} [array] The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {boolean} [initAccum] Specify using the first element of `array` as\n     *  the initial value.\n     * @returns {*} Returns the accumulated value.\n     */\n    function arrayReduce(array, iteratee, accumulator, initAccum) {\n        var index = -1,\n            length = array == null ? 0 : array.length;\n\n        if (initAccum && length) {\n            accumulator = array[++index];\n        }\n        while (++index < length) {\n            accumulator = iteratee(accumulator, array[index], index, array);\n        }\n        return accumulator;\n    }\n\n    /**\n     * A specialized version of `_.some` for arrays without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} [array] The array to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function arraySome(array, predicate) {\n        var index = -1,\n            length = array == null ? 0 : array.length;\n\n        while (++index < length) {\n            if (predicate(array[index], index, array)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Converts an ASCII `string` to an array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the converted array.\n     */\n    function asciiToArray(string) {\n        return string.split(\"\");\n    }\n\n    /**\n     * The base implementation of `_.findIndex` and `_.findLastIndex` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {number} fromIndex The index to search from.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function baseFindIndex(array, predicate, fromIndex, fromRight) {\n        var length = array.length,\n            index = fromIndex + (fromRight ? 1 : -1);\n\n        while (fromRight ? index-- : ++index < length) {\n            if (predicate(array[index], index, array)) {\n                return index;\n            }\n        }\n        return -1;\n    }\n\n    /**\n     * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} fromIndex The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function baseIndexOf(array, value, fromIndex) {\n        return value === value\n            ? strictIndexOf(array, value, fromIndex)\n            : baseFindIndex(array, baseIsNaN, fromIndex);\n    }\n\n    /**\n     * The base implementation of `_.isNaN` without support for number objects.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     */\n    function baseIsNaN(value) {\n        return value !== value;\n    }\n\n    /**\n     * The base implementation of `_.property` without support for deep paths.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function baseProperty(key) {\n        return function(object) {\n            return object == null ? undefined : object[key];\n        };\n    }\n\n    /**\n     * The base implementation of `_.times` without support for iteratee shorthands\n     * or max array length checks.\n     *\n     * @private\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     */\n    function baseTimes(n, iteratee) {\n        var index = -1,\n            result = Array(n);\n\n        while (++index < n) {\n            result[index] = iteratee(index);\n        }\n        return result;\n    }\n\n    /**\n     * The base implementation of `_.unary` without support for storing metadata.\n     *\n     * @private\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     */\n    function baseUnary(func) {\n        return function(value) {\n            return func(value);\n        };\n    }\n\n    /**\n     * The base implementation of `_.values` and `_.valuesIn` which creates an\n     * array of `object` property values corresponding to the property names\n     * of `props`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} props The property names to get values for.\n     * @returns {Object} Returns the array of property values.\n     */\n    function baseValues(object, props) {\n        return arrayMap(props, function(key) {\n            return object[key];\n        });\n    }\n\n    /**\n     * Checks if a `cache` value for `key` exists.\n     *\n     * @private\n     * @param {Object} cache The cache to query.\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function cacheHas(cache, key) {\n        return cache.has(key);\n    }\n\n    /**\n     * Gets the value at `key` of `object`.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function getValue(object, key) {\n        return object == null ? undefined : object[key];\n    }\n\n    /**\n     * Checks if `string` contains Unicode symbols.\n     *\n     * @private\n     * @param {string} string The string to inspect.\n     * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n     */\n    function hasUnicode(string) {\n        return reHasUnicode.test(string);\n    }\n\n    /**\n     * Converts `iterator` to an array.\n     *\n     * @private\n     * @param {Object} iterator The iterator to convert.\n     * @returns {Array} Returns the converted array.\n     */\n    function iteratorToArray(iterator) {\n        var data,\n            result = [];\n\n        while (!(data = iterator.next()).done) {\n            result.push(data.value);\n        }\n        return result;\n    }\n\n    /**\n     * Converts `map` to its key-value pairs.\n     *\n     * @private\n     * @param {Object} map The map to convert.\n     * @returns {Array} Returns the key-value pairs.\n     */\n    function mapToArray(map) {\n        var index = -1,\n            result = Array(map.size);\n\n        map.forEach(function(value, key) {\n            result[++index] = [key, value];\n        });\n        return result;\n    }\n\n    /**\n     * Creates a unary function that invokes `func` with its argument transformed.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {Function} transform The argument transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overArg(func, transform) {\n        return function(arg) {\n            return func(transform(arg));\n        };\n    }\n\n    /**\n     * Converts `set` to an array of its values.\n     *\n     * @private\n     * @param {Object} set The set to convert.\n     * @returns {Array} Returns the values.\n     */\n    function setToArray(set) {\n        var index = -1,\n            result = Array(set.size);\n\n        set.forEach(function(value) {\n            result[++index] = value;\n        });\n        return result;\n    }\n\n    /**\n     * A specialized version of `_.indexOf` which performs strict equality\n     * comparisons of values, i.e. `===`.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} fromIndex The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function strictIndexOf(array, value, fromIndex) {\n        var index = fromIndex - 1,\n            length = array.length;\n\n        while (++index < length) {\n            if (array[index] === value) {\n                return index;\n            }\n        }\n        return -1;\n    }\n\n    /**\n     * Converts `string` to an array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the converted array.\n     */\n    function stringToArray(string) {\n        return hasUnicode(string)\n            ? unicodeToArray(string)\n            : asciiToArray(string);\n    }\n\n    /**\n     * Converts a Unicode `string` to an array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the converted array.\n     */\n    function unicodeToArray(string) {\n        return string.match(reUnicode) || [];\n    }\n\n    /*--------------------------------------------------------------------------*/\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = root[\"__core-js_shared__\"];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n        var uid = /[^.]+$/.exec(\n            (coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO) || \"\"\n        );\n        return uid ? \"Symbol(src)_1.\" + uid : \"\";\n    })();\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp(\n        \"^\" +\n            funcToString\n                .call(hasOwnProperty)\n                .replace(reRegExpChar, \"\\\\$&\")\n                .replace(\n                    /hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\n                    \"$1.*?\"\n                ) +\n            \"$\"\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? root.Buffer : undefined,\n        Symbol = root.Symbol,\n        Uint8Array = root.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n        try {\n            var func = getNative(Object, \"defineProperty\");\n            func({}, \"\", {});\n            return func;\n        } catch (e) {}\n    })();\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeNow = Date.now;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(root, \"DataView\"),\n        Map = getNative(root, \"Map\"),\n        Promise = getNative(root, \"Promise\"),\n        Set = getNative(root, \"Set\"),\n        WeakMap = getNative(root, \"WeakMap\"),\n        nativeCreate = getNative(Object, \"create\");\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash() {\n        // No operation performed.\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n        function object() {}\n        return function(proto) {\n            if (!isObject(proto)) {\n                return {};\n            }\n            if (objectCreate) {\n                return objectCreate(proto);\n            }\n            object.prototype = proto;\n            var result = new object();\n            object.prototype = undefined;\n            return result;\n        };\n    })();\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n        var index = -1,\n            length = entries == null ? 0 : entries.length;\n\n        this.clear();\n        while (++index < length) {\n            var entry = entries[index];\n            this.set(entry[0], entry[1]);\n        }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n        this.__data__ = nativeCreate ? nativeCreate(null) : {};\n        this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n        var result = this.has(key) && delete this.__data__[key];\n        this.size -= result ? 1 : 0;\n        return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n        var data = this.__data__;\n        if (nativeCreate) {\n            var result = data[key];\n            return result === HASH_UNDEFINED ? undefined : result;\n        }\n        return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n        var data = this.__data__;\n        return nativeCreate\n            ? data[key] !== undefined\n            : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n        var data = this.__data__;\n        this.size += this.has(key) ? 0 : 1;\n        data[key] =\n            nativeCreate && value === undefined ? HASH_UNDEFINED : value;\n        return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype[\"delete\"] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n        var index = -1,\n            length = entries == null ? 0 : entries.length;\n\n        this.clear();\n        while (++index < length) {\n            var entry = entries[index];\n            this.set(entry[0], entry[1]);\n        }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n        this.__data__ = [];\n        this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n        var data = this.__data__,\n            index = assocIndexOf(data, key);\n\n        if (index < 0) {\n            return false;\n        }\n        var lastIndex = data.length - 1;\n        if (index == lastIndex) {\n            data.pop();\n        } else {\n            splice.call(data, index, 1);\n        }\n        --this.size;\n        return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n        var data = this.__data__,\n            index = assocIndexOf(data, key);\n\n        return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n        return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n        var data = this.__data__,\n            index = assocIndexOf(data, key);\n\n        if (index < 0) {\n            ++this.size;\n            data.push([key, value]);\n        } else {\n            data[index][1] = value;\n        }\n        return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype[\"delete\"] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n        var index = -1,\n            length = entries == null ? 0 : entries.length;\n\n        this.clear();\n        while (++index < length) {\n            var entry = entries[index];\n            this.set(entry[0], entry[1]);\n        }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n        this.size = 0;\n        this.__data__ = {\n            hash: new Hash(),\n            map: new (Map || ListCache)(),\n            string: new Hash()\n        };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n        var result = getMapData(this, key)[\"delete\"](key);\n        this.size -= result ? 1 : 0;\n        return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n        return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n        return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n        var data = getMapData(this, key),\n            size = data.size;\n\n        data.set(key, value);\n        this.size += data.size == size ? 0 : 1;\n        return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype[\"delete\"] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n        var index = -1,\n            length = values == null ? 0 : values.length;\n\n        this.__data__ = new MapCache();\n        while (++index < length) {\n            this.add(values[index]);\n        }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n        this.__data__.set(value, HASH_UNDEFINED);\n        return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n        return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n        var data = (this.__data__ = new ListCache(entries));\n        this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n        this.__data__ = new ListCache();\n        this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n        var data = this.__data__,\n            result = data[\"delete\"](key);\n\n        this.size = data.size;\n        return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n        return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n        return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n        var data = this.__data__;\n        if (data instanceof ListCache) {\n            var pairs = data.__data__;\n            if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) {\n                pairs.push([key, value]);\n                this.size = ++data.size;\n                return this;\n            }\n            data = this.__data__ = new MapCache(pairs);\n        }\n        data.set(key, value);\n        this.size = data.size;\n        return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype[\"delete\"] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n        var isArr = isArray(value),\n            isArg = !isArr && isArguments(value),\n            isBuff = !isArr && !isArg && isBuffer(value),\n            isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n            skipIndexes = isArr || isArg || isBuff || isType,\n            result = skipIndexes ? baseTimes(value.length, String) : [],\n            length = result.length;\n\n        for (var key in value) {\n            if (\n                (inherited || hasOwnProperty.call(value, key)) &&\n                !(\n                    skipIndexes &&\n                    // Safari 9 has enumerable `arguments.length` in strict mode.\n                    (key == \"length\" ||\n                        // Node.js 0.10 has enumerable non-index properties on buffers.\n                        (isBuff && (key == \"offset\" || key == \"parent\")) ||\n                        // PhantomJS 2 has enumerable non-index properties on typed arrays.\n                        (isType &&\n                            (key == \"buffer\" ||\n                                key == \"byteLength\" ||\n                                key == \"byteOffset\")) ||\n                        // Skip index properties.\n                        isIndex(key, length))\n                )\n            ) {\n                result.push(key);\n            }\n        }\n        return result;\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n        if (\n            (value !== undefined && !eq(object[key], value)) ||\n            (value === undefined && !(key in object))\n        ) {\n            baseAssignValue(object, key, value);\n        }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n        var objValue = object[key];\n        if (\n            !(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n            (value === undefined && !(key in object))\n        ) {\n            baseAssignValue(object, key, value);\n        }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n        var length = array.length;\n        while (length--) {\n            if (eq(array[length][0], key)) {\n                return length;\n            }\n        }\n        return -1;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n        return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n        return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n        if (key == \"__proto__\" && defineProperty) {\n            defineProperty(object, key, {\n                configurable: true,\n                enumerable: true,\n                value: value,\n                writable: true\n            });\n        } else {\n            object[key] = value;\n        }\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n        var result,\n            isDeep = bitmask & CLONE_DEEP_FLAG,\n            isFlat = bitmask & CLONE_FLAT_FLAG,\n            isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n        if (customizer) {\n            result = object\n                ? customizer(value, key, object, stack)\n                : customizer(value);\n        }\n        if (result !== undefined) {\n            return result;\n        }\n        if (!isObject(value)) {\n            return value;\n        }\n        var isArr = isArray(value);\n        if (isArr) {\n            result = initCloneArray(value);\n            if (!isDeep) {\n                return copyArray(value, result);\n            }\n        } else {\n            var tag = getTag(value),\n                isFunc = tag == funcTag || tag == genTag;\n\n            if (isBuffer(value)) {\n                return cloneBuffer(value, isDeep);\n            }\n            if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n                result = isFlat || isFunc ? {} : initCloneObject(value);\n                if (!isDeep) {\n                    return isFlat\n                        ? copySymbolsIn(value, baseAssignIn(result, value))\n                        : copySymbols(value, baseAssign(result, value));\n                }\n            } else {\n                if (!cloneableTags[tag]) {\n                    return object ? value : {};\n                }\n                result = initCloneByTag(value, tag, baseClone, isDeep);\n            }\n        }\n        // Check for circular references and return its corresponding clone.\n        stack || (stack = new Stack());\n        var stacked = stack.get(value);\n        if (stacked) {\n            return stacked;\n        }\n        stack.set(value, result);\n\n        var keysFunc = isFull\n            ? isFlat\n                ? getAllKeysIn\n                : getAllKeys\n            : isFlat\n            ? keysIn\n            : keys;\n\n        var props = isArr ? undefined : keysFunc(value);\n        arrayEach(props || value, function(subValue, key) {\n            if (props) {\n                key = subValue;\n                subValue = value[key];\n            }\n            // Recursively populate clone (susceptible to call stack limits).\n            assignValue(\n                result,\n                key,\n                baseClone(subValue, bitmask, customizer, key, value, stack)\n            );\n        });\n        return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n        var index = -1,\n            length = array.length;\n\n        predicate || (predicate = isFlattenable);\n        result || (result = []);\n\n        while (++index < length) {\n            var value = array[index];\n            if (depth > 0 && predicate(value)) {\n                if (depth > 1) {\n                    // Recursively flatten arrays (susceptible to call stack limits).\n                    baseFlatten(value, depth - 1, predicate, isStrict, result);\n                } else {\n                    arrayPush(result, value);\n                }\n            } else if (!isStrict) {\n                result[result.length] = value;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n        return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n        path = castPath(path, object);\n\n        var index = 0,\n            length = path.length;\n\n        while (object != null && index < length) {\n            object = object[toKey(path[index++])];\n        }\n        return index && index == length ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n        var result = keysFunc(object);\n        return isArray(object)\n            ? result\n            : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n        if (value == null) {\n            return value === undefined ? undefinedTag : nullTag;\n        }\n        return symToStringTag && symToStringTag in Object(value)\n            ? getRawTag(value)\n            : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n        return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n        return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n        if (value === other) {\n            return true;\n        }\n        if (\n            value == null ||\n            other == null ||\n            (!isObjectLike(value) && !isObjectLike(other))\n        ) {\n            return value !== value && other !== other;\n        }\n        return baseIsEqualDeep(\n            value,\n            other,\n            bitmask,\n            customizer,\n            baseIsEqual,\n            stack\n        );\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(\n        object,\n        other,\n        bitmask,\n        customizer,\n        equalFunc,\n        stack\n    ) {\n        var objIsArr = isArray(object),\n            othIsArr = isArray(other),\n            objTag = objIsArr ? arrayTag : getTag(object),\n            othTag = othIsArr ? arrayTag : getTag(other);\n\n        objTag = objTag == argsTag ? objectTag : objTag;\n        othTag = othTag == argsTag ? objectTag : othTag;\n\n        var objIsObj = objTag == objectTag,\n            othIsObj = othTag == objectTag,\n            isSameTag = objTag == othTag;\n\n        if (isSameTag && isBuffer(object)) {\n            if (!isBuffer(other)) {\n                return false;\n            }\n            objIsArr = true;\n            objIsObj = false;\n        }\n        if (isSameTag && !objIsObj) {\n            stack || (stack = new Stack());\n            return objIsArr || isTypedArray(object)\n                ? equalArrays(\n                      object,\n                      other,\n                      bitmask,\n                      customizer,\n                      equalFunc,\n                      stack\n                  )\n                : equalByTag(\n                      object,\n                      other,\n                      objTag,\n                      bitmask,\n                      customizer,\n                      equalFunc,\n                      stack\n                  );\n        }\n        if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n            var objIsWrapped =\n                    objIsObj && hasOwnProperty.call(object, \"__wrapped__\"),\n                othIsWrapped =\n                    othIsObj && hasOwnProperty.call(other, \"__wrapped__\");\n\n            if (objIsWrapped || othIsWrapped) {\n                var objUnwrapped = objIsWrapped ? object.value() : object,\n                    othUnwrapped = othIsWrapped ? other.value() : other;\n\n                stack || (stack = new Stack());\n                return equalFunc(\n                    objUnwrapped,\n                    othUnwrapped,\n                    bitmask,\n                    customizer,\n                    stack\n                );\n            }\n        }\n        if (!isSameTag) {\n            return false;\n        }\n        stack || (stack = new Stack());\n        return equalObjects(\n            object,\n            other,\n            bitmask,\n            customizer,\n            equalFunc,\n            stack\n        );\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n        var index = matchData.length,\n            length = index,\n            noCustomizer = !customizer;\n\n        if (object == null) {\n            return !length;\n        }\n        object = Object(object);\n        while (index--) {\n            var data = matchData[index];\n            if (\n                noCustomizer && data[2]\n                    ? data[1] !== object[data[0]]\n                    : !(data[0] in object)\n            ) {\n                return false;\n            }\n        }\n        while (++index < length) {\n            data = matchData[index];\n            var key = data[0],\n                objValue = object[key],\n                srcValue = data[1];\n\n            if (noCustomizer && data[2]) {\n                if (objValue === undefined && !(key in object)) {\n                    return false;\n                }\n            } else {\n                var stack = new Stack();\n                if (customizer) {\n                    var result = customizer(\n                        objValue,\n                        srcValue,\n                        key,\n                        object,\n                        source,\n                        stack\n                    );\n                }\n                if (\n                    !(result === undefined\n                        ? baseIsEqual(\n                              srcValue,\n                              objValue,\n                              COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG,\n                              customizer,\n                              stack\n                          )\n                        : result)\n                ) {\n                    return false;\n                }\n            }\n        }\n        return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n        if (!isObject(value) || isMasked(value)) {\n            return false;\n        }\n        var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n        return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n        return (\n            isObjectLike(value) &&\n            isLength(value.length) &&\n            !!typedArrayTags[baseGetTag(value)]\n        );\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n        // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n        // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n        if (typeof value == \"function\") {\n            return value;\n        }\n        if (value == null) {\n            return identity;\n        }\n        if (typeof value == \"object\") {\n            return isArray(value)\n                ? baseMatchesProperty(value[0], value[1])\n                : baseMatches(value);\n        }\n        return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n        if (!isPrototype(object)) {\n            return nativeKeys(object);\n        }\n        var result = [];\n        for (var key in Object(object)) {\n            if (hasOwnProperty.call(object, key) && key != \"constructor\") {\n                result.push(key);\n            }\n        }\n        return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n        if (!isObject(object)) {\n            return nativeKeysIn(object);\n        }\n        var isProto = isPrototype(object),\n            result = [];\n\n        for (var key in object) {\n            if (\n                !(\n                    key == \"constructor\" &&\n                    (isProto || !hasOwnProperty.call(object, key))\n                )\n            ) {\n                result.push(key);\n            }\n        }\n        return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n        var matchData = getMatchData(source);\n        if (matchData.length == 1 && matchData[0][2]) {\n            return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n        }\n        return function(object) {\n            return object === source || baseIsMatch(object, source, matchData);\n        };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n        if (isKey(path) && isStrictComparable(srcValue)) {\n            return matchesStrictComparable(toKey(path), srcValue);\n        }\n        return function(object) {\n            var objValue = get(object, path);\n            return objValue === undefined && objValue === srcValue\n                ? hasIn(object, path)\n                : baseIsEqual(\n                      srcValue,\n                      objValue,\n                      COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG\n                  );\n        };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n        if (object === source) {\n            return;\n        }\n        baseFor(\n            source,\n            function(srcValue, key) {\n                if (isObject(srcValue)) {\n                    stack || (stack = new Stack());\n                    baseMergeDeep(\n                        object,\n                        source,\n                        key,\n                        srcIndex,\n                        baseMerge,\n                        customizer,\n                        stack\n                    );\n                } else {\n                    var newValue = customizer\n                        ? customizer(\n                              object[key],\n                              srcValue,\n                              key + \"\",\n                              object,\n                              source,\n                              stack\n                          )\n                        : undefined;\n\n                    if (newValue === undefined) {\n                        newValue = srcValue;\n                    }\n                    assignMergeValue(object, key, newValue);\n                }\n            },\n            keysIn\n        );\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(\n        object,\n        source,\n        key,\n        srcIndex,\n        mergeFunc,\n        customizer,\n        stack\n    ) {\n        var objValue = object[key],\n            srcValue = source[key],\n            stacked = stack.get(srcValue);\n\n        if (stacked) {\n            assignMergeValue(object, key, stacked);\n            return;\n        }\n        var newValue = customizer\n            ? customizer(objValue, srcValue, key + \"\", object, source, stack)\n            : undefined;\n\n        var isCommon = newValue === undefined;\n\n        if (isCommon) {\n            var isArr = isArray(srcValue),\n                isBuff = !isArr && isBuffer(srcValue),\n                isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n            newValue = srcValue;\n            if (isArr || isBuff || isTyped) {\n                if (isArray(objValue)) {\n                    newValue = objValue;\n                } else if (isArrayLikeObject(objValue)) {\n                    newValue = copyArray(objValue);\n                } else if (isBuff) {\n                    isCommon = false;\n                    newValue = cloneBuffer(srcValue, true);\n                } else if (isTyped) {\n                    isCommon = false;\n                    newValue = cloneTypedArray(srcValue, true);\n                } else {\n                    newValue = [];\n                }\n            } else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n                newValue = objValue;\n                if (isArguments(objValue)) {\n                    newValue = toPlainObject(objValue);\n                } else if (\n                    !isObject(objValue) ||\n                    (srcIndex && isFunction(objValue))\n                ) {\n                    newValue = initCloneObject(srcValue);\n                }\n            } else {\n                isCommon = false;\n            }\n        }\n        if (isCommon) {\n            // Recursively merge objects and arrays (susceptible to call stack limits).\n            stack.set(srcValue, newValue);\n            mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n            stack[\"delete\"](srcValue);\n        }\n        assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n        return function(object) {\n            return baseGet(object, path);\n        };\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n        return setToString(overRest(func, start, identity), func + \"\");\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n        if (!isObject(object)) {\n            return object;\n        }\n        path = castPath(path, object);\n\n        var index = -1,\n            length = path.length,\n            lastIndex = length - 1,\n            nested = object;\n\n        while (nested != null && ++index < length) {\n            var key = toKey(path[index]),\n                newValue = value;\n\n            if (index != lastIndex) {\n                var objValue = nested[key];\n                newValue = customizer\n                    ? customizer(objValue, key, nested)\n                    : undefined;\n                if (newValue === undefined) {\n                    newValue = isObject(objValue)\n                        ? objValue\n                        : isIndex(path[index + 1])\n                        ? []\n                        : {};\n                }\n            }\n            assignValue(nested, key, newValue);\n            nested = nested[key];\n        }\n        return object;\n    }\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty\n        ? identity\n        : function(func, string) {\n              return defineProperty(func, \"toString\", {\n                  configurable: true,\n                  enumerable: false,\n                  value: constant(string),\n                  writable: true\n              });\n          };\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n        // Exit early for strings to avoid a performance hit in some environments.\n        if (typeof value == \"string\") {\n            return value;\n        }\n        if (isArray(value)) {\n            // Recursively convert values (susceptible to call stack limits).\n            return arrayMap(value, baseToString) + \"\";\n        }\n        if (isSymbol(value)) {\n            return symbolToString ? symbolToString.call(value) : \"\";\n        }\n        var result = value + \"\";\n        return result == \"0\" && 1 / value == -INFINITY ? \"-0\" : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n        var index = -1,\n            includes = arrayIncludes,\n            length = array.length,\n            isCommon = true,\n            result = [],\n            seen = result;\n\n        if (comparator) {\n            isCommon = false;\n            includes = arrayIncludesWith;\n        } else if (length >= LARGE_ARRAY_SIZE) {\n            var set = iteratee ? null : createSet(array);\n            if (set) {\n                return setToArray(set);\n            }\n            isCommon = false;\n            includes = cacheHas;\n            seen = new SetCache();\n        } else {\n            seen = iteratee ? [] : result;\n        }\n        outer: while (++index < length) {\n            var value = array[index],\n                computed = iteratee ? iteratee(value) : value;\n\n            value = comparator || value !== 0 ? value : 0;\n            if (isCommon && computed === computed) {\n                var seenIndex = seen.length;\n                while (seenIndex--) {\n                    if (seen[seenIndex] === computed) {\n                        continue outer;\n                    }\n                }\n                if (iteratee) {\n                    seen.push(computed);\n                }\n                result.push(value);\n            } else if (!includes(seen, computed, comparator)) {\n                if (seen !== result) {\n                    seen.push(computed);\n                }\n                result.push(value);\n            }\n        }\n        return result;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n        if (isArray(value)) {\n            return value;\n        }\n        return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n        if (isDeep) {\n            return buffer.slice();\n        }\n        var length = buffer.length,\n            result = allocUnsafe\n                ? allocUnsafe(length)\n                : new buffer.constructor(length);\n\n        buffer.copy(result);\n        return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n        var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n        new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n        return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n        var buffer = isDeep\n            ? cloneArrayBuffer(dataView.buffer)\n            : dataView.buffer;\n        return new dataView.constructor(\n            buffer,\n            dataView.byteOffset,\n            dataView.byteLength\n        );\n    }\n\n    /**\n     * Creates a clone of `map`.\n     *\n     * @private\n     * @param {Object} map The map to clone.\n     * @param {Function} cloneFunc The function to clone values.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned map.\n     */\n    function cloneMap(map, isDeep, cloneFunc) {\n        var array = isDeep\n            ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG)\n            : mapToArray(map);\n        return arrayReduce(array, addMapEntry, new map.constructor());\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n        var result = new regexp.constructor(\n            regexp.source,\n            reFlags.exec(regexp)\n        );\n        result.lastIndex = regexp.lastIndex;\n        return result;\n    }\n\n    /**\n     * Creates a clone of `set`.\n     *\n     * @private\n     * @param {Object} set The set to clone.\n     * @param {Function} cloneFunc The function to clone values.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned set.\n     */\n    function cloneSet(set, isDeep, cloneFunc) {\n        var array = isDeep\n            ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG)\n            : setToArray(set);\n        return arrayReduce(array, addSetEntry, new set.constructor());\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n        return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n        var buffer = isDeep\n            ? cloneArrayBuffer(typedArray.buffer)\n            : typedArray.buffer;\n        return new typedArray.constructor(\n            buffer,\n            typedArray.byteOffset,\n            typedArray.length\n        );\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n        var index = -1,\n            length = source.length;\n\n        array || (array = Array(length));\n        while (++index < length) {\n            array[index] = source[index];\n        }\n        return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n        var isNew = !object;\n        object || (object = {});\n\n        var index = -1,\n            length = props.length;\n\n        while (++index < length) {\n            var key = props[index];\n\n            var newValue = customizer\n                ? customizer(object[key], source[key], key, object, source)\n                : undefined;\n\n            if (newValue === undefined) {\n                newValue = source[key];\n            }\n            if (isNew) {\n                baseAssignValue(object, key, newValue);\n            } else {\n                assignValue(object, key, newValue);\n            }\n        }\n        return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n        return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n        return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n        return baseRest(function(object, sources) {\n            var index = -1,\n                length = sources.length,\n                customizer = length > 1 ? sources[length - 1] : undefined,\n                guard = length > 2 ? sources[2] : undefined;\n\n            customizer =\n                assigner.length > 3 && typeof customizer == \"function\"\n                    ? (length--, customizer)\n                    : undefined;\n\n            if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n                customizer = length < 3 ? undefined : customizer;\n                length = 1;\n            }\n            object = Object(object);\n            while (++index < length) {\n                var source = sources[index];\n                if (source) {\n                    assigner(object, source, index, customizer);\n                }\n            }\n            return object;\n        });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n        return function(collection, iteratee) {\n            if (collection == null) {\n                return collection;\n            }\n            if (!isArrayLike(collection)) {\n                return eachFunc(collection, iteratee);\n            }\n            var length = collection.length,\n                index = fromRight ? length : -1,\n                iterable = Object(collection);\n\n            while (fromRight ? index-- : ++index < length) {\n                if (iteratee(iterable[index], index, iterable) === false) {\n                    break;\n                }\n            }\n            return collection;\n        };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n        return function(object, iteratee, keysFunc) {\n            var index = -1,\n                iterable = Object(object),\n                props = keysFunc(object),\n                length = props.length;\n\n            while (length--) {\n                var key = props[fromRight ? length : ++index];\n                if (iteratee(iterable[key], key, iterable) === false) {\n                    break;\n                }\n            }\n            return object;\n        };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && 1 / setToArray(new Set([, -0]))[1] == INFINITY)\n        ? noop\n        : function(values) {\n              return new Set(values);\n          };\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n        var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n            arrLength = array.length,\n            othLength = other.length;\n\n        if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n            return false;\n        }\n        // Assume cyclic values are equal.\n        var stacked = stack.get(array);\n        if (stacked && stack.get(other)) {\n            return stacked == other;\n        }\n        var index = -1,\n            result = true,\n            seen =\n                bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined;\n\n        stack.set(array, other);\n        stack.set(other, array);\n\n        // Ignore non-index properties.\n        while (++index < arrLength) {\n            var arrValue = array[index],\n                othValue = other[index];\n\n            if (customizer) {\n                var compared = isPartial\n                    ? customizer(othValue, arrValue, index, other, array, stack)\n                    : customizer(\n                          arrValue,\n                          othValue,\n                          index,\n                          array,\n                          other,\n                          stack\n                      );\n            }\n            if (compared !== undefined) {\n                if (compared) {\n                    continue;\n                }\n                result = false;\n                break;\n            }\n            // Recursively compare arrays (susceptible to call stack limits).\n            if (seen) {\n                if (\n                    !arraySome(other, function(othValue, othIndex) {\n                        if (\n                            !cacheHas(seen, othIndex) &&\n                            (arrValue === othValue ||\n                                equalFunc(\n                                    arrValue,\n                                    othValue,\n                                    bitmask,\n                                    customizer,\n                                    stack\n                                ))\n                        ) {\n                            return seen.push(othIndex);\n                        }\n                    })\n                ) {\n                    result = false;\n                    break;\n                }\n            } else if (\n                !(\n                    arrValue === othValue ||\n                    equalFunc(arrValue, othValue, bitmask, customizer, stack)\n                )\n            ) {\n                result = false;\n                break;\n            }\n        }\n        stack[\"delete\"](array);\n        stack[\"delete\"](other);\n        return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(\n        object,\n        other,\n        tag,\n        bitmask,\n        customizer,\n        equalFunc,\n        stack\n    ) {\n        switch (tag) {\n            case dataViewTag:\n                if (\n                    object.byteLength != other.byteLength ||\n                    object.byteOffset != other.byteOffset\n                ) {\n                    return false;\n                }\n                object = object.buffer;\n                other = other.buffer;\n\n            case arrayBufferTag:\n                if (\n                    object.byteLength != other.byteLength ||\n                    !equalFunc(new Uint8Array(object), new Uint8Array(other))\n                ) {\n                    return false;\n                }\n                return true;\n\n            case boolTag:\n            case dateTag:\n            case numberTag:\n                // Coerce booleans to `1` or `0` and dates to milliseconds.\n                // Invalid dates are coerced to `NaN`.\n                return eq(+object, +other);\n\n            case errorTag:\n                return (\n                    object.name == other.name && object.message == other.message\n                );\n\n            case regexpTag:\n            case stringTag:\n                // Coerce regexes to strings and treat strings, primitives and objects,\n                // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n                // for more details.\n                return object == other + \"\";\n\n            case mapTag:\n                var convert = mapToArray;\n\n            case setTag:\n                var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n                convert || (convert = setToArray);\n\n                if (object.size != other.size && !isPartial) {\n                    return false;\n                }\n                // Assume cyclic values are equal.\n                var stacked = stack.get(object);\n                if (stacked) {\n                    return stacked == other;\n                }\n                bitmask |= COMPARE_UNORDERED_FLAG;\n\n                // Recursively compare objects (susceptible to call stack limits).\n                stack.set(object, other);\n                var result = equalArrays(\n                    convert(object),\n                    convert(other),\n                    bitmask,\n                    customizer,\n                    equalFunc,\n                    stack\n                );\n                stack[\"delete\"](object);\n                return result;\n\n            case symbolTag:\n                if (symbolValueOf) {\n                    return (\n                        symbolValueOf.call(object) == symbolValueOf.call(other)\n                    );\n                }\n        }\n        return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(\n        object,\n        other,\n        bitmask,\n        customizer,\n        equalFunc,\n        stack\n    ) {\n        var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n            objProps = getAllKeys(object),\n            objLength = objProps.length,\n            othProps = getAllKeys(other),\n            othLength = othProps.length;\n\n        if (objLength != othLength && !isPartial) {\n            return false;\n        }\n        var index = objLength;\n        while (index--) {\n            var key = objProps[index];\n            if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n                return false;\n            }\n        }\n        // Assume cyclic values are equal.\n        var stacked = stack.get(object);\n        if (stacked && stack.get(other)) {\n            return stacked == other;\n        }\n        var result = true;\n        stack.set(object, other);\n        stack.set(other, object);\n\n        var skipCtor = isPartial;\n        while (++index < objLength) {\n            key = objProps[index];\n            var objValue = object[key],\n                othValue = other[key];\n\n            if (customizer) {\n                var compared = isPartial\n                    ? customizer(othValue, objValue, key, other, object, stack)\n                    : customizer(objValue, othValue, key, object, other, stack);\n            }\n            // Recursively compare objects (susceptible to call stack limits).\n            if (\n                !(compared === undefined\n                    ? objValue === othValue ||\n                      equalFunc(objValue, othValue, bitmask, customizer, stack)\n                    : compared)\n            ) {\n                result = false;\n                break;\n            }\n            skipCtor || (skipCtor = key == \"constructor\");\n        }\n        if (result && !skipCtor) {\n            var objCtor = object.constructor,\n                othCtor = other.constructor;\n\n            // Non `Object` object instances with different constructors are not equal.\n            if (\n                objCtor != othCtor &&\n                (\"constructor\" in object && \"constructor\" in other) &&\n                !(\n                    typeof objCtor == \"function\" &&\n                    objCtor instanceof objCtor &&\n                    typeof othCtor == \"function\" &&\n                    othCtor instanceof othCtor\n                )\n            ) {\n                result = false;\n            }\n        }\n        stack[\"delete\"](object);\n        stack[\"delete\"](other);\n        return result;\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n        return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n        return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n        var result = lodash.iteratee || iteratee;\n        result = result === iteratee ? baseIteratee : result;\n        return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n        var data = map.__data__;\n        return isKeyable(key)\n            ? data[typeof key == \"string\" ? \"string\" : \"hash\"]\n            : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n        var result = keys(object),\n            length = result.length;\n\n        while (length--) {\n            var key = result[length],\n                value = object[key];\n\n            result[length] = [key, value, isStrictComparable(value)];\n        }\n        return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n        var value = getValue(object, key);\n        return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n        var isOwn = hasOwnProperty.call(value, symToStringTag),\n            tag = value[symToStringTag];\n\n        try {\n            value[symToStringTag] = undefined;\n            var unmasked = true;\n        } catch (e) {}\n\n        var result = nativeObjectToString.call(value);\n        if (unmasked) {\n            if (isOwn) {\n                value[symToStringTag] = tag;\n            } else {\n                delete value[symToStringTag];\n            }\n        }\n        return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols\n        ? stubArray\n        : function(object) {\n              if (object == null) {\n                  return [];\n              }\n              object = Object(object);\n              return arrayFilter(nativeGetSymbols(object), function(symbol) {\n                  return propertyIsEnumerable.call(object, symbol);\n              });\n          };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols\n        ? stubArray\n        : function(object) {\n              var result = [];\n              while (object) {\n                  arrayPush(result, getSymbols(object));\n                  object = getPrototype(object);\n              }\n              return result;\n          };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if (\n        (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map()) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set()) != setTag) ||\n        (WeakMap && getTag(new WeakMap()) != weakMapTag)\n    ) {\n        getTag = function(value) {\n            var result = baseGetTag(value),\n                Ctor = result == objectTag ? value.constructor : undefined,\n                ctorString = Ctor ? toSource(Ctor) : \"\";\n\n            if (ctorString) {\n                switch (ctorString) {\n                    case dataViewCtorString:\n                        return dataViewTag;\n                    case mapCtorString:\n                        return mapTag;\n                    case promiseCtorString:\n                        return promiseTag;\n                    case setCtorString:\n                        return setTag;\n                    case weakMapCtorString:\n                        return weakMapTag;\n                }\n            }\n            return result;\n        };\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n        path = castPath(path, object);\n\n        var index = -1,\n            length = path.length,\n            result = false;\n\n        while (++index < length) {\n            var key = toKey(path[index]);\n            if (!(result = object != null && hasFunc(object, key))) {\n                break;\n            }\n            object = object[key];\n        }\n        if (result || ++index != length) {\n            return result;\n        }\n        length = object == null ? 0 : object.length;\n        return (\n            !!length &&\n            isLength(length) &&\n            isIndex(key, length) &&\n            (isArray(object) || isArguments(object))\n        );\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n        var length = array.length,\n            result = array.constructor(length);\n\n        // Add properties assigned by `RegExp#exec`.\n        if (\n            length &&\n            typeof array[0] == \"string\" &&\n            hasOwnProperty.call(array, \"index\")\n        ) {\n            result.index = array.index;\n            result.input = array.input;\n        }\n        return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n        return typeof object.constructor == \"function\" && !isPrototype(object)\n            ? baseCreate(getPrototype(object))\n            : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {Function} cloneFunc The function to clone values.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, cloneFunc, isDeep) {\n        var Ctor = object.constructor;\n        switch (tag) {\n            case arrayBufferTag:\n                return cloneArrayBuffer(object);\n\n            case boolTag:\n            case dateTag:\n                return new Ctor(+object);\n\n            case dataViewTag:\n                return cloneDataView(object, isDeep);\n\n            case float32Tag:\n            case float64Tag:\n            case int8Tag:\n            case int16Tag:\n            case int32Tag:\n            case uint8Tag:\n            case uint8ClampedTag:\n            case uint16Tag:\n            case uint32Tag:\n                return cloneTypedArray(object, isDeep);\n\n            case mapTag:\n                return cloneMap(object, isDeep, cloneFunc);\n\n            case numberTag:\n            case stringTag:\n                return new Ctor(object);\n\n            case regexpTag:\n                return cloneRegExp(object);\n\n            case setTag:\n                return cloneSet(object, isDeep, cloneFunc);\n\n            case symbolTag:\n                return cloneSymbol(object);\n        }\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n        return (\n            isArray(value) ||\n            isArguments(value) ||\n            !!(spreadableSymbol && value && value[spreadableSymbol])\n        );\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n        length = length == null ? MAX_SAFE_INTEGER : length;\n        return (\n            !!length &&\n            (typeof value == \"number\" || reIsUint.test(value)) &&\n            (value > -1 && value % 1 == 0 && value < length)\n        );\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n        if (!isObject(object)) {\n            return false;\n        }\n        var type = typeof index;\n        if (\n            type == \"number\"\n                ? isArrayLike(object) && isIndex(index, object.length)\n                : type == \"string\" && index in object\n        ) {\n            return eq(object[index], value);\n        }\n        return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n        if (isArray(value)) {\n            return false;\n        }\n        var type = typeof value;\n        if (\n            type == \"number\" ||\n            type == \"symbol\" ||\n            type == \"boolean\" ||\n            value == null ||\n            isSymbol(value)\n        ) {\n            return true;\n        }\n        return (\n            reIsPlainProp.test(value) ||\n            !reIsDeepProp.test(value) ||\n            (object != null && value in Object(object))\n        );\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n        var type = typeof value;\n        return type == \"string\" ||\n            type == \"number\" ||\n            type == \"symbol\" ||\n            type == \"boolean\"\n            ? value !== \"__proto__\"\n            : value === null;\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n        return !!maskSrcKey && maskSrcKey in func;\n    }\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n        var Ctor = value && value.constructor,\n            proto =\n                (typeof Ctor == \"function\" && Ctor.prototype) || objectProto;\n\n        return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n        return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n        return function(object) {\n            if (object == null) {\n                return false;\n            }\n            return (\n                object[key] === srcValue &&\n                (srcValue !== undefined || key in Object(object))\n            );\n        };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n        var result = memoize(func, function(key) {\n            if (cache.size === MAX_MEMOIZE_SIZE) {\n                cache.clear();\n            }\n            return key;\n        });\n\n        var cache = result.cache;\n        return result;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n        var result = [];\n        if (object != null) {\n            for (var key in Object(object)) {\n                result.push(key);\n            }\n        }\n        return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n        return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n        start = nativeMax(start === undefined ? func.length - 1 : start, 0);\n        return function() {\n            var args = arguments,\n                index = -1,\n                length = nativeMax(args.length - start, 0),\n                array = Array(length);\n\n            while (++index < length) {\n                array[index] = args[start + index];\n            }\n            index = -1;\n            var otherArgs = Array(start + 1);\n            while (++index < start) {\n                otherArgs[index] = args[index];\n            }\n            otherArgs[start] = transform(array);\n            return apply(func, this, otherArgs);\n        };\n    }\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n        var count = 0,\n            lastCalled = 0;\n\n        return function() {\n            var stamp = nativeNow(),\n                remaining = HOT_SPAN - (stamp - lastCalled);\n\n            lastCalled = stamp;\n            if (remaining > 0) {\n                if (++count >= HOT_COUNT) {\n                    return arguments[0];\n                }\n            } else {\n                count = 0;\n            }\n            return func.apply(undefined, arguments);\n        };\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n        var result = [];\n        if (reLeadingDot.test(string)) {\n            result.push(\"\");\n        }\n        string.replace(rePropName, function(match, number, quote, string) {\n            result.push(\n                quote ? string.replace(reEscapeChar, \"$1\") : number || match\n            );\n        });\n        return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n        if (typeof value == \"string\" || isSymbol(value)) {\n            return value;\n        }\n        var result = value + \"\";\n        return result == \"0\" && 1 / value == -INFINITY ? \"-0\" : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n        if (func != null) {\n            try {\n                return funcToString.call(func);\n            } catch (e) {}\n            try {\n                return func + \"\";\n            } catch (e) {}\n        }\n        return \"\";\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n        return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n        var func = isArray(collection) ? arrayEach : baseEach;\n        return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n        collection = isArrayLike(collection) ? collection : values(collection);\n        fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;\n\n        var length = collection.length;\n        if (fromIndex < 0) {\n            fromIndex = nativeMax(length + fromIndex, 0);\n        }\n        return isString(collection)\n            ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1\n            : !!length && baseIndexOf(collection, value, fromIndex) > -1;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n        if (\n            typeof func != \"function\" ||\n            (resolver != null && typeof resolver != \"function\")\n        ) {\n            throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        var memoized = function() {\n            var args = arguments,\n                key = resolver ? resolver.apply(this, args) : args[0],\n                cache = memoized.cache;\n\n            if (cache.has(key)) {\n                return cache.get(key);\n            }\n            var result = func.apply(this, args);\n            memoized.cache = cache.set(key, result) || cache;\n            return result;\n        };\n        memoized.cache = new (memoize.Cache || MapCache)();\n        return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n        return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(\n        (function() {\n            return arguments;\n        })()\n    )\n        ? baseIsArguments\n        : function(value) {\n              return (\n                  isObjectLike(value) &&\n                  hasOwnProperty.call(value, \"callee\") &&\n                  !propertyIsEnumerable.call(value, \"callee\")\n              );\n          };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n        return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n        return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n        if (!isObject(value)) {\n            return false;\n        }\n        // The use of `Object#toString` avoids issues with the `typeof` operator\n        // in Safari 9 which returns 'object' for typed arrays and other constructors.\n        var tag = baseGetTag(value);\n        return (\n            tag == funcTag ||\n            tag == genTag ||\n            tag == asyncTag ||\n            tag == proxyTag\n        );\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n        return (\n            typeof value == \"number\" &&\n            value > -1 &&\n            value % 1 == 0 &&\n            value <= MAX_SAFE_INTEGER\n        );\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n        var type = typeof value;\n        return value != null && (type == \"object\" || type == \"function\");\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n        return value != null && typeof value == \"object\";\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n        if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n            return false;\n        }\n        var proto = getPrototype(value);\n        if (proto === null) {\n            return true;\n        }\n        var Ctor =\n            hasOwnProperty.call(proto, \"constructor\") && proto.constructor;\n        return (\n            typeof Ctor == \"function\" &&\n            Ctor instanceof Ctor &&\n            funcToString.call(Ctor) == objectCtorString\n        );\n    }\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n        return (\n            typeof value == \"string\" ||\n            (!isArray(value) &&\n                isObjectLike(value) &&\n                baseGetTag(value) == stringTag)\n        );\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n        return (\n            typeof value == \"symbol\" ||\n            (isObjectLike(value) && baseGetTag(value) == symbolTag)\n        );\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray\n        ? baseUnary(nodeIsTypedArray)\n        : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n        return value === undefined;\n    }\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n        if (!value) {\n            return [];\n        }\n        if (isArrayLike(value)) {\n            return isString(value) ? stringToArray(value) : copyArray(value);\n        }\n        if (symIterator && value[symIterator]) {\n            return iteratorToArray(value[symIterator]());\n        }\n        var tag = getTag(value),\n            func =\n                tag == mapTag\n                    ? mapToArray\n                    : tag == setTag\n                    ? setToArray\n                    : values;\n\n        return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n        if (!value) {\n            return value === 0 ? value : 0;\n        }\n        value = toNumber(value);\n        if (value === INFINITY || value === -INFINITY) {\n            var sign = value < 0 ? -1 : 1;\n            return sign * MAX_INTEGER;\n        }\n        return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n        var result = toFinite(value),\n            remainder = result % 1;\n\n        return result === result\n            ? remainder\n                ? result - remainder\n                : result\n            : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n        if (typeof value == \"number\") {\n            return value;\n        }\n        if (isSymbol(value)) {\n            return NAN;\n        }\n        if (isObject(value)) {\n            var other =\n                typeof value.valueOf == \"function\" ? value.valueOf() : value;\n            value = isObject(other) ? other + \"\" : other;\n        }\n        if (typeof value != \"string\") {\n            return value === 0 ? value : +value;\n        }\n        value = value.replace(reTrim, \"\");\n        var isBinary = reIsBinary.test(value);\n        return isBinary || reIsOctal.test(value)\n            ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n            : reIsBadHex.test(value)\n            ? NAN\n            : +value;\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n        return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n        return value == null ? \"\" : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n        var result = object == null ? undefined : baseGet(object, path);\n        return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n        return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n        return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n        return isArrayLike(object)\n            ? arrayLikeKeys(object, true)\n            : baseKeysIn(object);\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n        baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n        return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n        return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n        return function() {\n            return value;\n        };\n    }\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n        return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n        return baseIteratee(\n            typeof func == \"function\" ? func : baseClone(func, CLONE_DEEP_FLAG)\n        );\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n        // No operation performed.\n    }\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n        return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n        return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n        return false;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.constant = constant;\n    lodash.iteratee = iteratee;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.property = property;\n    lodash.set = set;\n    lodash.toArray = toArray;\n    lodash.toPlainObject = toPlainObject;\n    lodash.union = union;\n    lodash.values = values;\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.eq = eq;\n    lodash.forEach = forEach;\n    lodash.get = get;\n    lodash.hasIn = hasIn;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBuffer = isBuffer;\n    lodash.isFunction = isFunction;\n    lodash.isLength = isLength;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.noop = noop;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toNumber = toNumber;\n    lodash.toString = toString;\n\n    // Add aliases.\n    lodash.each = forEach;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    /*--------------------------------------------------------------------------*/\n\n    if (freeModule) {\n        // Export for Node.js.\n        (freeModule.exports = lodash)._ = lodash;\n        // Export for CommonJS support.\n        freeExports._ = lodash;\n    }\n}.call(this));\n"
  },
  {
    "path": "packages/browser-sync/lib/logger.js",
    "content": "\"use strict\";\n\nvar messages = require(\"./connect-utils\");\nvar utils = require(\"./utils\");\nvar _ = require(\"./lodash.custom\");\nvar chalk = require(\"chalk\");\n\nvar template = (prefix) => \"[\" + chalk.blue(prefix) + \"] \"\n\nvar logger = require(\"eazy-logger\").Logger({\n    useLevelPrefixes: false\n});\n\nmodule.exports.logger = logger;\n\n/**\n * @param name\n * @returns {*}\n */\nmodule.exports.getLogger = function(name) {\n    return logger.clone(function(config) {\n        config.prefix = config.prefix + template(name)\n        return config;\n    });\n};\n\n/**\n * Logging Callbacks\n */\nmodule.exports.callbacks = {\n    /**\n     * Log when file-watching has started\n     * @param {BrowserSync} bs\n     * @param data\n     */\n    \"file:watching\": function(bs, data) {\n        if (Object.keys(data).length) {\n            logger.info(\"Watching files...\");\n        }\n    },\n    /**\n     * Log when a file changes\n     * @param {BrowserSync} bs\n     * @param data\n     */\n    \"file:reload\": function(bs, data) {\n        if (canLogFileChange(bs, data)) {\n            if (data.path[0] === \"*\") {\n                return logger.info(\n                    chalk.cyan(\"Reloading files that match: %s\"),\n                    chalk.magenta(data.path)\n                );\n            }\n\n            logger.info(\n                chalk.cyan(\"File event [%s] : %s\"),\n                data.event,\n                chalk.magenta(data.path),\n            );\n        }\n    },\n    /**\n     *\n     */\n    \"service:exit\": function() {\n        logger.debug(\"Exiting...\");\n    },\n    /**\n     *\n     */\n    \"browser:reload\": function(bs, data = {}) {\n        if (canLogFileChange(bs)) {\n            if (data.files && data.files.length > 1) {\n                return logger.info(\n                    chalk.cyan(`Reloading Browsers... (buffered %s events)`),\n                    data.files.length\n                );\n            }\n            logger.info(chalk.cyan(\"Reloading Browsers...\"));\n        }\n    },\n    /**\n     *\n     */\n    \"browser:error\": function() {\n        logger.error(\n            \"Couldn't open browser (if you are using BrowserSync in a \" +\n            \"headless environment, you might want to set the %s option to %s)\",\n            chalk.cyan(\"open\"),\n            chalk.cyan(\"false\"),\n        );\n    },\n    /**\n     * @param {BrowserSync} bs\n     * @param data\n     */\n    \"stream:changed\": function(bs, data) {\n        if (canLogFileChange(bs)) {\n            var changed = data.changed;\n\n            logger.info(\n                chalk.cyan(\"%s %s changed (%s)\"),\n                changed.length,\n                changed.length > 1 ? \"files\" : \"file\",\n                chalk.magenta(changed.join(\", \"))\n            );\n        }\n    },\n    /**\n     * Client connected logging\n     * @param {BrowserSync} bs\n     * @param data\n     */\n    \"client:connected\": function(bs, data) {\n        var uaString = utils.getUaString(data.ua);\n        var msg = chalk.cyan(\"Browser Connected: %s, version: %s\");\n        var method = \"info\";\n\n        if (!bs.options.get(\"logConnections\")) {\n            method = \"debug\";\n        }\n\n        logger.log(method, msg, chalk.magenta(uaString.name), chalk.magenta(uaString.version));\n    },\n    /**\n     * Main logging when the service is running\n     * @param {BrowserSync} bs\n     * @param data\n     */\n    \"service:running\": function(bs, data) {\n        const type = data.type;\n        if (bs.options.get(\"json\")) {\n            return console.log(\n                JSON.stringify({\n                    \"service:running\": {\n                        options: bs.options.toJS()\n                    }\n                })\n            );\n        }\n        if (type === \"server\") {\n            var baseDir = bs.options.getIn([\"server\", \"baseDir\"]);\n\n            logUrls(bs.options.get(\"urls\").toJS());\n\n            if (baseDir) {\n                if (utils.isList(baseDir)) {\n                    baseDir.forEach(serveFiles);\n                } else {\n                    serveFiles(baseDir);\n                }\n            }\n        }\n\n        if (type === \"proxy\") {\n            logger.info(\n                \"Proxying: %s\",\n                chalk.cyan(bs.options.getIn([\"proxy\", \"target\"]))\n            );\n            logUrls(bs.options.get(\"urls\").toJS());\n        }\n\n        if (type === \"snippet\") {\n            if (bs.options.get(\"logSnippet\")) {\n                logger.info(\n                    chalk.bold(`Copy the following snippet into your website, just before the closing ${chalk.cyan('</body>')} tag`)\n                );\n\n                logger.unprefixed(\"info\", messages.scriptTags(bs.options));\n            }\n\n            logUrls(\n                bs.options\n                    .get(\"urls\")\n                    .filter(function(value, key) {\n                        return key.slice(0, 2) === \"ui\";\n                    })\n                    .toJS()\n            );\n        }\n\n        function serveFiles(base) {\n            logger.info(\"Serving files from: %s\", chalk.magenta(base));\n        }\n    }\n};\n\n/**\n * Plugin interface for BrowserSync\n * @param {EventEmitter} emitter\n * @param {BrowserSync} bs\n * @returns {Object}\n */\nmodule.exports.plugin = function(emitter, bs) {\n    var logPrefix = bs.options.get(\"logPrefix\");\n    var logLevel = bs.options.get(\"logLevel\");\n\n    // Should set logger level here!\n    logger.setLevel(logLevel);\n\n    if (logPrefix) {\n        if (_.isFunction(logPrefix)) {\n            logger.setPrefix(logPrefix);\n        } else {\n            logger.setPrefix(template(logPrefix));\n        }\n    }\n\n    _.each(exports.callbacks, function(func, event) {\n        emitter.on(event, func.bind(this, bs));\n    });\n\n    return logger;\n};\n\n/**\n *\n * @param urls\n */\nfunction logUrls(urls) {\n    var keys = Object.keys(urls);\n    var longestName = 0;\n    var longesturl = 0;\n    var offset = 2;\n\n    if (!keys.length) {\n        return;\n    }\n\n    var names = keys.map(function(key) {\n        if (key.length > longestName) {\n            longestName = key.length;\n        }\n        if (urls[key].length > longesturl) {\n            longesturl = urls[key].length;\n        }\n        return key;\n    });\n\n    var underline = getChars(longestName + offset + longesturl + 1, \"-\");\n    var underlined = false;\n\n    logger.info(chalk.bold(\"Access URLs:\"));\n    logger.unprefixed(\"info\", \" %s\", chalk.grey(underline));\n\n    keys.forEach(function(key, i) {\n        var keyname = getKeyName(key);\n        logger.unprefixed(\n            \"info\",\n            \" %s: %s\",\n            getPadding(key.length, longestName + offset) + keyname,\n            chalk.magenta(urls[key])\n        );\n        if (!underlined && names[i + 1] && names[i + 1].indexOf(\"ui\") > -1) {\n            underlined = true;\n            logger.unprefixed(\"info\", \" %s\", chalk.grey(underline));\n        }\n    });\n\n    logger.unprefixed(\"info\", \" %s\", chalk.grey(underline));\n}\n\n/**\n * @param {Number} len\n * @param {Number} max\n * @returns {string}\n */\nfunction getPadding(len, max) {\n    return new Array(max - (len + 1)).join(\" \");\n}\n\n/**\n * @param {Number} len\n * @param {String} char\n * @returns {string}\n */\nfunction getChars(len, char) {\n    return new Array(len).join(char);\n}\n\n/**\n * Transform url-key names into something more presentable\n * @param key\n * @returns {string}\n */\nfunction getKeyName(key) {\n    if (key.indexOf(\"ui\") > -1) {\n        if (key === \"ui\") {\n            return \"UI\";\n        }\n        if (key === \"ui-external\") {\n            return \"UI External\";\n        }\n    }\n    return key.substr(0, 1).toUpperCase() + key.substring(1);\n}\n\n/**\n * Determine if file changes should be logged\n * @param bs\n * @param data\n * @returns {boolean}\n */\nfunction canLogFileChange(bs, data) {\n    if (data && data.log === false) {\n        return false;\n    }\n\n    return bs.options.get(\"logFileChanges\");\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/options.ts",
    "content": "import { BsTempOptions, TransformResult } from \"./cli/cli-options\";\n\nconst _ = require(\"./lodash.custom\");\nimport * as Immutable from \"immutable\";\nimport * as defaultConfig from \"./default-config\";\n\n/**\n * Move top-level ws options to proxy.ws\n * This is to allow it to be set from the CLI\n * @param incoming\n */\nexport function setProxyWs(incoming: BsTempOptions): TransformResult {\n    if (incoming.get(\"ws\") && incoming.get(\"mode\") === \"proxy\") {\n        return [incoming.setIn([\"proxy\", \"ws\"], true), []];\n    }\n    return [incoming, []];\n}\n\n/**\n * @param incoming\n */\nexport function setOpen(incoming: BsTempOptions): TransformResult {\n    return [\n        incoming.update(\"open\", function(open) {\n            if (incoming.get(\"mode\") === \"snippet\") {\n                if (open !== \"ui\" && open !== \"ui-external\") {\n                    return false;\n                }\n            }\n            return open;\n        }),\n        []\n    ];\n}\n\n/**\n * Set the running mode\n * @param incoming\n */\nexport function setMode(incoming: BsTempOptions): TransformResult {\n    const output = incoming.set(\n        \"mode\",\n        (function() {\n            if (incoming.get(\"server\")) {\n                return \"server\";\n            }\n            if (incoming.get(\"proxy\")) {\n                return \"proxy\";\n            }\n            return \"snippet\";\n        })()\n    );\n    return [output, []];\n}\n\n/**\n * @param incoming\n */\nexport function setScheme(incoming: BsTempOptions): TransformResult {\n    var scheme = \"http\";\n\n    if (incoming.getIn([\"server\", \"https\"])) {\n        scheme = \"https\";\n    }\n\n    if (incoming.get(\"https\")) {\n        scheme = \"https\";\n    }\n\n    if (incoming.getIn([\"proxy\", \"url\", \"protocol\"])) {\n        if (incoming.getIn([\"proxy\", \"url\", \"protocol\"]) === \"https:\") {\n            scheme = \"https\";\n        }\n    }\n\n    return [incoming.set(\"scheme\", scheme), []];\n}\n\n/**\n * @param incoming\n */\nexport function setStartPath(incoming: BsTempOptions): TransformResult {\n    if (incoming.get(\"proxy\")) {\n        var path = incoming.getIn([\"proxy\", \"url\", \"path\"]);\n        if (path !== \"/\") {\n            return [incoming.set(\"startPath\", path), []];\n        }\n    }\n    return [incoming, []];\n}\n\n/**\n * @param incoming\n */\nexport function setNamespace(incoming: BsTempOptions): TransformResult {\n    var namespace = incoming.getIn([\"socket\", \"namespace\"]);\n\n    if (_.isFunction(namespace)) {\n        return [\n            incoming.setIn(\n                [\"socket\", \"namespace\"],\n                namespace((defaultConfig.socket as any).namespace)\n            ),\n            []\n        ];\n    }\n    return [incoming, []];\n}\n\n/**\n * @param incoming\n */\nexport function setServerOpts(incoming: BsTempOptions): TransformResult {\n    if (!incoming.get(\"server\")) {\n        return [incoming, []];\n    }\n    var indexarg = incoming.getIn([\"server\", \"index\"]) || \"index.html\";\n    var optPath = [\"server\", \"serveStaticOptions\"];\n\n    if (!incoming.getIn(optPath)) {\n        return [\n            incoming.setIn(\n                optPath,\n                Immutable.Map({\n                    index: indexarg\n                })\n            ),\n            []\n        ];\n    }\n    if (!incoming.hasIn(optPath.concat([\"index\"]))) {\n        return [incoming.setIn(optPath.concat([\"index\"]), indexarg), []];\n    }\n\n    return [incoming, []];\n}\n\nexport function liftExtensionsOptionFromCli(\n    incoming: BsTempOptions\n): TransformResult {\n    // cli extensions\n    var optPath = [\"server\", \"serveStaticOptions\"];\n    if (incoming.get(\"extensions\")) {\n        return [\n            incoming.setIn(\n                optPath.concat([\"extensions\"]),\n                incoming.get(\"extensions\")\n            ),\n            []\n        ];\n    }\n    return [incoming, []];\n}\n\n/**\n * Back-compat fixes for rewriteRules being set to a boolean\n */\nexport function fixRewriteRules(incoming: BsTempOptions): TransformResult {\n    return [\n        incoming.update(\"rewriteRules\", function(rr) {\n            return Immutable.List([])\n                .concat(rr)\n                .filter(Boolean);\n        }),\n        []\n    ];\n}\n\nexport function fixSnippetIgnorePaths(\n    incoming: BsTempOptions\n): TransformResult {\n    var ignorePaths = incoming.getIn([\"snippetOptions\", \"ignorePaths\"]);\n\n    if (ignorePaths) {\n        if (_.isString(ignorePaths)) {\n            ignorePaths = [ignorePaths];\n        }\n        ignorePaths = ignorePaths.map(ensureSlash);\n        return [\n            incoming.setIn(\n                [\"snippetOptions\", \"blacklist\"],\n                Immutable.List(ignorePaths)\n            ),\n            []\n        ];\n    }\n    return [incoming, []];\n}\n\nexport function fixSnippetIncludePaths(\n    incoming: BsTempOptions\n): TransformResult {\n    var includePaths = incoming.getIn([\"snippetOptions\", \"whitelist\"]);\n    if (includePaths) {\n        includePaths = includePaths.map(ensureSlash);\n        return [\n            incoming.setIn(\n                [\"snippetOptions\", \"whitelist\"],\n                Immutable.List(includePaths)\n            ),\n            []\n        ];\n    }\n    return [incoming, []];\n}\n\n/**\n * Enforce paths to begin with a forward slash\n */\nfunction ensureSlash(item) {\n    if (item[0] !== \"/\") {\n        return \"/\" + item;\n    }\n    return item;\n}\n\n/**\n *\n */\nexport function setMiddleware(incoming: BsTempOptions): TransformResult {\n    var mw = getMiddlwares(incoming);\n    return [incoming.set(\"middleware\", mw), []];\n}\n\n/**\n * top-level option, or given as part of the proxy/server option\n * @param item\n * @returns {*}\n */\nfunction getMiddlwares(item) {\n    var mw = item.get(\"middleware\");\n    var serverMw = item.getIn([\"server\", \"middleware\"]);\n    var proxyMw = item.getIn([\"proxy\", \"middleware\"]);\n\n    var list = Immutable.List([]);\n\n    if (mw) {\n        return listMerge(list, mw);\n    }\n\n    if (serverMw) {\n        return listMerge(list, serverMw);\n    }\n\n    if (proxyMw) {\n        return listMerge(list, proxyMw);\n    }\n\n    return list;\n}\n\n/**\n * @param item\n * @returns {*}\n */\nfunction isList(item) {\n    return Immutable.List.isList(item);\n}\n\n/**\n * @param list\n * @param item\n * @returns {*}\n */\nfunction listMerge(list, item) {\n    if (_.isFunction(item)) {\n        list = list.push(item);\n    }\n\n    if (isList(item) && item.size) {\n        list = list.merge(item);\n    }\n\n    return list;\n}\n\n/**\n * @param incoming\n * @returns {*}\n */\nexport function setUiPort(incoming: BsTempOptions): TransformResult {\n    if (incoming.get(\"uiPort\")) {\n        return [incoming.setIn([\"ui\", \"port\"], incoming.get(\"uiPort\")), []];\n    }\n    return [incoming, []];\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/plugins.js",
    "content": "var Immutable = require(\"immutable\");\nvar Map = Immutable.Map;\nvar isMap = Immutable.Map.isMap;\nvar List = Immutable.List;\nvar path = require(\"path\");\nvar fs = require(\"fs\");\nconst { parseParams } = require(\"./utils\");\n\nvar Plugin = Immutable.Record({\n    moduleName: \"\",\n    name: \"\",\n    active: true,\n    module: undefined,\n    options: Map({}),\n    via: \"inline\",\n    dir: process.cwd(),\n    init: undefined,\n    errors: List([])\n});\n\n/**\n * Accept a string/object\n * and resolve it into the plugin format above\n * @param item\n * @returns {*}\n */\nfunction resolvePlugin(item) {\n    /**\n     * Handle when string was given, such as plugins: ['bs-html-injector']\n     */\n    if (typeof item === \"string\") {\n        return getFromString(item);\n    }\n\n    if (!isMap(item)) {\n        return new Plugin().mergeDeep({\n            errors: [new Error(\"Plugin not supported in this format\")]\n        });\n    }\n\n    if (item.has(\"module\")) {\n        var nameOrObj = item.get(\"module\");\n        var options = item.get(\"options\");\n\n        /**\n         * The 'module' key can be a string, this allows\n         * inline plugin references, but with options\n         * eg:\n         *\n         * bs.init({\n         *     plugins: [\n         *         {\n         *             module: './myjs-file.js'\n         *             options: {\n         *                 files: \"*.html\"\n         *             }\n         *         }\n         *     ]\n         * });\n         */\n        if (typeof nameOrObj === \"string\") {\n            return getFromString(nameOrObj).mergeDeep({\n                options: options\n            });\n        }\n\n        /**\n         * If the plugin was given completely inline (because it needs options)\n         * eg:\n         *\n         * bs.init({\n         *     plugins: [\n         *         {\n         *             module: {\n         *                 plugin: function() {\n         *                     console.log('My plugin code')\n         *                 }\n         *             },\n         *             options: {\n         *                 files: \"*.html\"\n         *             }\n         *         }\n         *     ]\n         * })\n         */\n        if (Immutable.Map.isMap(nameOrObj)) {\n            return new Plugin({\n                module: nameOrObj,\n                options: options\n            });\n        }\n    }\n\n    /**\n     * If a module was given directly. For example, ater calling require.\n     *\n     * eg:\n     *    var myplugin = require('./some-js');\n     *    bs.init({plugins: [myplugin]});\n     */\n    if (item.has(\"plugin\")) {\n        return new Plugin({\n            module: item\n        });\n    }\n\n    /**\n     * If we reach here, the plugin option was used incorrectly\n     */\n    return new Plugin().mergeDeep({\n        errors: [new Error(\"Plugin was not configured correctly\")]\n    });\n}\n\nmodule.exports.resolvePlugin = resolvePlugin;\n\n/**\n * Load a plugin from disk\n * @param item\n * @returns {*}\n */\nfunction requirePlugin(item) {\n    /**\n     * if the \"module\" property already exists and\n     * is not a string, then we bail and don't bother looking\n     * for the file\n     */\n    if (item.get(\"module\") && typeof item.get(\"module\") !== \"string\") {\n        return item;\n    }\n\n    try {\n        /**\n         * Try a raw node require() call - this will be how\n         * regular \"npm installed\" plugins wil work\n         */\n        var maybe = require.resolve(item.get(\"name\"));\n        return item.set(\"module\", require(maybe));\n    } catch (e) {\n        /**\n         * If require threw an MODULE_NOT_FOUND error, try again\n         * by resolving from cwd. This is needed since cli\n         * users will not add ./ to the front of a path (which\n         * node requires to resolve from cwd)\n         */\n        if (e.code === \"MODULE_NOT_FOUND\") {\n            var maybe = path.resolve(process.cwd(), item.get(\"name\"));\n            if (fs.existsSync(maybe)) {\n                return item.set(\"module\", require(maybe));\n            } else {\n                /**\n                 * Finally return a plugin that contains the error\n                 * this will be picked up later and discarded\n                 */\n                return item.update(\"errors\", function(errors) {\n                    return errors.concat(e);\n                });\n            }\n        }\n        throw e;\n    }\n}\nmodule.exports.requirePlugin = requirePlugin;\n\nfunction getFromString(string) {\n    /**\n     * We allow query strings for plugins, so always split on ?\n     */\n    var split = string.split(\"?\");\n\n    var outGoing = new Plugin({\n        moduleName: split[0],\n        name: split[0]\n    });\n\n    if (split.length > 1) {\n        return outGoing.update(\"options\", function(opts) {\n            const parsed = parseParams(split[1]);\n            return opts.mergeDeep(parsed);\n        });\n    }\n\n    return outGoing;\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/public/exit.js",
    "content": "\"use strict\";\n\n/**\n * @param {BrowserSync} browserSync\n * @returns {Function}\n */\nmodule.exports = function(browserSync) {\n    function exit() {\n        if (browserSync.active) {\n            browserSync.events.emit(\"service:exit\");\n            browserSync.cleanup();\n        }\n    }\n\n    return exit;\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/public/init.ts",
    "content": "var _ = require(\"../lodash.custom\");\nimport { merge, printErrors } from \"../cli/cli-options\";\n\n/**\n * @param {BrowserSync} browserSync\n * @param {String} [name] - instance name\n * @param {Object} pjson\n * @returns {Function}\n */\nmodule.exports = function(browserSync, name, pjson) {\n    return function() {\n        /**\n         * Handle new + old signatures for init.\n         */\n        var args = require(\"../args\")(_.toArray(arguments));\n\n        /**\n         * If the current instance is already running, just return an error\n         */\n        if (browserSync.active) {\n            return args.cb(new Error(`Instance: ${name} is already running!`));\n        }\n\n        // Env specific items\n        args.config.version = pjson.version;\n        args.config.cwd = args.config.cwd || process.cwd();\n\n        const [opts, errors] = merge(args.config);\n\n        if (errors.length) {\n            return args.cb(new Error(printErrors(errors)));\n        }\n\n        return browserSync.init(opts, args.cb);\n    };\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/public/notify.js",
    "content": "\"use strict\";\n\n/**\n * @param {BrowserSync} browserSync\n * @returns {Function}\n */\nmodule.exports = function(browserSync) {\n    return function(msg, timeout) {\n        if (msg) {\n            browserSync.events.emit(\"browser:notify\", {\n                message: msg,\n                timeout: timeout || 2000,\n                override: true\n            });\n        }\n    };\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/public/pause.js",
    "content": "\"use strict\";\n\n/**\n * @param {BrowserSync} browserSync\n * @returns {Function}\n */\nmodule.exports = function(browserSync) {\n    return function() {\n        browserSync.paused = true;\n    };\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/public/public-utils.js",
    "content": "\"use strict\";\n\nvar _ = require(\"../lodash.custom\");\n\nmodule.exports = {\n    /**\n     * Emit the internal `file:change` event\n     * @param {EventEmitter} emitter\n     * @param {string} path\n     * @param {boolean} [log]\n     */\n    emitChangeEvent: function emitChangeEvent(emitter, path, log) {\n        emitter.emit(\"file:changed\", {\n            path: path,\n            log: log,\n            namespace: \"core\",\n            event: \"change\"\n        });\n    },\n    /**\n     * Emit the internal `browser:reload` event\n     * @param {EventEmitter} emitter\n     */\n    emitBrowserReload: function emitChangeEvent(emitter) {\n        emitter.emit(\"_browser:reload\");\n    },\n    /**\n     * Emit the internal `stream:changed` event\n     * @param {EventEmitter} emitter\n     * @param {Array} changed\n     */\n    emitStreamChangedEvent: function(emitter, changed) {\n        emitter.emit(\"stream:changed\", { changed: changed });\n    },\n    /**\n     * This code handles the switch between .reload & .stream\n     * since 2.6.0\n     * @param name\n     * @param args\n     * @returns {boolean}\n     */\n    isStreamArg: function(name, args) {\n        if (name === \"stream\") {\n            return true;\n        }\n\n        if (name !== \"reload\") {\n            return false;\n        }\n\n        var firstArg = args[0];\n\n        /**\n         * If here, it's reload with args\n         */\n        if (_.isObject(firstArg)) {\n            if (!Array.isArray(firstArg) && Object.keys(firstArg).length) {\n                return firstArg.stream === true;\n            }\n        }\n\n        return false;\n    }\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/public/reload.js",
    "content": "\"use strict\";\n\nvar utils = require(\"../utils\");\nvar publicUtils = require(\"./public-utils\");\nvar _ = require(\"../lodash.custom\");\nvar defaultConfig = require(\"../default-config\");\nvar stream = require(\"./stream\");\n\n/**\n * @param emitter\n * @returns {Function}\n */\nmodule.exports = function(emitter) {\n    /**\n     * Inform browsers about file changes.\n     *\n     * eg: reload(\"core.css\")\n     */\n    function browserSyncReload(opts) {\n        /**\n         * BACKWARDS COMPATIBILITY:\n         * Passing an object as the only arg to the `reload`\n         * method with at *least* the key-value pair of {stream: true},\n         * was only ever used for streams support - so it's safe to check\n         * for that signature here and defer to the\n         * dedicated `.stream()` method instead.\n         */\n        if (_.isObject(opts)) {\n            if (!Array.isArray(opts) && Object.keys(opts).length) {\n                if (opts.stream === true) {\n                    return stream(emitter)(opts);\n                }\n            }\n        }\n\n        /**\n         * Handle single string paths such as\n         * reload(\"core.css\")\n         */\n        if (typeof opts === \"string\" && opts !== \"undefined\") {\n            return publicUtils.emitChangeEvent(emitter, opts, true);\n        }\n\n        /**\n         * Handle an array of file paths such as\n         * reload([\"core.css, \"ie.css\"])\n         */\n        if (Array.isArray(opts)) {\n            return opts.forEach(function(filepath) {\n                publicUtils.emitChangeEvent(emitter, filepath, true);\n            });\n        }\n\n        /**\n         * At this point the argument given was neither an object,\n         * array or string so we simply perform a reload. This is to\n         * allow the following syntax to work as expected\n         *\n         * reload();\n         */\n        return publicUtils.emitBrowserReload(emitter);\n    }\n\n    return browserSyncReload;\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/public/resume.js",
    "content": "\"use strict\";\n\n/**\n * @param {BrowserSync} browserSync\n * @returns {Function}\n */\nmodule.exports = function(browserSync) {\n    return function() {\n        browserSync.paused = false;\n    };\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/public/stream.js",
    "content": "\"use strict\";\n\nvar path = require(\"path\");\nvar micromatch = require(\"micromatch\");\nvar utils = require(\"./public-utils\");\n\n/**\n * @param emitter\n * @returns {Function}\n */\nmodule.exports = function(emitter) {\n    /**\n     * Return a transform/through stream that listens to file\n     * paths and fires internal Browsersync events.\n     * @param {{once: boolean, match: string|array}} [opts]\n     * @returns {Stream.Transform}\n     */\n    function browserSyncThroughStream(opts) {\n        opts = opts || {};\n        var emitted = false;\n        var Transform = require(\"stream\").Transform;\n        var reload = new Transform({ objectMode: true });\n        var changed = [];\n\n        reload._transform = function(file, encoding, next) {\n            var stream = this;\n\n            /**\n             * End is always called to send the current file down\n             * stream. Browsersync never acts upon a stream,\n             * we only `listen` to it.\n             */\n            function end() {\n                stream.push(file); // always send the file down-stream\n                next();\n            }\n\n            /**\n             * If {match: <pattern>} was provided, test the\n             * current filepath against it\n             */\n            if (opts.match) {\n                if (!micromatch(file.path, opts.match, { dot: true }).length) {\n                    return end();\n                }\n            }\n\n            /**\n             * if {once: true} provided, emit the reload event for the\n             * first file only\n             */\n            if (opts.once === true && !emitted) {\n                utils.emitBrowserReload(emitter);\n\n                emitted = true;\n            } else {\n                // handle multiple\n\n                if (opts.once === true && emitted) {\n                } else {\n                    if (file.path) {\n                        emitted = true;\n                        utils.emitChangeEvent(emitter, file.path, false);\n                        changed.push(path.basename(file.path));\n                    }\n                }\n            }\n\n            end();\n        };\n\n        /**\n         * When this current operation has finished, emit the\n         * steam:changed event so that any loggers can pick up it\n         * @param next\n         * @private\n         */\n        reload._flush = function(next) {\n            if (changed.length) {\n                utils.emitStreamChangedEvent(emitter, changed);\n            }\n\n            next();\n        };\n\n        return reload;\n    }\n\n    return browserSyncThroughStream;\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/server/index.js",
    "content": "\"use strict\";\n\nvar enableDestroy = require(\"server-destroy\");\nvar _ = require(\"../lodash.custom\");\n\n/**\n * Browsersync server\n * Three available modes: Snippet, Server or Proxy\n */\nmodule.exports.plugin = function(bs) {\n    var debug = bs.debug;\n    var proxy = bs.options.get(\"proxy\");\n    var type = bs.options.get(\"mode\");\n\n    var bsServer = createServer(bs);\n\n    if (type === \"server\" || type === \"snippet\") {\n        debug(\n            \"Static Server running ({magenta:%s}) ...\",\n            bs.options.get(\"scheme\")\n        );\n    }\n\n    if (proxy) {\n        debug(\"Proxy running, proxing: {magenta:%s}\", proxy.get(\"target\"));\n    }\n\n    if (bsServer) {\n        /**\n         * Allow server to be destroyed gracefully\n         */\n        enableDestroy(bsServer.server);\n\n        /**\n         * Listen on the available port\n         */\n        bsServer.server.listen(\n            bs.options.get(\"port\"),\n            bs.options.get(\"listen\")\n        );\n\n        /**\n         * Hack to deal with https://github.com/socketio/socket.io/issues/1602#issuecomment-224270022\n         */\n        bs.registerCleanupTask(function() {\n            if (bs.io && bs.io.sockets) {\n                setCloseReceived(bs.io.sockets);\n            }\n            if (bs.ui && bs.ui.socket) {\n                setCloseReceived(bs.ui.socket);\n            }\n        });\n\n        /**\n         * Destroy the server on cleanup\n         */\n        bs.registerCleanupTask(function() {\n            bsServer.server.destroy();\n        });\n    }\n\n    function setCloseReceived(io) {\n        Object.keys(io.sockets).forEach(function(key) {\n            _.set(\n                io.sockets[key],\n                \"conn.transport.socket._closeReceived\",\n                true\n            );\n        });\n    }\n\n    debug(\"Running mode: %s\", type.toUpperCase());\n\n    return {\n        server: bsServer.server,\n        app: bsServer.app\n    };\n};\n\n/**\n * Launch the server for serving the client JS plus static files\n * @param {BrowserSync} bs\n * @returns {{staticServer: (http.Server), proxyServer: (http.Server)}}\n */\nfunction createServer(bs) {\n    var proxy = bs.options.get(\"proxy\");\n    var server = bs.options.get(\"server\");\n\n    if (!proxy && !server) {\n        return require(\"./snippet-server\")(bs);\n    }\n\n    if (proxy) {\n        return require(\"./proxy-server\")(bs);\n    }\n\n    if (server) {\n        return require(\"./static-server\")(bs);\n    }\n}\n\nmodule.exports.createServer = createServer;\n"
  },
  {
    "path": "packages/browser-sync/lib/server/proxy-server.js",
    "content": "\"use strict\";\n\nvar httpProxy = require(\"http-proxy\");\nvar utils = require(\"./utils\");\nvar proxyUtils = require(\"./proxy-utils\");\nvar Immutable = require(\"immutable\");\nvar Map = require(\"immutable\").Map;\nvar List = require(\"immutable\").List;\n\n/**\n * Default options that are passed along to http-proxy\n */\nvar defaultHttpProxyOptions = Map({\n    /**\n     * This ensures targets are more likely to\n     * accept each request\n     */\n    changeOrigin: true,\n    /**\n     * This handles redirects\n     */\n    autoRewrite: true,\n    /**\n     * This allows our self-signed certs to be used for development\n     */\n    secure: false,\n    ws: true\n});\n\nvar defaultCookieOptions = Map({\n    stripDomain: true\n});\n\nvar ProxyOption = Immutable.Record({\n    route: \"\",\n    target: \"\",\n    rewriteRules: true,\n    /**\n     * Functions to be called on proxy request\n     * with args [proxyReq, req, res, options]\n     */\n    proxyReq: List([]),\n    /**\n     * Functions to be called on proxy response\n     * with args [proxyRes, req, res]\n     */\n    proxyRes: List([]),\n    /**\n     * Functions to be called on proxy response\n     * with args [proxyReq, req, socket, options, head]\n     */\n    proxyReqWs: List([]),\n    errHandler: undefined,\n    url: Map({}),\n    proxyOptions: Map(defaultHttpProxyOptions),\n    cookies: Map(defaultCookieOptions),\n    ws: false,\n    middleware: List([]),\n    reqHeaders: undefined\n});\n\n/**\n * @param {BrowserSync} bs\n * @param {String} scripts\n * @returns {*}\n */\nmodule.exports = function createProxyServer(bs) {\n    var opt = new ProxyOption().mergeDeep(bs.options.get(\"proxy\"));\n    var proxy = httpProxy.createProxyServer(\n        opt\n            .get(\"proxyOptions\")\n            .set(\"target\", opt.get(\"target\"))\n            .toJS()\n    );\n    var target = opt.get(\"target\");\n    var proxyReq = getProxyReqFunctions(opt.get(\"proxyReq\"), opt, bs);\n    var proxyRes = getProxyResFunctions(opt.get(\"proxyRes\"), opt);\n    var proxyResWs = opt.get(\"proxyReqWs\");\n    bs.options = bs.options.update(\"middleware\", function(mw) {\n        return mw.concat({\n            id: \"Browsersync Proxy\",\n            route: opt.get(\"route\"),\n            handle: function(req, res) {\n                proxy.web(req, res, {\n                    target: target\n                });\n            }\n        });\n    });\n\n    var app = utils.getBaseApp(bs);\n\n    /**\n     * @type {*|{server, app}}\n     */\n    var browserSyncServer = utils.getServer(app, bs.options);\n    browserSyncServer.proxy = proxy;\n\n    if (opt.get(\"ws\")) {\n        // debug(`+ ws upgrade for: ${x.get(\"target\")}`);\n        browserSyncServer.server.on(\"upgrade\", function(req, socket, head) {\n            proxy.ws(req, socket, head);\n        });\n    }\n\n    /**\n     * Add any user provided functions for proxyReq, proxyReqWs and proxyRes\n     */\n    applyFns(\"proxyReq\", proxyReq);\n    applyFns(\"proxyRes\", proxyRes);\n    applyFns(\"proxyReqWs\", proxyResWs);\n\n    /**\n     * Handle Proxy errors\n     */\n    proxy.on(\"error\", function(err) {\n        if (typeof opt.get(\"errHandler\") === \"function\") {\n            opt.get(\"errHandler\").call(null, err);\n        }\n    });\n\n    /**\n     * Apply functions to proxy events\n     * @param {string} name - the name of the http-proxy event\n     * @param {Array} fns - functions to call on each event\n     */\n    function applyFns(name, fns) {\n        if (!List.isList(fns)) fns = [fns];\n        proxy.on(name, function() {\n            var args = arguments;\n            fns.forEach(function(fn) {\n                if (typeof fn === \"function\") {\n                    fn.apply(null, args);\n                }\n            });\n        });\n    }\n\n    return browserSyncServer;\n};\n\n/**\n * @param resFns\n * @returns {*}\n */\nfunction getProxyResFunctions(resFns, opt) {\n    if (opt.getIn([\"cookies\", \"stripDomain\"])) {\n        return resFns.push(proxyUtils.checkCookies);\n    }\n    return resFns;\n}\n\n/**\n * @param reqFns\n * @returns {*}\n */\nfunction getProxyReqFunctions(reqFns, opt, bs) {\n    var reqHeaders = opt.getIn([\"reqHeaders\"]);\n\n    if (!reqHeaders) {\n        return reqFns;\n    }\n\n    /**\n     * Back-compat for old `reqHeaders` option here a\n     * function was given that returned an object\n     * where key:value was header-name:header-value\n     * This didn't really work as it clobbered all other headers,\n     * but it remains for the unlucky few who used it.\n     */\n    if (typeof reqHeaders === \"function\") {\n        var output = reqHeaders.call(bs, opt.toJS());\n        if (Object.keys(output).length) {\n            return reqFns.concat(function(proxyReq) {\n                Object.keys(output).forEach(function(key) {\n                    proxyReq.setHeader(key, output[key]);\n                });\n            });\n        }\n    }\n\n    /**\n     * Now, if {key:value} given, set the each header\n     *\n     * eg: reqHeaders: {\n     *     'is-dev': 'true'\n     * }\n     */\n    if (Map.isMap(reqHeaders)) {\n        return reqFns.concat(function(proxyReq) {\n            reqHeaders.forEach(function(value, key) {\n                proxyReq.setHeader(key, value);\n            });\n        });\n    }\n\n    return reqFns;\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/server/proxy-utils.js",
    "content": "var url = require(\"url\");\n\nmodule.exports.rewriteLinks = function(userServer) {\n    var host = userServer.hostname;\n    var string = host;\n    var port = userServer.port;\n\n    if (host && port) {\n        if (parseInt(port, 10) !== 80) {\n            string = host + \":\" + port;\n        }\n    }\n\n    var reg = new RegExp(\n        // a simple, but exact match\n        \"https?:\\\\\\\\/\\\\\\\\/\" +\n            string +\n            \"|\" +\n            // following ['\"] + exact\n            \"('|\\\")\\\\/\\\\/\" +\n            string +\n            \"|\" +\n            // exact match with optional trailing slash\n            \"https?://\" +\n            string +\n            \"(?!:)(/)?\" +\n            \"|\" +\n            // following ['\"] + exact + possible multiple (imr srcset etc)\n            \"('|\\\")(https?://|/|\\\\.)?\" +\n            string +\n            \"(?!:)(/)?(.*?)(?=[ ,'\\\"\\\\s])\",\n        \"g\"\n    );\n\n    return {\n        match: reg,\n        //match: new RegExp(\"https?:\\\\\\\\/\\\\\\\\/\" + string + \"|https?://\" + string + \"(\\/)?|('|\\\")(https?://|/|\\\\.)?\" + string + \"(\\/)?(.*?)(?=[ ,'\\\"\\\\s])\", \"g\"),\n        //match: new RegExp(\"https?:\\\\\\\\?/\\\\\\\\?/\" + string + \"(\\/)?|('|\\\")(https?://|\\\\\\\\?/|\\\\.)?\" + string + \"(\\/)?(.*?)(?=[ ,'\\\"\\\\s])\", \"g\"),\n        //match: new RegExp('https?://' + string + '(\\/)?|(\\'|\")(https?://|/|\\\\.)?' + string + '(\\/)?(.*?)(?=[ ,\\'\"\\\\s])', 'g'),\n        //match: new RegExp(\"https?:\\\\\\\\/\\\\\\\\/\" + string, \"g\"),\n        fn: function(req, res, match) {\n            var proxyUrl = req.headers[\"host\"];\n\n            /**\n             * Reject subdomains\n             */\n            if (match[0] === \".\") {\n                return match;\n            }\n\n            var captured = match[0] === \"'\" || match[0] === '\"' ? match[0] : \"\";\n\n            /**\n             * allow http https\n             * @type {string}\n             */\n            var pre = \"//\";\n\n            if (match[0] === \"'\" || match[0] === '\"') {\n                match = match.slice(1);\n            }\n\n            /**\n             * parse the url\n             * @type {number|*}\n             */\n            var out = url.parse(match);\n\n            /**\n             * If host not set, just do a simple replace\n             */\n            if (!out.host) {\n                string = string.replace(/^(\\/)/, \"\");\n                return captured + match.replace(string, proxyUrl);\n            }\n\n            /**\n             * Only add trailing slash if one was\n             * present in the original match\n             */\n            if (out.path === \"/\") {\n                if (match.slice(-1) === \"/\") {\n                    out.path = \"/\";\n                } else {\n                    out.path = \"\";\n                }\n            }\n\n            /**\n             * Finally append all of parsed url\n             */\n            return [\n                captured,\n                pre,\n                proxyUrl,\n                out.path || \"\",\n                out.hash || \"\"\n            ].join(\"\");\n        }\n    };\n};\n\n/**\n * Remove 'domain' from any cookies\n * @param {Object} res\n */\nmodule.exports.checkCookies = function checkCookies(res) {\n    if (typeof res.headers[\"set-cookie\"] !== \"undefined\") {\n        res.headers[\"set-cookie\"] = res.headers[\"set-cookie\"].map(function(\n            item\n        ) {\n            return rewriteCookies(item);\n        });\n    }\n};\n\n/**\n * Remove the domain from any cookies.\n * @param rawCookie\n * @returns {string}\n */\nfunction rewriteCookies(rawCookie) {\n    var objCookie = (function() {\n        // simple parse function (does not remove quotes)\n        var obj = {};\n        var pairs = rawCookie.split(/; */);\n\n        pairs.forEach(function(pair) {\n            var eqIndex = pair.indexOf(\"=\");\n\n            // skip things that don't look like key=value\n            if (eqIndex < 0) {\n                return;\n            }\n\n            var key = pair.substr(0, eqIndex).trim();\n            obj[key] = pair.substr(eqIndex + 1, pair.length).trim();\n        });\n\n        return obj;\n    })();\n\n    var pairs = Object.keys(objCookie)\n        .filter(function(item) {\n            return item.toLowerCase() !== \"domain\";\n        })\n        .map(function(key) {\n            return key + \"=\" + objCookie[key];\n        });\n\n    if (rawCookie.match(/httponly/i)) {\n        pairs.push(\"HttpOnly\");\n    }\n\n    return pairs.join(\"; \");\n}\n\nmodule.exports.rewriteCookies = rewriteCookies;\n"
  },
  {
    "path": "packages/browser-sync/lib/server/serve-static-wrapper.ts",
    "content": "export default function() {\n    const serveStatic = require(\"serve-static\");\n\n    /**\n     * Adding a custom mime-type for wasm whilst we wait for\n     * the `send` package to be updated.\n     */\n    const send = require(\"send\");\n    send.mime.define({ \"application/wasm\": [\"wasm\"] });\n\n    return serveStatic;\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/server/snippet-server.js",
    "content": "\"use strict\";\n\nvar connect = require(\"connect\");\nvar serverUtils = require(\"./utils.js\");\n\n/**\n * Create a server for the snippet\n * @param {BrowserSync} bs\n * @param scripts\n * @returns {*}\n */\nmodule.exports = function createSnippetServer(bs, scripts) {\n    var app = serverUtils.getBaseApp(bs, bs.options, scripts);\n    return serverUtils.getServer(app, bs.options);\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/server/static-server.js",
    "content": "var serverUtils = require(\"./utils.js\");\nvar resolve = require(\"path\").resolve;\nvar utils = require(\"../utils.js\");\nvar serveStatic = require(\"./serve-static-wrapper\").default();\nvar serveIndex = require(\"serve-index\");\n\n/**\n * @param {BrowserSync} bs\n * @returns {*}\n */\nmodule.exports = function createServer(bs) {\n    var options = bs.options;\n    var server = options.get(\"server\");\n    var basedirs = utils.arrayify(server.get(\"baseDir\"));\n    var serveStaticOptions = server.get(\"serveStaticOptions\").toJS(); // passed to 3rd party\n\n    var _serveStatic = 0;\n    var _routes = 0;\n    bs.options = bs.options\n        /**\n         * Add directory Middleware if given in server.directory\n         */\n        .update(\"middleware\", function(mw) {\n            if (!server.get(\"directory\")) {\n                return mw;\n            }\n\n            return mw.concat({\n                route: \"\",\n                handle: serveIndex(resolve(basedirs[0]), {\n                    icons: true,\n                    view: \"details\"\n                }),\n                id: \"Browsersync Server Directory Middleware\"\n            });\n        })\n        /**\n         * Add middleware for server.baseDir Option\n         */\n        .update(\"middleware\", function(mw) {\n            return mw.concat(\n                basedirs.map(function(root) {\n                    return {\n                        route: \"\",\n                        id:\n                            \"Browsersync Server ServeStatic Middleware - \" +\n                            _serveStatic++,\n                        handle: serveStatic(resolve(root), serveStaticOptions)\n                    };\n                })\n            );\n        })\n        /**\n         * Add middleware for server.routes\n         */\n        .update(\"middleware\", function(mw) {\n            if (!server.get(\"routes\")) {\n                return mw;\n            }\n\n            return mw.concat(\n                server.get(\"routes\").map(function(root, urlPath) {\n                    // strip trailing slash\n                    if (urlPath[urlPath.length - 1] === \"/\") {\n                        urlPath = urlPath.slice(0, -1);\n                    }\n                    return {\n                        route: urlPath,\n                        id:\n                            \"Browsersync Server Routes Middleware - \" +\n                            _routes++,\n                        handle: serveStatic(resolve(root))\n                    };\n                })\n            );\n        });\n\n    var app = serverUtils.getBaseApp(bs);\n\n    /**\n     * Finally, return the server + App\n     */\n    return serverUtils.getServer(app, bs.options);\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/server/utils.js",
    "content": "\"use strict\";\n\nvar fs = require(\"fs\");\nvar path = require(\"path\");\nvar join = require(\"path\").join;\nvar connect = require(\"connect\");\nvar Immutable = require(\"immutable\");\nvar http = require(\"http\");\nvar https = require(\"https\");\nvar Map = require(\"immutable\").Map;\nvar fromJS = require(\"immutable\").fromJS;\nvar List = require(\"immutable\").List;\nvar snippet = require(\"./../snippet\").utils;\nvar _ = require(\"../lodash.custom\");\nvar serveStatic = require(\"./serve-static-wrapper\").default();\nvar serveIndex = require(\"serve-index\");\nvar logger = require(\"../logger\");\nvar snippetUtils = require(\"../snippet\").utils;\nvar lrSnippet = require(\"resp-modifier\");\nvar certPath = join(__dirname, \"..\", \"..\", \"certs\");\n\nfunction getCa(options) {\n    var caOption = options.getIn([\"https\", \"ca\"]);\n    // if not provided, use Browsersync self-signed\n    if (typeof caOption === \"undefined\") {\n        return fs.readFileSync(join(certPath, \"server.csr\"));\n    }\n    // if a string was given, read that file from disk\n    if (typeof caOption === \"string\") {\n        return fs.readFileSync(caOption);\n    }\n    // if an array was given, read all\n    if (List.isList(caOption)) {\n        return caOption.toArray().map(function(x) {\n            return fs.readFileSync(x);\n        });\n    }\n}\n\nfunction getKey(options) {\n    return fs.readFileSync(\n        options.getIn([\"https\", \"key\"]) || join(certPath, \"server.key\")\n    );\n}\n\nfunction getCert(options) {\n    return fs.readFileSync(\n        options.getIn([\"https\", \"cert\"]) || join(certPath, \"server.crt\")\n    );\n}\n\nfunction getHttpsServerDefaults(options) {\n    return fromJS({\n        key: getKey(options),\n        cert: getCert(options),\n        ca: getCa(options),\n        passphrase: options.getIn([\"https\", \"passphrase\"], \"\")\n    });\n}\n\nfunction getPFXDefaults(options) {\n    return fromJS({\n        pfx: fs.readFileSync(options.getIn([\"https\", \"pfx\"]))\n    });\n}\n\nvar serverUtils = {\n    /**\n     * @param options\n     * @returns {{key, cert}}\n     */\n    getHttpsOptions: function(options) {\n        var userOption = options.get(\"https\");\n        if (Map.isMap(userOption)) {\n            if (userOption.has(\"pfx\")) {\n                return userOption.mergeDeep(getPFXDefaults(options));\n            }\n            return userOption.mergeDeep(getHttpsServerDefaults(options));\n        }\n        return getHttpsServerDefaults(options);\n    },\n    /**\n     * Get either http or https server\n     * or use the httpModule provided in options if present\n     */\n    getServer: function(app, options) {\n        return {\n            server: (function() {\n                var httpModule = serverUtils.getHttpModule(options);\n\n                if (\n                    options.get(\"scheme\") === \"https\" ||\n                    options.get(\"httpModule\") === \"http2\"\n                ) {\n                    var opts = serverUtils.getHttpsOptions(options);\n                    return httpModule.createServer(opts.toJS(), app);\n                }\n\n                return httpModule.createServer(app);\n            })(),\n            app: app\n        };\n    },\n    getHttpModule: function(options) {\n        /**\n         * Users may provide a string to be used by nodes\n         * require lookup.\n         */\n        var httpModule = options.get(\"httpModule\");\n\n        if (typeof httpModule === \"string\") {\n            /**\n             * Note, this could throw, but let that happen as\n             * the error message good enough.\n             */\n            var maybe = require.resolve(httpModule);\n            return require(maybe);\n        }\n\n        if (options.get(\"scheme\") === \"https\") {\n            return https;\n        }\n\n        return http;\n    },\n    getMiddlewares: function(bs) {\n        var clientJs = bs.pluginManager.hook(\"client:js\", {\n            port: bs.options.get(\"port\"),\n            options: bs.options\n        });\n\n        var scripts = bs.pluginManager.get(\"client:script\")(\n            bs.options.toJS(),\n            clientJs,\n            \"middleware\"\n        );\n\n        var defaultMiddlewares = [\n            {\n                id: \"Browsersync HTTP Protocol\",\n                route: require(\"../config\").httpProtocol.path,\n                handle: require(\"../http-protocol\").middleware(bs)\n            },\n            {\n                id: \"Browsersync IE8 Support\",\n                route: \"\",\n                handle: snippet.isOldIe(\n                    bs.options.get(\"excludedFileTypes\").toJS()\n                )\n            },\n            {\n                id: \"Browsersync Response Modifier\",\n                route: \"\",\n                handle: serverUtils.getSnippetMiddleware(bs)\n            },\n            {\n                id: \"Browsersync Client - versioned\",\n                route: bs.options.getIn([\"scriptPaths\", \"versioned\"]),\n                handle: scripts\n            },\n            {\n                id: \"Browsersync Client\",\n                route: bs.options.getIn([\"scriptPaths\", \"path\"]),\n                handle: scripts\n            }\n        ];\n\n        /**\n         * Add cors middleware to the front of the stack\n         * if a user provided a 'cors' flag\n         */\n        if (bs.options.get(\"cors\")) {\n            defaultMiddlewares.unshift({\n                id: \"Browsersync CORS support\",\n                route: \"\",\n                handle: serverUtils.getCorsMiddlewware()\n            });\n        }\n\n        /**\n         * Add connect-history-api-fallback if 'single' argument given\n         */\n        if (bs.options.get(\"single\")) {\n            defaultMiddlewares.unshift({\n                id: \"Browsersync SPA support\",\n                route: \"\",\n                handle: require(\"connect-history-api-fallback\")()\n            });\n        }\n\n        /**\n         * Add serve static middleware\n         */\n        if (bs.options.get(\"serveStatic\")) {\n            var ssMiddlewares = serverUtils.getServeStaticMiddlewares(\n                bs.options.get(\"serveStatic\"),\n                bs.options.get(\"serveStaticOptions\", Immutable.Map({})).toJS()\n            );\n            var withErrors = ssMiddlewares.filter(function(x) {\n                return x.get(\"errors\").size > 0;\n            });\n            var withoutErrors = ssMiddlewares.filter(function(x) {\n                return x.get(\"errors\").size === 0;\n            });\n\n            if (withErrors.size) {\n                withErrors.forEach(function(item) {\n                    logger.logger.error(\n                        \"%s %s\",\n                        chalk.red(\"Warning!\"),\n                        item.getIn([\"errors\", 0, \"data\", \"message\"])\n                    );\n                });\n            }\n\n            if (withoutErrors.size) {\n                withoutErrors.forEach(function(item) {\n                    defaultMiddlewares.push.apply(\n                        defaultMiddlewares,\n                        item.get(\"items\").toJS()\n                    );\n                });\n            }\n        }\n\n        /**\n         * Add user-provided middlewares\n         */\n        var userMiddlewares = bs.options\n            .get(\"middleware\")\n            .map(normaliseMiddleware)\n            .toArray();\n        var beforeMiddlewares = userMiddlewares.filter(function(x) {\n            return x.override;\n        });\n        var afterMiddlewares = userMiddlewares\n            .filter(function(x) {\n                return !x.override;\n            })\n            .concat(\n                bs.options.get(\"mode\") !== \"proxy\" &&\n                    userMiddlewares.length === 0 && {\n                        id: \"Browsersync 404/index support\",\n                        route: \"\",\n                        handle: serveIndex(bs.options.get(\"cwd\"), {\n                            icons: true,\n                            view: \"details\"\n                        })\n                    }\n            );\n\n        const mwStack = []\n            .concat(beforeMiddlewares, defaultMiddlewares, afterMiddlewares)\n            .filter(Boolean);\n\n        return mwStack;\n\n        function normaliseMiddleware(item) {\n            /**\n             * Object given in options, which\n             * ended up being a Map\n             */\n            if (Map.isMap(item)) {\n                return item.toJS();\n            }\n            /**\n             * Single function\n             */\n            if (typeof item === \"function\") {\n                return {\n                    route: \"\",\n                    handle: item\n                };\n            }\n            /**\n             * Plain obj\n             */\n            if (item.route !== undefined && item.handle) {\n                return item;\n            }\n        }\n    },\n    getBaseApp: function(bs) {\n        var app = connect();\n        var middlewares = serverUtils.getMiddlewares(bs);\n\n        /**\n         * Add all internal middlewares\n         */\n        middlewares.forEach(function(item) {\n            app.stack.push(item);\n        });\n\n        return app;\n    },\n    getSnippetMiddleware: function(bs) {\n        var rules = [];\n        var blacklist = List([])\n            .concat(bs.options.getIn([\"snippetOptions\", \"ignorePaths\"]))\n            .concat(bs.options.getIn([\"snippetOptions\", \"blacklist\"]))\n            .filter(Boolean);\n\n        var whitelist = List([]).concat(\n            bs.options.getIn([\"snippetOptions\", \"whitelist\"])\n        );\n\n        // Snippet\n        if (bs.options.get(\"snippet\")) {\n            rules.push(\n                snippetUtils.getRegex(\n                    bs.options.get(\"snippet\"),\n                    bs.options.get(\"snippetOptions\")\n                )\n            );\n        }\n\n        // User\n        bs.options.get(\"rewriteRules\").forEach(function(rule) {\n            if (Map.isMap(rule)) {\n                rules.push(rule.toJS());\n            }\n            if (_.isPlainObject(rule)) {\n                rules.push(rule);\n            }\n        });\n\n        // Proxy\n        if (bs.options.get(\"proxy\")) {\n            var proxyRule = require(\"./proxy-utils\").rewriteLinks(\n                bs.options.getIn([\"proxy\", \"url\"]).toJS()\n            );\n            rules.push(proxyRule);\n        }\n\n        var lr = lrSnippet.create({\n            rules: rules,\n            blacklist: blacklist.toArray(),\n            whitelist: whitelist.toArray()\n        });\n\n        return lr.middleware;\n    },\n    getCorsMiddlewware: function() {\n        return function(req, res, next) {\n            // Website you wish to allow to connect\n            res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n\n            // Request methods you wish to allow\n            res.setHeader(\n                \"Access-Control-Allow-Methods\",\n                \"GET, POST, OPTIONS, PUT, PATCH, DELETE\"\n            );\n\n            // Request headers you wish to allow\n            res.setHeader(\n                \"Access-Control-Allow-Headers\",\n                \"X-Requested-With,content-type\"\n            );\n\n            // Set to true if you need the website to include cookies in the requests sent\n            // to the API (e.g. in case you use sessions)\n            res.setHeader(\"Access-Control-Allow-Credentials\", true);\n            next();\n        };\n    },\n    /**\n     * @param ssOption\n     * @param serveStaticOptions\n     * @returns {*}\n     */\n    getServeStaticMiddlewares: function(ssOption, serveStaticOptions) {\n        return ssOption.map(function(dir, i) {\n            /**\n             * When a user gives a plain string only, eg:\n             *   serveStatic: ['./temp']\n             *     ->\n             *       This means a middleware will be created with\n             *         route: ''\n             *         handle: serveStatic('./temp', options)\n             */\n            if (_.isString(dir)) {\n                return getFromString(dir);\n            }\n\n            /**\n             * If a user gave an object eg:\n             *   serveStatic: [{route: \"\", dir: [\"test\", \"./tmp\"]}]\n             *     ->\n             *       This means we need to create a middle for each route + dir combo\n             */\n            if (Immutable.Map.isMap(dir)) {\n                return getFromMap(dir, i);\n            }\n\n            /**\n             * At this point, an item in the serveStatic array was not a string\n             * or an object so we return an error that can be logged\n             */\n            return fromJS({\n                items: [],\n                errors: [\n                    {\n                        type: \"Invalid Type\",\n                        data: {\n                            message:\n                                \"Only strings and Objects (with route+dir) are supported for the ServeStatic option\"\n                        }\n                    }\n                ]\n            });\n        });\n\n        /**\n         * @param {string} x\n         * @returns {string}\n         */\n        function getRoute(x) {\n            if (x === \"\") return \"\";\n            return x[0] === \"/\" ? x : \"/\" + x;\n        }\n\n        /**\n         * @param dir\n         * @returns {Map}\n         */\n        function getFromString(dir) {\n            return fromJS({\n                items: [\n                    {\n                        route: \"\",\n                        handle: serveStatic(dir, serveStaticOptions)\n                    }\n                ],\n                errors: []\n            });\n        }\n\n        /**\n         * @param dir\n         * @returns {Map}\n         */\n        function getFromMap(dir) {\n            var ssOptions = (function() {\n                if (dir.get(\"options\")) {\n                    return dir.get(\"options\").toJS();\n                }\n                return {};\n            })();\n\n            var route = Immutable.List([])\n                .concat(dir.get(\"route\"))\n                .filter(_.isString);\n            var _dir = Immutable.List([])\n                .concat(dir.get(\"dir\"))\n                .filter(_.isString);\n\n            if (_dir.size === 0) {\n                return fromJS({\n                    items: [],\n                    errors: [\n                        {\n                            type: \"Invalid Object\",\n                            data: {\n                                message:\n                                    \"Serve Static requires a 'dir' property when using an Object\"\n                            }\n                        }\n                    ]\n                });\n            }\n\n            var ssItems = (function() {\n                /**\n                 * iterate over every 'route' item\n                 * @type {Immutable.List<any>|Immutable.List<*>|Immutable.List<any>|*}\n                 */\n                var routeItems = (function() {\n                    /**\n                     * If no 'route' was given, assume we want to match all\n                     * paths\n                     */\n                    if (route.size === 0) {\n                        return _dir.map(function(dirString) {\n                            return Map({\n                                route: \"\",\n                                dir: dirString\n                            });\n                        });\n                    }\n\n                    return route.reduce(function(acc, routeString) {\n                        /**\n                         * For each 'route' item, also iterate through 'dirs'\n                         * @type {Immutable.Iterable<K, M>}\n                         */\n                        var perDir = _dir.map(function(dirString) {\n                            return Map({\n                                route: getRoute(routeString),\n                                dir: dirString\n                            });\n                        });\n                        return acc.concat(perDir);\n                    }, List([]));\n                })();\n\n                /**\n                 * Now create a serverStatic Middleware for each item\n                 */\n                return routeItems.map(function(routeItem) {\n                    return routeItem.merge({\n                        handle: serveStatic(routeItem.get(\"dir\"), ssOptions)\n                    });\n                });\n            })();\n\n            return fromJS({\n                items: ssItems,\n                errors: []\n            });\n        }\n    }\n};\n\nmodule.exports = serverUtils;\n"
  },
  {
    "path": "packages/browser-sync/lib/snippet.js",
    "content": "\"use strict\";\n\nvar connectUtils = require(\"./connect-utils\");\nvar config = require(\"./config\");\n\nvar lrSnippet = require(\"resp-modifier\");\nvar path = require(\"path\");\nvar _ = require(\"./lodash.custom\");\nvar utils = require(\"./utils\");\nvar fs = require(\"fs\");\nvar path = require(\"path\");\n\n/**\n * Utils for snippet injection\n */\nvar snippetUtils = {\n    /**\n     * @param {String} url\n     * @param {Array} excludeList\n     * @returns {boolean}\n     */\n    isExcluded: function(url, excludeList) {\n        var extension = path.extname(url);\n\n        if (extension) {\n            if (~url.indexOf(\"?\")) {\n                return true;\n            }\n            extension = extension.slice(1);\n            return _.includes(excludeList, extension);\n        }\n        return false;\n    },\n    /**\n     * @param {String} snippet\n     * @param {Object} options\n     * @returns {{match: RegExp, fn: Function}}\n     */\n    getRegex: function(snippet, options) {\n        var fn = options.getIn([\"rule\", \"fn\"]);\n\n        return {\n            match: options.getIn([\"rule\", \"match\"]),\n            fn: function(req, res, match) {\n                return fn.apply(null, [snippet, match]);\n            },\n            once: true,\n            id: \"bs-snippet\"\n        };\n    },\n    getSnippetMiddleware: function(snippet, options, rewriteRules) {\n        return lrSnippet.create(\n            snippetUtils.getRules(snippet, options, rewriteRules)\n        );\n    },\n    getRules: function(snippet, options, rewriteRules) {\n        var rules = [snippetUtils.getRegex(snippet, options)];\n\n        if (rewriteRules) {\n            rules = rules.concat(rewriteRules);\n        }\n\n        return {\n            rules: rules,\n            blacklist: utils.arrayify(options.get(\"blacklist\")),\n            whitelist: utils.arrayify(options.get(\"whitelist\"))\n        };\n    },\n    /**\n     * @param {Object} req\n     * @param {Array} [excludeList]\n     * @returns {Object}\n     */\n    isOldIe: function(excludeList) {\n        return function(req, res, next) {\n            var ua = req.headers[\"user-agent\"];\n            var match = /MSIE (\\d)\\.\\d/.exec(ua);\n            if (match) {\n                if (parseInt(match[1], 10) < 9) {\n                    if (!snippetUtils.isExcluded(req.url, excludeList)) {\n                        req.headers[\"accept\"] = \"text/html\";\n                    }\n                }\n            }\n            next();\n        };\n    },\n    /**\n     * @param {Number} port\n     * @param {BrowserSync.options} options\n     * @returns {String}\n     */\n    getClientJs: function(port, options) {\n        return () => {\n            const script = options.get(\"minify\") ? \"index.js\" : \"index.js\";\n            const client = fs.readFileSync(\n                require.resolve(\"browser-sync-client/dist/\" + script),\n                \"utf8\"\n            );\n            return [connectUtils.socketConnector(options), client].join(\";\\n\");\n        };\n    }\n};\n\nmodule.exports.utils = snippetUtils;\n"
  },
  {
    "path": "packages/browser-sync/lib/sockets.ts",
    "content": "import {Server} from \"socket.io\";\nimport * as utils from \"./server/utils\";\n\n/**\n * Plugin interface\n * @returns {*|function(this:exports)}\n */\nexport function plugin(server, clientEvents, bs) {\n    return exports.init(server, clientEvents, bs);\n}\n\n/**\n * @param {http.Server} server\n * @param clientEvents\n * @param {BrowserSync} bs\n */\nexport function init(server, clientEvents, bs) {\n    var emitter = bs.events;\n\n    var socketConfig = bs.options.get(\"socket\").toJS();\n\n    if (\n        bs.options.get(\"mode\") === \"proxy\" &&\n        bs.options.getIn([\"proxy\", \"ws\"])\n    ) {\n        server = utils.getServer(null, bs.options).server;\n        server.listen(bs.options.getIn([\"socket\", \"port\"]));\n        bs.registerCleanupTask(function() {\n            server.close();\n        });\n    }\n\n    var socketIoConfig = socketConfig.socketIoOptions;\n    socketIoConfig.path = socketConfig.path;\n\n    const io = new Server();\n    io.attach(server, {\n      ...socketIoConfig,\n      pingTimeout: socketConfig.clients.heartbeatTimeout,\n      cors: {\n          credentials: true,\n          \"origin\": (origin, cb) => {\n            return cb(null, origin)\n          },\n      }\n    });\n\n    io.of(socketConfig.namespace).on('connection', (socket) => {\n        handleConnection(socket);\n    });\n\n    /**\n     * Handle each new connection\n     * @param {Object} client\n     */\n    function handleConnection(client) {\n        // set ghostmode callbacks\n        if (bs.options.get(\"ghostMode\")) {\n            addGhostMode(client);\n        }\n\n        client.emit(\"connection\", bs.options.toJS()); //todo - trim the amount of options sent to clients\n\n        emitter.emit(\"client:connected\", {\n            ua: client.handshake.headers[\"user-agent\"]\n        });\n    }\n\n    /**\n     * @param client\n     */\n    function addGhostMode(client) {\n        clientEvents.forEach(addEvent);\n\n        function addEvent(event) {\n            client.on(event, data => {\n                client.broadcast.emit(event, data);\n            });\n        }\n    }\n\n    // @ts-ignore\n    io.sockets = io.of(socketConfig.namespace)\n\n    return io;\n}\n"
  },
  {
    "path": "packages/browser-sync/lib/tunnel.js",
    "content": "\"use strict\";\n\nvar _ = require(\"./lodash.custom\");\nvar utils = require(\"util\");\n\n/**\n * @param {BrowserSync} bs\n * @param {Function} cb\n */\nmodule.exports = function(bs, cb) {\n    var localtunnel;\n    try {\n        localtunnel = require(\"localtunnel\");\n    } catch (e) {\n        if (e.code === \"MODULE_NOT_FOUND\") {\n            var error = new Error(\"Could not find package `localtunnel`. From Browsersync version 3.0 you'll need to install this manually.\");\n            error.code = e.code;\n            return cb(error);\n        }\n        return cb(e);\n    }\n    var opts = {};\n    var options = bs.options;\n    var port = options.get(\"port\");\n\n    if (_.isString(options.get(\"tunnel\"))) {\n        opts.subdomain = options.get(\"tunnel\");\n    }\n\n    bs.debug(\"Requesting a tunnel connection on port: {magenta:%s}\", port);\n    bs.debug(\n        \"Requesting a tunnel connection with options: {magenta:%s}\",\n        utils.inspect(opts)\n    );\n\n    localtunnel(port, opts, function(err, tunnel) {\n        if (err) {\n            return cb(err);\n        }\n\n        tunnel.on(\"error\", function(err) {\n            bs.logger.info(\"Localtunnel issue: \" + err.message);\n            bs.logger.info(\n                \"Oops! The localtunnel appears to have disconnected. Reconnecting...\"\n            );\n        });\n\n        return cb(null, tunnel);\n    });\n};\n"
  },
  {
    "path": "packages/browser-sync/lib/types.ts",
    "content": "import * as url from \"url\";\nimport { Map } from \"immutable\";\n\nexport type ServerIncoming = string | string[] | IServerOption;\n\nexport interface IServerOption {\n    baseDir: string[];\n    index?: string;\n    directory?: boolean;\n    serveStaticOptions?: any;\n    routes?: { [route: string]: string };\n    middleware?: MiddlewareInput;\n}\n\nexport type MiddlewareInput = Function | Function[] | Middleware | Middleware[];\n\nexport interface Middleware {\n    route: string;\n    id?: string;\n    handle: Function;\n}\n\nexport type BrowsersyncProxyIncoming = string | BrowsersyncProxy;\nexport interface BrowsersyncProxy {\n    target: string;\n    url: Map<string, any>;\n    middleware?: MiddlewareInput;\n}\n\nexport type PortsOption = {\n    min: number | null;\n    max: number | null;\n};\n\nexport type FilesObject = { match: string[]; fn?: Function; options?: any };\nexport type FilesNamespace = { globs: string[]; objs: FilesObject[] };\nexport type FilesNamespaces = { [name: string]: FilesNamespace };\n"
  },
  {
    "path": "packages/browser-sync/lib/utils.ts",
    "content": "import { BsTempOptions } from \"./cli/cli-options\";\n\nimport * as devIp from \"dev-ip\";\nimport * as portScanner from \"portscanner\";\nimport * as path from \"path\";\nimport * as UAParser from \"ua-parser-js\";\nimport * as Immutable from \"immutable\";\nimport { List } from \"immutable\";\n\nconst _ = require(\"./lodash.custom\");\nconst parser = new UAParser();\n\n/**\n * @param {Object} options\n * @returns {String|boolean} - the IP address\n * @param devIp\n */\nexport function getHostIp(options: BsTempOptions, devIp: string[]) {\n    if (options) {\n        var host = options.get(\"host\");\n        if (host && host !== \"localhost\") {\n            return host;\n        }\n        if (options.get(\"detect\") === false || !devIp.length) {\n            return false;\n        }\n    }\n\n    return devIp.length ? devIp[0] : false;\n}\n\n/**\n * Set URL Options\n */\nexport function getUrlOptions(options: BsTempOptions): Map<string, string> {\n    const scheme = options.get(\"scheme\");\n\n    const port = options.get(\"port\");\n    const urls: { [index: string]: string } = {};\n    const listen = options.get(\"listen\");\n\n    if (options.get(\"online\") === false || listen) {\n        const host = listen || \"localhost\";\n        urls.local = getUrl(`${scheme}://${host}:${port}`, options);\n        return Immutable.fromJS(urls);\n    }\n\n    const fn: typeof getHostIp = exports.getHostIp;\n    const external = hostnameSuffix(fn(options, devIp()), options);\n    const localhost = hostnameSuffix(\"localhost\", options);\n\n    return Immutable.fromJS(getUrls(external, localhost, scheme, options));\n}\n\n/**\n * Append a start path if given in options\n * @param {String} url\n * @param {Object} options\n * @returns {String}\n */\nexport function getUrl(url: string, options: BsTempOptions) {\n    var prefix = \"/\";\n    var startPath = options.get(\"startPath\");\n\n    if (startPath) {\n        if (startPath.charAt(0) === \"/\") {\n            prefix = \"\";\n        }\n        url = url + prefix + startPath;\n    }\n\n    return url;\n}\n\n/**\n * @param {String} external\n * @param {String} local\n * @param {String} scheme\n * @param {Object} options\n * @returns {{local: string, external: string}}\n */\nexport function getUrls(external, local, scheme, options) {\n    var urls: { [index: string]: string } = {\n        local: getUrl(_makeUrl(scheme, local, options.get(\"port\")), options)\n    };\n\n    if (external !== local) {\n        urls.external = getUrl(\n            _makeUrl(scheme, external, options.get(\"port\")),\n            options\n        );\n    }\n\n    return urls;\n}\n\n/**\n * @param {String} scheme\n * @param {String} host\n * @param {Number} port\n * @returns {String}\n * @private\n */\nexport function _makeUrl(scheme, host, port) {\n    return scheme + \"://\" + host + \":\" + port;\n}\n\nexport type PortLookupCb = (error: null | Error, port: number) => void;\n/**\n * Get ports\n * @param {Object} options\n * @param {Function} cb\n */\nexport function getPorts(options: BsTempOptions, cb: PortLookupCb) {\n    var port = options.get(\"port\");\n    var ports = options.get(\"ports\"); // backwards compatibility\n    var host = options.get(\"listen\", \"localhost\"); // backwards compatibility\n    var max;\n\n    if (ports) {\n        port = ports.get(\"min\");\n        max = ports.get(\"max\") || null;\n    }\n\n    var fn: typeof getPort = exports.getPort;\n    fn(host, port, max, cb);\n}\n\nexport function getPort(\n    host: string,\n    port: number | string,\n    max: number | string | null,\n    cb: PortLookupCb\n) {\n    portScanner.findAPortNotInUse(\n        port,\n        max,\n        {\n            host: host,\n            timeout: 1000\n        },\n        cb\n    );\n}\n\n/**\n * @param {String} ua\n * @returns {Object}\n */\nexport function getUaString(ua) {\n    return parser.setUA(ua).getBrowser();\n}\n\n/**\n * Open the page in browser\n * @param {String} url\n * @param {Object} options\n * @param {BrowserSync} bs\n */\nexport function openBrowser(url, options, bs) {\n    const open = options.get(\"open\");\n    const browser = options.get(\"browser\");\n\n    if (_.isString(open)) {\n        if (options.getIn([\"urls\", open])) {\n            url = options.getIn([\"urls\", open]);\n        }\n    }\n\n    const fn: typeof opnWrapper = exports.opnWrapper;\n    if (open) {\n        if (browser !== \"default\") {\n            if (isList(browser)) {\n                browser.forEach(function(browser) {\n                    fn(url, browser, bs);\n                });\n            } else {\n                fn(url, browser, bs); // single\n            }\n        } else {\n            fn(url, null, bs);\n        }\n    }\n}\n\n/**\n * Wrapper for opn module\n * @param url\n * @param name\n * @param bs\n */\nexport function opnWrapper(url, name, bs) {\n    var options = (function() {\n        if (_.isString(name)) {\n            return { app: name };\n        }\n        if (Immutable.Map.isMap(name)) {\n            return name.toJS();\n        }\n        return {};\n    })();\n    var opn = require(\"opn\");\n    opn(url, options).catch(function() {\n        bs.events.emit(\"browser:error\");\n    });\n}\n\n/**\n * @param {Boolean} kill\n * @param {String|Error} [errMessage]\n * @param {Function} [cb]\n */\nexport function fail(kill, errMessage, cb) {\n    if (kill) {\n        if (_.isFunction(cb)) {\n            if (errMessage.message) {\n                // Is this an error object?\n                cb(errMessage);\n            } else {\n                cb(new Error(errMessage));\n            }\n        }\n        process.exit(1);\n    }\n}\n\n/**\n * hostnameSuffix\n * @param {String} host\n * @param {Object} options\n * @returns {String}\n */\nexport function hostnameSuffix(host, options) {\n    var suffix = options.get(\"hostnameSuffix\");\n    if (suffix) {\n        return host + suffix;\n    }\n    return host;\n}\n\n/**\n * Determine if an array of file paths will cause a full page reload.\n * @param {Array} needles - filepath such as [\"core.css\", \"index.html\"]\n * @param {Array} haystack\n * @returns {Boolean}\n */\nexport function willCauseReload(needles, haystack) {\n    return needles.some(function(needle) {\n        return !_.includes(haystack, path.extname(needle).replace(\".\", \"\"));\n    });\n}\n\nexport const isList = Immutable.List.isList;\nexport const isMap = Immutable.Map.isMap;\n\n/**\n * @param {Map} options\n * @returns {Array}\n */\nexport function getConfigErrors(options) {\n    var messages = require(\"./config\").errors;\n\n    var errors = [];\n\n    if (options.get(\"server\") && options.get(\"proxy\")) {\n        errors.push(messages[\"server+proxy\"]);\n    }\n\n    return errors;\n}\n\n/**\n * @param {Map} options\n * @param {Function} [cb]\n */\nexport function verifyConfig(options, cb) {\n    var errors = getConfigErrors(options);\n    if (errors.length) {\n        fail(true, errors.join(\"\\n\"), cb);\n        return false;\n    }\n    return true;\n}\n\nexport function eachSeries(arr, iterator, callback) {\n    callback = callback || function() {};\n    var completed = 0;\n    var iterate = function() {\n        iterator(arr[completed], function(err) {\n            if (err) {\n                callback(err);\n                callback = function() {};\n            } else {\n                ++completed;\n                if (completed >= arr.length) {\n                    callback();\n                } else {\n                    iterate();\n                }\n            }\n        });\n    };\n    iterate();\n}\n\n/**\n * @param {Immutable.List|Array|String} incoming\n * @returns {Array}\n */\nexport function arrayify(incoming) {\n    if (List.isList(incoming)) {\n        return incoming.toArray();\n    }\n    return [].concat(incoming).filter(Boolean);\n}\n\nexport function defaultCallback(err?: Error) {\n    if (err && err.message) {\n        console.error(err.message);\n    }\n}\n\nexport const portscanner = portScanner;\nexport const connect = require(\"connect\");\nexport const serveStatic = require(\"./server/serve-static-wrapper\").default();\nexport const easyExtender = require(\"easy-extender\");\nexport { UAParser, devIp };\n\n/**\n * Just for backwards compat around old argument styles\n */\nexport function parseParams(search: string): Record<string, any> {\n    const params = new URLSearchParams(search);\n    const parsed = Object.create(null);\n    for (let [key, value] of params) {\n        let nextKey = key;\n        let arrayType = false;\n\n        if (nextKey.slice(-2) === \"[]\") {\n            nextKey = key.slice(0, -2);\n            arrayType = true;\n        }\n\n        const curr = parsed[nextKey];\n\n        if (curr && Array.isArray(curr)) {\n            curr.push(value);\n        } else if (curr) {\n            // if it already exists, but is not already an array, upgrade to array\n            parsed[nextKey] = [curr, value];\n        } else {\n            // otherwise create the original value\n            if (arrayType) {\n                parsed[nextKey] = [value];\n            } else {\n                parsed[nextKey] = value;\n            }\n        }\n    }\n    return parsed;\n}\n\n/**\n * Also for backwards compat around old argument styles\n */\nexport function serializeParams(args: Record<string, any> = {}): URLSearchParams {\n    const output = new URLSearchParams();\n    for (let [key, value] of Object.entries(args)) {\n        if (Array.isArray(value)) {\n            for (let valueElement of value) {\n                output.append(key, valueElement);\n            }\n        } else {\n            output.append(key, String(value));\n        }\n    }\n    return output;\n}\n"
  },
  {
    "path": "packages/browser-sync/package.json",
    "content": "{\n\t\"name\": \"browser-sync\",\n\t\"description\": \"Live CSS Reload & Browser Syncing\",\n\t\"version\": \"3.0.4\",\n\t\"homepage\": \"https://browsersync.io/\",\n\t\"author\": {\n\t\t\"name\": \"Shane Osbourne\"\n\t},\n\t\"repository\": \"BrowserSync/browser-sync\",\n\t\"license\": \"Apache-2.0\",\n\t\"main\": \"dist/index.js\",\n\t\"bin\": \"dist/bin.js\",\n\t\"files\": [\n\t\t\"dist\",\n\t\t\"certs\",\n\t\t\"templates\",\n\t\t\"cli-options\",\n\t\t\"client/dist\"\n\t],\n\t\"engines\": {\n\t\t\"node\": \">= 8.0.0\"\n\t},\n\t\"scripts\": {\n\t\t\"build\": \"npm run build:server\",\n\t\t\"build:server\": \"tsc\",\n\t\t\"build:watch\": \"tsc --watch\",\n\t\t\"env\": \"node ./test/env.js\",\n\t\t\"lodash\": \"lodash include=isUndefined,isFunction,toArray,includes,union,each,isString,merge,isObject,set exports=node\",\n\t\t\"prepublishOnly\": \"npm run build\",\n\t\t\"prettier\": \"prettier 'lib/**/*' 'examples/*' 'test/specs/**/*.js' --tab-width 4\",\n\t\t\"prettier:fix\": \"npm run prettier -- --write\",\n\t\t\"test\": \"npm run build && npm run env && npm run unit\",\n\t\t\"unit\": \"mocha --recursive test/specs --timeout 10000 --bail --exit\",\n\t\t\"watch\": \"npm run build && npm run serve:fixtures\",\n\t\t\"serve:fixtures\": \"node dist/bin test/fixtures -w --no-open\"\n\t},\n\t\"dependencies\": {\n\t\t\"browser-sync-client\": \"^3.0.4\",\n\t\t\"browser-sync-ui\": \"^3.0.4\",\n\t\t\"bs-recipes\": \"1.3.4\",\n\t\t\"chalk\": \"4.1.2\",\n\t\t\"chokidar\": \"^3.5.1\",\n\t\t\"connect\": \"3.6.6\",\n\t\t\"connect-history-api-fallback\": \"^1\",\n\t\t\"dev-ip\": \"^1.0.1\",\n\t\t\"easy-extender\": \"^2.3.4\",\n\t\t\"eazy-logger\": \"^4.1.0\",\n\t\t\"etag\": \"^1.8.1\",\n\t\t\"fresh\": \"^0.5.2\",\n\t\t\"fs-extra\": \"3.0.1\",\n\t\t\"http-proxy\": \"^1.18.1\",\n\t\t\"immutable\": \"^3\",\n\t\t\"micromatch\": \"^4.0.8\",\n\t\t\"opn\": \"5.3.0\",\n\t\t\"portscanner\": \"2.2.0\",\n\t\t\"raw-body\": \"^2.3.2\",\n\t\t\"resp-modifier\": \"6.0.2\",\n\t\t\"rx\": \"4.1.0\",\n\t\t\"send\": \"^0.19.0\",\n\t\t\"serve-index\": \"^1.9.1\",\n\t\t\"serve-static\": \"^1.16.2\",\n\t\t\"server-destroy\": \"1.0.1\",\n\t\t\"socket.io\": \"^4.4.1\",\n\t\t\"ua-parser-js\": \"^1.0.33\",\n\t\t\"yargs\": \"^17.3.1\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@types/node\": \"^8\",\n\t\t\"bs-snippet-injector\": \"^2.0.1\",\n\t\t\"chai\": \"^3\",\n\t\t\"generate-changelog\": \"^1.7.0\",\n\t\t\"graceful-fs\": \"4.1.9\",\n\t\t\"http2\": \"^3.3.6\",\n\t\t\"mocha\": \"^10.2.0\",\n\t\t\"prettier\": \"^1.9.2\",\n\t\t\"q\": \"1.4.1\",\n\t\t\"request\": \"^2\",\n\t\t\"requirejs\": \"^2.3.5\",\n\t\t\"rimraf\": \"2.5.4\",\n\t\t\"sinon\": \"^1\",\n\t\t\"socket.io-client\": \"^2.4.0\",\n\t\t\"source-map-support\": \"^0.5.0\",\n\t\t\"strip-ansi\": \"^6.0.1\",\n\t\t\"supertest\": \"^3\",\n\t\t\"typescript\": \"^4.6.2\",\n\t\t\"vinyl\": \"1.2.0\"\n\t},\n\t\"keywords\": [\n\t\t\"browser sync\",\n\t\t\"css\",\n\t\t\"live reload\",\n\t\t\"sync\"\n\t]\n}\n"
  },
  {
    "path": "packages/browser-sync/readme.md",
    "content": "<p align=\"center\">\n<a href=\"https://travis-ci.org/BrowserSync/browser-sync\" title=\"Travis branch\">\n <img src=\"https://img.shields.io/travis/BrowserSync/browser-sync/master.svg?style=flat-square&label=linux\" />\n</a><a href=\"https://www.npmjs.com/package/browser-sync\">\n <img src=\"https://img.shields.io/npm/dm/browser-sync.svg?style=flat-square\" />\n</a>\n</p>\n<p align=\"center\">\n<a href=\"https://www.npmjs.com/package/browser-sync\" title=\"NPM version\">\n <img src=\"https://img.shields.io/npm/v/browser-sync.svg?style=flat-square\" />\n</a>\n</p>\n<p align=\"center\"><a href=\"https://www.browsersync.io\"><img src=\"https://raw.githubusercontent.com/BrowserSync/browsersync.github.io/master/public/img/logo-gh.png\" /></a></p>\n<p align=\"center\">Keep multiple browsers & devices in sync when building websites.</p>\n\n<p align=\"center\">Follow <a href=\"https://twitter.com/browsersync\">@Browsersync</a> on twitter for news & updates.</p>\n\n## Features\n\nPlease visit [browsersync.io](https://browsersync.io) for a full run-down of features\n\n## Requirements\n\nBrowsersync works by injecting an asynchronous script tag (`<script async>...</script>`) right after the `<body>` tag\nduring initial request. In order for this to work properly the `<body>` tag must be present. Alternatively you\ncan provide a custom rule for the snippet using [snippetOptions](https://www.browsersync.io/docs/options/#option-snippetOptions)\n\n## Upgrading from 1.x to 2.x ?\nProviding you haven't accessed any internal properties, everything will just work as\nthere are no breaking changes to the public API. Internally however, we now use an\nimmutable data structure for storing/retrieving options. So whereas before you could access urls like this...\n\n```js\nbrowserSync({server: true}, function(err, bs) {\n    console.log(bs.options.urls.local);\n});\n```\n\n... you now access them in the following way:\n\n```js\nbrowserSync({server: true}, function(err, bs) {\n    console.log(bs.options.getIn([\"urls\", \"local\"]));\n});\n```\n\n## Install and trouble shooting\n\n[browsersync.io docs](https://browsersync.io)\n\n## Integrations / recipes\n\n[Browsersync recipes](https://github.com/Browsersync/recipes)\n\n\n## Support\n\nIf you've found Browser-sync useful and would like to contribute to its continued development & support, please feel free to send a donation of any size - it would be greatly appreciated!\n\n[Support via PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=shakyshane%40gmail%2ecom&lc=US&item_name=browser%2dsync)\n\n## Supported by\n\nOriginally supported by [JH](https://www.wearejh.com) - they provided financial support as well as access to a professional designer to help with Branding.\n\nApache 2\nCopyright (c) 2021 Shane Osbourne\n"
  },
  {
    "path": "packages/browser-sync/templates/cli-template.js",
    "content": "\n/*\n |--------------------------------------------------------------------------\n | Browser-sync config file\n |--------------------------------------------------------------------------\n |\n | For up-to-date information about the options:\n |   http://www.browsersync.io/docs/options/\n |\n | There are more options than you see here, these are just the ones that are\n | set internally. See the website for more info.\n |\n |\n */\nmodule.exports = //OPTS;"
  },
  {
    "path": "packages/browser-sync/templates/connector.tmpl",
    "content": "window.___browserSync___ = {};\n___browserSync___.socketConfig = %config%;\n___browserSync___.socketUrl = %url%;\n___browserSync___.options = %options%;\nif (location.protocol == \"https:\" && /^http:/.test(___browserSync___.socketUrl)) {\n    ___browserSync___.socketUrl = ___browserSync___.socketUrl.replace(/^http:/, \"https:\");\n}\n"
  },
  {
    "path": "packages/browser-sync/templates/script-tags-simple.html",
    "content": "<script %async% id=\"__bs_script__\" src=\"%script%\"></script>\n"
  },
  {
    "path": "packages/browser-sync/templates/script-tags.html",
    "content": "<script id=\"__bs_script__\">//<![CDATA[\n  (function() {\n    try {\n      var script = document.createElement('script');\n      if ('%async%') {\n        script.async = true;\n      }\n      script.src = '%script%'.replace(\"HOST\", location.hostname);\n      if (document.body) {\n        document.body.appendChild(script);\n      } else if (document.head) {\n        document.head.appendChild(script);\n      }\n    } catch (e) {\n      console.error(\"Browsersync: could not append script tag\", e);\n    }\n  })()\n//]]></script>\n"
  },
  {
    "path": "packages/browser-sync/test/env.js",
    "content": "process.env.TESTING = true;\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/.tmp/temp.css",
    "content": "body {\n    background: red;\n}"
  },
  {
    "path": "packages/browser-sync/test/fixtures/alt/index.htm",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" href=\"../assets/style.css\"/>\n</head>\n<body>\n\n    <h1>Hello from the test</h1>\n    <a href=\"../forms.html\">Forms</a>\n    <a href=\"../scrolling.html\">Scrolling Window</a>\n\n    <a href=\"http://www.googlize.com\">\n        <div>\n            <div>\n                <img src=\"http://placekitten.com/400/300\" alt=\"\"/>\n            </div>\n        </div>\n    </a>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync/test/fixtures/assets/import.css",
    "content": "@import \"import2.css\";\n\nbody {\n    color: orange;\n}\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/assets/import2.css",
    "content": "body {\n    background: red;\n}"
  },
  {
    "path": "packages/browser-sync/test/fixtures/assets/print.css",
    "content": "body {\n    background: #322323;\n}\n\n.container {\n    margin: 0 auto;\n    width: 320px;\n}"
  },
  {
    "path": "packages/browser-sync/test/fixtures/assets/style.css",
    "content": "body {\n    background: white;\n}\n\n\n.container {\n    margin: 0 auto;\n    width: 320px;\n}\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/base.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Forms</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\"/>\n    <base href=\"http://www.google.com/\" />\n\n</head>\n<body>\n<div class=\"container\">\n    <h1>Browsersync Ghost Mode: Form sync</h1>\n\n    <p>Links: synced</p>\n    <a href=\"index.html\">Hompage</a>\n\n    <form id=\"form-01\">\n        <p><label for=\"name\">Text Inputs: synced</label></p>\n        <input type=\"text\" name=\"name\" value=\"\" id=\"name\"/>\n\n        <p><label for=\"email\">Email Inputs: synced</label></p>\n        <input type=\"email\" name=\"email\" value=\"\" id=\"email\"/>\n        <p><label for=\"password\">Passwords Inputs: synced</label></p>\n        <input type=\"password\" name=\"password\" value=\"\" id=\"password\"/>\n\n        <p><label for=\"country\">Select Boxes: synced</label></p>\n        <select name=\"country\" id=\"country\">\n            <option value=\"uk\">Uk</option>\n            <option value=\"spain\">Spain</option>\n            <option value=\"france\">France</option>\n        </select>\n\n        <p>Radio Buttons: synced </p>\n\n        <p>\n            <label for=\"confirm-1\">Yes</label>\n            <input type=\"radio\" name=\"confirm\" id=\"confirm-1\" value=\"1\"/>\n            <label for=\"confirm-0\">No</label>\n            <input type=\"radio\" name=\"confirm\" id=\"confirm-0\" value=\"0\"/>\n        </p>\n\n        <p>Check Boxes: synced</p>\n\n        <div>\n            <label for=\"option-1\">Option 1</label>\n            <input type=\"checkbox\" name=\"checkbox\" id=\"option-1\">\n            <label for=\"option-2\">Option 2</label>\n            <input type=\"checkbox\" name=\"checkbox\" id=\"option-2\">\n        </div>\n\n        <p><label for=\"message\">Text Areas: synced</label></p>\n        <textarea name=\"message\" id=\"message\" cols=\"30\" rows=\"10\"></textarea>\n\n        <input type=\"submit\" value=\"Submit\" />\n        <input type=\"reset\" value=\"Reset\" />\n    </form>\n\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/bootstrap/css/bootstrap-grid.css",
    "content": "/*!\n * Bootstrap Grid v4.0.0-beta.3 (https://getbootstrap.com)\n * Copyright 2011-2017 The Bootstrap Authors\n * Copyright 2011-2017 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n@-ms-viewport {\n  width: device-width;\n}\n\nhtml {\n  box-sizing: border-box;\n  -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: inherit;\n}\n\n.container {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n\n.container-fluid {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.row {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -webkit-box-flex: 1;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  max-width: 100%;\n}\n\n.col-auto {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 auto;\n  flex: 0 0 auto;\n  width: auto;\n  max-width: none;\n}\n\n.col-1 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 8.333333%;\n  flex: 0 0 8.333333%;\n  max-width: 8.333333%;\n}\n\n.col-2 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 16.666667%;\n  flex: 0 0 16.666667%;\n  max-width: 16.666667%;\n}\n\n.col-3 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 25%;\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.col-4 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 33.333333%;\n  flex: 0 0 33.333333%;\n  max-width: 33.333333%;\n}\n\n.col-5 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 41.666667%;\n  flex: 0 0 41.666667%;\n  max-width: 41.666667%;\n}\n\n.col-6 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 50%;\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.col-7 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 58.333333%;\n  flex: 0 0 58.333333%;\n  max-width: 58.333333%;\n}\n\n.col-8 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 66.666667%;\n  flex: 0 0 66.666667%;\n  max-width: 66.666667%;\n}\n\n.col-9 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 75%;\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n\n.col-10 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 83.333333%;\n  flex: 0 0 83.333333%;\n  max-width: 83.333333%;\n}\n\n.col-11 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 91.666667%;\n  flex: 0 0 91.666667%;\n  max-width: 91.666667%;\n}\n\n.col-12 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 100%;\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.order-first {\n  -webkit-box-ordinal-group: 0;\n  -ms-flex-order: -1;\n  order: -1;\n}\n\n.order-1 {\n  -webkit-box-ordinal-group: 2;\n  -ms-flex-order: 1;\n  order: 1;\n}\n\n.order-2 {\n  -webkit-box-ordinal-group: 3;\n  -ms-flex-order: 2;\n  order: 2;\n}\n\n.order-3 {\n  -webkit-box-ordinal-group: 4;\n  -ms-flex-order: 3;\n  order: 3;\n}\n\n.order-4 {\n  -webkit-box-ordinal-group: 5;\n  -ms-flex-order: 4;\n  order: 4;\n}\n\n.order-5 {\n  -webkit-box-ordinal-group: 6;\n  -ms-flex-order: 5;\n  order: 5;\n}\n\n.order-6 {\n  -webkit-box-ordinal-group: 7;\n  -ms-flex-order: 6;\n  order: 6;\n}\n\n.order-7 {\n  -webkit-box-ordinal-group: 8;\n  -ms-flex-order: 7;\n  order: 7;\n}\n\n.order-8 {\n  -webkit-box-ordinal-group: 9;\n  -ms-flex-order: 8;\n  order: 8;\n}\n\n.order-9 {\n  -webkit-box-ordinal-group: 10;\n  -ms-flex-order: 9;\n  order: 9;\n}\n\n.order-10 {\n  -webkit-box-ordinal-group: 11;\n  -ms-flex-order: 10;\n  order: 10;\n}\n\n.order-11 {\n  -webkit-box-ordinal-group: 12;\n  -ms-flex-order: 11;\n  order: 11;\n}\n\n.order-12 {\n  -webkit-box-ordinal-group: 13;\n  -ms-flex-order: 12;\n  order: 12;\n}\n\n.offset-1 {\n  margin-left: 8.333333%;\n}\n\n.offset-2 {\n  margin-left: 16.666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.333333%;\n}\n\n.offset-5 {\n  margin-left: 41.666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.333333%;\n}\n\n.offset-8 {\n  margin-left: 66.666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.333333%;\n}\n\n.offset-11 {\n  margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -webkit-box-flex: 1;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-sm-auto {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-sm-1 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-sm-2 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-sm-3 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-sm-5 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-sm-6 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-sm-8 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-sm-9 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-sm-11 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-sm-12 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    -webkit-box-ordinal-group: 0;\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-sm-1 {\n    -webkit-box-ordinal-group: 2;\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-sm-2 {\n    -webkit-box-ordinal-group: 3;\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-sm-3 {\n    -webkit-box-ordinal-group: 4;\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-sm-4 {\n    -webkit-box-ordinal-group: 5;\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-sm-5 {\n    -webkit-box-ordinal-group: 6;\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-sm-6 {\n    -webkit-box-ordinal-group: 7;\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-sm-7 {\n    -webkit-box-ordinal-group: 8;\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-sm-8 {\n    -webkit-box-ordinal-group: 9;\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-sm-9 {\n    -webkit-box-ordinal-group: 10;\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-sm-10 {\n    -webkit-box-ordinal-group: 11;\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-sm-11 {\n    -webkit-box-ordinal-group: 12;\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-sm-12 {\n    -webkit-box-ordinal-group: 13;\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 768px) {\n  .col-md {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -webkit-box-flex: 1;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-md-auto {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-md-1 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-md-2 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-md-3 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-md-5 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-md-6 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-md-8 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-md-9 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-md-11 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-md-12 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    -webkit-box-ordinal-group: 0;\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-md-1 {\n    -webkit-box-ordinal-group: 2;\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-md-2 {\n    -webkit-box-ordinal-group: 3;\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-md-3 {\n    -webkit-box-ordinal-group: 4;\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-md-4 {\n    -webkit-box-ordinal-group: 5;\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-md-5 {\n    -webkit-box-ordinal-group: 6;\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-md-6 {\n    -webkit-box-ordinal-group: 7;\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-md-7 {\n    -webkit-box-ordinal-group: 8;\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-md-8 {\n    -webkit-box-ordinal-group: 9;\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-md-9 {\n    -webkit-box-ordinal-group: 10;\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-md-10 {\n    -webkit-box-ordinal-group: 11;\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-md-11 {\n    -webkit-box-ordinal-group: 12;\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-md-12 {\n    -webkit-box-ordinal-group: 13;\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-lg {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -webkit-box-flex: 1;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-lg-auto {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-lg-1 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-lg-2 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-lg-3 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-lg-5 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-lg-6 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-lg-8 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-lg-9 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-lg-11 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-lg-12 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    -webkit-box-ordinal-group: 0;\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-lg-1 {\n    -webkit-box-ordinal-group: 2;\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-lg-2 {\n    -webkit-box-ordinal-group: 3;\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-lg-3 {\n    -webkit-box-ordinal-group: 4;\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-lg-4 {\n    -webkit-box-ordinal-group: 5;\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-lg-5 {\n    -webkit-box-ordinal-group: 6;\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-lg-6 {\n    -webkit-box-ordinal-group: 7;\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-lg-7 {\n    -webkit-box-ordinal-group: 8;\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-lg-8 {\n    -webkit-box-ordinal-group: 9;\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-lg-9 {\n    -webkit-box-ordinal-group: 10;\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-lg-10 {\n    -webkit-box-ordinal-group: 11;\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-lg-11 {\n    -webkit-box-ordinal-group: 12;\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-lg-12 {\n    -webkit-box-ordinal-group: 13;\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-xl {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -webkit-box-flex: 1;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-xl-auto {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-xl-1 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-xl-2 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-xl-3 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-xl-5 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-xl-6 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-xl-8 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-xl-9 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-xl-11 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-xl-12 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    -webkit-box-ordinal-group: 0;\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-xl-1 {\n    -webkit-box-ordinal-group: 2;\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-xl-2 {\n    -webkit-box-ordinal-group: 3;\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-xl-3 {\n    -webkit-box-ordinal-group: 4;\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-xl-4 {\n    -webkit-box-ordinal-group: 5;\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-xl-5 {\n    -webkit-box-ordinal-group: 6;\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-xl-6 {\n    -webkit-box-ordinal-group: 7;\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-xl-7 {\n    -webkit-box-ordinal-group: 8;\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-xl-8 {\n    -webkit-box-ordinal-group: 9;\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-xl-9 {\n    -webkit-box-ordinal-group: 10;\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-xl-10 {\n    -webkit-box-ordinal-group: 11;\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-xl-11 {\n    -webkit-box-ordinal-group: 12;\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-xl-12 {\n    -webkit-box-ordinal-group: 13;\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n.flex-row {\n  -webkit-box-orient: horizontal !important;\n  -webkit-box-direction: normal !important;\n  -ms-flex-direction: row !important;\n  flex-direction: row !important;\n}\n\n.flex-column {\n  -webkit-box-orient: vertical !important;\n  -webkit-box-direction: normal !important;\n  -ms-flex-direction: column !important;\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  -webkit-box-orient: horizontal !important;\n  -webkit-box-direction: reverse !important;\n  -ms-flex-direction: row-reverse !important;\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  -webkit-box-orient: vertical !important;\n  -webkit-box-direction: reverse !important;\n  -ms-flex-direction: column-reverse !important;\n  flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n  -ms-flex-wrap: wrap !important;\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  -ms-flex-wrap: nowrap !important;\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  -ms-flex-wrap: wrap-reverse !important;\n  flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n  -webkit-box-pack: start !important;\n  -ms-flex-pack: start !important;\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  -webkit-box-pack: end !important;\n  -ms-flex-pack: end !important;\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  -webkit-box-pack: center !important;\n  -ms-flex-pack: center !important;\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  -webkit-box-pack: justify !important;\n  -ms-flex-pack: justify !important;\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  -ms-flex-pack: distribute !important;\n  justify-content: space-around !important;\n}\n\n.align-items-start {\n  -webkit-box-align: start !important;\n  -ms-flex-align: start !important;\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  -webkit-box-align: end !important;\n  -ms-flex-align: end !important;\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  -webkit-box-align: center !important;\n  -ms-flex-align: center !important;\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  -webkit-box-align: baseline !important;\n  -ms-flex-align: baseline !important;\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  -webkit-box-align: stretch !important;\n  -ms-flex-align: stretch !important;\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  -ms-flex-line-pack: start !important;\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  -ms-flex-line-pack: end !important;\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  -ms-flex-line-pack: center !important;\n  align-content: center !important;\n}\n\n.align-content-between {\n  -ms-flex-line-pack: justify !important;\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  -ms-flex-line-pack: distribute !important;\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  -ms-flex-line-pack: stretch !important;\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  -ms-flex-item-align: auto !important;\n  align-self: auto !important;\n}\n\n.align-self-start {\n  -ms-flex-item-align: start !important;\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  -ms-flex-item-align: end !important;\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  -ms-flex-item-align: center !important;\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  -ms-flex-item-align: baseline !important;\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  -ms-flex-item-align: stretch !important;\n  align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n  .flex-sm-row {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-sm-start {\n    -webkit-box-pack: start !important;\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    -webkit-box-pack: end !important;\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    -webkit-box-pack: center !important;\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    -webkit-box-pack: justify !important;\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    -webkit-box-align: start !important;\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    -webkit-box-align: end !important;\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    -webkit-box-align: center !important;\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    -webkit-box-align: baseline !important;\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    -webkit-box-align: stretch !important;\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .flex-md-row {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-md-start {\n    -webkit-box-pack: start !important;\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    -webkit-box-pack: end !important;\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    -webkit-box-pack: center !important;\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    -webkit-box-pack: justify !important;\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    -webkit-box-align: start !important;\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    -webkit-box-align: end !important;\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    -webkit-box-align: center !important;\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    -webkit-box-align: baseline !important;\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    -webkit-box-align: stretch !important;\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .flex-lg-row {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-lg-start {\n    -webkit-box-pack: start !important;\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    -webkit-box-pack: end !important;\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    -webkit-box-pack: center !important;\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    -webkit-box-pack: justify !important;\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    -webkit-box-align: start !important;\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    -webkit-box-align: end !important;\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    -webkit-box-align: center !important;\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    -webkit-box-align: baseline !important;\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    -webkit-box-align: stretch !important;\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-xl-start {\n    -webkit-box-pack: start !important;\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    -webkit-box-pack: end !important;\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    -webkit-box-pack: center !important;\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    -webkit-box-pack: justify !important;\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    -webkit-box-align: start !important;\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    -webkit-box-align: end !important;\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    -webkit-box-align: center !important;\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    -webkit-box-align: baseline !important;\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    -webkit-box-align: stretch !important;\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n/*# sourceMappingURL=bootstrap-grid.css.map */"
  },
  {
    "path": "packages/browser-sync/test/fixtures/bootstrap/css/bootstrap-reboot.css",
    "content": "/*!\n * Bootstrap Reboot v4.0.0-beta.3 (https://getbootstrap.com)\n * Copyright 2011-2017 The Bootstrap Authors\n * Copyright 2011-2017 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n  -ms-overflow-style: scrollbar;\n  -webkit-tap-highlight-color: transparent;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\nbody {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: left;\n  background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n  outline: 0 !important;\n}\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\ndfn {\n  font-style: italic;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -.25em;\n}\n\nsup {\n  top: -.5em;\n}\n\na {\n  color: #007bff;\n  text-decoration: none;\n  background-color: transparent;\n  -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n  outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n  -ms-overflow-style: scrollbar;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput:not([type=\"range\"]),\nlabel,\nselect,\nsummary,\ntextarea {\n  -ms-touch-action: manipulation;\n  touch-action: manipulation;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #868e96;\n  text-align: left;\n  caption-side: bottom;\n}\n\nth {\n  text-align: inherit;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: .5rem;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\n\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: .5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\ntemplate {\n  display: none;\n}\n\n[hidden] {\n  display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.css.map */"
  },
  {
    "path": "packages/browser-sync/test/fixtures/bootstrap/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v4.0.0-beta.3 (https://getbootstrap.com)\n * Copyright 2011-2017 The Bootstrap Authors\n * Copyright 2011-2017 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n  --blue: #007bff;\n  --indigo: #6610f2;\n  --purple: #6f42c1;\n  --pink: #e83e8c;\n  --red: #dc3545;\n  --orange: #fd7e14;\n  --yellow: #ffc107;\n  --green: #28a745;\n  --teal: #20c997;\n  --cyan: #17a2b8;\n  --white: #fff;\n  --gray: #868e96;\n  --gray-dark: #343a40;\n  --primary: #007bff;s\n  --secondarsy: #868e96;  --success: #28a745;\n  --info: #17a2b8;\n  --warning: #ffc107;\n  --danger: #dc3545;\n  --light: #f8f9fa;\n  --dask: #343a40;\n  --breakpoint-xs: 0;\n  --breakpoint-sm: 576px;\n  --breakpoint-md: 768px;\n  --breakpoint-lg: 992px;\n  --breakpoint-xl: 1200px;\n\n\n  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n  -ms-overflow-style: scrollbar;\n  -webkit-tap-highlight-color: transparent;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\nbody {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: left;\n  background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n  outline: 0 !important;\n}\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\ndfn {\n  font-style: italic;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -.25em;\n}\n\nsup {\n  top: -.5em;\n}\n\na {\n  color: #007bff;\n  text-decoration: none;\n  background-color: transparent;\n  -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n  outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n  -ms-overflow-style: scrollbar;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput:not([type=\"range\"]),\nlabel,\nselect,\nsummary,\ntextarea {\n  -ms-touch-action: manipulation;\n  touch-action: manipulation;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #868e96;\n  text-align: left;\n  caption-side: bottom;\n}\n\nth {\n  text-align: inherit;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: .5rem;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\n\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: .5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\ntemplate {\n  display: none;\n}\n\n[hidden] {\n  display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  margin-bottom: 0.5rem;\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.2;\n  color: inherit;\n}\n\nh1, .h1 {\n  font-size: 2.5rem;\n}\n\nh2, .h2 {\n  font-size: 2rem;\n}\n\nh3, .h3 {\n  font-size: 1.75rem;\n}\n\nh4, .h4 {\n  font-size: 1.5rem;\n}\n\nh5, .h5 {\n  font-size: 1.25rem;\n}\n\nh6, .h6 {\n  font-size: 1rem;\n}\n\n.lead {\n  font-size: 1.25rem;\n  font-weight: 300;\n}\n\n.display-1 {\n  font-size: 6rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-2 {\n  font-size: 5.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-3 {\n  font-size: 4.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-4 {\n  font-size: 3.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\nhr {\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n  border: 0;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n  font-size: 80%;\n  font-weight: 400;\n}\n\nmark,\n.mark {\n  padding: 0.2em;\n  background-color: #fcf8e3;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline-item {\n  display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n  margin-right: 0.5rem;\n}\n\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n.blockquote {\n  margin-bottom: 1rem;\n  font-size: 1.25rem;\n}\n\n.blockquote-footer {\n  display: block;\n  font-size: 80%;\n  color: #868e96;\n}\n\n.blockquote-footer::before {\n  content: \"\\2014 \\00A0\";\n}\n\n.img-fluid {\n  max-width: 100%;\n  height: auto;\n}\n\n.img-thumbnail {\n  padding: 0.25rem;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n  border-radius: 0.25rem;\n  max-width: 100%;\n  height: auto;\n}\n\n.figure {\n  display: inline-block;\n}\n\n.figure-img {\n  margin-bottom: 0.5rem;\n  line-height: 1;\n}\n\n.figure-caption {\n  font-size: 90%;\n  color: #868e96;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\ncode {\n  font-size: 87.5%;\n  color: #e83e8c;\n  word-break: break-word;\n}\n\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.2rem 0.4rem;\n  font-size: 87.5%;\n  color: #fff;\n  background-color: #212529;\n  border-radius: 0.2rem;\n}\n\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: 700;\n}\n\npre {\n  display: block;\n  font-size: 87.5%;\n  color: #212529;\n}\n\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n\n.container-fluid {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.row {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -webkit-box-flex: 1;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  max-width: 100%;\n}\n\n.col-auto {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 auto;\n  flex: 0 0 auto;\n  width: auto;\n  max-width: none;\n}\n\n.col-1 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 8.333333%;\n  flex: 0 0 8.333333%;\n  max-width: 8.333333%;\n}\n\n.col-2 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 16.666667%;\n  flex: 0 0 16.666667%;\n  max-width: 16.666667%;\n}\n\n.col-3 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 25%;\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.col-4 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 33.333333%;\n  flex: 0 0 33.333333%;\n  max-width: 33.333333%;\n}\n\n.col-5 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 41.666667%;\n  flex: 0 0 41.666667%;\n  max-width: 41.666667%;\n}\n\n.col-6 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 50%;\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.col-7 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 58.333333%;\n  flex: 0 0 58.333333%;\n  max-width: 58.333333%;\n}\n\n.col-8 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 66.666667%;\n  flex: 0 0 66.666667%;\n  max-width: 66.666667%;\n}\n\n.col-9 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 75%;\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n\n.col-10 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 83.333333%;\n  flex: 0 0 83.333333%;\n  max-width: 83.333333%;\n}\n\n.col-11 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 91.666667%;\n  flex: 0 0 91.666667%;\n  max-width: 91.666667%;\n}\n\n.col-12 {\n  -webkit-box-flex: 0;\n  -ms-flex: 0 0 100%;\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.order-first {\n  -webkit-box-ordinal-group: 0;\n  -ms-flex-order: -1;\n  order: -1;\n}\n\n.order-1 {\n  -webkit-box-ordinal-group: 2;\n  -ms-flex-order: 1;\n  order: 1;\n}\n\n.order-2 {\n  -webkit-box-ordinal-group: 3;\n  -ms-flex-order: 2;\n  order: 2;\n}\n\n.order-3 {\n  -webkit-box-ordinal-group: 4;\n  -ms-flex-order: 3;\n  order: 3;\n}\n\n.order-4 {\n  -webkit-box-ordinal-group: 5;\n  -ms-flex-order: 4;\n  order: 4;\n}\n\n.order-5 {\n  -webkit-box-ordinal-group: 6;\n  -ms-flex-order: 5;\n  order: 5;\n}\n\n.order-6 {\n  -webkit-box-ordinal-group: 7;\n  -ms-flex-order: 6;\n  order: 6;\n}\n\n.order-7 {\n  -webkit-box-ordinal-group: 8;\n  -ms-flex-order: 7;\n  order: 7;\n}\n\n.order-8 {\n  -webkit-box-ordinal-group: 9;\n  -ms-flex-order: 8;\n  order: 8;\n}\n\n.order-9 {\n  -webkit-box-ordinal-group: 10;\n  -ms-flex-order: 9;\n  order: 9;\n}\n\n.order-10 {\n  -webkit-box-ordinal-group: 11;\n  -ms-flex-order: 10;\n  order: 10;\n}\n\n.order-11 {\n  -webkit-box-ordinal-group: 12;\n  -ms-flex-order: 11;\n  order: 11;\n}\n\n.order-12 {\n  -webkit-box-ordinal-group: 13;\n  -ms-flex-order: 12;\n  order: 12;\n}\n\n.offset-1 {\n  margin-left: 8.333333%;\n}\n\n.offset-2 {\n  margin-left: 16.666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.333333%;\n}\n\n.offset-5 {\n  margin-left: 41.666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.333333%;\n}\n\n.offset-8 {\n  margin-left: 66.666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.333333%;\n}\n\n.offset-11 {\n  margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -webkit-box-flex: 1;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-sm-auto {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-sm-1 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-sm-2 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-sm-3 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-sm-5 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-sm-6 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-sm-8 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-sm-9 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-sm-11 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-sm-12 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    -webkit-box-ordinal-group: 0;\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-sm-1 {\n    -webkit-box-ordinal-group: 2;\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-sm-2 {\n    -webkit-box-ordinal-group: 3;\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-sm-3 {\n    -webkit-box-ordinal-group: 4;\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-sm-4 {\n    -webkit-box-ordinal-group: 5;\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-sm-5 {\n    -webkit-box-ordinal-group: 6;\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-sm-6 {\n    -webkit-box-ordinal-group: 7;\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-sm-7 {\n    -webkit-box-ordinal-group: 8;\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-sm-8 {\n    -webkit-box-ordinal-group: 9;\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-sm-9 {\n    -webkit-box-ordinal-group: 10;\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-sm-10 {\n    -webkit-box-ordinal-group: 11;\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-sm-11 {\n    -webkit-box-ordinal-group: 12;\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-sm-12 {\n    -webkit-box-ordinal-group: 13;\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 768px) {\n  .col-md {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -webkit-box-flex: 1;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-md-auto {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-md-1 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-md-2 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-md-3 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-md-5 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-md-6 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-md-8 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-md-9 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-md-11 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-md-12 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    -webkit-box-ordinal-group: 0;\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-md-1 {\n    -webkit-box-ordinal-group: 2;\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-md-2 {\n    -webkit-box-ordinal-group: 3;\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-md-3 {\n    -webkit-box-ordinal-group: 4;\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-md-4 {\n    -webkit-box-ordinal-group: 5;\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-md-5 {\n    -webkit-box-ordinal-group: 6;\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-md-6 {\n    -webkit-box-ordinal-group: 7;\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-md-7 {\n    -webkit-box-ordinal-group: 8;\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-md-8 {\n    -webkit-box-ordinal-group: 9;\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-md-9 {\n    -webkit-box-ordinal-group: 10;\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-md-10 {\n    -webkit-box-ordinal-group: 11;\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-md-11 {\n    -webkit-box-ordinal-group: 12;\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-md-12 {\n    -webkit-box-ordinal-group: 13;\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-lg {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -webkit-box-flex: 1;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-lg-auto {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-lg-1 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-lg-2 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-lg-3 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-lg-5 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-lg-6 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-lg-8 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-lg-9 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-lg-11 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-lg-12 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    -webkit-box-ordinal-group: 0;\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-lg-1 {\n    -webkit-box-ordinal-group: 2;\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-lg-2 {\n    -webkit-box-ordinal-group: 3;\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-lg-3 {\n    -webkit-box-ordinal-group: 4;\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-lg-4 {\n    -webkit-box-ordinal-group: 5;\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-lg-5 {\n    -webkit-box-ordinal-group: 6;\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-lg-6 {\n    -webkit-box-ordinal-group: 7;\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-lg-7 {\n    -webkit-box-ordinal-group: 8;\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-lg-8 {\n    -webkit-box-ordinal-group: 9;\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-lg-9 {\n    -webkit-box-ordinal-group: 10;\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-lg-10 {\n    -webkit-box-ordinal-group: 11;\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-lg-11 {\n    -webkit-box-ordinal-group: 12;\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-lg-12 {\n    -webkit-box-ordinal-group: 13;\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-xl {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -webkit-box-flex: 1;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-xl-auto {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-xl-1 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-xl-2 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-xl-3 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-xl-5 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-xl-6 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-xl-8 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-xl-9 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-xl-11 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-xl-12 {\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    -webkit-box-ordinal-group: 0;\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-xl-1 {\n    -webkit-box-ordinal-group: 2;\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-xl-2 {\n    -webkit-box-ordinal-group: 3;\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-xl-3 {\n    -webkit-box-ordinal-group: 4;\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-xl-4 {\n    -webkit-box-ordinal-group: 5;\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-xl-5 {\n    -webkit-box-ordinal-group: 6;\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-xl-6 {\n    -webkit-box-ordinal-group: 7;\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-xl-7 {\n    -webkit-box-ordinal-group: 8;\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-xl-8 {\n    -webkit-box-ordinal-group: 9;\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-xl-9 {\n    -webkit-box-ordinal-group: 10;\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-xl-10 {\n    -webkit-box-ordinal-group: 11;\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-xl-11 {\n    -webkit-box-ordinal-group: 12;\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-xl-12 {\n    -webkit-box-ordinal-group: 13;\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 1rem;\n  background-color: transparent;\n}\n\n.table th,\n.table td {\n  padding: 0.75rem;\n  vertical-align: top;\n  border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dee2e6;\n}\n\n.table .table {\n  background-color: #fff;\n}\n\n.table-sm th,\n.table-sm td {\n  padding: 0.3rem;\n}\n\n.table-bordered {\n  border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n  border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n  border-bottom-width: 2px;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n  background-color: #b8daff;\n}\n\n.table-hover .table-primary:hover {\n  background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n  background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n  background-color: #dddfe2;\n}\n\n.table-hover .table-secondary:hover {\n  background-color: #cfd2d6;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n  background-color: #cfd2d6;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n  background-color: #c3e6cb;\n}\n\n.table-hover .table-success:hover {\n  background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n  background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n  background-color: #bee5eb;\n}\n\n.table-hover .table-info:hover {\n  background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n  background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n  background-color: #ffeeba;\n}\n\n.table-hover .table-warning:hover {\n  background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n  background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n  background-color: #f5c6cb;\n}\n\n.table-hover .table-danger:hover {\n  background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n  background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n  background-color: #fdfdfe;\n}\n\n.table-hover .table-light:hover {\n  background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n  background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n  background-color: #c6c8ca;\n}\n\n.table-hover .table-dark:hover {\n  background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n  background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n  color: #fff;\n  background-color: #212529;\n  border-color: #32383e;\n}\n\n.table .thead-light th {\n  color: #495057;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n\n.table-dark {\n  color: #fff;\n  background-color: #212529;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n  border-color: #32383e;\n}\n\n.table-dark.table-bordered {\n  border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n  background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.99px) {\n  .table-responsive-sm {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-sm > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 767.99px) {\n  .table-responsive-md {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-md > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 991.99px) {\n  .table-responsive-lg {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-lg > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 1199.99px) {\n  .table-responsive-xl {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-xl > .table-bordered {\n    border: 0;\n  }\n}\n\n.table-responsive {\n  display: block;\n  width: 100%;\n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n  -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\n.table-responsive > .table-bordered {\n  border: 0;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n.form-control::-ms-expand {\n  background-color: transparent;\n  border: 0;\n}\n\n.form-control:focus {\n  color: #495057;\n  background-color: #fff;\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #868e96;\n  opacity: 1;\n}\n\n.form-control::-moz-placeholder {\n  color: #868e96;\n  opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #868e96;\n  opacity: 1;\n}\n\n.form-control::-ms-input-placeholder {\n  color: #868e96;\n  opacity: 1;\n}\n\n.form-control::placeholder {\n  color: #868e96;\n  opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n  background-color: #e9ecef;\n  opacity: 1;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n  height: calc(2.25rem + 2px);\n}\n\nselect.form-control:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n  display: block;\n  width: 100%;\n}\n\n.col-form-label {\n  padding-top: calc(0.375rem + 1px);\n  padding-bottom: calc(0.375rem + 1px);\n  margin-bottom: 0;\n  font-size: inherit;\n  line-height: 1.5;\n}\n\n.col-form-label-lg {\n  padding-top: calc(0.5rem + 1px);\n  padding-bottom: calc(0.5rem + 1px);\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.col-form-label-sm {\n  padding-top: calc(0.25rem + 1px);\n  padding-bottom: calc(0.25rem + 1px);\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  margin-bottom: 0;\n  line-height: 1.5;\n  background-color: transparent;\n  border: solid transparent;\n  border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .input-group-sm > .form-control-plaintext.form-control,\n.input-group-sm > .input-group-prepend > .form-control-plaintext.input-group-text,\n.input-group-sm > .input-group-append > .form-control-plaintext.input-group-text,\n.input-group-sm > .input-group-prepend > .form-control-plaintext.btn,\n.input-group-sm > .input-group-append > .form-control-plaintext.btn, .form-control-plaintext.form-control-lg, .input-group-lg > .form-control-plaintext.form-control,\n.input-group-lg > .input-group-prepend > .form-control-plaintext.input-group-text,\n.input-group-lg > .input-group-append > .form-control-plaintext.input-group-text,\n.input-group-lg > .input-group-prepend > .form-control-plaintext.btn,\n.input-group-lg > .input-group-append > .form-control-plaintext.btn {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.form-control-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\nselect.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),\n.input-group-sm > .input-group-prepend > select.input-group-text:not([size]):not([multiple]),\n.input-group-sm > .input-group-append > select.input-group-text:not([size]):not([multiple]),\n.input-group-sm > .input-group-prepend > select.btn:not([size]):not([multiple]),\n.input-group-sm > .input-group-append > select.btn:not([size]):not([multiple]) {\n  height: calc(1.8125rem + 2px);\n}\n\n.form-control-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\nselect.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),\n.input-group-lg > .input-group-prepend > select.input-group-text:not([size]):not([multiple]),\n.input-group-lg > .input-group-append > select.input-group-text:not([size]):not([multiple]),\n.input-group-lg > .input-group-prepend > select.btn:not([size]):not([multiple]),\n.input-group-lg > .input-group-append > select.btn:not([size]):not([multiple]) {\n  height: calc(2.875rem + 2px);\n}\n\n.form-group {\n  margin-bottom: 1rem;\n}\n\n.form-text {\n  display: block;\n  margin-top: 0.25rem;\n}\n\n.form-row {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -5px;\n  margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.form-check {\n  position: relative;\n  display: block;\n  padding-left: 1.25rem;\n}\n\n.form-check-input {\n  position: absolute;\n  margin-top: 0.3rem;\n  margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n  color: #868e96;\n}\n\n.form-check-label {\n  margin-bottom: 0;\n}\n\n.form-check-inline {\n  display: -webkit-inline-box;\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  -webkit-box-align: center;\n  -ms-flex-align: center;\n  align-items: center;\n  padding-left: 0;\n  margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n  position: static;\n  margin-top: 0;\n  margin-right: 0.3125rem;\n  margin-left: 0;\n}\n\n.valid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #28a745;\n}\n\n.valid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  width: 250px;\n  padding: .5rem;\n  margin-top: .1rem;\n  font-size: .875rem;\n  line-height: 1;\n  color: #fff;\n  background-color: rgba(40, 167, 69, 0.8);\n  border-radius: .2rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid, .was-validated\n.custom-select:valid,\n.custom-select.is-valid {\n  border-color: #28a745;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated\n.custom-select:valid:focus,\n.custom-select.is-valid:focus {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip, .was-validated\n.custom-select:valid ~ .valid-feedback,\n.was-validated\n.custom-select:valid ~ .valid-tooltip,\n.custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n  color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n  color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n  background-color: #71dd8a;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n  background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n  border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label::before, .custom-file-input.is-valid ~ .custom-file-label::before {\n  border-color: inherit;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #dc3545;\n}\n\n.invalid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  width: 250px;\n  padding: .5rem;\n  margin-top: .1rem;\n  font-size: .875rem;\n  line-height: 1;\n  color: #fff;\n  background-color: rgba(220, 53, 69, 0.8);\n  border-radius: .2rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated\n.custom-select:invalid,\n.custom-select.is-invalid {\n  border-color: #dc3545;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated\n.custom-select:invalid:focus,\n.custom-select.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip, .was-validated\n.custom-select:invalid ~ .invalid-feedback,\n.was-validated\n.custom-select:invalid ~ .invalid-tooltip,\n.custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n  color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n  color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n  background-color: #efa2a9;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n  background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label::before, .custom-file-input.is-invalid ~ .custom-file-label::before {\n  border-color: inherit;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n  -ms-flex-flow: row wrap;\n  flex-flow: row wrap;\n  -webkit-box-align: center;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.form-inline .form-check {\n  width: 100%;\n}\n\n@media (min-width: 576px) {\n  .form-inline label {\n    display: -webkit-box;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-align: center;\n    -ms-flex-align: center;\n    align-items: center;\n    -webkit-box-pack: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-group {\n    display: -webkit-box;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-flex: 0;\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n    -webkit-box-align: center;\n    -ms-flex-align: center;\n    align-items: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-plaintext {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    width: auto;\n  }\n  .form-inline .form-check {\n    display: -webkit-box;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-align: center;\n    -ms-flex-align: center;\n    align-items: center;\n    -webkit-box-pack: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n    width: auto;\n    padding-left: 0;\n  }\n  .form-inline .form-check-input {\n    position: relative;\n    margin-top: 0;\n    margin-right: 0.25rem;\n    margin-left: 0;\n  }\n  .form-inline .custom-control {\n    -webkit-box-align: center;\n    -ms-flex-align: center;\n    align-items: center;\n    -webkit-box-pack: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n  }\n  .form-inline .custom-control-label {\n    margin-bottom: 0;\n  }\n}\n\n.btn {\n  display: inline-block;\n  font-weight: 400;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  border: 1px solid transparent;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  line-height: 1.5;\n  border-radius: 0.25rem;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n.btn:focus, .btn:hover {\n  text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n  opacity: 0.65;\n}\n\n.btn:not([disabled]):not(.disabled) {\n  cursor: pointer;\n}\n\n.btn:not([disabled]):not(.disabled):active, .btn:not([disabled]):not(.disabled).active {\n  background-image: none;\n}\n\na.btn.disabled,\nfieldset[disabled] a.btn {\n  pointer-events: none;\n}\n\n.btn-primary {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-primary:hover {\n  color: #fff;\n  background-color: #0069d9;\n  border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-primary:not([disabled]):not(.disabled):active, .btn-primary:not([disabled]):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #0062cc;\n  border-color: #005cbf;\n}\n\n.btn-primary:not([disabled]):not(.disabled):active:focus, .btn-primary:not([disabled]):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-secondary {\n  color: #fff;\n  background-color: #868e96;\n  border-color: #868e96;\n}\n\n.btn-secondary:hover {\n  color: #fff;\n  background-color: #727b84;\n  border-color: #6c757d;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n  background-color: #868e96;\n  border-color: #868e96;\n}\n\n.btn-secondary:not([disabled]):not(.disabled):active, .btn-secondary:not([disabled]):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #666e76;\n}\n\n.btn-secondary:not([disabled]):not(.disabled):active:focus, .btn-secondary:not([disabled]):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5);\n}\n\n.btn-success {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-success:hover {\n  color: #fff;\n  background-color: #218838;\n  border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-success:not([disabled]):not(.disabled):active, .btn-success:not([disabled]):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n  color: #fff;\n  background-color: #1e7e34;\n  border-color: #1c7430;\n}\n\n.btn-success:not([disabled]):not(.disabled):active:focus, .btn-success:not([disabled]):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-info {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:hover {\n  color: #fff;\n  background-color: #138496;\n  border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:not([disabled]):not(.disabled):active, .btn-info:not([disabled]):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n  color: #fff;\n  background-color: #117a8b;\n  border-color: #10707f;\n}\n\n.btn-info:not([disabled]):not(.disabled):active:focus, .btn-info:not([disabled]):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-warning {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-warning:hover {\n  color: #212529;\n  background-color: #e0a800;\n  border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-warning:not([disabled]):not(.disabled):active, .btn-warning:not([disabled]):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n  color: #212529;\n  background-color: #d39e00;\n  border-color: #c69500;\n}\n\n.btn-warning:not([disabled]):not(.disabled):active:focus, .btn-warning:not([disabled]):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-danger {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-danger:hover {\n  color: #fff;\n  background-color: #c82333;\n  border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-danger:not([disabled]):not(.disabled):active, .btn-danger:not([disabled]):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #bd2130;\n  border-color: #b21f2d;\n}\n\n.btn-danger:not([disabled]):not(.disabled):active:focus, .btn-danger:not([disabled]):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-light {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n  color: #212529;\n  background-color: #e2e6ea;\n  border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:not([disabled]):not(.disabled):active, .btn-light:not([disabled]):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n  color: #212529;\n  background-color: #dae0e5;\n  border-color: #d3d9df;\n}\n\n.btn-light:not([disabled]):not(.disabled):active:focus, .btn-light:not([disabled]):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-dark {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:hover {\n  color: #fff;\n  background-color: #23272b;\n  border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:not([disabled]):not(.disabled):active, .btn-dark:not([disabled]):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #1d2124;\n  border-color: #171a1d;\n}\n\n.btn-dark:not([disabled]):not(.disabled):active:focus, .btn-dark:not([disabled]):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-primary {\n  color: #007bff;\n  background-color: transparent;\n  background-image: none;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n  color: #007bff;\n  background-color: transparent;\n}\n\n.btn-outline-primary:not([disabled]):not(.disabled):active, .btn-outline-primary:not([disabled]):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n  color: #212529;\n  background-color: #007bff;\n  border-color: #007bff;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n  color: #868e96;\n  background-color: transparent;\n  background-image: none;\n  border-color: #868e96;\n}\n\n.btn-outline-secondary:hover {\n  color: #fff;\n  background-color: #868e96;\n  border-color: #868e96;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n  color: #868e96;\n  background-color: transparent;\n}\n\n.btn-outline-secondary:not([disabled]):not(.disabled):active, .btn-outline-secondary:not([disabled]):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n  color: #212529;\n  background-color: #868e96;\n  border-color: #868e96;\n  box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5);\n}\n\n.btn-outline-success {\n  color: #28a745;\n  background-color: transparent;\n  background-image: none;\n  border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n  color: #28a745;\n  background-color: transparent;\n}\n\n.btn-outline-success:not([disabled]):not(.disabled):active, .btn-outline-success:not([disabled]):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n  color: #212529;\n  background-color: #28a745;\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n  color: #17a2b8;\n  background-color: transparent;\n  background-image: none;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n  color: #17a2b8;\n  background-color: transparent;\n}\n\n.btn-outline-info:not([disabled]):not(.disabled):active, .btn-outline-info:not([disabled]):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n  color: #212529;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n  color: #ffc107;\n  background-color: transparent;\n  background-image: none;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n  color: #ffc107;\n  background-color: transparent;\n}\n\n.btn-outline-warning:not([disabled]):not(.disabled):active, .btn-outline-warning:not([disabled]):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n  color: #dc3545;\n  background-color: transparent;\n  background-image: none;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n  color: #dc3545;\n  background-color: transparent;\n}\n\n.btn-outline-danger:not([disabled]):not(.disabled):active, .btn-outline-danger:not([disabled]):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n  color: #212529;\n  background-color: #dc3545;\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n  color: #f8f9fa;\n  background-color: transparent;\n  background-image: none;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n  color: #f8f9fa;\n  background-color: transparent;\n}\n\n.btn-outline-light:not([disabled]):not(.disabled):active, .btn-outline-light:not([disabled]):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n  color: #fff;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n  color: #343a40;\n  background-color: transparent;\n  background-image: none;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n  color: #343a40;\n  background-color: transparent;\n}\n\n.btn-outline-dark:not([disabled]):not(.disabled):active, .btn-outline-dark:not([disabled]):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n  color: #212529;\n  background-color: #343a40;\n  border-color: #343a40;\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n  font-weight: 400;\n  color: #007bff;\n  background-color: transparent;\n}\n\n.btn-link:hover {\n  color: #0056b3;\n  text-decoration: underline;\n  background-color: transparent;\n  border-color: transparent;\n}\n\n.btn-link:focus, .btn-link.focus {\n  text-decoration: underline;\n  border-color: transparent;\n  box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n  color: #868e96;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n.btn-block + .btn-block {\n  margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  opacity: 0;\n  transition: opacity 0.15s linear;\n}\n\n.fade.show {\n  opacity: 1;\n}\n\n.collapse {\n  display: none;\n}\n\n.collapse.show {\n  display: block;\n}\n\ntr.collapse.show {\n  display: table-row;\n}\n\ntbody.collapse.show {\n  display: table-row-group;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  transition: height 0.35s ease;\n}\n\n.dropup,\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0;\n  border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n  margin-left: 0;\n}\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: 10rem;\n  padding: 0.5rem 0;\n  margin: 0.125rem 0 0;\n  font-size: 1rem;\n  color: #212529;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 0.25rem;\n}\n\n.dropup .dropdown-menu {\n  margin-top: 0;\n  margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0.3em solid;\n  border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n  margin-top: 0;\n  margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-bottom: 0.3em solid transparent;\n  border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n  vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n  margin-top: 0;\n  margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n  display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0.3em solid;\n  border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n  vertical-align: 0;\n}\n\n.dropdown-divider {\n  height: 0;\n  margin: 0.5rem 0;\n  overflow: hidden;\n  border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n  display: block;\n  width: 100%;\n  padding: 0.25rem 1.5rem;\n  clear: both;\n  font-weight: 400;\n  color: #212529;\n  text-align: inherit;\n  white-space: nowrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.dropdown-item:focus, .dropdown-item:hover {\n  color: #16181b;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n  color: #fff;\n  text-decoration: none;\n  background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n  color: #868e96;\n  background-color: transparent;\n}\n\n.dropdown-menu.show {\n  display: block;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 0.5rem 1.5rem;\n  margin-bottom: 0;\n  font-size: 0.875rem;\n  color: #868e96;\n  white-space: nowrap;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: -webkit-inline-box;\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  -webkit-box-flex: 0;\n  -ms-flex: 0 1 auto;\n  flex: 0 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n  z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n  z-index: 1;\n}\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.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-left: -1px;\n}\n\n.btn-toolbar {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -webkit-box-pack: start;\n  -ms-flex-pack: start;\n  justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n  width: auto;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n  padding-right: 0.5625rem;\n  padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after {\n  margin-left: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n  padding-right: 0.375rem;\n  padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n  padding-right: 0.75rem;\n  padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -webkit-box-align: start;\n  -ms-flex-align: start;\n  align-items: flex-start;\n  -webkit-box-pack: center;\n  -ms-flex-pack: center;\n  justify-content: center;\n}\n\n.btn-group-vertical .btn,\n.btn-group-vertical .btn-group {\n  width: 100%;\n}\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\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n  margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n\n.input-group {\n  position: relative;\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -webkit-box-align: stretch;\n  -ms-flex-align: stretch;\n  align-items: stretch;\n  width: 100%;\n}\n\n.input-group .form-control,\n.input-group .custom-select,\n.input-group .custom-file {\n  position: relative;\n  -webkit-box-flex: 1;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  width: 1%;\n  margin-bottom: 0;\n}\n\n.input-group .form-control:focus,\n.input-group .custom-select:focus,\n.input-group .custom-file:focus {\n  z-index: 3;\n}\n\n.input-group .form-control + .form-control,\n.input-group .custom-select + .form-control,\n.input-group .custom-file + .form-control {\n  margin-left: -1px;\n}\n\n.input-group .form-control:not(:last-child),\n.input-group .custom-select:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group .form-control:not(:first-child),\n.input-group .custom-select:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group .custom-file {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.input-group .custom-file:not(:last-child) .custom-file-control,\n.input-group .custom-file:not(:last-child) .custom-file-control::before {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group .custom-file:not(:first-child) .custom-file-control,\n.input-group .custom-file:not(:first-child) .custom-file-control::before {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n  position: relative;\n  z-index: 2;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n  margin-left: -1px;\n}\n\n.input-group-prepend {\n  margin-right: -1px;\n}\n\n.input-group-append {\n  margin-left: -1px;\n}\n\n.input-group-text {\n  padding: 0.375rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #e9ecef;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.custom-control {\n  position: relative;\n  display: block;\n  min-height: 1.5rem;\n  padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n  display: -webkit-inline-box;\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  margin-right: 1rem;\n}\n\n.custom-control-input {\n  position: absolute;\n  z-index: -1;\n  opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n  color: #fff;\n  background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:active ~ .custom-control-label::before {\n  color: #fff;\n  background-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n  color: #868e96;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n  background-color: #e9ecef;\n}\n\n.custom-control-label {\n  margin-bottom: 0;\n}\n\n.custom-control-label::before {\n  position: absolute;\n  top: 0.25rem;\n  left: 0;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  pointer-events: none;\n  content: \"\";\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  background-color: #dee2e6;\n}\n\n.custom-control-label::after {\n  position: absolute;\n  top: 0.25rem;\n  left: 0;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  content: \"\";\n  background-repeat: no-repeat;\n  background-position: center center;\n  background-size: 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n  border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before {\n  background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n  background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E\");\n}\n\n.custom-radio .custom-control-label::before {\n  border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::before {\n  background-color: #007bff;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.custom-select {\n  display: inline-block;\n  width: 100%;\n  height: calc(2.25rem + 2px);\n  padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  vertical-align: middle;\n  background: #fff url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\") no-repeat right 0.75rem center;\n  background-size: 8px 10px;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n.custom-select:focus {\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n  height: auto;\n  padding-right: 0.75rem;\n  background-image: none;\n}\n\n.custom-select:disabled {\n  color: #868e96;\n  background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n  opacity: 0;\n}\n\n.custom-select-sm {\n  height: calc(1.8125rem + 2px);\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  font-size: 75%;\n}\n\n.custom-select-lg {\n  height: calc(2.875rem + 2px);\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  font-size: 125%;\n}\n\n.custom-file {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  height: calc(2.25rem + 2px);\n  margin-bottom: 0;\n}\n\n.custom-file-input {\n  position: relative;\n  z-index: 2;\n  width: 100%;\n  height: calc(2.25rem + 2px);\n  margin: 0;\n  opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-control {\n  border-color: #80bdff;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:focus ~ .custom-file-control::before {\n  border-color: #80bdff;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n  content: \"Browse\";\n}\n\n.custom-file-label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1;\n  height: calc(2.25rem + 2px);\n  padding: 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 3;\n  display: block;\n  height: calc(calc(2.25rem + 2px) - 1px * 2);\n  padding: 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  content: \"Browse\";\n  background-color: #e9ecef;\n  border-left: 1px solid #ced4da;\n  border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.nav {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav-link {\n  display: block;\n  padding: 0.5rem 1rem;\n}\n\n.nav-link:focus, .nav-link:hover {\n  text-decoration: none;\n}\n\n.nav-link.disabled {\n  color: #868e96;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n  margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n  border: 1px solid transparent;\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {\n  border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n  color: #868e96;\n  background-color: transparent;\n  border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n  color: #495057;\n  background-color: #fff;\n  border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n  border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n  color: #fff;\n  background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n  -webkit-box-flex: 1;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  text-align: center;\n}\n\n.nav-justified .nav-item {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -webkit-box-flex: 1;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  text-align: center;\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n\n.tab-content > .active {\n  display: block;\n}\n\n.navbar {\n  position: relative;\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -webkit-box-align: center;\n  -ms-flex-align: center;\n  align-items: center;\n  -webkit-box-pack: justify;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n  padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -webkit-box-align: center;\n  -ms-flex-align: center;\n  align-items: center;\n  -webkit-box-pack: justify;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n}\n\n.navbar-brand {\n  display: inline-block;\n  padding-top: 0.3125rem;\n  padding-bottom: 0.3125rem;\n  margin-right: 1rem;\n  font-size: 1.25rem;\n  line-height: inherit;\n  white-space: nowrap;\n}\n\n.navbar-brand:focus, .navbar-brand:hover {\n  text-decoration: none;\n}\n\n.navbar-nav {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.navbar-nav .nav-link {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n  position: static;\n  float: none;\n}\n\n.navbar-text {\n  display: inline-block;\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n  -ms-flex-preferred-size: 100%;\n  flex-basis: 100%;\n  -webkit-box-flex: 1;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  -webkit-box-align: center;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.navbar-toggler {\n  padding: 0.25rem 0.75rem;\n  font-size: 1.25rem;\n  line-height: 1;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.navbar-toggler:focus, .navbar-toggler:hover {\n  text-decoration: none;\n}\n\n.navbar-toggler:not([disabled]):not(.disabled) {\n  cursor: pointer;\n}\n\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  content: \"\";\n  background: no-repeat center center;\n  background-size: 100% 100%;\n}\n\n@media (max-width: 575.99px) {\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 576px) {\n  .navbar-expand-sm {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -webkit-box-pack: start;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-sm .navbar-nav {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-sm .navbar-nav .dropdown-menu-right {\n    right: 0;\n    left: auto;\n  }\n  .navbar-expand-sm .navbar-nav .nav-link {\n    padding-right: .5rem;\n    padding-left: .5rem;\n  }\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-sm .navbar-collapse {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-sm .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-sm .dropup .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n  }\n}\n\n@media (max-width: 767.99px) {\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-expand-md {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -webkit-box-pack: start;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-md .navbar-nav {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-md .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-md .navbar-nav .dropdown-menu-right {\n    right: 0;\n    left: auto;\n  }\n  .navbar-expand-md .navbar-nav .nav-link {\n    padding-right: .5rem;\n    padding-left: .5rem;\n  }\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-md .navbar-collapse {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-md .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-md .dropup .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n  }\n}\n\n@media (max-width: 991.99px) {\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .navbar-expand-lg {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -webkit-box-pack: start;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-lg .navbar-nav {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-lg .navbar-nav .dropdown-menu-right {\n    right: 0;\n    left: auto;\n  }\n  .navbar-expand-lg .navbar-nav .nav-link {\n    padding-right: .5rem;\n    padding-left: .5rem;\n  }\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-lg .navbar-collapse {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-lg .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-lg .dropup .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n  }\n}\n\n@media (max-width: 1199.99px) {\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .navbar-expand-xl {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -webkit-box-pack: start;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xl .navbar-nav {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xl .navbar-nav .dropdown-menu-right {\n    right: 0;\n    left: auto;\n  }\n  .navbar-expand-xl .navbar-nav .nav-link {\n    padding-right: .5rem;\n    padding-left: .5rem;\n  }\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-xl .navbar-collapse {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-xl .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-xl .dropup .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n  }\n}\n\n.navbar-expand {\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n  -ms-flex-flow: row nowrap;\n  flex-flow: row nowrap;\n  -webkit-box-pack: start;\n  -ms-flex-pack: start;\n  justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n  -ms-flex-direction: row;\n  flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n  position: absolute;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n  padding-right: .5rem;\n  padding-left: .5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  -ms-flex-wrap: nowrap;\n  flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n  display: -webkit-box !important;\n  display: -ms-flexbox !important;\n  display: flex !important;\n  -ms-flex-preferred-size: auto;\n  flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n  display: none;\n}\n\n.navbar-expand .dropup .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n}\n\n.navbar-light .navbar-brand {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {\n  color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n  color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n  color: rgba(0, 0, 0, 0.5);\n  border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-light .navbar-text {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:focus, .navbar-light .navbar-text a:hover {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n  color: #fff;\n}\n\n.navbar-dark .navbar-brand:focus, .navbar-dark .navbar-brand:hover {\n  color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover {\n  color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n  color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n  color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n  color: rgba(255, 255, 255, 0.5);\n  border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-dark .navbar-text {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n  color: #fff;\n}\n\n.navbar-dark .navbar-text a:focus, .navbar-dark .navbar-text a:hover {\n  color: #fff;\n}\n\n.card {\n  position: relative;\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  min-width: 0;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: border-box;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n  border-radius: 0.25rem;\n}\n\n.card > hr {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n  -webkit-box-flex: 1;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  padding: 1.25rem;\n}\n\n.card-title {\n  margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n  margin-top: -0.375rem;\n  margin-bottom: 0;\n}\n\n.card-text:last-child {\n  margin-bottom: 0;\n}\n\n.card-link:hover {\n  text-decoration: none;\n}\n\n.card-link + .card-link {\n  margin-left: 1.25rem;\n}\n\n.card-header {\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 0;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n  border-top: 0;\n}\n\n.card-footer {\n  padding: 0.75rem 1.25rem;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n  margin-right: -0.625rem;\n  margin-bottom: -0.75rem;\n  margin-left: -0.625rem;\n  border-bottom: 0;\n}\n\n.card-header-pills {\n  margin-right: -0.625rem;\n  margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: 1.25rem;\n}\n\n.card-img {\n  width: 100%;\n  border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n  width: 100%;\n  border-top-left-radius: calc(0.25rem - 1px);\n  border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n  width: 100%;\n  border-bottom-right-radius: calc(0.25rem - 1px);\n  border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -ms-flex-direction: column;\n  flex-direction: column;\n}\n\n.card-deck .card {\n  margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n  .card-deck {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n    margin-right: -15px;\n    margin-left: -15px;\n  }\n  .card-deck .card {\n    display: -webkit-box;\n    display: -ms-flexbox;\n    display: flex;\n    -webkit-box-flex: 1;\n    -ms-flex: 1 0 0%;\n    flex: 1 0 0%;\n    -webkit-box-orient: vertical;\n    -webkit-box-direction: normal;\n    -ms-flex-direction: column;\n    flex-direction: column;\n    margin-right: 15px;\n    margin-bottom: 0;\n    margin-left: 15px;\n  }\n}\n\n.card-group {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -ms-flex-direction: column;\n  flex-direction: column;\n}\n\n.card-group > .card {\n  margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n  .card-group {\n    -webkit-box-orient: horizontal;\n    -webkit-box-direction: normal;\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n  }\n  .card-group > .card {\n    -webkit-box-flex: 1;\n    -ms-flex: 1 0 0%;\n    flex: 1 0 0%;\n    margin-bottom: 0;\n  }\n  .card-group > .card + .card {\n    margin-left: 0;\n    border-left: 0;\n  }\n  .card-group > .card:first-child {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:first-child .card-img-top,\n  .card-group > .card:first-child .card-header {\n    border-top-right-radius: 0;\n  }\n  .card-group > .card:first-child .card-img-bottom,\n  .card-group > .card:first-child .card-footer {\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:last-child {\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:last-child .card-img-top,\n  .card-group > .card:last-child .card-header {\n    border-top-left-radius: 0;\n  }\n  .card-group > .card:last-child .card-img-bottom,\n  .card-group > .card:last-child .card-footer {\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:only-child {\n    border-radius: 0.25rem;\n  }\n  .card-group > .card:only-child .card-img-top,\n  .card-group > .card:only-child .card-header {\n    border-top-left-radius: 0.25rem;\n    border-top-right-radius: 0.25rem;\n  }\n  .card-group > .card:only-child .card-img-bottom,\n  .card-group > .card:only-child .card-footer {\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n  }\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) {\n    border-radius: 0;\n  }\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header,\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer {\n    border-radius: 0;\n  }\n}\n\n.card-columns .card {\n  margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n  .card-columns {\n    -webkit-column-count: 3;\n    -moz-column-count: 3;\n    column-count: 3;\n    -webkit-column-gap: 1.25rem;\n    -moz-column-gap: 1.25rem;\n    column-gap: 1.25rem;\n  }\n  .card-columns .card {\n    display: inline-block;\n    width: 100%;\n  }\n}\n\n.breadcrumb {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  padding: 0.75rem 1rem;\n  margin-bottom: 1rem;\n  list-style: none;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n  display: inline-block;\n  padding-right: 0.5rem;\n  padding-left: 0.5rem;\n  color: #868e96;\n  content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: none;\n}\n\n.breadcrumb-item.active {\n  color: #868e96;\n}\n\n.pagination {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  padding-left: 0;\n  list-style: none;\n  border-radius: 0.25rem;\n}\n\n.page-link {\n  position: relative;\n  display: block;\n  padding: 0.5rem 0.75rem;\n  margin-left: -1px;\n  line-height: 1.25;\n  color: #007bff;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n}\n\n.page-link:focus, .page-link:hover {\n  color: #0056b3;\n  text-decoration: none;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n\n.page-link:not([disabled]):not(.disabled) {\n  cursor: pointer;\n}\n\n.page-item:first-child .page-link {\n  margin-left: 0;\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n  z-index: 1;\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n  color: #868e96;\n  pointer-events: none;\n  cursor: auto;\n  background-color: #fff;\n  border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n  padding: 0.75rem 1.5rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n  border-top-left-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n  border-top-right-radius: 0.3rem;\n  border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n  border-top-left-radius: 0.2rem;\n  border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n  border-top-right-radius: 0.2rem;\n  border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n  display: inline-block;\n  padding: 0.25em 0.4em;\n  font-size: 75%;\n  font-weight: 700;\n  line-height: 1;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: 0.25rem;\n}\n\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n.badge-pill {\n  padding-right: 0.6em;\n  padding-left: 0.6em;\n  border-radius: 10rem;\n}\n\n.badge-primary {\n  color: #fff;\n  background-color: #007bff;\n}\n\n.badge-primary[href]:focus, .badge-primary[href]:hover {\n  color: #fff;\n  text-decoration: none;\n  background-color: #0062cc;\n}\n\n.badge-secondary {\n  color: #fff;\n  background-color: #868e96;\n}\n\n.badge-secondary[href]:focus, .badge-secondary[href]:hover {\n  color: #fff;\n  text-decoration: none;\n  background-color: #6c757d;\n}\n\n.badge-success {\n  color: #fff;\n  background-color: #28a745;\n}\n\n.badge-success[href]:focus, .badge-success[href]:hover {\n  color: #fff;\n  text-decoration: none;\n  background-color: #1e7e34;\n}\n\n.badge-info {\n  color: #fff;\n  background-color: #17a2b8;\n}\n\n.badge-info[href]:focus, .badge-info[href]:hover {\n  color: #fff;\n  text-decoration: none;\n  background-color: #117a8b;\n}\n\n.badge-warning {\n  color: #212529;\n  background-color: #ffc107;\n}\n\n.badge-warning[href]:focus, .badge-warning[href]:hover {\n  color: #212529;\n  text-decoration: none;\n  background-color: #d39e00;\n}\n\n.badge-danger {\n  color: #fff;\n  background-color: #dc3545;\n}\n\n.badge-danger[href]:focus, .badge-danger[href]:hover {\n  color: #fff;\n  text-decoration: none;\n  background-color: #bd2130;\n}\n\n.badge-light {\n  color: #212529;\n  background-color: #f8f9fa;\n}\n\n.badge-light[href]:focus, .badge-light[href]:hover {\n  color: #212529;\n  text-decoration: none;\n  background-color: #dae0e5;\n}\n\n.badge-dark {\n  color: #fff;\n  background-color: #343a40;\n}\n\n.badge-dark[href]:focus, .badge-dark[href]:hover {\n  color: #fff;\n  text-decoration: none;\n  background-color: #1d2124;\n}\n\n.jumbotron {\n  padding: 2rem 1rem;\n  margin-bottom: 2rem;\n  background-color: #e9ecef;\n  border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n  .jumbotron {\n    padding: 4rem 2rem;\n  }\n}\n\n.jumbotron-fluid {\n  padding-right: 0;\n  padding-left: 0;\n  border-radius: 0;\n}\n\n.alert {\n  position: relative;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 1rem;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.alert-heading {\n  color: inherit;\n}\n\n.alert-link {\n  font-weight: 700;\n}\n\n.alert-dismissible {\n  padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n  position: absolute;\n  top: 0;\n  right: 0;\n  padding: 0.75rem 1.25rem;\n  color: inherit;\n}\n\n.alert-primary {\n  color: #004085;\n  background-color: #cce5ff;\n  border-color: #b8daff;\n}\n\n.alert-primary hr {\n  border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n  color: #002752;\n}\n\n.alert-secondary {\n  color: #464a4e;\n  background-color: #e7e8ea;\n  border-color: #dddfe2;\n}\n\n.alert-secondary hr {\n  border-top-color: #cfd2d6;\n}\n\n.alert-secondary .alert-link {\n  color: #2e3133;\n}\n\n.alert-success {\n  color: #155724;\n  background-color: #d4edda;\n  border-color: #c3e6cb;\n}\n\n.alert-success hr {\n  border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n  color: #0b2e13;\n}\n\n.alert-info {\n  color: #0c5460;\n  background-color: #d1ecf1;\n  border-color: #bee5eb;\n}\n\n.alert-info hr {\n  border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n  color: #062c33;\n}\n\n.alert-warning {\n  color: #856404;\n  background-color: #fff3cd;\n  border-color: #ffeeba;\n}\n\n.alert-warning hr {\n  border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n  color: #533f03;\n}\n\n.alert-danger {\n  color: #721c24;\n  background-color: #f8d7da;\n  border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n  border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n  color: #491217;\n}\n\n.alert-light {\n  color: #818182;\n  background-color: #fefefe;\n  border-color: #fdfdfe;\n}\n\n.alert-light hr {\n  border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n  color: #686868;\n}\n\n.alert-dark {\n  color: #1b1e21;\n  background-color: #d6d8d9;\n  border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n  border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n  color: #040505;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  height: 1rem;\n  overflow: hidden;\n  font-size: 0.75rem;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.progress-bar {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -webkit-box-pack: center;\n  -ms-flex-pack: center;\n  justify-content: center;\n  color: #fff;\n  text-align: center;\n  background-color: #007bff;\n  transition: width 0.6s ease;\n}\n\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: 1rem 1rem;\n}\n\n.progress-bar-animated {\n  -webkit-animation: progress-bar-stripes 1s linear infinite;\n  animation: progress-bar-stripes 1s linear infinite;\n}\n\n.media {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: start;\n  -ms-flex-align: start;\n  align-items: flex-start;\n}\n\n.media-body {\n  -webkit-box-flex: 1;\n  -ms-flex: 1;\n  flex: 1;\n}\n\n.list-group {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n}\n\n.list-group-item-action {\n  width: 100%;\n  color: #495057;\n  text-align: inherit;\n}\n\n.list-group-item-action:focus, .list-group-item-action:hover {\n  color: #495057;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n  color: #212529;\n  background-color: #e9ecef;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item:focus, .list-group-item:hover {\n  z-index: 1;\n  text-decoration: none;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n  color: #868e96;\n  background-color: #fff;\n}\n\n.list-group-item.active {\n  z-index: 2;\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.list-group-flush .list-group-item {\n  border-right: 0;\n  border-left: 0;\n  border-radius: 0;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n  border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.list-group-item-primary {\n  color: #004085;\n  background-color: #b8daff;\n}\n\na.list-group-item-primary,\nbutton.list-group-item-primary {\n  color: #004085;\n}\n\na.list-group-item-primary:focus, a.list-group-item-primary:hover,\nbutton.list-group-item-primary:focus,\nbutton.list-group-item-primary:hover {\n  color: #004085;\n  background-color: #9fcdff;\n}\n\na.list-group-item-primary.active,\nbutton.list-group-item-primary.active {\n  color: #fff;\n  background-color: #004085;\n  border-color: #004085;\n}\n\n.list-group-item-secondary {\n  color: #464a4e;\n  background-color: #dddfe2;\n}\n\na.list-group-item-secondary,\nbutton.list-group-item-secondary {\n  color: #464a4e;\n}\n\na.list-group-item-secondary:focus, a.list-group-item-secondary:hover,\nbutton.list-group-item-secondary:focus,\nbutton.list-group-item-secondary:hover {\n  color: #464a4e;\n  background-color: #cfd2d6;\n}\n\na.list-group-item-secondary.active,\nbutton.list-group-item-secondary.active {\n  color: #fff;\n  background-color: #464a4e;\n  border-color: #464a4e;\n}\n\n.list-group-item-success {\n  color: #155724;\n  background-color: #c3e6cb;\n}\n\na.list-group-item-success,\nbutton.list-group-item-success {\n  color: #155724;\n}\n\na.list-group-item-success:focus, a.list-group-item-success:hover,\nbutton.list-group-item-success:focus,\nbutton.list-group-item-success:hover {\n  color: #155724;\n  background-color: #b1dfbb;\n}\n\na.list-group-item-success.active,\nbutton.list-group-item-success.active {\n  color: #fff;\n  background-color: #155724;\n  border-color: #155724;\n}\n\n.list-group-item-info {\n  color: #0c5460;\n  background-color: #bee5eb;\n}\n\na.list-group-item-info,\nbutton.list-group-item-info {\n  color: #0c5460;\n}\n\na.list-group-item-info:focus, a.list-group-item-info:hover,\nbutton.list-group-item-info:focus,\nbutton.list-group-item-info:hover {\n  color: #0c5460;\n  background-color: #abdde5;\n}\n\na.list-group-item-info.active,\nbutton.list-group-item-info.active {\n  color: #fff;\n  background-color: #0c5460;\n  border-color: #0c5460;\n}\n\n.list-group-item-warning {\n  color: #856404;\n  background-color: #ffeeba;\n}\n\na.list-group-item-warning,\nbutton.list-group-item-warning {\n  color: #856404;\n}\n\na.list-group-item-warning:focus, a.list-group-item-warning:hover,\nbutton.list-group-item-warning:focus,\nbutton.list-group-item-warning:hover {\n  color: #856404;\n  background-color: #ffe8a1;\n}\n\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active {\n  color: #fff;\n  background-color: #856404;\n  border-color: #856404;\n}\n\n.list-group-item-danger {\n  color: #721c24;\n  background-color: #f5c6cb;\n}\n\na.list-group-item-danger,\nbutton.list-group-item-danger {\n  color: #721c24;\n}\n\na.list-group-item-danger:focus, a.list-group-item-danger:hover,\nbutton.list-group-item-danger:focus,\nbutton.list-group-item-danger:hover {\n  color: #721c24;\n  background-color: #f1b0b7;\n}\n\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active {\n  color: #fff;\n  background-color: #721c24;\n  border-color: #721c24;\n}\n\n.list-group-item-light {\n  color: #818182;\n  background-color: #fdfdfe;\n}\n\na.list-group-item-light,\nbutton.list-group-item-light {\n  color: #818182;\n}\n\na.list-group-item-light:focus, a.list-group-item-light:hover,\nbutton.list-group-item-light:focus,\nbutton.list-group-item-light:hover {\n  color: #818182;\n  background-color: #ececf6;\n}\n\na.list-group-item-light.active,\nbutton.list-group-item-light.active {\n  color: #fff;\n  background-color: #818182;\n  border-color: #818182;\n}\n\n.list-group-item-dark {\n  color: #1b1e21;\n  background-color: #c6c8ca;\n}\n\na.list-group-item-dark,\nbutton.list-group-item-dark {\n  color: #1b1e21;\n}\n\na.list-group-item-dark:focus, a.list-group-item-dark:hover,\nbutton.list-group-item-dark:focus,\nbutton.list-group-item-dark:hover {\n  color: #1b1e21;\n  background-color: #b9bbbe;\n}\n\na.list-group-item-dark.active,\nbutton.list-group-item-dark.active {\n  color: #fff;\n  background-color: #1b1e21;\n  border-color: #1b1e21;\n}\n\n.close {\n  float: right;\n  font-size: 1.5rem;\n  font-weight: 700;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  opacity: .5;\n}\n\n.close:focus, .close:hover {\n  color: #000;\n  text-decoration: none;\n  opacity: .75;\n}\n\n.close:not([disabled]):not(.disabled) {\n  cursor: pointer;\n}\n\nbutton.close {\n  padding: 0;\n  background-color: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  overflow: hidden;\n  outline: 0;\n}\n\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 0.5rem;\n  pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n  transition: -webkit-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n  transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n  -webkit-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n}\n\n.modal.show .modal-dialog {\n  -webkit-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n\n.modal-dialog-centered {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -ms-flex-align: center;\n  align-items: center;\n  min-height: calc(100% - (0.5rem * 2));\n}\n\n.modal-content {\n  position: relative;\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  width: 100%;\n  pointer-events: auto;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n  outline: 0;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n}\n\n.modal-backdrop.show {\n  opacity: 0.5;\n}\n\n.modal-header {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: start;\n  -ms-flex-align: start;\n  align-items: flex-start;\n  -webkit-box-pack: justify;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n  padding: 1rem;\n  border-bottom: 1px solid #e9ecef;\n  border-top-left-radius: 0.3rem;\n  border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n  padding: 1rem;\n  margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n  margin-bottom: 0;\n  line-height: 1.5;\n}\n\n.modal-body {\n  position: relative;\n  -webkit-box-flex: 1;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  padding: 1rem;\n}\n\n.modal-footer {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -ms-flex-align: center;\n  align-items: center;\n  -webkit-box-pack: end;\n  -ms-flex-pack: end;\n  justify-content: flex-end;\n  padding: 1rem;\n  border-top: 1px solid #e9ecef;\n}\n\n.modal-footer > :not(:first-child) {\n  margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n  margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n@media (min-width: 576px) {\n  .modal-dialog {\n    max-width: 500px;\n    margin: 1.75rem auto;\n  }\n  .modal-dialog-centered {\n    min-height: calc(100% - (1.75rem * 2));\n  }\n  .modal-sm {\n    max-width: 300px;\n  }\n}\n\n@media (min-width: 992px) {\n  .modal-lg {\n    max-width: 800px;\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  opacity: 0;\n}\n\n.tooltip.show {\n  opacity: 0.9;\n}\n\n.tooltip .arrow {\n  position: absolute;\n  display: block;\n  width: 0.8rem;\n  height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n  position: absolute;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n  bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n  top: 0;\n  border-width: 0.4rem 0.4rem 0;\n  border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n  left: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n  right: 0;\n  border-width: 0.4rem 0.4rem 0.4rem 0;\n  border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n  top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n  bottom: 0;\n  border-width: 0 0.4rem 0.4rem;\n  border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n  right: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n  left: 0;\n  border-width: 0.4rem 0 0.4rem 0.4rem;\n  border-left-color: #000;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 0.25rem 0.5rem;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 0.25rem;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: block;\n  max-width: 276px;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n}\n\n.popover .arrow {\n  position: absolute;\n  display: block;\n  width: 1rem;\n  height: 0.5rem;\n  margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n  margin-bottom: 0.5rem;\n}\n\n.bs-popover-top .arrow, .bs-popover-auto[x-placement^=\"top\"] .arrow {\n  bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=\"top\"] .arrow::before,\n.bs-popover-top .arrow::after, .bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n  border-width: 0.5rem 0.5rem 0;\n}\n\n.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=\"top\"] .arrow::before {\n  bottom: 0;\n  border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top .arrow::after, .bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n  bottom: 1px;\n  border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n  margin-left: 0.5rem;\n}\n\n.bs-popover-right .arrow, .bs-popover-auto[x-placement^=\"right\"] .arrow {\n  left: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=\"right\"] .arrow::before,\n.bs-popover-right .arrow::after, .bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n}\n\n.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=\"right\"] .arrow::before {\n  left: 0;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right .arrow::after, .bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n  left: 1px;\n  border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n  margin-top: 0.5rem;\n}\n\n.bs-popover-bottom .arrow, .bs-popover-auto[x-placement^=\"bottom\"] .arrow {\n  top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] .arrow::before,\n.bs-popover-bottom .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n}\n\n.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] .arrow::before {\n  top: 0;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n  top: 1px;\n  border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  display: block;\n  width: 1rem;\n  margin-left: -0.5rem;\n  content: \"\";\n  border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n  margin-right: 0.5rem;\n}\n\n.bs-popover-left .arrow, .bs-popover-auto[x-placement^=\"left\"] .arrow {\n  right: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=\"left\"] .arrow::before,\n.bs-popover-left .arrow::after, .bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n}\n\n.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=\"left\"] .arrow::before {\n  right: 0;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left .arrow::after, .bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n  right: 1px;\n  border-left-color: #fff;\n}\n\n.popover-header {\n  padding: 0.5rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  color: inherit;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-top-left-radius: calc(0.3rem - 1px);\n  border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n  display: none;\n}\n\n.popover-body {\n  padding: 0.5rem 0.75rem;\n  color: #212529;\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-item {\n  position: relative;\n  display: none;\n  -webkit-box-align: center;\n  -ms-flex-align: center;\n  align-items: center;\n  width: 100%;\n  transition: -webkit-transform 0.6s ease;\n  transition: transform 0.6s ease;\n  transition: transform 0.6s ease, -webkit-transform 0.6s ease;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  -webkit-perspective: 1000px;\n  perspective: 1000px;\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n\n.carousel-item-next,\n.carousel-item-prev {\n  position: absolute;\n  top: 0;\n}\n\n.carousel-item-next.carousel-item-left,\n.carousel-item-prev.carousel-item-right {\n  -webkit-transform: translateX(0);\n  transform: translateX(0);\n}\n\n@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {\n  .carousel-item-next.carousel-item-left,\n  .carousel-item-prev.carousel-item-right {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.carousel-item-next,\n.active.carousel-item-right {\n  -webkit-transform: translateX(100%);\n  transform: translateX(100%);\n}\n\n@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {\n  .carousel-item-next,\n  .active.carousel-item-right {\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n\n.carousel-item-prev,\n.active.carousel-item-left {\n  -webkit-transform: translateX(-100%);\n  transform: translateX(-100%);\n}\n\n@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {\n  .carousel-item-prev,\n  .active.carousel-item-left {\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -ms-flex-align: center;\n  align-items: center;\n  -webkit-box-pack: center;\n  -ms-flex-pack: center;\n  justify-content: center;\n  width: 15%;\n  color: #fff;\n  text-align: center;\n  opacity: 0.5;\n}\n\n.carousel-control-prev:focus, .carousel-control-prev:hover,\n.carousel-control-next:focus,\n.carousel-control-next:hover {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  opacity: .9;\n}\n\n.carousel-control-prev {\n  left: 0;\n}\n\n.carousel-control-next {\n  right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  background: transparent no-repeat center center;\n  background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\");\n}\n\n.carousel-control-next-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\");\n}\n\n.carousel-indicators {\n  position: absolute;\n  right: 0;\n  bottom: 10px;\n  left: 0;\n  z-index: 15;\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-pack: center;\n  -ms-flex-pack: center;\n  justify-content: center;\n  padding-left: 0;\n  margin-right: 15%;\n  margin-left: 15%;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  position: relative;\n  -webkit-box-flex: 0;\n  -ms-flex: 0 1 auto;\n  flex: 0 1 auto;\n  width: 30px;\n  height: 3px;\n  margin-right: 3px;\n  margin-left: 3px;\n  text-indent: -999px;\n  background-color: rgba(255, 255, 255, 0.5);\n}\n\n.carousel-indicators li::before {\n  position: absolute;\n  top: -10px;\n  left: 0;\n  display: inline-block;\n  width: 100%;\n  height: 10px;\n  content: \"\";\n}\n\n.carousel-indicators li::after {\n  position: absolute;\n  bottom: -10px;\n  left: 0;\n  display: inline-block;\n  width: 100%;\n  height: 10px;\n  content: \"\";\n}\n\n.carousel-indicators .active {\n  background-color: #fff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.bg-primary {\n  background-color: #007bff !important;\n}\n\na.bg-primary:focus, a.bg-primary:hover,\nbutton.bg-primary:focus,\nbutton.bg-primary:hover {\n  background-color: #0062cc !important;\n}\n\n.bg-secondary {\n  background-color: #868e96 !important;\n}\n\na.bg-secondary:focus, a.bg-secondary:hover,\nbutton.bg-secondary:focus,\nbutton.bg-secondary:hover {\n  background-color: #6c757d !important;\n}\n\n.bg-success {\n  background-color: #28a745 !important;\n}\n\na.bg-success:focus, a.bg-success:hover,\nbutton.bg-success:focus,\nbutton.bg-success:hover {\n  background-color: #1e7e34 !important;\n}\n\n.bg-info {\n  background-color: #17a2b8 !important;\n}\n\na.bg-info:focus, a.bg-info:hover,\nbutton.bg-info:focus,\nbutton.bg-info:hover {\n  background-color: #117a8b !important;\n}\n\n.bg-warning {\n  background-color: #ffc107 !important;\n}\n\na.bg-warning:focus, a.bg-warning:hover,\nbutton.bg-warning:focus,\nbutton.bg-warning:hover {\n  background-color: #d39e00 !important;\n}\n\n.bg-danger {\n  background-color: #dc3545 !important;\n}\n\na.bg-danger:focus, a.bg-danger:hover,\nbutton.bg-danger:focus,\nbutton.bg-danger:hover {\n  background-color: #bd2130 !important;\n}\n\n.bg-light {\n  background-color: #f8f9fa !important;\n}\n\na.bg-light:focus, a.bg-light:hover,\nbutton.bg-light:focus,\nbutton.bg-light:hover {\n  background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n  background-color: #343a40 !important;\n}\n\na.bg-dark:focus, a.bg-dark:hover,\nbutton.bg-dark:focus,\nbutton.bg-dark:hover {\n  background-color: #1d2124 !important;\n}\n\n.bg-white {\n  background-color: #fff !important;\n}\n\n.bg-transparent {\n  background-color: transparent !important;\n}\n\n.border {\n  border: 1px solid #e9ecef !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-right-0 {\n  border-right: 0 !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-left-0 {\n  border-left: 0 !important;\n}\n\n.border-primary {\n  border-color: #007bff !important;\n}\n\n.border-secondary {\n  border-color: #868e96 !important;\n}\n\n.border-success {\n  border-color: #28a745 !important;\n}\n\n.border-info {\n  border-color: #17a2b8 !important;\n}\n\n.border-warning {\n  border-color: #ffc107 !important;\n}\n\n.border-danger {\n  border-color: #dc3545 !important;\n}\n\n.border-light {\n  border-color: #f8f9fa !important;\n}\n\n.border-dark {\n  border-color: #343a40 !important;\n}\n\n.border-white {\n  border-color: #fff !important;\n}\n\n.rounded {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n  border-top-left-radius: 0.25rem !important;\n  border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n  border-top-right-radius: 0.25rem !important;\n  border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n  border-bottom-right-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n  border-top-left-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.d-none {\n  display: none !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: -webkit-box !important;\n  display: -ms-flexbox !important;\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: -webkit-inline-box !important;\n  display: -ms-inline-flexbox !important;\n  display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-none {\n    display: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: -webkit-inline-box !important;\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .d-md-none {\n    display: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: -webkit-inline-box !important;\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .d-lg-none {\n    display: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: -webkit-inline-box !important;\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .d-xl-none {\n    display: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: -webkit-box !important;\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: -webkit-inline-box !important;\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n.d-print-block {\n  display: none !important;\n}\n\n@media print {\n  .d-print-block {\n    display: block !important;\n  }\n}\n\n.d-print-inline {\n  display: none !important;\n}\n\n@media print {\n  .d-print-inline {\n    display: inline !important;\n  }\n}\n\n.d-print-inline-block {\n  display: none !important;\n}\n\n@media print {\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n}\n\n@media print {\n  .d-print-none {\n    display: none !important;\n  }\n}\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  width: 100%;\n  padding: 0;\n  overflow: hidden;\n}\n\n.embed-responsive::before {\n  display: block;\n  content: \"\";\n}\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  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n\n.embed-responsive-21by9::before {\n  padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n  padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n  padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n  padding-top: 100%;\n}\n\n.flex-row {\n  -webkit-box-orient: horizontal !important;\n  -webkit-box-direction: normal !important;\n  -ms-flex-direction: row !important;\n  flex-direction: row !important;\n}\n\n.flex-column {\n  -webkit-box-orient: vertical !important;\n  -webkit-box-direction: normal !important;\n  -ms-flex-direction: column !important;\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  -webkit-box-orient: horizontal !important;\n  -webkit-box-direction: reverse !important;\n  -ms-flex-direction: row-reverse !important;\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  -webkit-box-orient: vertical !important;\n  -webkit-box-direction: reverse !important;\n  -ms-flex-direction: column-reverse !important;\n  flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n  -ms-flex-wrap: wrap !important;\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  -ms-flex-wrap: nowrap !important;\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  -ms-flex-wrap: wrap-reverse !important;\n  flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n  -webkit-box-pack: start !important;\n  -ms-flex-pack: start !important;\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  -webkit-box-pack: end !important;\n  -ms-flex-pack: end !important;\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  -webkit-box-pack: center !important;\n  -ms-flex-pack: center !important;\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  -webkit-box-pack: justify !important;\n  -ms-flex-pack: justify !important;\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  -ms-flex-pack: distribute !important;\n  justify-content: space-around !important;\n}\n\n.align-items-start {\n  -webkit-box-align: start !important;\n  -ms-flex-align: start !important;\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  -webkit-box-align: end !important;\n  -ms-flex-align: end !important;\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  -webkit-box-align: center !important;\n  -ms-flex-align: center !important;\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  -webkit-box-align: baseline !important;\n  -ms-flex-align: baseline !important;\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  -webkit-box-align: stretch !important;\n  -ms-flex-align: stretch !important;\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  -ms-flex-line-pack: start !important;\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  -ms-flex-line-pack: end !important;\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  -ms-flex-line-pack: center !important;\n  align-content: center !important;\n}\n\n.align-content-between {\n  -ms-flex-line-pack: justify !important;\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  -ms-flex-line-pack: distribute !important;\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  -ms-flex-line-pack: stretch !important;\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  -ms-flex-item-align: auto !important;\n  align-self: auto !important;\n}\n\n.align-self-start {\n  -ms-flex-item-align: start !important;\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  -ms-flex-item-align: end !important;\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  -ms-flex-item-align: center !important;\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  -ms-flex-item-align: baseline !important;\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  -ms-flex-item-align: stretch !important;\n  align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n  .flex-sm-row {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-sm-start {\n    -webkit-box-pack: start !important;\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    -webkit-box-pack: end !important;\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    -webkit-box-pack: center !important;\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    -webkit-box-pack: justify !important;\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    -webkit-box-align: start !important;\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    -webkit-box-align: end !important;\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    -webkit-box-align: center !important;\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    -webkit-box-align: baseline !important;\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    -webkit-box-align: stretch !important;\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .flex-md-row {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-md-start {\n    -webkit-box-pack: start !important;\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    -webkit-box-pack: end !important;\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    -webkit-box-pack: center !important;\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    -webkit-box-pack: justify !important;\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    -webkit-box-align: start !important;\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    -webkit-box-align: end !important;\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    -webkit-box-align: center !important;\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    -webkit-box-align: baseline !important;\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    -webkit-box-align: stretch !important;\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .flex-lg-row {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-lg-start {\n    -webkit-box-pack: start !important;\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    -webkit-box-pack: end !important;\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    -webkit-box-pack: center !important;\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    -webkit-box-pack: justify !important;\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    -webkit-box-align: start !important;\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    -webkit-box-align: end !important;\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    -webkit-box-align: center !important;\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    -webkit-box-align: baseline !important;\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    -webkit-box-align: stretch !important;\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: normal !important;\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    -webkit-box-orient: horizontal !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    -webkit-box-orient: vertical !important;\n    -webkit-box-direction: reverse !important;\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-xl-start {\n    -webkit-box-pack: start !important;\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    -webkit-box-pack: end !important;\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    -webkit-box-pack: center !important;\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    -webkit-box-pack: justify !important;\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    -webkit-box-align: start !important;\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    -webkit-box-align: end !important;\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    -webkit-box-align: center !important;\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    -webkit-box-align: baseline !important;\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    -webkit-box-align: stretch !important;\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n.float-left {\n  float: left !important;\n}\n\n.float-right {\n  float: right !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-left {\n    float: left !important;\n  }\n  .float-sm-right {\n    float: right !important;\n  }\n  .float-sm-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .float-md-left {\n    float: left !important;\n  }\n  .float-md-right {\n    float: right !important;\n  }\n  .float-md-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .float-lg-left {\n    float: left !important;\n  }\n  .float-lg-right {\n    float: right !important;\n  }\n  .float-lg-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .float-xl-left {\n    float: left !important;\n  }\n  .float-xl-right {\n    float: right !important;\n  }\n  .float-xl-none {\n    float: none !important;\n  }\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n  .sticky-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  -webkit-clip-path: inset(50%);\n  clip-path: inset(50%);\n  border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  overflow: visible;\n  clip: auto;\n  white-space: normal;\n  -webkit-clip-path: none;\n  clip-path: none;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n  margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n  margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n  margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n  margin-left: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n  margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n  margin-left: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n  margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n  margin-left: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n  margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n  margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n  margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n  margin-left: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n  margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n  margin-left: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n  margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n  margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n  margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n  margin-left: 3rem !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n  padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n  padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n  padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n  padding-left: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n  padding-left: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n  padding-left: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n  padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n  padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n  padding-left: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n  padding-left: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n  padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n  padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n  padding-left: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n  margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n  margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n  margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n  margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .mt-sm-0,\n  .my-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mr-sm-0,\n  .mx-sm-0 {\n    margin-right: 0 !important;\n  }\n  .mb-sm-0,\n  .my-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-sm-0,\n  .mx-sm-0 {\n    margin-left: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-sm-1,\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-sm-1,\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-sm-1,\n  .my-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-sm-1,\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-sm-2,\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-sm-2,\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-sm-2,\n  .my-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-sm-2,\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .mt-sm-3,\n  .my-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-sm-3,\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-sm-3,\n  .my-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-sm-3,\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-sm-4,\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-sm-4,\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-sm-4,\n  .my-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-sm-4,\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .mt-sm-5,\n  .my-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-sm-5,\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-sm-5,\n  .my-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-sm-5,\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .pt-sm-0,\n  .py-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pr-sm-0,\n  .px-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pb-sm-0,\n  .py-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-sm-0,\n  .px-sm-0 {\n    padding-left: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-sm-1,\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-sm-1,\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-sm-1,\n  .py-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-sm-1,\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-sm-2,\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-sm-2,\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-sm-2,\n  .py-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-sm-2,\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .pt-sm-3,\n  .py-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-sm-3,\n  .px-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-sm-3,\n  .py-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-sm-3,\n  .px-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-sm-4,\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-sm-4,\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-sm-4,\n  .py-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-sm-4,\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .pt-sm-5,\n  .py-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-sm-5,\n  .px-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-5,\n  .py-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-sm-5,\n  .px-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mt-sm-auto,\n  .my-sm-auto {\n    margin-top: auto !important;\n  }\n  .mr-sm-auto,\n  .mx-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-auto,\n  .my-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-sm-auto,\n  .mx-sm-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .mt-md-0,\n  .my-md-0 {\n    margin-top: 0 !important;\n  }\n  .mr-md-0,\n  .mx-md-0 {\n    margin-right: 0 !important;\n  }\n  .mb-md-0,\n  .my-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-md-0,\n  .mx-md-0 {\n    margin-left: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-md-1,\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-md-1,\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-md-1,\n  .my-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-md-1,\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-md-2,\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-md-2,\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-md-2,\n  .my-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-md-2,\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .mt-md-3,\n  .my-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-md-3,\n  .mx-md-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-md-3,\n  .my-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-md-3,\n  .mx-md-3 {\n    margin-left: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-md-4,\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-md-4,\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-md-4,\n  .my-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-md-4,\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .mt-md-5,\n  .my-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-md-5,\n  .mx-md-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-md-5,\n  .my-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-md-5,\n  .mx-md-5 {\n    margin-left: 3rem !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .pt-md-0,\n  .py-md-0 {\n    padding-top: 0 !important;\n  }\n  .pr-md-0,\n  .px-md-0 {\n    padding-right: 0 !important;\n  }\n  .pb-md-0,\n  .py-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-md-0,\n  .px-md-0 {\n    padding-left: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-md-1,\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-md-1,\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-md-1,\n  .py-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-md-1,\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-md-2,\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-md-2,\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-md-2,\n  .py-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-md-2,\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .pt-md-3,\n  .py-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-md-3,\n  .px-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-md-3,\n  .py-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-md-3,\n  .px-md-3 {\n    padding-left: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-md-4,\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-md-4,\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-md-4,\n  .py-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-md-4,\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .pt-md-5,\n  .py-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-md-5,\n  .px-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-5,\n  .py-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-md-5,\n  .px-md-5 {\n    padding-left: 3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mt-md-auto,\n  .my-md-auto {\n    margin-top: auto !important;\n  }\n  .mr-md-auto,\n  .mx-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-auto,\n  .my-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-md-auto,\n  .mx-md-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .mt-lg-0,\n  .my-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mr-lg-0,\n  .mx-lg-0 {\n    margin-right: 0 !important;\n  }\n  .mb-lg-0,\n  .my-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-lg-0,\n  .mx-lg-0 {\n    margin-left: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-lg-1,\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-lg-1,\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-lg-1,\n  .my-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-lg-1,\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-lg-2,\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-lg-2,\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-lg-2,\n  .my-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-lg-2,\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .mt-lg-3,\n  .my-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-lg-3,\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-lg-3,\n  .my-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-lg-3,\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-lg-4,\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-lg-4,\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-lg-4,\n  .my-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-lg-4,\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .mt-lg-5,\n  .my-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-lg-5,\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-lg-5,\n  .my-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-lg-5,\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .pt-lg-0,\n  .py-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pr-lg-0,\n  .px-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pb-lg-0,\n  .py-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-lg-0,\n  .px-lg-0 {\n    padding-left: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-lg-1,\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-lg-1,\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-lg-1,\n  .py-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-lg-1,\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-lg-2,\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-lg-2,\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-lg-2,\n  .py-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-lg-2,\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .pt-lg-3,\n  .py-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-lg-3,\n  .px-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-lg-3,\n  .py-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-lg-3,\n  .px-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-lg-4,\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-lg-4,\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-lg-4,\n  .py-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-lg-4,\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .pt-lg-5,\n  .py-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-lg-5,\n  .px-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-5,\n  .py-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-lg-5,\n  .px-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mt-lg-auto,\n  .my-lg-auto {\n    margin-top: auto !important;\n  }\n  .mr-lg-auto,\n  .mx-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-auto,\n  .my-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-lg-auto,\n  .mx-lg-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .mt-xl-0,\n  .my-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mr-xl-0,\n  .mx-xl-0 {\n    margin-right: 0 !important;\n  }\n  .mb-xl-0,\n  .my-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-xl-0,\n  .mx-xl-0 {\n    margin-left: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-xl-1,\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-xl-1,\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-xl-1,\n  .my-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-xl-1,\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-xl-2,\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-xl-2,\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-xl-2,\n  .my-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-xl-2,\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .mt-xl-3,\n  .my-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-xl-3,\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-xl-3,\n  .my-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-xl-3,\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-xl-4,\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-xl-4,\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-xl-4,\n  .my-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-xl-4,\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .mt-xl-5,\n  .my-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-xl-5,\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-xl-5,\n  .my-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-xl-5,\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .pt-xl-0,\n  .py-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pr-xl-0,\n  .px-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pb-xl-0,\n  .py-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-xl-0,\n  .px-xl-0 {\n    padding-left: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-xl-1,\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-xl-1,\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-xl-1,\n  .py-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-xl-1,\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-xl-2,\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-xl-2,\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-xl-2,\n  .py-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-xl-2,\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .pt-xl-3,\n  .py-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-xl-3,\n  .px-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-xl-3,\n  .py-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-xl-3,\n  .px-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-xl-4,\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-xl-4,\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-xl-4,\n  .py-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-xl-4,\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .pt-xl-5,\n  .py-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-xl-5,\n  .px-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-5,\n  .py-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-xl-5,\n  .px-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mt-xl-auto,\n  .my-xl-auto {\n    margin-top: auto !important;\n  }\n  .mr-xl-auto,\n  .mx-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-auto,\n  .my-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-xl-auto,\n  .mx-xl-auto {\n    margin-left: auto !important;\n  }\n}\n\n.text-justify {\n  text-align: justify !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.text-left {\n  text-align: left !important;\n}\n\n.text-right {\n  text-align: right !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n@media (min-width: 576px) {\n  .text-sm-left {\n    text-align: left !important;\n  }\n  .text-sm-right {\n    text-align: right !important;\n  }\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .text-md-left {\n    text-align: left !important;\n  }\n  .text-md-right {\n    text-align: right !important;\n  }\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .text-lg-left {\n    text-align: left !important;\n  }\n  .text-lg-right {\n    text-align: right !important;\n  }\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .text-xl-left {\n    text-align: left !important;\n  }\n  .text-xl-right {\n    text-align: right !important;\n  }\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.font-weight-light {\n  font-weight: 300 !important;\n}\n\n.font-weight-normal {\n  font-weight: 400 !important;\n}\n\n.font-weight-bold {\n  font-weight: 700 !important;\n}\n\n.font-italic {\n  font-style: italic !important;\n}\n\n.text-white {\n  color: #fff !important;\n}\n\n.text-primary {\n  color: #007bff !important;\n}\n\na.text-primary:focus, a.text-primary:hover {\n  color: #0062cc !important;\n}\n\n.text-secondary {\n  color: #868e96 !important;\n}\n\na.text-secondary:focus, a.text-secondary:hover {\n  color: #6c757d !important;\n}\n\n.text-success {\n  color: #28a745 !important;\n}\n\na.text-success:focus, a.text-success:hover {\n  color: #1e7e34 !important;\n}\n\n.text-info {\n  color: #17a2b8 !important;\n}\n\na.text-info:focus, a.text-info:hover {\n  color: #117a8b !important;\n}\n\n.text-warning {\n  color: #ffc107 !important;\n}\n\na.text-warning:focus, a.text-warning:hover {\n  color: #d39e00 !important;\n}\n\n.text-danger {\n  color: #dc3545 !important;\n}\n\na.text-danger:focus, a.text-danger:hover {\n  color: #bd2130 !important;\n}\n\n.text-light {\n  color: #f8f9fa !important;\n}\n\na.text-light:focus, a.text-light:hover {\n  color: #dae0e5 !important;\n}\n\n.text-dark {\n  color: #343a40 !important;\n}\n\na.text-dark:focus, a.text-dark:hover {\n  color: #1d2124 !important;\n}\n\n.text-muted {\n  color: #868e96 !important;\n}\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\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n@media print {\n  *,\n  *::before,\n  *::after {\n    text-shadow: none !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  abbr[title]::after {\n    content: \" (\" attr(title) \")\";\n  }\n  pre {\n    white-space: pre-wrap !important;\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  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  .navbar {\n    display: none;\n  }\n  .badge {\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/*# sourceMappingURL=bootstrap.css.map */\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/bootstrap/css/justified-nav.css",
    "content": "body {\n    padding-top: 20px;\n}\n\n.footer {\n    padding-top: 40px;\n    padding-bottom: 40px;\n    margin-top: 40px;\n    border-top: 1px solid #eee;\n}\n\n/* Main marketing message and sign up button */\n.jumbotron {\n    text-align: center;\n    background-color: transparent;\n}\n.jumbotron .btn {\n    padding: 14px 24px;\n    font-size: 21px;\n}\n\n.navbar {\n    background-image: linear-gradient(to bottom, #f7f7f7 0%, #eee 100%);\n    border: 1px solid #e5e5e5;\n}\n\n@media (min-width: 768px) {\n    .navbar-nav {\n        display: -ms-flexbox;\n        display: -webkit-box;\n        display: flex;\n    }\n\n    .navbar-nav .nav-item {\n        -ms-flex: 1 0 auto;\n        -webkit-box-flex: 1;\n        flex: 1 0 auto;\n    }\n}\n\n/* Responsive: Portrait tablets and up */\n@media screen and (min-width: 768px) {\n    /* Remove the padding we set earlier */\n    .masthead,\n    .marketing,\n    .footer {\n        padding-right: 0;\n        padding-left: 0;\n    }\n}\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/bootstrap/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n\n    <title>Justified Nav Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"css/justified-nav.css\" rel=\"stylesheet\">\n</head>\n\n<body>\n\n<div class=\"container\">\n\n    <header class=\"masthead\">\n        <h3 class=\"text-muted\">Project name</h3>\n\n        <nav class=\"navbar navbar-expand-md navbar-light bg-light rounded mb-3\">\n            <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\"#navbarCollapse\" aria-controls=\"navbarCollapse\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                <span class=\"navbar-toggler-icon\"></span>\n            </button>\n            <div class=\"collapse navbar-collapse\" id=\"navbarCollapse\">\n                <ul class=\"navbar-nav text-md-center nav-justified w-100\">\n                    <li class=\"nav-item active\">\n                        <a class=\"nav-link\" href=\"#\">Home <span class=\"sr-only\">(current)</span></a>\n                    </li>\n                    <li class=\"nav-item\">\n                        <a class=\"nav-link\" href=\"#\">Projects</a>\n                    </li>\n                    <li class=\"nav-item\">\n                        <a class=\"nav-link\" href=\"#\">Services</a>\n                    </li>\n                    <li class=\"nav-item\">\n                        <a class=\"nav-link\" href=\"#\">Downloads</a>\n                    </li>\n                    <li class=\"nav-item\">\n                        <a class=\"nav-link\" href=\"#\">About</a>\n                    </li>\n                    <li class=\"nav-item dropdown\">\n                        <a class=\"nav-link dropdown-toggle\" href=\"http://example.com\" id=\"dropdown01\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">Dropdown</a>\n                        <div class=\"dropdown-menu\" aria-labelledby=\"dropdown01\">\n                            <a class=\"dropdown-item\" href=\"#\">Action</a>\n                            <a class=\"dropdown-item\" href=\"#\">Another action</a>\n                            <a class=\"dropdown-item\" href=\"#\">Something else here</a>\n                        </div>\n                    </li>\n                </ul>\n            </div>\n        </nav>\n    </header>\n\n    <main role=\"main\">\n\n        <!-- Jumbotron -->\n        <div class=\"jumbotron\">\n            <h1>Marketing stuff!</h1>\n            <p class=\"lead\">Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet.</p>\n            <p><a class=\"btn btn-lg btn-success\" href=\"#\" role=\"button\">Get started today</a></p>\n        </div>\n\n        <!-- Example row of columns -->\n        <div class=\"row\">\n            <div class=\"col-lg-4\">\n                <h2>Heading</h2>\n                <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n                <p><a class=\"btn btn-primary\" href=\"#\" role=\"button\">View details &raquo;</a></p>\n            </div>\n            <div class=\"col-lg-4\">\n                <h2>Heading</h2>\n                <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n                <p><a class=\"btn btn-primary\" href=\"#\" role=\"button\">View details &raquo;</a></p>\n            </div>\n            <div class=\"col-lg-4\">\n                <h2>Heading</h2>\n                <p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa.</p>\n                <p><a class=\"btn btn-primary\" href=\"#\" role=\"button\">View details &raquo;</a></p>\n            </div>\n        </div>\n\n    </main>\n\n    <!-- Site footer -->\n    <footer class=\"footer\">\n        <p>&copy; Company 2017</p>\n    </footer>\n\n</div> <!-- /container -->\n\n<!-- Bootstrap core JavaScript\n================================================== -->\n<!-- Placed at the end of the document so the pages load faster -->\n<script src=\"js/jquery-3.2.1.slim.min.js\" crossorigin=\"anonymous\"></script>\n<script src=\"js/bootstrap.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/bootstrap/js/bootstrap.bundle.js",
    "content": "/*!\n  * Bootstrap v4.0.0-beta.3 (https://getbootstrap.com)\n  * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) :\n\ttypeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) :\n\t(factory((global.bootstrap = {}),global.jQuery));\n}(this, (function (exports,$) { 'use strict';\n\n$ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  subClass.__proto__ = superClass;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Util = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Private TransitionEnd Helpers\n   * ------------------------------------------------------------------------\n   */\n  var transition = false;\n  var MAX_UID = 1000000; // shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  function toType(obj) {\n    return {}.toString.call(obj).match(/\\s([a-zA-Z]+)/)[1].toLowerCase();\n  }\n\n  function getSpecialTransitionEndEvent() {\n    return {\n      bindType: transition.end,\n      delegateType: transition.end,\n      handle: function handle(event) {\n        if ($$$1(event.target).is(this)) {\n          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n        }\n\n        return undefined; // eslint-disable-line no-undefined\n      }\n    };\n  }\n\n  function transitionEndTest() {\n    if (window.QUnit) {\n      return false;\n    }\n\n    return {\n      end: 'transitionend'\n    };\n  }\n\n  function transitionEndEmulator(duration) {\n    var _this = this;\n\n    var called = false;\n    $$$1(this).one(Util.TRANSITION_END, function () {\n      called = true;\n    });\n    setTimeout(function () {\n      if (!called) {\n        Util.triggerTransitionEnd(_this);\n      }\n    }, duration);\n    return this;\n  }\n\n  function setTransitionEndSupport() {\n    transition = transitionEndTest();\n    $$$1.fn.emulateTransitionEnd = transitionEndEmulator;\n\n    if (Util.supportsTransitionEnd()) {\n      $$$1.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n    }\n  }\n\n  function escapeId(selector) {\n    // we escape IDs in case of special selectors (selector = '#myId:something')\n    // $.escapeSelector does not exist in jQuery < 3\n    selector = typeof $$$1.escapeSelector === 'function' ? $$$1.escapeSelector(selector).substr(1) : selector.replace(/(:|\\.|\\[|\\]|,|=|@)/g, '\\\\$1');\n    return selector;\n  }\n  /**\n   * --------------------------------------------------------------------------\n   * Public Util Api\n   * --------------------------------------------------------------------------\n   */\n\n\n  var Util = {\n    TRANSITION_END: 'bsTransitionEnd',\n    getUID: function getUID(prefix) {\n      do {\n        // eslint-disable-next-line no-bitwise\n        prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n      } while (document.getElementById(prefix));\n\n      return prefix;\n    },\n    getSelectorFromElement: function getSelectorFromElement(element) {\n      var selector = element.getAttribute('data-target');\n\n      if (!selector || selector === '#') {\n        selector = element.getAttribute('href') || '';\n      } // if it's an ID\n\n\n      if (selector.charAt(0) === '#') {\n        selector = escapeId(selector);\n      }\n\n      try {\n        var $selector = $$$1(document).find(selector);\n        return $selector.length > 0 ? selector : null;\n      } catch (error) {\n        return null;\n      }\n    },\n    reflow: function reflow(element) {\n      return element.offsetHeight;\n    },\n    triggerTransitionEnd: function triggerTransitionEnd(element) {\n      $$$1(element).trigger(transition.end);\n    },\n    supportsTransitionEnd: function supportsTransitionEnd() {\n      return Boolean(transition);\n    },\n    isElement: function isElement(obj) {\n      return (obj[0] || obj).nodeType;\n    },\n    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n      for (var property in configTypes) {\n        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n          var expectedTypes = configTypes[property];\n          var value = config[property];\n          var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n          if (!new RegExp(expectedTypes).test(valueType)) {\n            throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n          }\n        }\n      }\n    }\n  };\n  setTransitionEndSupport();\n  return Util;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Alert = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'alert';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.alert';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var TRANSITION_DURATION = 150;\n  var Selector = {\n    DISMISS: '[data-dismiss=\"alert\"]'\n  };\n  var Event = {\n    CLOSE: \"close\" + EVENT_KEY,\n    CLOSED: \"closed\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    ALERT: 'alert',\n    FADE: 'fade',\n    SHOW: 'show'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Alert =\n  /*#__PURE__*/\n  function () {\n    function Alert(element) {\n      this._element = element;\n    } // getters\n\n\n    var _proto = Alert.prototype;\n\n    // public\n    _proto.close = function close(element) {\n      element = element || this._element;\n\n      var rootElement = this._getRootElement(element);\n\n      var customEvent = this._triggerCloseEvent(rootElement);\n\n      if (customEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._removeElement(rootElement);\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1.removeData(this._element, DATA_KEY);\n      this._element = null;\n    }; // private\n\n\n    _proto._getRootElement = function _getRootElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      var parent = false;\n\n      if (selector) {\n        parent = $$$1(selector)[0];\n      }\n\n      if (!parent) {\n        parent = $$$1(element).closest(\".\" + ClassName.ALERT)[0];\n      }\n\n      return parent;\n    };\n\n    _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n      var closeEvent = $$$1.Event(Event.CLOSE);\n      $$$1(element).trigger(closeEvent);\n      return closeEvent;\n    };\n\n    _proto._removeElement = function _removeElement(element) {\n      var _this = this;\n\n      $$$1(element).removeClass(ClassName.SHOW);\n\n      if (!Util.supportsTransitionEnd() || !$$$1(element).hasClass(ClassName.FADE)) {\n        this._destroyElement(element);\n\n        return;\n      }\n\n      $$$1(element).one(Util.TRANSITION_END, function (event) {\n        return _this._destroyElement(element, event);\n      }).emulateTransitionEnd(TRANSITION_DURATION);\n    };\n\n    _proto._destroyElement = function _destroyElement(element) {\n      $$$1(element).detach().trigger(Event.CLOSED).remove();\n    }; // static\n\n\n    Alert._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $$$1(this);\n        var data = $element.data(DATA_KEY);\n\n        if (!data) {\n          data = new Alert(this);\n          $element.data(DATA_KEY, data);\n        }\n\n        if (config === 'close') {\n          data[config](this);\n        }\n      });\n    };\n\n    Alert._handleDismiss = function _handleDismiss(alertInstance) {\n      return function (event) {\n        if (event) {\n          event.preventDefault();\n        }\n\n        alertInstance.close(this);\n      };\n    };\n\n    _createClass(Alert, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }]);\n    return Alert;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = Alert._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Alert;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Alert._jQueryInterface;\n  };\n\n  return Alert;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Button = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'button';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.button';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var ClassName = {\n    ACTIVE: 'active',\n    BUTTON: 'btn',\n    FOCUS: 'focus'\n  };\n  var Selector = {\n    DATA_TOGGLE_CARROT: '[data-toggle^=\"button\"]',\n    DATA_TOGGLE: '[data-toggle=\"buttons\"]',\n    INPUT: 'input',\n    ACTIVE: '.active',\n    BUTTON: '.btn'\n  };\n  var Event = {\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY,\n    FOCUS_BLUR_DATA_API: \"focus\" + EVENT_KEY + DATA_API_KEY + \" \" + (\"blur\" + EVENT_KEY + DATA_API_KEY)\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Button =\n  /*#__PURE__*/\n  function () {\n    function Button(element) {\n      this._element = element;\n    } // getters\n\n\n    var _proto = Button.prototype;\n\n    // public\n    _proto.toggle = function toggle() {\n      var triggerChangeEvent = true;\n      var addAriaPressed = true;\n      var rootElement = $$$1(this._element).closest(Selector.DATA_TOGGLE)[0];\n\n      if (rootElement) {\n        var input = $$$1(this._element).find(Selector.INPUT)[0];\n\n        if (input) {\n          if (input.type === 'radio') {\n            if (input.checked && $$$1(this._element).hasClass(ClassName.ACTIVE)) {\n              triggerChangeEvent = false;\n            } else {\n              var activeElement = $$$1(rootElement).find(Selector.ACTIVE)[0];\n\n              if (activeElement) {\n                $$$1(activeElement).removeClass(ClassName.ACTIVE);\n              }\n            }\n          }\n\n          if (triggerChangeEvent) {\n            if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {\n              return;\n            }\n\n            input.checked = !$$$1(this._element).hasClass(ClassName.ACTIVE);\n            $$$1(input).trigger('change');\n          }\n\n          input.focus();\n          addAriaPressed = false;\n        }\n      }\n\n      if (addAriaPressed) {\n        this._element.setAttribute('aria-pressed', !$$$1(this._element).hasClass(ClassName.ACTIVE));\n      }\n\n      if (triggerChangeEvent) {\n        $$$1(this._element).toggleClass(ClassName.ACTIVE);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1.removeData(this._element, DATA_KEY);\n      this._element = null;\n    }; // static\n\n\n    Button._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $$$1(this).data(DATA_KEY);\n\n        if (!data) {\n          data = new Button(this);\n          $$$1(this).data(DATA_KEY, data);\n        }\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Button, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }]);\n    return Button;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\n    event.preventDefault();\n    var button = event.target;\n\n    if (!$$$1(button).hasClass(ClassName.BUTTON)) {\n      button = $$$1(button).closest(Selector.BUTTON);\n    }\n\n    Button._jQueryInterface.call($$$1(button), 'toggle');\n  }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\n    var button = $$$1(event.target).closest(Selector.BUTTON)[0];\n    $$$1(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = Button._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Button;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Button._jQueryInterface;\n  };\n\n  return Button;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Carousel = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'carousel';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.carousel';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var TRANSITION_DURATION = 600;\n  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n  var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  var Default = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true\n  };\n  var DefaultType = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean'\n  };\n  var Direction = {\n    NEXT: 'next',\n    PREV: 'prev',\n    LEFT: 'left',\n    RIGHT: 'right'\n  };\n  var Event = {\n    SLIDE: \"slide\" + EVENT_KEY,\n    SLID: \"slid\" + EVENT_KEY,\n    KEYDOWN: \"keydown\" + EVENT_KEY,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY,\n    TOUCHEND: \"touchend\" + EVENT_KEY,\n    LOAD_DATA_API: \"load\" + EVENT_KEY + DATA_API_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    CAROUSEL: 'carousel',\n    ACTIVE: 'active',\n    SLIDE: 'slide',\n    RIGHT: 'carousel-item-right',\n    LEFT: 'carousel-item-left',\n    NEXT: 'carousel-item-next',\n    PREV: 'carousel-item-prev',\n    ITEM: 'carousel-item'\n  };\n  var Selector = {\n    ACTIVE: '.active',\n    ACTIVE_ITEM: '.active.carousel-item',\n    ITEM: '.carousel-item',\n    NEXT_PREV: '.carousel-item-next, .carousel-item-prev',\n    INDICATORS: '.carousel-indicators',\n    DATA_SLIDE: '[data-slide], [data-slide-to]',\n    DATA_RIDE: '[data-ride=\"carousel\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Carousel =\n  /*#__PURE__*/\n  function () {\n    function Carousel(element, config) {\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this._config = this._getConfig(config);\n      this._element = $$$1(element)[0];\n      this._indicatorsElement = $$$1(this._element).find(Selector.INDICATORS)[0];\n\n      this._addEventListeners();\n    } // getters\n\n\n    var _proto = Carousel.prototype;\n\n    // public\n    _proto.next = function next() {\n      if (!this._isSliding) {\n        this._slide(Direction.NEXT);\n      }\n    };\n\n    _proto.nextWhenVisible = function nextWhenVisible() {\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && $$$1(this._element).is(':visible') && $$$1(this._element).css('visibility') !== 'hidden') {\n        this.next();\n      }\n    };\n\n    _proto.prev = function prev() {\n      if (!this._isSliding) {\n        this._slide(Direction.PREV);\n      }\n    };\n\n    _proto.pause = function pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if ($$$1(this._element).find(Selector.NEXT_PREV)[0] && Util.supportsTransitionEnd()) {\n        Util.triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    };\n\n    _proto.cycle = function cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config.interval && !this._isPaused) {\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    };\n\n    _proto.to = function to(index) {\n      var _this = this;\n\n      this._activeElement = $$$1(this._element).find(Selector.ACTIVE_ITEM)[0];\n\n      var activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        $$$1(this._element).one(Event.SLID, function () {\n          return _this.to(index);\n        });\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;\n\n      this._slide(direction, this._items[index]);\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1(this._element).off(EVENT_KEY);\n      $$$1.removeData(this._element, DATA_KEY);\n      this._items = null;\n      this._config = null;\n      this._element = null;\n      this._interval = null;\n      this._isPaused = null;\n      this._isSliding = null;\n      this._activeElement = null;\n      this._indicatorsElement = null;\n    }; // private\n\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, Default, config);\n      Util.typeCheckConfig(NAME, config, DefaultType);\n      return config;\n    };\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this2 = this;\n\n      if (this._config.keyboard) {\n        $$$1(this._element).on(Event.KEYDOWN, function (event) {\n          return _this2._keydown(event);\n        });\n      }\n\n      if (this._config.pause === 'hover') {\n        $$$1(this._element).on(Event.MOUSEENTER, function (event) {\n          return _this2.pause(event);\n        }).on(Event.MOUSELEAVE, function (event) {\n          return _this2.cycle(event);\n        });\n\n        if ('ontouchstart' in document.documentElement) {\n          // if it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          $$$1(this._element).on(Event.TOUCHEND, function () {\n            _this2.pause();\n\n            if (_this2.touchTimeout) {\n              clearTimeout(_this2.touchTimeout);\n            }\n\n            _this2.touchTimeout = setTimeout(function (event) {\n              return _this2.cycle(event);\n            }, TOUCHEVENT_COMPAT_WAIT + _this2._config.interval);\n          });\n        }\n      }\n    };\n\n    _proto._keydown = function _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      switch (event.which) {\n        case ARROW_LEFT_KEYCODE:\n          event.preventDefault();\n          this.prev();\n          break;\n\n        case ARROW_RIGHT_KEYCODE:\n          event.preventDefault();\n          this.next();\n          break;\n\n        default:\n          return;\n      }\n    };\n\n    _proto._getItemIndex = function _getItemIndex(element) {\n      this._items = $$$1.makeArray($$$1(element).parent().find(Selector.ITEM));\n      return this._items.indexOf(element);\n    };\n\n    _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n      var isNextDirection = direction === Direction.NEXT;\n      var isPrevDirection = direction === Direction.PREV;\n\n      var activeIndex = this._getItemIndex(activeElement);\n\n      var lastItemIndex = this._items.length - 1;\n      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n      if (isGoingToWrap && !this._config.wrap) {\n        return activeElement;\n      }\n\n      var delta = direction === Direction.PREV ? -1 : 1;\n      var itemIndex = (activeIndex + delta) % this._items.length;\n      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n    };\n\n    _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      var targetIndex = this._getItemIndex(relatedTarget);\n\n      var fromIndex = this._getItemIndex($$$1(this._element).find(Selector.ACTIVE_ITEM)[0]);\n\n      var slideEvent = $$$1.Event(Event.SLIDE, {\n        relatedTarget: relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n      $$$1(this._element).trigger(slideEvent);\n      return slideEvent;\n    };\n\n    _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        $$$1(this._indicatorsElement).find(Selector.ACTIVE).removeClass(ClassName.ACTIVE);\n\n        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n        if (nextIndicator) {\n          $$$1(nextIndicator).addClass(ClassName.ACTIVE);\n        }\n      }\n    };\n\n    _proto._slide = function _slide(direction, element) {\n      var _this3 = this;\n\n      var activeElement = $$$1(this._element).find(Selector.ACTIVE_ITEM)[0];\n\n      var activeElementIndex = this._getItemIndex(activeElement);\n\n      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n      var nextElementIndex = this._getItemIndex(nextElement);\n\n      var isCycling = Boolean(this._interval);\n      var directionalClassName;\n      var orderClassName;\n      var eventDirectionName;\n\n      if (direction === Direction.NEXT) {\n        directionalClassName = ClassName.LEFT;\n        orderClassName = ClassName.NEXT;\n        eventDirectionName = Direction.LEFT;\n      } else {\n        directionalClassName = ClassName.RIGHT;\n        orderClassName = ClassName.PREV;\n        eventDirectionName = Direction.RIGHT;\n      }\n\n      if (nextElement && $$$1(nextElement).hasClass(ClassName.ACTIVE)) {\n        this._isSliding = false;\n        return;\n      }\n\n      var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      var slidEvent = $$$1.Event(Event.SLID, {\n        relatedTarget: nextElement,\n        direction: eventDirectionName,\n        from: activeElementIndex,\n        to: nextElementIndex\n      });\n\n      if (Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.SLIDE)) {\n        $$$1(nextElement).addClass(orderClassName);\n        Util.reflow(nextElement);\n        $$$1(activeElement).addClass(directionalClassName);\n        $$$1(nextElement).addClass(directionalClassName);\n        $$$1(activeElement).one(Util.TRANSITION_END, function () {\n          $$$1(nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(ClassName.ACTIVE);\n          $$$1(activeElement).removeClass(ClassName.ACTIVE + \" \" + orderClassName + \" \" + directionalClassName);\n          _this3._isSliding = false;\n          setTimeout(function () {\n            return $$$1(_this3._element).trigger(slidEvent);\n          }, 0);\n        }).emulateTransitionEnd(TRANSITION_DURATION);\n      } else {\n        $$$1(activeElement).removeClass(ClassName.ACTIVE);\n        $$$1(nextElement).addClass(ClassName.ACTIVE);\n        this._isSliding = false;\n        $$$1(this._element).trigger(slidEvent);\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    }; // static\n\n\n    Carousel._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $$$1(this).data(DATA_KEY);\n\n        var _config = _extends({}, Default, $$$1(this).data());\n\n        if (typeof config === 'object') {\n          _config = _extends({}, _config, config);\n        }\n\n        var action = typeof config === 'string' ? config : _config.slide;\n\n        if (!data) {\n          data = new Carousel(this, _config);\n          $$$1(this).data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'number') {\n          data.to(config);\n        } else if (typeof action === 'string') {\n          if (typeof data[action] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + action + \"\\\"\");\n          }\n\n          data[action]();\n        } else if (_config.interval) {\n          data.pause();\n          data.cycle();\n        }\n      });\n    };\n\n    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n      var selector = Util.getSelectorFromElement(this);\n\n      if (!selector) {\n        return;\n      }\n\n      var target = $$$1(selector)[0];\n\n      if (!target || !$$$1(target).hasClass(ClassName.CAROUSEL)) {\n        return;\n      }\n\n      var config = _extends({}, $$$1(target).data(), $$$1(this).data());\n      var slideIndex = this.getAttribute('data-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel._jQueryInterface.call($$$1(target), config);\n\n      if (slideIndex) {\n        $$$1(target).data(DATA_KEY).to(slideIndex);\n      }\n\n      event.preventDefault();\n    };\n\n    _createClass(Carousel, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n    return Carousel;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);\n  $$$1(window).on(Event.LOAD_DATA_API, function () {\n    $$$1(Selector.DATA_RIDE).each(function () {\n      var $carousel = $$$1(this);\n\n      Carousel._jQueryInterface.call($carousel, $carousel.data());\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = Carousel._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Carousel;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Carousel._jQueryInterface;\n  };\n\n  return Carousel;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Collapse = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'collapse';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.collapse';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var TRANSITION_DURATION = 600;\n  var Default = {\n    toggle: true,\n    parent: ''\n  };\n  var DefaultType = {\n    toggle: 'boolean',\n    parent: '(string|element)'\n  };\n  var Event = {\n    SHOW: \"show\" + EVENT_KEY,\n    SHOWN: \"shown\" + EVENT_KEY,\n    HIDE: \"hide\" + EVENT_KEY,\n    HIDDEN: \"hidden\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    SHOW: 'show',\n    COLLAPSE: 'collapse',\n    COLLAPSING: 'collapsing',\n    COLLAPSED: 'collapsed'\n  };\n  var Dimension = {\n    WIDTH: 'width',\n    HEIGHT: 'height'\n  };\n  var Selector = {\n    ACTIVES: '.show, .collapsing',\n    DATA_TOGGLE: '[data-toggle=\"collapse\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Collapse =\n  /*#__PURE__*/\n  function () {\n    function Collapse(element, config) {\n      this._isTransitioning = false;\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._triggerArray = $$$1.makeArray($$$1(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n      var tabToggles = $$$1(Selector.DATA_TOGGLE);\n\n      for (var i = 0; i < tabToggles.length; i++) {\n        var elem = tabToggles[i];\n        var selector = Util.getSelectorFromElement(elem);\n\n        if (selector !== null && $$$1(selector).filter(element).length > 0) {\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._parent = this._config.parent ? this._getParent() : null;\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // getters\n\n\n    var _proto = Collapse.prototype;\n\n    // public\n    _proto.toggle = function toggle() {\n      if ($$$1(this._element).hasClass(ClassName.SHOW)) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._isTransitioning || $$$1(this._element).hasClass(ClassName.SHOW)) {\n        return;\n      }\n\n      var actives;\n      var activesData;\n\n      if (this._parent) {\n        actives = $$$1.makeArray($$$1(this._parent).children().children(Selector.ACTIVES));\n\n        if (!actives.length) {\n          actives = null;\n        }\n      }\n\n      if (actives) {\n        activesData = $$$1(actives).data(DATA_KEY);\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      var startEvent = $$$1.Event(Event.SHOW);\n      $$$1(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (actives) {\n        Collapse._jQueryInterface.call($$$1(actives), 'hide');\n\n        if (!activesData) {\n          $$$1(actives).data(DATA_KEY, null);\n        }\n      }\n\n      var dimension = this._getDimension();\n\n      $$$1(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);\n      this._element.style[dimension] = 0;\n\n      if (this._triggerArray.length) {\n        $$$1(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        $$$1(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);\n        _this._element.style[dimension] = '';\n\n        _this.setTransitioning(false);\n\n        $$$1(_this._element).trigger(Event.SHOWN);\n      };\n\n      if (!Util.supportsTransitionEnd()) {\n        complete();\n        return;\n      }\n\n      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      var scrollSize = \"scroll\" + capitalizedDimension;\n      $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\n      this._element.style[dimension] = this._element[scrollSize] + \"px\";\n    };\n\n    _proto.hide = function hide() {\n      var _this2 = this;\n\n      if (this._isTransitioning || !$$$1(this._element).hasClass(ClassName.SHOW)) {\n        return;\n      }\n\n      var startEvent = $$$1.Event(Event.HIDE);\n      $$$1(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      var dimension = this._getDimension();\n\n      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n      Util.reflow(this._element);\n      $$$1(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);\n\n      if (this._triggerArray.length) {\n        for (var i = 0; i < this._triggerArray.length; i++) {\n          var trigger = this._triggerArray[i];\n          var selector = Util.getSelectorFromElement(trigger);\n\n          if (selector !== null) {\n            var $elem = $$$1(selector);\n\n            if (!$elem.hasClass(ClassName.SHOW)) {\n              $$$1(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);\n            }\n          }\n        }\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        _this2.setTransitioning(false);\n\n        $$$1(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);\n      };\n\n      this._element.style[dimension] = '';\n\n      if (!Util.supportsTransitionEnd()) {\n        complete();\n        return;\n      }\n\n      $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\n    };\n\n    _proto.setTransitioning = function setTransitioning(isTransitioning) {\n      this._isTransitioning = isTransitioning;\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1.removeData(this._element, DATA_KEY);\n      this._config = null;\n      this._parent = null;\n      this._element = null;\n      this._triggerArray = null;\n      this._isTransitioning = null;\n    }; // private\n\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, Default, config);\n      config.toggle = Boolean(config.toggle); // coerce string values\n\n      Util.typeCheckConfig(NAME, config, DefaultType);\n      return config;\n    };\n\n    _proto._getDimension = function _getDimension() {\n      var hasWidth = $$$1(this._element).hasClass(Dimension.WIDTH);\n      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n    };\n\n    _proto._getParent = function _getParent() {\n      var _this3 = this;\n\n      var parent = null;\n\n      if (Util.isElement(this._config.parent)) {\n        parent = this._config.parent; // it's a jQuery object\n\n        if (typeof this._config.parent.jquery !== 'undefined') {\n          parent = this._config.parent[0];\n        }\n      } else {\n        parent = $$$1(this._config.parent)[0];\n      }\n\n      var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n      $$$1(parent).find(selector).each(function (i, element) {\n        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n      });\n      return parent;\n    };\n\n    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n      if (element) {\n        var isOpen = $$$1(element).hasClass(ClassName.SHOW);\n\n        if (triggerArray.length) {\n          $$$1(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n        }\n      }\n    }; // static\n\n\n    Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      return selector ? $$$1(selector)[0] : null;\n    };\n\n    Collapse._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $$$1(this);\n        var data = $this.data(DATA_KEY);\n\n        var _config = _extends({}, Default, $this.data(), typeof config === 'object' && config);\n\n        if (!data && _config.toggle && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        if (!data) {\n          data = new Collapse(this, _config);\n          $this.data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Collapse, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n    return Collapse;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.currentTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    var $trigger = $$$1(this);\n    var selector = Util.getSelectorFromElement(this);\n    $$$1(selector).each(function () {\n      var $target = $$$1(this);\n      var data = $target.data(DATA_KEY);\n      var config = data ? 'toggle' : $trigger.data();\n\n      Collapse._jQueryInterface.call($target, config);\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = Collapse._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Collapse;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Collapse._jQueryInterface;\n  };\n\n  return Collapse;\n}($);\n\n/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.12.9\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\nvar longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\nvar timeoutDuration = 0;\nfor (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n  if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n    timeoutDuration = 1;\n    break;\n  }\n}\n\nfunction microtaskDebounce(fn) {\n  var called = false;\n  return function () {\n    if (called) {\n      return;\n    }\n    called = true;\n    window.Promise.resolve().then(function () {\n      called = false;\n      fn();\n    });\n  };\n}\n\nfunction taskDebounce(fn) {\n  var scheduled = false;\n  return function () {\n    if (!scheduled) {\n      scheduled = true;\n      setTimeout(function () {\n        scheduled = false;\n        fn();\n      }, timeoutDuration);\n    }\n  };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nfunction isFunction(functionToCheck) {\n  var getType = {};\n  return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nfunction getStyleComputedProperty(element, property) {\n  if (element.nodeType !== 1) {\n    return [];\n  }\n  // NOTE: 1 DOM access here\n  var css = getComputedStyle(element, null);\n  return property ? css[property] : css;\n}\n\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nfunction getParentNode(element) {\n  if (element.nodeName === 'HTML') {\n    return element;\n  }\n  return element.parentNode || element.host;\n}\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nfunction getScrollParent(element) {\n  // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n  if (!element) {\n    return document.body;\n  }\n\n  switch (element.nodeName) {\n    case 'HTML':\n    case 'BODY':\n      return element.ownerDocument.body;\n    case '#document':\n      return element.body;\n  }\n\n  // Firefox want us to check `-x` and `-y` variations as well\n\n  var _getStyleComputedProp = getStyleComputedProperty(element),\n      overflow = _getStyleComputedProp.overflow,\n      overflowX = _getStyleComputedProp.overflowX,\n      overflowY = _getStyleComputedProp.overflowY;\n\n  if (/(auto|scroll)/.test(overflow + overflowY + overflowX)) {\n    return element;\n  }\n\n  return getScrollParent(getParentNode(element));\n}\n\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nfunction getOffsetParent(element) {\n  // NOTE: 1 DOM access here\n  var offsetParent = element && element.offsetParent;\n  var nodeName = offsetParent && offsetParent.nodeName;\n\n  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n    if (element) {\n      return element.ownerDocument.documentElement;\n    }\n\n    return document.documentElement;\n  }\n\n  // .offsetParent will return the closest TD or TABLE in case\n  // no offsetParent is present, I hate this job...\n  if (['TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n    return getOffsetParent(offsetParent);\n  }\n\n  return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n  var nodeName = element.nodeName;\n\n  if (nodeName === 'BODY') {\n    return false;\n  }\n  return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nfunction getRoot(node) {\n  if (node.parentNode !== null) {\n    return getRoot(node.parentNode);\n  }\n\n  return node;\n}\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nfunction findCommonOffsetParent(element1, element2) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n  if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n    return document.documentElement;\n  }\n\n  // Here we make sure to give as \"start\" the element that comes first in the DOM\n  var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n  var start = order ? element1 : element2;\n  var end = order ? element2 : element1;\n\n  // Get common ancestor container\n  var range = document.createRange();\n  range.setStart(start, 0);\n  range.setEnd(end, 0);\n  var commonAncestorContainer = range.commonAncestorContainer;\n\n  // Both nodes are inside #document\n\n  if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n    if (isOffsetContainer(commonAncestorContainer)) {\n      return commonAncestorContainer;\n    }\n\n    return getOffsetParent(commonAncestorContainer);\n  }\n\n  // one of the nodes is inside shadowDOM, find which one\n  var element1root = getRoot(element1);\n  if (element1root.host) {\n    return findCommonOffsetParent(element1root.host, element2);\n  } else {\n    return findCommonOffsetParent(element1, getRoot(element2).host);\n  }\n}\n\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nfunction getScroll(element) {\n  var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n  var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n  var nodeName = element.nodeName;\n\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    var html = element.ownerDocument.documentElement;\n    var scrollingElement = element.ownerDocument.scrollingElement || html;\n    return scrollingElement[upperSide];\n  }\n\n  return element[upperSide];\n}\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nfunction includeScroll(rect, element) {\n  var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n  var scrollTop = getScroll(element, 'top');\n  var scrollLeft = getScroll(element, 'left');\n  var modifier = subtract ? -1 : 1;\n  rect.top += scrollTop * modifier;\n  rect.bottom += scrollTop * modifier;\n  rect.left += scrollLeft * modifier;\n  rect.right += scrollLeft * modifier;\n  return rect;\n}\n\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nfunction getBordersSize(styles, axis) {\n  var sideA = axis === 'x' ? 'Left' : 'Top';\n  var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n  return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\n}\n\n/**\n * Tells if you are running Internet Explorer 10\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean} isIE10\n */\nvar isIE10 = undefined;\n\nvar isIE10$1 = function () {\n  if (isIE10 === undefined) {\n    isIE10 = navigator.appVersion.indexOf('MSIE 10') !== -1;\n  }\n  return isIE10;\n};\n\nfunction getSize(axis, body, html, computedStyle) {\n  return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE10$1() ? html['offset' + axis] + computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')] + computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')] : 0);\n}\n\nfunction getWindowSizes() {\n  var body = document.body;\n  var html = document.documentElement;\n  var computedStyle = isIE10$1() && getComputedStyle(html);\n\n  return {\n    height: getSize('Height', body, html, computedStyle),\n    width: getSize('Width', body, html, computedStyle)\n  };\n}\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\n\n\n\n\nvar defineProperty = function (obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n};\n\nvar _extends$1 = Object.assign || function (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n\n    for (var key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }\n\n  return target;\n};\n\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nfunction getClientRect(offsets) {\n  return _extends$1({}, offsets, {\n    right: offsets.left + offsets.width,\n    bottom: offsets.top + offsets.height\n  });\n}\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nfunction getBoundingClientRect(element) {\n  var rect = {};\n\n  // IE10 10 FIX: Please, don't ask, the element isn't\n  // considered in DOM in some circumstances...\n  // This isn't reproducible in IE10 compatibility mode of IE11\n  if (isIE10$1()) {\n    try {\n      rect = element.getBoundingClientRect();\n      var scrollTop = getScroll(element, 'top');\n      var scrollLeft = getScroll(element, 'left');\n      rect.top += scrollTop;\n      rect.left += scrollLeft;\n      rect.bottom += scrollTop;\n      rect.right += scrollLeft;\n    } catch (err) {}\n  } else {\n    rect = element.getBoundingClientRect();\n  }\n\n  var result = {\n    left: rect.left,\n    top: rect.top,\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top\n  };\n\n  // subtract scrollbar size from sizes\n  var sizes = element.nodeName === 'HTML' ? getWindowSizes() : {};\n  var width = sizes.width || element.clientWidth || result.right - result.left;\n  var height = sizes.height || element.clientHeight || result.bottom - result.top;\n\n  var horizScrollbar = element.offsetWidth - width;\n  var vertScrollbar = element.offsetHeight - height;\n\n  // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n  // we make this check conditional for performance reasons\n  if (horizScrollbar || vertScrollbar) {\n    var styles = getStyleComputedProperty(element);\n    horizScrollbar -= getBordersSize(styles, 'x');\n    vertScrollbar -= getBordersSize(styles, 'y');\n\n    result.width -= horizScrollbar;\n    result.height -= vertScrollbar;\n  }\n\n  return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n  var isIE10 = isIE10$1();\n  var isHTML = parent.nodeName === 'HTML';\n  var childrenRect = getBoundingClientRect(children);\n  var parentRect = getBoundingClientRect(parent);\n  var scrollParent = getScrollParent(children);\n\n  var styles = getStyleComputedProperty(parent);\n  var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\n  var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\n\n  var offsets = getClientRect({\n    top: childrenRect.top - parentRect.top - borderTopWidth,\n    left: childrenRect.left - parentRect.left - borderLeftWidth,\n    width: childrenRect.width,\n    height: childrenRect.height\n  });\n  offsets.marginTop = 0;\n  offsets.marginLeft = 0;\n\n  // Subtract margins of documentElement in case it's being used as parent\n  // we do this only on HTML because it's the only element that behaves\n  // differently when margins are applied to it. The margins are included in\n  // the box of the documentElement, in the other cases not.\n  if (!isIE10 && isHTML) {\n    var marginTop = parseFloat(styles.marginTop, 10);\n    var marginLeft = parseFloat(styles.marginLeft, 10);\n\n    offsets.top -= borderTopWidth - marginTop;\n    offsets.bottom -= borderTopWidth - marginTop;\n    offsets.left -= borderLeftWidth - marginLeft;\n    offsets.right -= borderLeftWidth - marginLeft;\n\n    // Attach marginTop and marginLeft because in some circumstances we may need them\n    offsets.marginTop = marginTop;\n    offsets.marginLeft = marginLeft;\n  }\n\n  if (isIE10 ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n    offsets = includeScroll(offsets, parent);\n  }\n\n  return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n  var html = element.ownerDocument.documentElement;\n  var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n  var width = Math.max(html.clientWidth, window.innerWidth || 0);\n  var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n  var scrollTop = getScroll(html);\n  var scrollLeft = getScroll(html, 'left');\n\n  var offset = {\n    top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n    left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n    width: width,\n    height: height\n  };\n\n  return getClientRect(offset);\n}\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nfunction isFixed(element) {\n  var nodeName = element.nodeName;\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    return false;\n  }\n  if (getStyleComputedProperty(element, 'position') === 'fixed') {\n    return true;\n  }\n  return isFixed(getParentNode(element));\n}\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @returns {Object} Coordinates of the boundaries\n */\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n  // NOTE: 1 DOM access here\n  var boundaries = { top: 0, left: 0 };\n  var offsetParent = findCommonOffsetParent(popper, reference);\n\n  // Handle viewport case\n  if (boundariesElement === 'viewport') {\n    boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent);\n  } else {\n    // Handle other cases based on DOM element used as boundaries\n    var boundariesNode = void 0;\n    if (boundariesElement === 'scrollParent') {\n      boundariesNode = getScrollParent(getParentNode(reference));\n      if (boundariesNode.nodeName === 'BODY') {\n        boundariesNode = popper.ownerDocument.documentElement;\n      }\n    } else if (boundariesElement === 'window') {\n      boundariesNode = popper.ownerDocument.documentElement;\n    } else {\n      boundariesNode = boundariesElement;\n    }\n\n    var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent);\n\n    // In case of HTML, we need a different computation\n    if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n      var _getWindowSizes = getWindowSizes(),\n          height = _getWindowSizes.height,\n          width = _getWindowSizes.width;\n\n      boundaries.top += offsets.top - offsets.marginTop;\n      boundaries.bottom = height + offsets.top;\n      boundaries.left += offsets.left - offsets.marginLeft;\n      boundaries.right = width + offsets.left;\n    } else {\n      // for all the other DOM elements, this one is good\n      boundaries = offsets;\n    }\n  }\n\n  // Add paddings\n  boundaries.left += padding;\n  boundaries.top += padding;\n  boundaries.right -= padding;\n  boundaries.bottom -= padding;\n\n  return boundaries;\n}\n\nfunction getArea(_ref) {\n  var width = _ref.width,\n      height = _ref.height;\n\n  return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n  var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n  if (placement.indexOf('auto') === -1) {\n    return placement;\n  }\n\n  var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n  var rects = {\n    top: {\n      width: boundaries.width,\n      height: refRect.top - boundaries.top\n    },\n    right: {\n      width: boundaries.right - refRect.right,\n      height: boundaries.height\n    },\n    bottom: {\n      width: boundaries.width,\n      height: boundaries.bottom - refRect.bottom\n    },\n    left: {\n      width: refRect.left - boundaries.left,\n      height: boundaries.height\n    }\n  };\n\n  var sortedAreas = Object.keys(rects).map(function (key) {\n    return _extends$1({\n      key: key\n    }, rects[key], {\n      area: getArea(rects[key])\n    });\n  }).sort(function (a, b) {\n    return b.area - a.area;\n  });\n\n  var filteredAreas = sortedAreas.filter(function (_ref2) {\n    var width = _ref2.width,\n        height = _ref2.height;\n    return width >= popper.clientWidth && height >= popper.clientHeight;\n  });\n\n  var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n  var variation = placement.split('-')[1];\n\n  return computedPlacement + (variation ? '-' + variation : '');\n}\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nfunction getReferenceOffsets(state, popper, reference) {\n  var commonOffsetParent = findCommonOffsetParent(popper, reference);\n  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent);\n}\n\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nfunction getOuterSizes(element) {\n  var styles = getComputedStyle(element);\n  var x = parseFloat(styles.marginTop) + parseFloat(styles.marginBottom);\n  var y = parseFloat(styles.marginLeft) + parseFloat(styles.marginRight);\n  var result = {\n    width: element.offsetWidth + y,\n    height: element.offsetHeight + x\n  };\n  return result;\n}\n\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nfunction getOppositePlacement(placement) {\n  var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n  return placement.replace(/left|right|bottom|top/g, function (matched) {\n    return hash[matched];\n  });\n}\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n  placement = placement.split('-')[0];\n\n  // Get popper node sizes\n  var popperRect = getOuterSizes(popper);\n\n  // Add position, width and height to our offsets object\n  var popperOffsets = {\n    width: popperRect.width,\n    height: popperRect.height\n  };\n\n  // depending by the popper placement we have to compute its offsets slightly differently\n  var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n  var mainSide = isHoriz ? 'top' : 'left';\n  var secondarySide = isHoriz ? 'left' : 'top';\n  var measurement = isHoriz ? 'height' : 'width';\n  var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n  popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n  if (placement === secondarySide) {\n    popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n  } else {\n    popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n  }\n\n  return popperOffsets;\n}\n\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction find(arr, check) {\n  // use native find if supported\n  if (Array.prototype.find) {\n    return arr.find(check);\n  }\n\n  // use `filter` to obtain the same behavior of `find`\n  return arr.filter(check)[0];\n}\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction findIndex(arr, prop, value) {\n  // use native findIndex if supported\n  if (Array.prototype.findIndex) {\n    return arr.findIndex(function (cur) {\n      return cur[prop] === value;\n    });\n  }\n\n  // use `find` + `indexOf` if `findIndex` isn't supported\n  var match = find(arr, function (obj) {\n    return obj[prop] === value;\n  });\n  return arr.indexOf(match);\n}\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nfunction runModifiers(modifiers, data, ends) {\n  var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n  modifiersToRun.forEach(function (modifier) {\n    if (modifier['function']) {\n      // eslint-disable-line dot-notation\n      console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n    }\n    var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n    if (modifier.enabled && isFunction(fn)) {\n      // Add properties to offsets to make them a complete clientRect object\n      // we do this before each modifier to make sure the previous one doesn't\n      // mess with these values\n      data.offsets.popper = getClientRect(data.offsets.popper);\n      data.offsets.reference = getClientRect(data.offsets.reference);\n\n      data = fn(data, modifier);\n    }\n  });\n\n  return data;\n}\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nfunction update() {\n  // if popper is destroyed, don't perform any further update\n  if (this.state.isDestroyed) {\n    return;\n  }\n\n  var data = {\n    instance: this,\n    styles: {},\n    arrowStyles: {},\n    attributes: {},\n    flipped: false,\n    offsets: {}\n  };\n\n  // compute reference element offsets\n  data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference);\n\n  // compute auto placement, store placement inside the data object,\n  // modifiers will be able to edit `placement` if needed\n  // and refer to originalPlacement to know the original value\n  data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n  // store the computed placement inside `originalPlacement`\n  data.originalPlacement = data.placement;\n\n  // compute the popper offsets\n  data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n  data.offsets.popper.position = 'absolute';\n\n  // run the modifiers\n  data = runModifiers(this.modifiers, data);\n\n  // the first `update` will call `onCreate` callback\n  // the other ones will call `onUpdate` callback\n  if (!this.state.isCreated) {\n    this.state.isCreated = true;\n    this.options.onCreate(data);\n  } else {\n    this.options.onUpdate(data);\n  }\n}\n\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nfunction isModifierEnabled(modifiers, modifierName) {\n  return modifiers.some(function (_ref) {\n    var name = _ref.name,\n        enabled = _ref.enabled;\n    return enabled && name === modifierName;\n  });\n}\n\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nfunction getSupportedPropertyName(property) {\n  var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n  var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n  for (var i = 0; i < prefixes.length - 1; i++) {\n    var prefix = prefixes[i];\n    var toCheck = prefix ? '' + prefix + upperProp : property;\n    if (typeof document.body.style[toCheck] !== 'undefined') {\n      return toCheck;\n    }\n  }\n  return null;\n}\n\n/**\n * Destroy the popper\n * @method\n * @memberof Popper\n */\nfunction destroy() {\n  this.state.isDestroyed = true;\n\n  // touch DOM only if `applyStyle` modifier is enabled\n  if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n    this.popper.removeAttribute('x-placement');\n    this.popper.style.left = '';\n    this.popper.style.position = '';\n    this.popper.style.top = '';\n    this.popper.style[getSupportedPropertyName('transform')] = '';\n  }\n\n  this.disableEventListeners();\n\n  // remove the popper if user explicity asked for the deletion on destroy\n  // do not use `remove` because IE11 doesn't support it\n  if (this.options.removeOnDestroy) {\n    this.popper.parentNode.removeChild(this.popper);\n  }\n  return this;\n}\n\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nfunction getWindow(element) {\n  var ownerDocument = element.ownerDocument;\n  return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n  var isBody = scrollParent.nodeName === 'BODY';\n  var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n  target.addEventListener(event, callback, { passive: true });\n\n  if (!isBody) {\n    attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n  }\n  scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction setupEventListeners(reference, options, state, updateBound) {\n  // Resize event listener on window\n  state.updateBound = updateBound;\n  getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n  // Scroll event listener on scroll parents\n  var scrollElement = getScrollParent(reference);\n  attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n  state.scrollElement = scrollElement;\n  state.eventsEnabled = true;\n\n  return state;\n}\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nfunction enableEventListeners() {\n  if (!this.state.eventsEnabled) {\n    this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n  }\n}\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction removeEventListeners(reference, state) {\n  // Remove resize event listener on window\n  getWindow(reference).removeEventListener('resize', state.updateBound);\n\n  // Remove scroll event listener on scroll parents\n  state.scrollParents.forEach(function (target) {\n    target.removeEventListener('scroll', state.updateBound);\n  });\n\n  // Reset state\n  state.updateBound = null;\n  state.scrollParents = [];\n  state.scrollElement = null;\n  state.eventsEnabled = false;\n  return state;\n}\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger onUpdate callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nfunction disableEventListeners() {\n  if (this.state.eventsEnabled) {\n    cancelAnimationFrame(this.scheduleUpdate);\n    this.state = removeEventListeners(this.reference, this.state);\n  }\n}\n\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nfunction isNumeric(n) {\n  return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setStyles(element, styles) {\n  Object.keys(styles).forEach(function (prop) {\n    var unit = '';\n    // add unit if the value is numeric and is one of the following\n    if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n      unit = 'px';\n    }\n    element.style[prop] = styles[prop] + unit;\n  });\n}\n\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setAttributes(element, attributes) {\n  Object.keys(attributes).forEach(function (prop) {\n    var value = attributes[prop];\n    if (value !== false) {\n      element.setAttribute(prop, attributes[prop]);\n    } else {\n      element.removeAttribute(prop);\n    }\n  });\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nfunction applyStyle(data) {\n  // any property present in `data.styles` will be applied to the popper,\n  // in this way we can make the 3rd party modifiers add custom styles to it\n  // Be aware, modifiers could override the properties defined in the previous\n  // lines of this modifier!\n  setStyles(data.instance.popper, data.styles);\n\n  // any property present in `data.attributes` will be applied to the popper,\n  // they will be set as HTML attributes of the element\n  setAttributes(data.instance.popper, data.attributes);\n\n  // if arrowElement is defined and arrowStyles has some properties\n  if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n    setStyles(data.arrowElement, data.arrowStyles);\n  }\n\n  return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper.\n * @param {Object} options - Popper.js options\n */\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n  // compute reference element offsets\n  var referenceOffsets = getReferenceOffsets(state, popper, reference);\n\n  // compute auto placement, store placement inside the data object,\n  // modifiers will be able to edit `placement` if needed\n  // and refer to originalPlacement to know the original value\n  var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n  popper.setAttribute('x-placement', placement);\n\n  // Apply `position` to popper before anything else because\n  // without the position applied we can't guarantee correct computations\n  setStyles(popper, { position: 'absolute' });\n\n  return options;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeStyle(data, options) {\n  var x = options.x,\n      y = options.y;\n  var popper = data.offsets.popper;\n\n  // Remove this legacy support in Popper.js v2\n\n  var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n    return modifier.name === 'applyStyle';\n  }).gpuAcceleration;\n  if (legacyGpuAccelerationOption !== undefined) {\n    console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n  }\n  var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n  var offsetParent = getOffsetParent(data.instance.popper);\n  var offsetParentRect = getBoundingClientRect(offsetParent);\n\n  // Styles\n  var styles = {\n    position: popper.position\n  };\n\n  // floor sides to avoid blurry text\n  var offsets = {\n    left: Math.floor(popper.left),\n    top: Math.floor(popper.top),\n    bottom: Math.floor(popper.bottom),\n    right: Math.floor(popper.right)\n  };\n\n  var sideA = x === 'bottom' ? 'top' : 'bottom';\n  var sideB = y === 'right' ? 'left' : 'right';\n\n  // if gpuAcceleration is set to `true` and transform is supported,\n  //  we use `translate3d` to apply the position to the popper we\n  // automatically use the supported prefixed version if needed\n  var prefixedProperty = getSupportedPropertyName('transform');\n\n  // now, let's make a step back and look at this code closely (wtf?)\n  // If the content of the popper grows once it's been positioned, it\n  // may happen that the popper gets misplaced because of the new content\n  // overflowing its reference element\n  // To avoid this problem, we provide two options (x and y), which allow\n  // the consumer to define the offset origin.\n  // If we position a popper on top of a reference element, we can set\n  // `x` to `top` to make the popper grow towards its top instead of\n  // its bottom.\n  var left = void 0,\n      top = void 0;\n  if (sideA === 'bottom') {\n    top = -offsetParentRect.height + offsets.bottom;\n  } else {\n    top = offsets.top;\n  }\n  if (sideB === 'right') {\n    left = -offsetParentRect.width + offsets.right;\n  } else {\n    left = offsets.left;\n  }\n  if (gpuAcceleration && prefixedProperty) {\n    styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n    styles[sideA] = 0;\n    styles[sideB] = 0;\n    styles.willChange = 'transform';\n  } else {\n    // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n    var invertTop = sideA === 'bottom' ? -1 : 1;\n    var invertLeft = sideB === 'right' ? -1 : 1;\n    styles[sideA] = top * invertTop;\n    styles[sideB] = left * invertLeft;\n    styles.willChange = sideA + ', ' + sideB;\n  }\n\n  // Attributes\n  var attributes = {\n    'x-placement': data.placement\n  };\n\n  // Update `data` attributes, styles and arrowStyles\n  data.attributes = _extends$1({}, attributes, data.attributes);\n  data.styles = _extends$1({}, styles, data.styles);\n  data.arrowStyles = _extends$1({}, data.offsets.arrow, data.arrowStyles);\n\n  return data;\n}\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n  var requesting = find(modifiers, function (_ref) {\n    var name = _ref.name;\n    return name === requestingName;\n  });\n\n  var isRequired = !!requesting && modifiers.some(function (modifier) {\n    return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n  });\n\n  if (!isRequired) {\n    var _requesting = '`' + requestingName + '`';\n    var requested = '`' + requestedName + '`';\n    console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n  }\n  return isRequired;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction arrow(data, options) {\n  var _data$offsets$arrow;\n\n  // arrow depends on keepTogether in order to work\n  if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n    return data;\n  }\n\n  var arrowElement = options.element;\n\n  // if arrowElement is a string, suppose it's a CSS selector\n  if (typeof arrowElement === 'string') {\n    arrowElement = data.instance.popper.querySelector(arrowElement);\n\n    // if arrowElement is not found, don't run the modifier\n    if (!arrowElement) {\n      return data;\n    }\n  } else {\n    // if the arrowElement isn't a query selector we must check that the\n    // provided DOM node is child of its popper node\n    if (!data.instance.popper.contains(arrowElement)) {\n      console.warn('WARNING: `arrow.element` must be child of its popper element!');\n      return data;\n    }\n  }\n\n  var placement = data.placement.split('-')[0];\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n\n  var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n  var len = isVertical ? 'height' : 'width';\n  var sideCapitalized = isVertical ? 'Top' : 'Left';\n  var side = sideCapitalized.toLowerCase();\n  var altSide = isVertical ? 'left' : 'top';\n  var opSide = isVertical ? 'bottom' : 'right';\n  var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n  //\n  // extends keepTogether behavior making sure the popper and its\n  // reference have enough pixels in conjuction\n  //\n\n  // top/left side\n  if (reference[opSide] - arrowElementSize < popper[side]) {\n    data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n  }\n  // bottom/right side\n  if (reference[side] + arrowElementSize > popper[opSide]) {\n    data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n  }\n  data.offsets.popper = getClientRect(data.offsets.popper);\n\n  // compute center of the popper\n  var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n  // Compute the sideValue using the updated popper offsets\n  // take popper margin in account because we don't have this info available\n  var css = getStyleComputedProperty(data.instance.popper);\n  var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\n  var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\n  var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n  // prevent arrowElement from being placed not contiguously to its popper\n  sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n  data.arrowElement = arrowElement;\n  data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n  return data;\n}\n\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nfunction getOppositeVariation(variation) {\n  if (variation === 'end') {\n    return 'start';\n  } else if (variation === 'start') {\n    return 'end';\n  }\n  return variation;\n}\n\n/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-right` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n// Get rid of `auto` `auto-start` and `auto-end`\nvar validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nfunction clockwise(placement) {\n  var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  var index = validPlacements.indexOf(placement);\n  var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n  return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n  FLIP: 'flip',\n  CLOCKWISE: 'clockwise',\n  COUNTERCLOCKWISE: 'counterclockwise'\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction flip(data, options) {\n  // if `inner` modifier is enabled, we can't use the `flip` modifier\n  if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n    return data;\n  }\n\n  if (data.flipped && data.placement === data.originalPlacement) {\n    // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n    return data;\n  }\n\n  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement);\n\n  var placement = data.placement.split('-')[0];\n  var placementOpposite = getOppositePlacement(placement);\n  var variation = data.placement.split('-')[1] || '';\n\n  var flipOrder = [];\n\n  switch (options.behavior) {\n    case BEHAVIORS.FLIP:\n      flipOrder = [placement, placementOpposite];\n      break;\n    case BEHAVIORS.CLOCKWISE:\n      flipOrder = clockwise(placement);\n      break;\n    case BEHAVIORS.COUNTERCLOCKWISE:\n      flipOrder = clockwise(placement, true);\n      break;\n    default:\n      flipOrder = options.behavior;\n  }\n\n  flipOrder.forEach(function (step, index) {\n    if (placement !== step || flipOrder.length === index + 1) {\n      return data;\n    }\n\n    placement = data.placement.split('-')[0];\n    placementOpposite = getOppositePlacement(placement);\n\n    var popperOffsets = data.offsets.popper;\n    var refOffsets = data.offsets.reference;\n\n    // using floor because the reference offsets may contain decimals we are not going to consider here\n    var floor = Math.floor;\n    var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n    var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n    var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n    var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n    var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n    var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n    // flip the variation if required\n    var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n    var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n    if (overlapsRef || overflowsBoundaries || flippedVariation) {\n      // this boolean to detect any flip loop\n      data.flipped = true;\n\n      if (overlapsRef || overflowsBoundaries) {\n        placement = flipOrder[index + 1];\n      }\n\n      if (flippedVariation) {\n        variation = getOppositeVariation(variation);\n      }\n\n      data.placement = placement + (variation ? '-' + variation : '');\n\n      // this object contains `position`, we want to preserve it along with\n      // any additional property we may add in the future\n      data.offsets.popper = _extends$1({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n      data = runModifiers(data.instance.modifiers, data, 'flip');\n    }\n  });\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction keepTogether(data) {\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n\n  var placement = data.placement.split('-')[0];\n  var floor = Math.floor;\n  var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n  var side = isVertical ? 'right' : 'bottom';\n  var opSide = isVertical ? 'left' : 'top';\n  var measurement = isVertical ? 'width' : 'height';\n\n  if (popper[side] < floor(reference[opSide])) {\n    data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n  }\n  if (popper[opSide] > floor(reference[side])) {\n    data.offsets.popper[opSide] = floor(reference[side]);\n  }\n\n  return data;\n}\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n  // separate value from unit\n  var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n  var value = +split[1];\n  var unit = split[2];\n\n  // If it's not a number it's an operator, I guess\n  if (!value) {\n    return str;\n  }\n\n  if (unit.indexOf('%') === 0) {\n    var element = void 0;\n    switch (unit) {\n      case '%p':\n        element = popperOffsets;\n        break;\n      case '%':\n      case '%r':\n      default:\n        element = referenceOffsets;\n    }\n\n    var rect = getClientRect(element);\n    return rect[measurement] / 100 * value;\n  } else if (unit === 'vh' || unit === 'vw') {\n    // if is a vh or vw, we calculate the size based on the viewport\n    var size = void 0;\n    if (unit === 'vh') {\n      size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n    } else {\n      size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n    }\n    return size / 100 * value;\n  } else {\n    // if is an explicit pixel unit, we get rid of the unit and keep the value\n    // if is an implicit unit, it's px, and we return just the value\n    return value;\n  }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n  var offsets = [0, 0];\n\n  // Use height if placement is left or right and index is 0 otherwise use width\n  // in this way the first offset will use an axis and the second one\n  // will use the other one\n  var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n  // Split the offset string to obtain a list of values and operands\n  // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n  var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n    return frag.trim();\n  });\n\n  // Detect if the offset string contains a pair of values or a single one\n  // they could be separated by comma or space\n  var divider = fragments.indexOf(find(fragments, function (frag) {\n    return frag.search(/,|\\s/) !== -1;\n  }));\n\n  if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n    console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n  }\n\n  // If divider is found, we divide the list of values and operands to divide\n  // them by ofset X and Y.\n  var splitRegex = /\\s*,\\s*|\\s+/;\n  var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n  // Convert the values with units to absolute pixels to allow our computations\n  ops = ops.map(function (op, index) {\n    // Most of the units rely on the orientation of the popper\n    var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n    var mergeWithPrevious = false;\n    return op\n    // This aggregates any `+` or `-` sign that aren't considered operators\n    // e.g.: 10 + +5 => [10, +, +5]\n    .reduce(function (a, b) {\n      if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n        a[a.length - 1] = b;\n        mergeWithPrevious = true;\n        return a;\n      } else if (mergeWithPrevious) {\n        a[a.length - 1] += b;\n        mergeWithPrevious = false;\n        return a;\n      } else {\n        return a.concat(b);\n      }\n    }, [])\n    // Here we convert the string values into number values (in px)\n    .map(function (str) {\n      return toValue(str, measurement, popperOffsets, referenceOffsets);\n    });\n  });\n\n  // Loop trough the offsets arrays and execute the operations\n  ops.forEach(function (op, index) {\n    op.forEach(function (frag, index2) {\n      if (isNumeric(frag)) {\n        offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n      }\n    });\n  });\n  return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nfunction offset(data, _ref) {\n  var offset = _ref.offset;\n  var placement = data.placement,\n      _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n\n  var basePlacement = placement.split('-')[0];\n\n  var offsets = void 0;\n  if (isNumeric(+offset)) {\n    offsets = [+offset, 0];\n  } else {\n    offsets = parseOffset(offset, popper, reference, basePlacement);\n  }\n\n  if (basePlacement === 'left') {\n    popper.top += offsets[0];\n    popper.left -= offsets[1];\n  } else if (basePlacement === 'right') {\n    popper.top += offsets[0];\n    popper.left += offsets[1];\n  } else if (basePlacement === 'top') {\n    popper.left += offsets[0];\n    popper.top -= offsets[1];\n  } else if (basePlacement === 'bottom') {\n    popper.left += offsets[0];\n    popper.top += offsets[1];\n  }\n\n  data.popper = popper;\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction preventOverflow(data, options) {\n  var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n  // If offsetParent is the reference element, we really want to\n  // go one step up and use the next offsetParent as reference to\n  // avoid to make this modifier completely useless and look like broken\n  if (data.instance.reference === boundariesElement) {\n    boundariesElement = getOffsetParent(boundariesElement);\n  }\n\n  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement);\n  options.boundaries = boundaries;\n\n  var order = options.priority;\n  var popper = data.offsets.popper;\n\n  var check = {\n    primary: function primary(placement) {\n      var value = popper[placement];\n      if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n        value = Math.max(popper[placement], boundaries[placement]);\n      }\n      return defineProperty({}, placement, value);\n    },\n    secondary: function secondary(placement) {\n      var mainSide = placement === 'right' ? 'left' : 'top';\n      var value = popper[mainSide];\n      if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n        value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n      }\n      return defineProperty({}, mainSide, value);\n    }\n  };\n\n  order.forEach(function (placement) {\n    var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n    popper = _extends$1({}, popper, check[side](placement));\n  });\n\n  data.offsets.popper = popper;\n\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction shift(data) {\n  var placement = data.placement;\n  var basePlacement = placement.split('-')[0];\n  var shiftvariation = placement.split('-')[1];\n\n  // if shift shiftvariation is specified, run the modifier\n  if (shiftvariation) {\n    var _data$offsets = data.offsets,\n        reference = _data$offsets.reference,\n        popper = _data$offsets.popper;\n\n    var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n    var side = isVertical ? 'left' : 'top';\n    var measurement = isVertical ? 'width' : 'height';\n\n    var shiftOffsets = {\n      start: defineProperty({}, side, reference[side]),\n      end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n    };\n\n    data.offsets.popper = _extends$1({}, popper, shiftOffsets[shiftvariation]);\n  }\n\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction hide(data) {\n  if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n    return data;\n  }\n\n  var refRect = data.offsets.reference;\n  var bound = find(data.instance.modifiers, function (modifier) {\n    return modifier.name === 'preventOverflow';\n  }).boundaries;\n\n  if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n    // Avoid unnecessary DOM access if visibility hasn't changed\n    if (data.hide === true) {\n      return data;\n    }\n\n    data.hide = true;\n    data.attributes['x-out-of-boundaries'] = '';\n  } else {\n    // Avoid unnecessary DOM access if visibility hasn't changed\n    if (data.hide === false) {\n      return data;\n    }\n\n    data.hide = false;\n    data.attributes['x-out-of-boundaries'] = false;\n  }\n\n  return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction inner(data) {\n  var placement = data.placement;\n  var basePlacement = placement.split('-')[0];\n  var _data$offsets = data.offsets,\n      popper = _data$offsets.popper,\n      reference = _data$offsets.reference;\n\n  var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n  var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n  popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n  data.placement = getOppositePlacement(placement);\n  data.offsets.popper = getClientRect(popper);\n\n  return data;\n}\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nvar modifiers = {\n  /**\n   * Modifier used to shift the popper on the start or end of its reference\n   * element.<br />\n   * It will read the variation of the `placement` property.<br />\n   * It can be one either `-end` or `-start`.\n   * @memberof modifiers\n   * @inner\n   */\n  shift: {\n    /** @prop {number} order=100 - Index used to define the order of execution */\n    order: 100,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: shift\n  },\n\n  /**\n   * The `offset` modifier can shift your popper on both its axis.\n   *\n   * It accepts the following units:\n   * - `px` or unitless, interpreted as pixels\n   * - `%` or `%r`, percentage relative to the length of the reference element\n   * - `%p`, percentage relative to the length of the popper element\n   * - `vw`, CSS viewport width unit\n   * - `vh`, CSS viewport height unit\n   *\n   * For length is intended the main axis relative to the placement of the popper.<br />\n   * This means that if the placement is `top` or `bottom`, the length will be the\n   * `width`. In case of `left` or `right`, it will be the height.\n   *\n   * You can provide a single value (as `Number` or `String`), or a pair of values\n   * as `String` divided by a comma or one (or more) white spaces.<br />\n   * The latter is a deprecated method because it leads to confusion and will be\n   * removed in v2.<br />\n   * Additionally, it accepts additions and subtractions between different units.\n   * Note that multiplications and divisions aren't supported.\n   *\n   * Valid examples are:\n   * ```\n   * 10\n   * '10%'\n   * '10, 10'\n   * '10%, 10'\n   * '10 + 10%'\n   * '10 - 5vh + 3%'\n   * '-10px + 5vh, 5px - 6%'\n   * ```\n   * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n   * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n   * > More on this [reading this issue](https://github.com/FezVrasta/popper.js/issues/373)\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  offset: {\n    /** @prop {number} order=200 - Index used to define the order of execution */\n    order: 200,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: offset,\n    /** @prop {Number|String} offset=0\n     * The offset value as described in the modifier description\n     */\n    offset: 0\n  },\n\n  /**\n   * Modifier used to prevent the popper from being positioned outside the boundary.\n   *\n   * An scenario exists where the reference itself is not within the boundaries.<br />\n   * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n   * In this case we need to decide whether the popper should either:\n   *\n   * - detach from the reference and remain \"trapped\" in the boundaries, or\n   * - if it should ignore the boundary and \"escape with its reference\"\n   *\n   * When `escapeWithReference` is set to`true` and reference is completely\n   * outside its boundaries, the popper will overflow (or completely leave)\n   * the boundaries in order to remain attached to the edge of the reference.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  preventOverflow: {\n    /** @prop {number} order=300 - Index used to define the order of execution */\n    order: 300,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: preventOverflow,\n    /**\n     * @prop {Array} [priority=['left','right','top','bottom']]\n     * Popper will try to prevent overflow following these priorities by default,\n     * then, it could overflow on the left and on top of the `boundariesElement`\n     */\n    priority: ['left', 'right', 'top', 'bottom'],\n    /**\n     * @prop {number} padding=5\n     * Amount of pixel used to define a minimum distance between the boundaries\n     * and the popper this makes sure the popper has always a little padding\n     * between the edges of its container\n     */\n    padding: 5,\n    /**\n     * @prop {String|HTMLElement} boundariesElement='scrollParent'\n     * Boundaries used by the modifier, can be `scrollParent`, `window`,\n     * `viewport` or any DOM element.\n     */\n    boundariesElement: 'scrollParent'\n  },\n\n  /**\n   * Modifier used to make sure the reference and its popper stay near eachothers\n   * without leaving any gap between the two. Expecially useful when the arrow is\n   * enabled and you want to assure it to point to its reference element.\n   * It cares only about the first axis, you can still have poppers with margin\n   * between the popper and its reference element.\n   * @memberof modifiers\n   * @inner\n   */\n  keepTogether: {\n    /** @prop {number} order=400 - Index used to define the order of execution */\n    order: 400,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: keepTogether\n  },\n\n  /**\n   * This modifier is used to move the `arrowElement` of the popper to make\n   * sure it is positioned between the reference element and its popper element.\n   * It will read the outer size of the `arrowElement` node to detect how many\n   * pixels of conjuction are needed.\n   *\n   * It has no effect if no `arrowElement` is provided.\n   * @memberof modifiers\n   * @inner\n   */\n  arrow: {\n    /** @prop {number} order=500 - Index used to define the order of execution */\n    order: 500,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: arrow,\n    /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n    element: '[x-arrow]'\n  },\n\n  /**\n   * Modifier used to flip the popper's placement when it starts to overlap its\n   * reference element.\n   *\n   * Requires the `preventOverflow` modifier before it in order to work.\n   *\n   * **NOTE:** this modifier will interrupt the current update cycle and will\n   * restart it if it detects the need to flip the placement.\n   * @memberof modifiers\n   * @inner\n   */\n  flip: {\n    /** @prop {number} order=600 - Index used to define the order of execution */\n    order: 600,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: flip,\n    /**\n     * @prop {String|Array} behavior='flip'\n     * The behavior used to change the popper's placement. It can be one of\n     * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n     * placements (with optional variations).\n     */\n    behavior: 'flip',\n    /**\n     * @prop {number} padding=5\n     * The popper will flip if it hits the edges of the `boundariesElement`\n     */\n    padding: 5,\n    /**\n     * @prop {String|HTMLElement} boundariesElement='viewport'\n     * The element which will define the boundaries of the popper position,\n     * the popper will never be placed outside of the defined boundaries\n     * (except if keepTogether is enabled)\n     */\n    boundariesElement: 'viewport'\n  },\n\n  /**\n   * Modifier used to make the popper flow toward the inner of the reference element.\n   * By default, when this modifier is disabled, the popper will be placed outside\n   * the reference element.\n   * @memberof modifiers\n   * @inner\n   */\n  inner: {\n    /** @prop {number} order=700 - Index used to define the order of execution */\n    order: 700,\n    /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n    enabled: false,\n    /** @prop {ModifierFn} */\n    fn: inner\n  },\n\n  /**\n   * Modifier used to hide the popper when its reference element is outside of the\n   * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n   * be used to hide with a CSS selector the popper when its reference is\n   * out of boundaries.\n   *\n   * Requires the `preventOverflow` modifier before it in order to work.\n   * @memberof modifiers\n   * @inner\n   */\n  hide: {\n    /** @prop {number} order=800 - Index used to define the order of execution */\n    order: 800,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: hide\n  },\n\n  /**\n   * Computes the style that will be applied to the popper element to gets\n   * properly positioned.\n   *\n   * Note that this modifier will not touch the DOM, it just prepares the styles\n   * so that `applyStyle` modifier can apply it. This separation is useful\n   * in case you need to replace `applyStyle` with a custom implementation.\n   *\n   * This modifier has `850` as `order` value to maintain backward compatibility\n   * with previous versions of Popper.js. Expect the modifiers ordering method\n   * to change in future major versions of the library.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  computeStyle: {\n    /** @prop {number} order=850 - Index used to define the order of execution */\n    order: 850,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: computeStyle,\n    /**\n     * @prop {Boolean} gpuAcceleration=true\n     * If true, it uses the CSS 3d transformation to position the popper.\n     * Otherwise, it will use the `top` and `left` properties.\n     */\n    gpuAcceleration: true,\n    /**\n     * @prop {string} [x='bottom']\n     * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n     * Change this if your popper should grow in a direction different from `bottom`\n     */\n    x: 'bottom',\n    /**\n     * @prop {string} [x='left']\n     * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n     * Change this if your popper should grow in a direction different from `right`\n     */\n    y: 'right'\n  },\n\n  /**\n   * Applies the computed styles to the popper element.\n   *\n   * All the DOM manipulations are limited to this modifier. This is useful in case\n   * you want to integrate Popper.js inside a framework or view library and you\n   * want to delegate all the DOM manipulations to it.\n   *\n   * Note that if you disable this modifier, you must make sure the popper element\n   * has its position set to `absolute` before Popper.js can do its work!\n   *\n   * Just disable this modifier and define you own to achieve the desired effect.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  applyStyle: {\n    /** @prop {number} order=900 - Index used to define the order of execution */\n    order: 900,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: applyStyle,\n    /** @prop {Function} */\n    onLoad: applyStyleOnLoad,\n    /**\n     * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n     * @prop {Boolean} gpuAcceleration=true\n     * If true, it uses the CSS 3d transformation to position the popper.\n     * Otherwise, it will use the `top` and `left` properties.\n     */\n    gpuAcceleration: undefined\n  }\n};\n\n/**\n * The `dataObject` is an object containing all the informations used by Popper.js\n * this object get passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper.\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper, it expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow, it expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements.\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overriden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass as 3rd argument an object with the same\n * structure of this object, example:\n * ```\n * new Popper(ref, pop, {\n *   modifiers: {\n *     preventOverflow: { enabled: false }\n *   }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nvar Defaults = {\n  /**\n   * Popper's placement\n   * @prop {Popper.placements} placement='bottom'\n   */\n  placement: 'bottom',\n\n  /**\n   * Whether events (resize, scroll) are initially enabled\n   * @prop {Boolean} eventsEnabled=true\n   */\n  eventsEnabled: true,\n\n  /**\n   * Set to true if you want to automatically remove the popper when\n   * you call the `destroy` method.\n   * @prop {Boolean} removeOnDestroy=false\n   */\n  removeOnDestroy: false,\n\n  /**\n   * Callback called when the popper is created.<br />\n   * By default, is set to no-op.<br />\n   * Access Popper.js instance with `data.instance`.\n   * @prop {onCreate}\n   */\n  onCreate: function onCreate() {},\n\n  /**\n   * Callback called when the popper is updated, this callback is not called\n   * on the initialization/creation of the popper, but only on subsequent\n   * updates.<br />\n   * By default, is set to no-op.<br />\n   * Access Popper.js instance with `data.instance`.\n   * @prop {onUpdate}\n   */\n  onUpdate: function onUpdate() {},\n\n  /**\n   * List of modifiers used to modify the offsets before they are applied to the popper.\n   * They provide most of the functionalities of Popper.js\n   * @prop {modifiers}\n   */\n  modifiers: modifiers\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n\n// Utils\n// Methods\nvar Popper = function () {\n  /**\n   * Create a new Popper.js instance\n   * @class Popper\n   * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper\n   * @param {HTMLElement} popper - The HTML element used as popper.\n   * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n   * @return {Object} instance - The generated Popper.js instance\n   */\n  function Popper(reference, popper) {\n    var _this = this;\n\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    classCallCheck(this, Popper);\n\n    this.scheduleUpdate = function () {\n      return requestAnimationFrame(_this.update);\n    };\n\n    // make update() debounced, so that it only runs at most once-per-tick\n    this.update = debounce(this.update.bind(this));\n\n    // with {} we create a new object with the options inside it\n    this.options = _extends$1({}, Popper.Defaults, options);\n\n    // init state\n    this.state = {\n      isDestroyed: false,\n      isCreated: false,\n      scrollParents: []\n    };\n\n    // get reference and popper elements (allow jQuery wrappers)\n    this.reference = reference && reference.jquery ? reference[0] : reference;\n    this.popper = popper && popper.jquery ? popper[0] : popper;\n\n    // Deep merge modifiers options\n    this.options.modifiers = {};\n    Object.keys(_extends$1({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n      _this.options.modifiers[name] = _extends$1({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n    });\n\n    // Refactoring modifiers' list (Object => Array)\n    this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n      return _extends$1({\n        name: name\n      }, _this.options.modifiers[name]);\n    })\n    // sort the modifiers by order\n    .sort(function (a, b) {\n      return a.order - b.order;\n    });\n\n    // modifiers have the ability to execute arbitrary code when Popper.js get inited\n    // such code is executed in the same order of its modifier\n    // they could add new properties to their options configuration\n    // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n    this.modifiers.forEach(function (modifierOptions) {\n      if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n        modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n      }\n    });\n\n    // fire the first update to position the popper in the right place\n    this.update();\n\n    var eventsEnabled = this.options.eventsEnabled;\n    if (eventsEnabled) {\n      // setup event listeners, they will take care of update the position in specific situations\n      this.enableEventListeners();\n    }\n\n    this.state.eventsEnabled = eventsEnabled;\n  }\n\n  // We can't use class properties because they don't get listed in the\n  // class prototype and break stuff like Sinon stubs\n\n\n  createClass(Popper, [{\n    key: 'update',\n    value: function update$$1() {\n      return update.call(this);\n    }\n  }, {\n    key: 'destroy',\n    value: function destroy$$1() {\n      return destroy.call(this);\n    }\n  }, {\n    key: 'enableEventListeners',\n    value: function enableEventListeners$$1() {\n      return enableEventListeners.call(this);\n    }\n  }, {\n    key: 'disableEventListeners',\n    value: function disableEventListeners$$1() {\n      return disableEventListeners.call(this);\n    }\n\n    /**\n     * Schedule an update, it will run on the next UI update available\n     * @method scheduleUpdate\n     * @memberof Popper\n     */\n\n\n    /**\n     * Collection of utilities useful when writing custom modifiers.\n     * Starting from version 1.7, this method is available only if you\n     * include `popper-utils.js` before `popper.js`.\n     *\n     * **DEPRECATION**: This way to access PopperUtils is deprecated\n     * and will be removed in v2! Use the PopperUtils module directly instead.\n     * Due to the high instability of the methods contained in Utils, we can't\n     * guarantee them to follow semver. Use them at your own risk!\n     * @static\n     * @private\n     * @type {Object}\n     * @deprecated since version 1.8\n     * @member Utils\n     * @memberof Popper\n     */\n\n  }]);\n  return Popper;\n}();\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\n\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Dropdown = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'dropdown';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.dropdown';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE);\n  var Event = {\n    HIDE: \"hide\" + EVENT_KEY,\n    HIDDEN: \"hidden\" + EVENT_KEY,\n    SHOW: \"show\" + EVENT_KEY,\n    SHOWN: \"shown\" + EVENT_KEY,\n    CLICK: \"click\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY,\n    KEYDOWN_DATA_API: \"keydown\" + EVENT_KEY + DATA_API_KEY,\n    KEYUP_DATA_API: \"keyup\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    DISABLED: 'disabled',\n    SHOW: 'show',\n    DROPUP: 'dropup',\n    DROPRIGHT: 'dropright',\n    DROPLEFT: 'dropleft',\n    MENURIGHT: 'dropdown-menu-right',\n    MENULEFT: 'dropdown-menu-left',\n    POSITION_STATIC: 'position-static'\n  };\n  var Selector = {\n    DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n    FORM_CHILD: '.dropdown form',\n    MENU: '.dropdown-menu',\n    NAVBAR_NAV: '.navbar-nav',\n    VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled)'\n  };\n  var AttachmentMap = {\n    TOP: 'top-start',\n    TOPEND: 'top-end',\n    BOTTOM: 'bottom-start',\n    BOTTOMEND: 'bottom-end',\n    RIGHT: 'right-start',\n    RIGHTEND: 'right-end',\n    LEFT: 'left-start',\n    LEFTEND: 'left-end'\n  };\n  var Default = {\n    offset: 0,\n    flip: true,\n    boundary: 'scrollParent'\n  };\n  var DefaultType = {\n    offset: '(number|string|function)',\n    flip: 'boolean',\n    boundary: '(string|element)'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Dropdown =\n  /*#__PURE__*/\n  function () {\n    function Dropdown(element, config) {\n      this._element = element;\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n\n      this._addEventListeners();\n    } // getters\n\n\n    var _proto = Dropdown.prototype;\n\n    // public\n    _proto.toggle = function toggle() {\n      if (this._element.disabled || $$$1(this._element).hasClass(ClassName.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      var isActive = $$$1(this._menu).hasClass(ClassName.SHOW);\n\n      Dropdown._clearMenus();\n\n      if (isActive) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $$$1.Event(Event.SHOW, relatedTarget);\n      $$$1(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      } // Disable totally Popper.js for Dropdown in Navbar\n\n\n      if (!this._inNavbar) {\n        /**\n         * Check for Popper dependency\n         * Popper - https://popper.js.org\n         */\n        if (typeof Popper === 'undefined') {\n          throw new Error('Bootstrap dropdown require Popper.js (https://popper.js.org)');\n        }\n\n        var element = this._element; // for dropup with alignment we use the parent as popper container\n\n        if ($$$1(parent).hasClass(ClassName.DROPUP)) {\n          if ($$$1(this._menu).hasClass(ClassName.MENULEFT) || $$$1(this._menu).hasClass(ClassName.MENURIGHT)) {\n            element = parent;\n          }\n        } // If boundary is not `scrollParent`, then set position to `static`\n        // to allow the menu to \"escape\" the scroll parent's boundaries\n        // https://github.com/twbs/bootstrap/issues/24251\n\n\n        if (this._config.boundary !== 'scrollParent') {\n          $$$1(parent).addClass(ClassName.POSITION_STATIC);\n        }\n\n        this._popper = new Popper(element, this._menu, this._getPopperConfig());\n      } // if this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && !$$$1(parent).closest(Selector.NAVBAR_NAV).length) {\n        $$$1('body').children().on('mouseover', null, $$$1.noop);\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      $$$1(this._menu).toggleClass(ClassName.SHOW);\n      $$$1(parent).toggleClass(ClassName.SHOW).trigger($$$1.Event(Event.SHOWN, relatedTarget));\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1.removeData(this._element, DATA_KEY);\n      $$$1(this._element).off(EVENT_KEY);\n      this._element = null;\n      this._menu = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n\n        this._popper = null;\n      }\n    };\n\n    _proto.update = function update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    }; // private\n\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this = this;\n\n      $$$1(this._element).on(Event.CLICK, function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        _this.toggle();\n      });\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, this.constructor.Default, $$$1(this._element).data(), config);\n      Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._getMenuElement = function _getMenuElement() {\n      if (!this._menu) {\n        var parent = Dropdown._getParentFromElement(this._element);\n\n        this._menu = $$$1(parent).find(Selector.MENU)[0];\n      }\n\n      return this._menu;\n    };\n\n    _proto._getPlacement = function _getPlacement() {\n      var $parentDropdown = $$$1(this._element).parent();\n      var placement = AttachmentMap.BOTTOM; // Handle dropup\n\n      if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n        placement = AttachmentMap.TOP;\n\n        if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {\n          placement = AttachmentMap.TOPEND;\n        }\n      } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n        placement = AttachmentMap.RIGHT;\n      } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n        placement = AttachmentMap.LEFT;\n      } else if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {\n        placement = AttachmentMap.BOTTOMEND;\n      }\n\n      return placement;\n    };\n\n    _proto._detectNavbar = function _detectNavbar() {\n      return $$$1(this._element).closest('.navbar').length > 0;\n    };\n\n    _proto._getPopperConfig = function _getPopperConfig() {\n      var _this2 = this;\n\n      var offsetConf = {};\n\n      if (typeof this._config.offset === 'function') {\n        offsetConf.fn = function (data) {\n          data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets) || {});\n          return data;\n        };\n      } else {\n        offsetConf.offset = this._config.offset;\n      }\n\n      var popperConfig = {\n        placement: this._getPlacement(),\n        modifiers: {\n          offset: offsetConf,\n          flip: {\n            enabled: this._config.flip\n          },\n          preventOverflow: {\n            boundariesElement: this._config.boundary\n          }\n        }\n      };\n      return popperConfig;\n    }; // static\n\n\n    Dropdown._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $$$1(this).data(DATA_KEY);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data) {\n          data = new Dropdown(this, _config);\n          $$$1(this).data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    Dropdown._clearMenus = function _clearMenus(event) {\n      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n        return;\n      }\n\n      var toggles = $$$1.makeArray($$$1(Selector.DATA_TOGGLE));\n\n      for (var i = 0; i < toggles.length; i++) {\n        var parent = Dropdown._getParentFromElement(toggles[i]);\n\n        var context = $$$1(toggles[i]).data(DATA_KEY);\n        var relatedTarget = {\n          relatedTarget: toggles[i]\n        };\n\n        if (!context) {\n          continue;\n        }\n\n        var dropdownMenu = context._menu;\n\n        if (!$$$1(parent).hasClass(ClassName.SHOW)) {\n          continue;\n        }\n\n        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $$$1.contains(parent, event.target)) {\n          continue;\n        }\n\n        var hideEvent = $$$1.Event(Event.HIDE, relatedTarget);\n        $$$1(parent).trigger(hideEvent);\n\n        if (hideEvent.isDefaultPrevented()) {\n          continue;\n        } // if this is a touch-enabled device we remove the extra\n        // empty mouseover listeners we added for iOS support\n\n\n        if ('ontouchstart' in document.documentElement) {\n          $$$1('body').children().off('mouseover', null, $$$1.noop);\n        }\n\n        toggles[i].setAttribute('aria-expanded', 'false');\n        $$$1(dropdownMenu).removeClass(ClassName.SHOW);\n        $$$1(parent).removeClass(ClassName.SHOW).trigger($$$1.Event(Event.HIDDEN, relatedTarget));\n      }\n    };\n\n    Dropdown._getParentFromElement = function _getParentFromElement(element) {\n      var parent;\n      var selector = Util.getSelectorFromElement(element);\n\n      if (selector) {\n        parent = $$$1(selector)[0];\n      }\n\n      return parent || element.parentNode;\n    };\n\n    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $$$1(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (this.disabled || $$$1(this).hasClass(ClassName.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this);\n\n      var isActive = $$$1(parent).hasClass(ClassName.SHOW);\n\n      if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n        if (event.which === ESCAPE_KEYCODE) {\n          var toggle = $$$1(parent).find(Selector.DATA_TOGGLE)[0];\n          $$$1(toggle).trigger('focus');\n        }\n\n        $$$1(this).trigger('click');\n        return;\n      }\n\n      var items = $$$1(parent).find(Selector.VISIBLE_ITEMS).get();\n\n      if (!items.length) {\n        return;\n      }\n\n      var index = items.indexOf(event.target);\n\n      if (event.which === ARROW_UP_KEYCODE && index > 0) {\n        // up\n        index--;\n      }\n\n      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n        // down\n        index++;\n      }\n\n      if (index < 0) {\n        index = 0;\n      }\n\n      items[index].focus();\n    };\n\n    _createClass(Dropdown, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType;\n      }\n    }]);\n    return Dropdown;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + \" \" + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    Dropdown._jQueryInterface.call($$$1(this), 'toggle');\n  }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {\n    e.stopPropagation();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = Dropdown._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Dropdown;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Dropdown._jQueryInterface;\n  };\n\n  return Dropdown;\n}($, Popper);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Modal = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'modal';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.modal';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var TRANSITION_DURATION = 300;\n  var BACKDROP_TRANSITION_DURATION = 150;\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var Default = {\n    backdrop: true,\n    keyboard: true,\n    focus: true,\n    show: true\n  };\n  var DefaultType = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean',\n    show: 'boolean'\n  };\n  var Event = {\n    HIDE: \"hide\" + EVENT_KEY,\n    HIDDEN: \"hidden\" + EVENT_KEY,\n    SHOW: \"show\" + EVENT_KEY,\n    SHOWN: \"shown\" + EVENT_KEY,\n    FOCUSIN: \"focusin\" + EVENT_KEY,\n    RESIZE: \"resize\" + EVENT_KEY,\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY,\n    KEYDOWN_DISMISS: \"keydown.dismiss\" + EVENT_KEY,\n    MOUSEUP_DISMISS: \"mouseup.dismiss\" + EVENT_KEY,\n    MOUSEDOWN_DISMISS: \"mousedown.dismiss\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\n    BACKDROP: 'modal-backdrop',\n    OPEN: 'modal-open',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector = {\n    DIALOG: '.modal-dialog',\n    DATA_TOGGLE: '[data-toggle=\"modal\"]',\n    DATA_DISMISS: '[data-dismiss=\"modal\"]',\n    FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n    STICKY_CONTENT: '.sticky-top',\n    NAVBAR_TOGGLER: '.navbar-toggler'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Modal =\n  /*#__PURE__*/\n  function () {\n    function Modal(element, config) {\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._dialog = $$$1(element).find(Selector.DIALOG)[0];\n      this._backdrop = null;\n      this._isShown = false;\n      this._isBodyOverflowing = false;\n      this._ignoreBackdropClick = false;\n      this._originalBodyPadding = 0;\n      this._scrollbarWidth = 0;\n    } // getters\n\n\n    var _proto = Modal.prototype;\n\n    // public\n    _proto.toggle = function toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    };\n\n    _proto.show = function show(relatedTarget) {\n      var _this = this;\n\n      if (this._isTransitioning || this._isShown) {\n        return;\n      }\n\n      if (Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.FADE)) {\n        this._isTransitioning = true;\n      }\n\n      var showEvent = $$$1.Event(Event.SHOW, {\n        relatedTarget: relatedTarget\n      });\n      $$$1(this._element).trigger(showEvent);\n\n      if (this._isShown || showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = true;\n\n      this._checkScrollbar();\n\n      this._setScrollbar();\n\n      this._adjustDialog();\n\n      $$$1(document.body).addClass(ClassName.OPEN);\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $$$1(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {\n        return _this.hide(event);\n      });\n      $$$1(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {\n        $$$1(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {\n          if ($$$1(event.target).is(_this._element)) {\n            _this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(function () {\n        return _this._showElement(relatedTarget);\n      });\n    };\n\n    _proto.hide = function hide(event) {\n      var _this2 = this;\n\n      if (event) {\n        event.preventDefault();\n      }\n\n      if (this._isTransitioning || !this._isShown) {\n        return;\n      }\n\n      var hideEvent = $$$1.Event(Event.HIDE);\n      $$$1(this._element).trigger(hideEvent);\n\n      if (!this._isShown || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = false;\n      var transition = Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.FADE);\n\n      if (transition) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $$$1(document).off(Event.FOCUSIN);\n      $$$1(this._element).removeClass(ClassName.SHOW);\n      $$$1(this._element).off(Event.CLICK_DISMISS);\n      $$$1(this._dialog).off(Event.MOUSEDOWN_DISMISS);\n\n      if (transition) {\n        $$$1(this._element).one(Util.TRANSITION_END, function (event) {\n          return _this2._hideModal(event);\n        }).emulateTransitionEnd(TRANSITION_DURATION);\n      } else {\n        this._hideModal();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1.removeData(this._element, DATA_KEY);\n      $$$1(window, document, this._element, this._backdrop).off(EVENT_KEY);\n      this._config = null;\n      this._element = null;\n      this._dialog = null;\n      this._backdrop = null;\n      this._isShown = null;\n      this._isBodyOverflowing = null;\n      this._ignoreBackdropClick = null;\n      this._scrollbarWidth = null;\n    };\n\n    _proto.handleUpdate = function handleUpdate() {\n      this._adjustDialog();\n    }; // private\n\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, Default, config);\n      Util.typeCheckConfig(NAME, config, DefaultType);\n      return config;\n    };\n\n    _proto._showElement = function _showElement(relatedTarget) {\n      var _this3 = this;\n\n      var transition = Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.FADE);\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // don't move modals dom position\n        document.body.appendChild(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.scrollTop = 0;\n\n      if (transition) {\n        Util.reflow(this._element);\n      }\n\n      $$$1(this._element).addClass(ClassName.SHOW);\n\n      if (this._config.focus) {\n        this._enforceFocus();\n      }\n\n      var shownEvent = $$$1.Event(Event.SHOWN, {\n        relatedTarget: relatedTarget\n      });\n\n      var transitionComplete = function transitionComplete() {\n        if (_this3._config.focus) {\n          _this3._element.focus();\n        }\n\n        _this3._isTransitioning = false;\n        $$$1(_this3._element).trigger(shownEvent);\n      };\n\n      if (transition) {\n        $$$1(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);\n      } else {\n        transitionComplete();\n      }\n    };\n\n    _proto._enforceFocus = function _enforceFocus() {\n      var _this4 = this;\n\n      $$$1(document).off(Event.FOCUSIN) // guard against infinite focus loop\n      .on(Event.FOCUSIN, function (event) {\n        if (document !== event.target && _this4._element !== event.target && !$$$1(_this4._element).has(event.target).length) {\n          _this4._element.focus();\n        }\n      });\n    };\n\n    _proto._setEscapeEvent = function _setEscapeEvent() {\n      var _this5 = this;\n\n      if (this._isShown && this._config.keyboard) {\n        $$$1(this._element).on(Event.KEYDOWN_DISMISS, function (event) {\n          if (event.which === ESCAPE_KEYCODE) {\n            event.preventDefault();\n\n            _this5.hide();\n          }\n        });\n      } else if (!this._isShown) {\n        $$$1(this._element).off(Event.KEYDOWN_DISMISS);\n      }\n    };\n\n    _proto._setResizeEvent = function _setResizeEvent() {\n      var _this6 = this;\n\n      if (this._isShown) {\n        $$$1(window).on(Event.RESIZE, function (event) {\n          return _this6.handleUpdate(event);\n        });\n      } else {\n        $$$1(window).off(Event.RESIZE);\n      }\n    };\n\n    _proto._hideModal = function _hideModal() {\n      var _this7 = this;\n\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._isTransitioning = false;\n\n      this._showBackdrop(function () {\n        $$$1(document.body).removeClass(ClassName.OPEN);\n\n        _this7._resetAdjustments();\n\n        _this7._resetScrollbar();\n\n        $$$1(_this7._element).trigger(Event.HIDDEN);\n      });\n    };\n\n    _proto._removeBackdrop = function _removeBackdrop() {\n      if (this._backdrop) {\n        $$$1(this._backdrop).remove();\n        this._backdrop = null;\n      }\n    };\n\n    _proto._showBackdrop = function _showBackdrop(callback) {\n      var _this8 = this;\n\n      var animate = $$$1(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';\n\n      if (this._isShown && this._config.backdrop) {\n        var doAnimate = Util.supportsTransitionEnd() && animate;\n        this._backdrop = document.createElement('div');\n        this._backdrop.className = ClassName.BACKDROP;\n\n        if (animate) {\n          $$$1(this._backdrop).addClass(animate);\n        }\n\n        $$$1(this._backdrop).appendTo(document.body);\n        $$$1(this._element).on(Event.CLICK_DISMISS, function (event) {\n          if (_this8._ignoreBackdropClick) {\n            _this8._ignoreBackdropClick = false;\n            return;\n          }\n\n          if (event.target !== event.currentTarget) {\n            return;\n          }\n\n          if (_this8._config.backdrop === 'static') {\n            _this8._element.focus();\n          } else {\n            _this8.hide();\n          }\n        });\n\n        if (doAnimate) {\n          Util.reflow(this._backdrop);\n        }\n\n        $$$1(this._backdrop).addClass(ClassName.SHOW);\n\n        if (!callback) {\n          return;\n        }\n\n        if (!doAnimate) {\n          callback();\n          return;\n        }\n\n        $$$1(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);\n      } else if (!this._isShown && this._backdrop) {\n        $$$1(this._backdrop).removeClass(ClassName.SHOW);\n\n        var callbackRemove = function callbackRemove() {\n          _this8._removeBackdrop();\n\n          if (callback) {\n            callback();\n          }\n        };\n\n        if (Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.FADE)) {\n          $$$1(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);\n        } else {\n          callbackRemove();\n        }\n      } else if (callback) {\n        callback();\n      }\n    }; // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // todo (fat): these should probably be refactored out of modal.js\n    // ----------------------------------------------------------------------\n\n\n    _proto._adjustDialog = function _adjustDialog() {\n      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      if (!this._isBodyOverflowing && isModalOverflowing) {\n        this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n      }\n\n      if (this._isBodyOverflowing && !isModalOverflowing) {\n        this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n      }\n    };\n\n    _proto._resetAdjustments = function _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    };\n\n    _proto._checkScrollbar = function _checkScrollbar() {\n      var rect = document.body.getBoundingClientRect();\n      this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;\n      this._scrollbarWidth = this._getScrollbarWidth();\n    };\n\n    _proto._setScrollbar = function _setScrollbar() {\n      var _this9 = this;\n\n      if (this._isBodyOverflowing) {\n        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n        // Adjust fixed content padding\n        $$$1(Selector.FIXED_CONTENT).each(function (index, element) {\n          var actualPadding = $$$1(element)[0].style.paddingRight;\n          var calculatedPadding = $$$1(element).css('padding-right');\n          $$$1(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + \"px\");\n        }); // Adjust sticky content margin\n\n        $$$1(Selector.STICKY_CONTENT).each(function (index, element) {\n          var actualMargin = $$$1(element)[0].style.marginRight;\n          var calculatedMargin = $$$1(element).css('margin-right');\n          $$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + \"px\");\n        }); // Adjust navbar-toggler margin\n\n        $$$1(Selector.NAVBAR_TOGGLER).each(function (index, element) {\n          var actualMargin = $$$1(element)[0].style.marginRight;\n          var calculatedMargin = $$$1(element).css('margin-right');\n          $$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this9._scrollbarWidth + \"px\");\n        }); // Adjust body padding\n\n        var actualPadding = document.body.style.paddingRight;\n        var calculatedPadding = $$$1('body').css('padding-right');\n        $$$1('body').data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n      }\n    };\n\n    _proto._resetScrollbar = function _resetScrollbar() {\n      // Restore fixed content padding\n      $$$1(Selector.FIXED_CONTENT).each(function (index, element) {\n        var padding = $$$1(element).data('padding-right');\n\n        if (typeof padding !== 'undefined') {\n          $$$1(element).css('padding-right', padding).removeData('padding-right');\n        }\n      }); // Restore sticky content and navbar-toggler margin\n\n      $$$1(Selector.STICKY_CONTENT + \", \" + Selector.NAVBAR_TOGGLER).each(function (index, element) {\n        var margin = $$$1(element).data('margin-right');\n\n        if (typeof margin !== 'undefined') {\n          $$$1(element).css('margin-right', margin).removeData('margin-right');\n        }\n      }); // Restore body padding\n\n      var padding = $$$1('body').data('padding-right');\n\n      if (typeof padding !== 'undefined') {\n        $$$1('body').css('padding-right', padding).removeData('padding-right');\n      }\n    };\n\n    _proto._getScrollbarWidth = function _getScrollbarWidth() {\n      // thx d.walsh\n      var scrollDiv = document.createElement('div');\n      scrollDiv.className = ClassName.SCROLLBAR_MEASURER;\n      document.body.appendChild(scrollDiv);\n      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n      document.body.removeChild(scrollDiv);\n      return scrollbarWidth;\n    }; // static\n\n\n    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        var data = $$$1(this).data(DATA_KEY);\n\n        var _config = _extends({}, Modal.Default, $$$1(this).data(), typeof config === 'object' && config);\n\n        if (!data) {\n          data = new Modal(this, _config);\n          $$$1(this).data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](relatedTarget);\n        } else if (_config.show) {\n          data.show(relatedTarget);\n        }\n      });\n    };\n\n    _createClass(Modal, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n    return Modal;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n    var _this10 = this;\n\n    var target;\n    var selector = Util.getSelectorFromElement(this);\n\n    if (selector) {\n      target = $$$1(selector)[0];\n    }\n\n    var config = $$$1(target).data(DATA_KEY) ? 'toggle' : _extends({}, $$$1(target).data(), $$$1(this).data());\n\n    if (this.tagName === 'A' || this.tagName === 'AREA') {\n      event.preventDefault();\n    }\n\n    var $target = $$$1(target).one(Event.SHOW, function (showEvent) {\n      if (showEvent.isDefaultPrevented()) {\n        // only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      $target.one(Event.HIDDEN, function () {\n        if ($$$1(_this10).is(':visible')) {\n          _this10.focus();\n        }\n      });\n    });\n\n    Modal._jQueryInterface.call($$$1(target), config, this);\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = Modal._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Modal;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Modal._jQueryInterface;\n  };\n\n  return Modal;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Tooltip = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'tooltip';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.tooltip';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var TRANSITION_DURATION = 150;\n  var CLASS_PREFIX = 'bs-tooltip';\n  var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n  var DefaultType = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(number|string)',\n    container: '(string|element|boolean)',\n    fallbackPlacement: '(string|array)',\n    boundary: '(string|element)'\n  };\n  var AttachmentMap = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: 'right',\n    BOTTOM: 'bottom',\n    LEFT: 'left'\n  };\n  var Default = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: 0,\n    container: false,\n    fallbackPlacement: 'flip',\n    boundary: 'scrollParent'\n  };\n  var HoverState = {\n    SHOW: 'show',\n    OUT: 'out'\n  };\n  var Event = {\n    HIDE: \"hide\" + EVENT_KEY,\n    HIDDEN: \"hidden\" + EVENT_KEY,\n    SHOW: \"show\" + EVENT_KEY,\n    SHOWN: \"shown\" + EVENT_KEY,\n    INSERTED: \"inserted\" + EVENT_KEY,\n    CLICK: \"click\" + EVENT_KEY,\n    FOCUSIN: \"focusin\" + EVENT_KEY,\n    FOCUSOUT: \"focusout\" + EVENT_KEY,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY\n  };\n  var ClassName = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector = {\n    TOOLTIP: '.tooltip',\n    TOOLTIP_INNER: '.tooltip-inner',\n    ARROW: '.arrow'\n  };\n  var Trigger = {\n    HOVER: 'hover',\n    FOCUS: 'focus',\n    CLICK: 'click',\n    MANUAL: 'manual'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tooltip =\n  /*#__PURE__*/\n  function () {\n    function Tooltip(element, config) {\n      /**\n       * Check for Popper dependency\n       * Popper - https://popper.js.org\n       */\n      if (typeof Popper === 'undefined') {\n        throw new Error('Bootstrap tooltips require Popper.js (https://popper.js.org)');\n      } // private\n\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // protected\n\n      this.element = element;\n      this.config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // getters\n\n\n    var _proto = Tooltip.prototype;\n\n    // public\n    _proto.enable = function enable() {\n      this._isEnabled = true;\n    };\n\n    _proto.disable = function disable() {\n      this._isEnabled = false;\n    };\n\n    _proto.toggleEnabled = function toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    };\n\n    _proto.toggle = function toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        var dataKey = this.constructor.DATA_KEY;\n        var context = $$$1(event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $$$1(event.currentTarget).data(dataKey, context);\n        }\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if ($$$1(this.getTipElement()).hasClass(ClassName.SHOW)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      $$$1.removeData(this.element, this.constructor.DATA_KEY);\n      $$$1(this.element).off(this.constructor.EVENT_KEY);\n      $$$1(this.element).closest('.modal').off('hide.bs.modal');\n\n      if (this.tip) {\n        $$$1(this.tip).remove();\n      }\n\n      this._isEnabled = null;\n      this._timeout = null;\n      this._hoverState = null;\n      this._activeTrigger = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n      }\n\n      this._popper = null;\n      this.element = null;\n      this.config = null;\n      this.tip = null;\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if ($$$1(this.element).css('display') === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      var showEvent = $$$1.Event(this.constructor.Event.SHOW);\n\n      if (this.isWithContent() && this._isEnabled) {\n        $$$1(this.element).trigger(showEvent);\n        var isInTheDom = $$$1.contains(this.element.ownerDocument.documentElement, this.element);\n\n        if (showEvent.isDefaultPrevented() || !isInTheDom) {\n          return;\n        }\n\n        var tip = this.getTipElement();\n        var tipId = Util.getUID(this.constructor.NAME);\n        tip.setAttribute('id', tipId);\n        this.element.setAttribute('aria-describedby', tipId);\n        this.setContent();\n\n        if (this.config.animation) {\n          $$$1(tip).addClass(ClassName.FADE);\n        }\n\n        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n        var attachment = this._getAttachment(placement);\n\n        this.addAttachmentClass(attachment);\n        var container = this.config.container === false ? document.body : $$$1(this.config.container);\n        $$$1(tip).data(this.constructor.DATA_KEY, this);\n\n        if (!$$$1.contains(this.element.ownerDocument.documentElement, this.tip)) {\n          $$$1(tip).appendTo(container);\n        }\n\n        $$$1(this.element).trigger(this.constructor.Event.INSERTED);\n        this._popper = new Popper(this.element, tip, {\n          placement: attachment,\n          modifiers: {\n            offset: {\n              offset: this.config.offset\n            },\n            flip: {\n              behavior: this.config.fallbackPlacement\n            },\n            arrow: {\n              element: Selector.ARROW\n            },\n            preventOverflow: {\n              boundariesElement: this.config.boundary\n            }\n          },\n          onCreate: function onCreate(data) {\n            if (data.originalPlacement !== data.placement) {\n              _this._handlePopperPlacementChange(data);\n            }\n          },\n          onUpdate: function onUpdate(data) {\n            _this._handlePopperPlacementChange(data);\n          }\n        });\n        $$$1(tip).addClass(ClassName.SHOW); // if this is a touch-enabled device we add extra\n        // empty mouseover listeners to the body's immediate children;\n        // only needed because of broken event delegation on iOS\n        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n        if ('ontouchstart' in document.documentElement) {\n          $$$1('body').children().on('mouseover', null, $$$1.noop);\n        }\n\n        var complete = function complete() {\n          if (_this.config.animation) {\n            _this._fixTransition();\n          }\n\n          var prevHoverState = _this._hoverState;\n          _this._hoverState = null;\n          $$$1(_this.element).trigger(_this.constructor.Event.SHOWN);\n\n          if (prevHoverState === HoverState.OUT) {\n            _this._leave(null, _this);\n          }\n        };\n\n        if (Util.supportsTransitionEnd() && $$$1(this.tip).hasClass(ClassName.FADE)) {\n          $$$1(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);\n        } else {\n          complete();\n        }\n      }\n    };\n\n    _proto.hide = function hide(callback) {\n      var _this2 = this;\n\n      var tip = this.getTipElement();\n      var hideEvent = $$$1.Event(this.constructor.Event.HIDE);\n\n      var complete = function complete() {\n        if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {\n          tip.parentNode.removeChild(tip);\n        }\n\n        _this2._cleanTipClass();\n\n        _this2.element.removeAttribute('aria-describedby');\n\n        $$$1(_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n        if (_this2._popper !== null) {\n          _this2._popper.destroy();\n        }\n\n        if (callback) {\n          callback();\n        }\n      };\n\n      $$$1(this.element).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $$$1(tip).removeClass(ClassName.SHOW); // if this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        $$$1('body').children().off('mouseover', null, $$$1.noop);\n      }\n\n      this._activeTrigger[Trigger.CLICK] = false;\n      this._activeTrigger[Trigger.FOCUS] = false;\n      this._activeTrigger[Trigger.HOVER] = false;\n\n      if (Util.supportsTransitionEnd() && $$$1(this.tip).hasClass(ClassName.FADE)) {\n        $$$1(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\n      } else {\n        complete();\n      }\n\n      this._hoverState = '';\n    };\n\n    _proto.update = function update() {\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    }; // protected\n\n\n    _proto.isWithContent = function isWithContent() {\n      return Boolean(this.getTitle());\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $$$1(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $$$1(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var $tip = $$$1(this.getTipElement());\n      this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());\n      $tip.removeClass(ClassName.FADE + \" \" + ClassName.SHOW);\n    };\n\n    _proto.setElementContent = function setElementContent($element, content) {\n      var html = this.config.html;\n\n      if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n        // content is a DOM node or a jQuery\n        if (html) {\n          if (!$$$1(content).parent().is($element)) {\n            $element.empty().append(content);\n          }\n        } else {\n          $element.text($$$1(content).text());\n        }\n      } else {\n        $element[html ? 'html' : 'text'](content);\n      }\n    };\n\n    _proto.getTitle = function getTitle() {\n      var title = this.element.getAttribute('data-original-title');\n\n      if (!title) {\n        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n      }\n\n      return title;\n    }; // private\n\n\n    _proto._getAttachment = function _getAttachment(placement) {\n      return AttachmentMap[placement.toUpperCase()];\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this3 = this;\n\n      var triggers = this.config.trigger.split(' ');\n      triggers.forEach(function (trigger) {\n        if (trigger === 'click') {\n          $$$1(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) {\n            return _this3.toggle(event);\n          });\n        } else if (trigger !== Trigger.MANUAL) {\n          var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;\n          var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;\n          $$$1(_this3.element).on(eventIn, _this3.config.selector, function (event) {\n            return _this3._enter(event);\n          }).on(eventOut, _this3.config.selector, function (event) {\n            return _this3._leave(event);\n          });\n        }\n\n        $$$1(_this3.element).closest('.modal').on('hide.bs.modal', function () {\n          return _this3.hide();\n        });\n      });\n\n      if (this.config.selector) {\n        this.config = _extends({}, this.config, {\n          trigger: 'manual',\n          selector: ''\n        });\n      } else {\n        this._fixTitle();\n      }\n    };\n\n    _proto._fixTitle = function _fixTitle() {\n      var titleType = typeof this.element.getAttribute('data-original-title');\n\n      if (this.element.getAttribute('title') || titleType !== 'string') {\n        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n        this.element.setAttribute('title', '');\n      }\n    };\n\n    _proto._enter = function _enter(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $$$1(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $$$1(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\n      }\n\n      if ($$$1(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n        context._hoverState = HoverState.SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.SHOW;\n\n      if (!context.config.delay || !context.config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.SHOW) {\n          context.show();\n        }\n      }, context.config.delay.show);\n    };\n\n    _proto._leave = function _leave(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $$$1(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $$$1(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.OUT;\n\n      if (!context.config.delay || !context.config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.OUT) {\n          context.hide();\n        }\n      }, context.config.delay.hide);\n    };\n\n    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n      for (var trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, this.constructor.Default, $$$1(this.element).data(), config);\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._getDelegateConfig = function _getDelegateConfig() {\n      var config = {};\n\n      if (this.config) {\n        for (var key in this.config) {\n          if (this.constructor.Default[key] !== this.config[key]) {\n            config[key] = this.config[key];\n          }\n        }\n      }\n\n      return config;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $$$1(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    };\n\n    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(data) {\n      this._cleanTipClass();\n\n      this.addAttachmentClass(this._getAttachment(data.placement));\n    };\n\n    _proto._fixTransition = function _fixTransition() {\n      var tip = this.getTipElement();\n      var initConfigAnimation = this.config.animation;\n\n      if (tip.getAttribute('x-placement') !== null) {\n        return;\n      }\n\n      $$$1(tip).removeClass(ClassName.FADE);\n      this.config.animation = false;\n      this.hide();\n      this.show();\n      this.config.animation = initConfigAnimation;\n    }; // static\n\n\n    Tooltip._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $$$1(this).data(DATA_KEY);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Tooltip(this, _config);\n          $$$1(this).data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tooltip, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType;\n      }\n    }]);\n    return Tooltip;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1.fn[NAME] = Tooltip._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Tooltip;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Tooltip._jQueryInterface;\n  };\n\n  return Tooltip;\n}($, Popper);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Popover = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'popover';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.popover';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var CLASS_PREFIX = 'bs-popover';\n  var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n  var Default = _extends({}, Tooltip.Default, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n  });\n  var DefaultType = _extends({}, Tooltip.DefaultType, {\n    content: '(string|element|function)'\n  });\n  var ClassName = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector = {\n    TITLE: '.popover-header',\n    CONTENT: '.popover-body'\n  };\n  var Event = {\n    HIDE: \"hide\" + EVENT_KEY,\n    HIDDEN: \"hidden\" + EVENT_KEY,\n    SHOW: \"show\" + EVENT_KEY,\n    SHOWN: \"shown\" + EVENT_KEY,\n    INSERTED: \"inserted\" + EVENT_KEY,\n    CLICK: \"click\" + EVENT_KEY,\n    FOCUSIN: \"focusin\" + EVENT_KEY,\n    FOCUSOUT: \"focusout\" + EVENT_KEY,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Popover =\n  /*#__PURE__*/\n  function (_Tooltip) {\n    _inheritsLoose(Popover, _Tooltip);\n\n    function Popover() {\n      return _Tooltip.apply(this, arguments) || this;\n    }\n\n    var _proto = Popover.prototype;\n\n    // overrides\n    _proto.isWithContent = function isWithContent() {\n      return this.getTitle() || this._getContent();\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $$$1(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $$$1(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var $tip = $$$1(this.getTipElement()); // we use append for html objects to maintain js events\n\n      this.setElementContent($tip.find(Selector.TITLE), this.getTitle());\n\n      var content = this._getContent();\n\n      if (typeof content === 'function') {\n        content = content.call(this.element);\n      }\n\n      this.setElementContent($tip.find(Selector.CONTENT), content);\n      $tip.removeClass(ClassName.FADE + \" \" + ClassName.SHOW);\n    }; // private\n\n\n    _proto._getContent = function _getContent() {\n      return this.element.getAttribute('data-content') || this.config.content;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $$$1(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    }; // static\n\n\n    Popover._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $$$1(this).data(DATA_KEY);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data && /destroy|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Popover(this, _config);\n          $$$1(this).data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Popover, null, [{\n      key: \"VERSION\",\n      // getters\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType;\n      }\n    }]);\n    return Popover;\n  }(Tooltip);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1.fn[NAME] = Popover._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Popover;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Popover._jQueryInterface;\n  };\n\n  return Popover;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar ScrollSpy = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'scrollspy';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.scrollspy';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var Default = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  var DefaultType = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  var Event = {\n    ACTIVATE: \"activate\" + EVENT_KEY,\n    SCROLL: \"scroll\" + EVENT_KEY,\n    LOAD_DATA_API: \"load\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    DROPDOWN_ITEM: 'dropdown-item',\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active'\n  };\n  var Selector = {\n    DATA_SPY: '[data-spy=\"scroll\"]',\n    ACTIVE: '.active',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    NAV_LINKS: '.nav-link',\n    NAV_ITEMS: '.nav-item',\n    LIST_ITEMS: '.list-group-item',\n    DROPDOWN: '.dropdown',\n    DROPDOWN_ITEMS: '.dropdown-item',\n    DROPDOWN_TOGGLE: '.dropdown-toggle'\n  };\n  var OffsetMethod = {\n    OFFSET: 'offset',\n    POSITION: 'position'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var ScrollSpy =\n  /*#__PURE__*/\n  function () {\n    function ScrollSpy(element, config) {\n      var _this = this;\n\n      this._element = element;\n      this._scrollElement = element.tagName === 'BODY' ? window : element;\n      this._config = this._getConfig(config);\n      this._selector = this._config.target + \" \" + Selector.NAV_LINKS + \",\" + (this._config.target + \" \" + Selector.LIST_ITEMS + \",\") + (this._config.target + \" \" + Selector.DROPDOWN_ITEMS);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      $$$1(this._scrollElement).on(Event.SCROLL, function (event) {\n        return _this._process(event);\n      });\n      this.refresh();\n\n      this._process();\n    } // getters\n\n\n    var _proto = ScrollSpy.prototype;\n\n    // public\n    _proto.refresh = function refresh() {\n      var _this2 = this;\n\n      var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;\n      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      var targets = $$$1.makeArray($$$1(this._selector));\n      targets.map(function (element) {\n        var target;\n        var targetSelector = Util.getSelectorFromElement(element);\n\n        if (targetSelector) {\n          target = $$$1(targetSelector)[0];\n        }\n\n        if (target) {\n          var targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            // todo (fat): remove sketch reliance on jQuery position/offset\n            return [$$$1(target)[offsetMethod]().top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(function (item) {\n        return item;\n      }).sort(function (a, b) {\n        return a[0] - b[0];\n      }).forEach(function (item) {\n        _this2._offsets.push(item[0]);\n\n        _this2._targets.push(item[1]);\n      });\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1.removeData(this._element, DATA_KEY);\n      $$$1(this._scrollElement).off(EVENT_KEY);\n      this._element = null;\n      this._scrollElement = null;\n      this._config = null;\n      this._selector = null;\n      this._offsets = null;\n      this._targets = null;\n      this._activeTarget = null;\n      this._scrollHeight = null;\n    }; // private\n\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, Default, config);\n\n      if (typeof config.target !== 'string') {\n        var id = $$$1(config.target).attr('id');\n\n        if (!id) {\n          id = Util.getUID(NAME);\n          $$$1(config.target).attr('id', id);\n        }\n\n        config.target = \"#\" + id;\n      }\n\n      Util.typeCheckConfig(NAME, config, DefaultType);\n      return config;\n    };\n\n    _proto._getScrollTop = function _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    };\n\n    _proto._getScrollHeight = function _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    };\n\n    _proto._getOffsetHeight = function _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    };\n\n    _proto._process = function _process() {\n      var scrollTop = this._getScrollTop() + this._config.offset;\n\n      var scrollHeight = this._getScrollHeight();\n\n      var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        var target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      for (var i = this._offsets.length; i--;) {\n        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    };\n\n    _proto._activate = function _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      var queries = this._selector.split(','); // eslint-disable-next-line arrow-body-style\n\n\n      queries = queries.map(function (selector) {\n        return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + (selector + \"[href=\\\"\" + target + \"\\\"]\");\n      });\n      var $link = $$$1(queries.join(','));\n\n      if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n        $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);\n        $link.addClass(ClassName.ACTIVE);\n      } else {\n        // Set triggered link as active\n        $link.addClass(ClassName.ACTIVE); // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n        $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_LINKS + \", \" + Selector.LIST_ITEMS).addClass(ClassName.ACTIVE); // Handle special case when .nav-link is inside .nav-item\n\n        $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);\n      }\n\n      $$$1(this._scrollElement).trigger(Event.ACTIVATE, {\n        relatedTarget: target\n      });\n    };\n\n    _proto._clear = function _clear() {\n      $$$1(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);\n    }; // static\n\n\n    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $$$1(this).data(DATA_KEY);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new ScrollSpy(this, _config);\n          $$$1(this).data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(ScrollSpy, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n    return ScrollSpy;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(window).on(Event.LOAD_DATA_API, function () {\n    var scrollSpys = $$$1.makeArray($$$1(Selector.DATA_SPY));\n\n    for (var i = scrollSpys.length; i--;) {\n      var $spy = $$$1(scrollSpys[i]);\n\n      ScrollSpy._jQueryInterface.call($spy, $spy.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = ScrollSpy._jQueryInterface;\n  $$$1.fn[NAME].Constructor = ScrollSpy;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return ScrollSpy._jQueryInterface;\n  };\n\n  return ScrollSpy;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Tab = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'tab';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.tab';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var TRANSITION_DURATION = 150;\n  var Event = {\n    HIDE: \"hide\" + EVENT_KEY,\n    HIDDEN: \"hidden\" + EVENT_KEY,\n    SHOW: \"show\" + EVENT_KEY,\n    SHOWN: \"shown\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active',\n    DISABLED: 'disabled',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector = {\n    DROPDOWN: '.dropdown',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    ACTIVE: '.active',\n    ACTIVE_UL: '> li > .active',\n    DATA_TOGGLE: '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n    DROPDOWN_TOGGLE: '.dropdown-toggle',\n    DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tab =\n  /*#__PURE__*/\n  function () {\n    function Tab(element) {\n      this._element = element;\n    } // getters\n\n\n    var _proto = Tab.prototype;\n\n    // public\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $$$1(this._element).hasClass(ClassName.ACTIVE) || $$$1(this._element).hasClass(ClassName.DISABLED)) {\n        return;\n      }\n\n      var target;\n      var previous;\n      var listElement = $$$1(this._element).closest(Selector.NAV_LIST_GROUP)[0];\n      var selector = Util.getSelectorFromElement(this._element);\n\n      if (listElement) {\n        var itemSelector = listElement.nodeName === 'UL' ? Selector.ACTIVE_UL : Selector.ACTIVE;\n        previous = $$$1.makeArray($$$1(listElement).find(itemSelector));\n        previous = previous[previous.length - 1];\n      }\n\n      var hideEvent = $$$1.Event(Event.HIDE, {\n        relatedTarget: this._element\n      });\n      var showEvent = $$$1.Event(Event.SHOW, {\n        relatedTarget: previous\n      });\n\n      if (previous) {\n        $$$1(previous).trigger(hideEvent);\n      }\n\n      $$$1(this._element).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (selector) {\n        target = $$$1(selector)[0];\n      }\n\n      this._activate(this._element, listElement);\n\n      var complete = function complete() {\n        var hiddenEvent = $$$1.Event(Event.HIDDEN, {\n          relatedTarget: _this._element\n        });\n        var shownEvent = $$$1.Event(Event.SHOWN, {\n          relatedTarget: previous\n        });\n        $$$1(previous).trigger(hiddenEvent);\n        $$$1(_this._element).trigger(shownEvent);\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1.removeData(this._element, DATA_KEY);\n      this._element = null;\n    }; // private\n\n\n    _proto._activate = function _activate(element, container, callback) {\n      var _this2 = this;\n\n      var activeElements;\n\n      if (container.nodeName === 'UL') {\n        activeElements = $$$1(container).find(Selector.ACTIVE_UL);\n      } else {\n        activeElements = $$$1(container).children(Selector.ACTIVE);\n      }\n\n      var active = activeElements[0];\n      var isTransitioning = callback && Util.supportsTransitionEnd() && active && $$$1(active).hasClass(ClassName.FADE);\n\n      var complete = function complete() {\n        return _this2._transitionComplete(element, active, callback);\n      };\n\n      if (active && isTransitioning) {\n        $$$1(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\n      } else {\n        complete();\n      }\n    };\n\n    _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n      if (active) {\n        $$$1(active).removeClass(ClassName.SHOW + \" \" + ClassName.ACTIVE);\n        var dropdownChild = $$$1(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];\n\n        if (dropdownChild) {\n          $$$1(dropdownChild).removeClass(ClassName.ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      $$$1(element).addClass(ClassName.ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      Util.reflow(element);\n      $$$1(element).addClass(ClassName.SHOW);\n\n      if (element.parentNode && $$$1(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\n        var dropdownElement = $$$1(element).closest(Selector.DROPDOWN)[0];\n\n        if (dropdownElement) {\n          $$$1(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    }; // static\n\n\n    Tab._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $$$1(this);\n        var data = $this.data(DATA_KEY);\n\n        if (!data) {\n          data = new Tab(this);\n          $this.data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tab, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }]);\n    return Tab;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n\n    Tab._jQueryInterface.call($$$1(this), 'show');\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = Tab._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Tab;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Tab._jQueryInterface;\n  };\n\n  return Tab;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-alpha.6): index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n(function ($$$1) {\n  if (typeof $$$1 === 'undefined') {\n    throw new Error('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n  }\n\n  var version = $$$1.fn.jquery.split(' ')[0].split('.');\n  var minMajor = 1;\n  var ltMajor = 2;\n  var minMinor = 9;\n  var minPatch = 1;\n  var maxMajor = 4;\n\n  if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n    throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n  }\n})($);\n\nexports.Util = Util;\nexports.Alert = Alert;\nexports.Button = Button;\nexports.Carousel = Carousel;\nexports.Collapse = Collapse;\nexports.Dropdown = Dropdown;\nexports.Modal = Modal;\nexports.Popover = Popover;\nexports.Scrollspy = ScrollSpy;\nexports.Tab = Tab;\nexports.Tooltip = Tooltip;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=bootstrap.bundle.js.map\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/bootstrap/js/bootstrap.js",
    "content": "/*!\n  * Bootstrap v4.0.0-beta.3 (https://getbootstrap.com)\n  * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) :\n\ttypeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :\n\t(factory((global.bootstrap = {}),global.jQuery,global.Popper));\n}(this, (function (exports,$,Popper) { 'use strict';\n\n$ = $ && $.hasOwnProperty('default') ? $['default'] : $;\nPopper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  subClass.__proto__ = superClass;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Util = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Private TransitionEnd Helpers\n   * ------------------------------------------------------------------------\n   */\n  var transition = false;\n  var MAX_UID = 1000000; // shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  function toType(obj) {\n    return {}.toString.call(obj).match(/\\s([a-zA-Z]+)/)[1].toLowerCase();\n  }\n\n  function getSpecialTransitionEndEvent() {\n    return {\n      bindType: transition.end,\n      delegateType: transition.end,\n      handle: function handle(event) {\n        if ($$$1(event.target).is(this)) {\n          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n        }\n\n        return undefined; // eslint-disable-line no-undefined\n      }\n    };\n  }\n\n  function transitionEndTest() {\n    if (window.QUnit) {\n      return false;\n    }\n\n    return {\n      end: 'transitionend'\n    };\n  }\n\n  function transitionEndEmulator(duration) {\n    var _this = this;\n\n    var called = false;\n    $$$1(this).one(Util.TRANSITION_END, function () {\n      called = true;\n    });\n    setTimeout(function () {\n      if (!called) {\n        Util.triggerTransitionEnd(_this);\n      }\n    }, duration);\n    return this;\n  }\n\n  function setTransitionEndSupport() {\n    transition = transitionEndTest();\n    $$$1.fn.emulateTransitionEnd = transitionEndEmulator;\n\n    if (Util.supportsTransitionEnd()) {\n      $$$1.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n    }\n  }\n\n  function escapeId(selector) {\n    // we escape IDs in case of special selectors (selector = '#myId:something')\n    // $.escapeSelector does not exist in jQuery < 3\n    selector = typeof $$$1.escapeSelector === 'function' ? $$$1.escapeSelector(selector).substr(1) : selector.replace(/(:|\\.|\\[|\\]|,|=|@)/g, '\\\\$1');\n    return selector;\n  }\n  /**\n   * --------------------------------------------------------------------------\n   * Public Util Api\n   * --------------------------------------------------------------------------\n   */\n\n\n  var Util = {\n    TRANSITION_END: 'bsTransitionEnd',\n    getUID: function getUID(prefix) {\n      do {\n        // eslint-disable-next-line no-bitwise\n        prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n      } while (document.getElementById(prefix));\n\n      return prefix;\n    },\n    getSelectorFromElement: function getSelectorFromElement(element) {\n      var selector = element.getAttribute('data-target');\n\n      if (!selector || selector === '#') {\n        selector = element.getAttribute('href') || '';\n      } // if it's an ID\n\n\n      if (selector.charAt(0) === '#') {\n        selector = escapeId(selector);\n      }\n\n      try {\n        var $selector = $$$1(document).find(selector);\n        return $selector.length > 0 ? selector : null;\n      } catch (error) {\n        return null;\n      }\n    },\n    reflow: function reflow(element) {\n      return element.offsetHeight;\n    },\n    triggerTransitionEnd: function triggerTransitionEnd(element) {\n      $$$1(element).trigger(transition.end);\n    },\n    supportsTransitionEnd: function supportsTransitionEnd() {\n      return Boolean(transition);\n    },\n    isElement: function isElement(obj) {\n      return (obj[0] || obj).nodeType;\n    },\n    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n      for (var property in configTypes) {\n        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n          var expectedTypes = configTypes[property];\n          var value = config[property];\n          var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n          if (!new RegExp(expectedTypes).test(valueType)) {\n            throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n          }\n        }\n      }\n    }\n  };\n  setTransitionEndSupport();\n  return Util;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Alert = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'alert';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.alert';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var TRANSITION_DURATION = 150;\n  var Selector = {\n    DISMISS: '[data-dismiss=\"alert\"]'\n  };\n  var Event = {\n    CLOSE: \"close\" + EVENT_KEY,\n    CLOSED: \"closed\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    ALERT: 'alert',\n    FADE: 'fade',\n    SHOW: 'show'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Alert =\n  /*#__PURE__*/\n  function () {\n    function Alert(element) {\n      this._element = element;\n    } // getters\n\n\n    var _proto = Alert.prototype;\n\n    // public\n    _proto.close = function close(element) {\n      element = element || this._element;\n\n      var rootElement = this._getRootElement(element);\n\n      var customEvent = this._triggerCloseEvent(rootElement);\n\n      if (customEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._removeElement(rootElement);\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1.removeData(this._element, DATA_KEY);\n      this._element = null;\n    }; // private\n\n\n    _proto._getRootElement = function _getRootElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      var parent = false;\n\n      if (selector) {\n        parent = $$$1(selector)[0];\n      }\n\n      if (!parent) {\n        parent = $$$1(element).closest(\".\" + ClassName.ALERT)[0];\n      }\n\n      return parent;\n    };\n\n    _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n      var closeEvent = $$$1.Event(Event.CLOSE);\n      $$$1(element).trigger(closeEvent);\n      return closeEvent;\n    };\n\n    _proto._removeElement = function _removeElement(element) {\n      var _this = this;\n\n      $$$1(element).removeClass(ClassName.SHOW);\n\n      if (!Util.supportsTransitionEnd() || !$$$1(element).hasClass(ClassName.FADE)) {\n        this._destroyElement(element);\n\n        return;\n      }\n\n      $$$1(element).one(Util.TRANSITION_END, function (event) {\n        return _this._destroyElement(element, event);\n      }).emulateTransitionEnd(TRANSITION_DURATION);\n    };\n\n    _proto._destroyElement = function _destroyElement(element) {\n      $$$1(element).detach().trigger(Event.CLOSED).remove();\n    }; // static\n\n\n    Alert._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $$$1(this);\n        var data = $element.data(DATA_KEY);\n\n        if (!data) {\n          data = new Alert(this);\n          $element.data(DATA_KEY, data);\n        }\n\n        if (config === 'close') {\n          data[config](this);\n        }\n      });\n    };\n\n    Alert._handleDismiss = function _handleDismiss(alertInstance) {\n      return function (event) {\n        if (event) {\n          event.preventDefault();\n        }\n\n        alertInstance.close(this);\n      };\n    };\n\n    _createClass(Alert, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }]);\n    return Alert;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = Alert._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Alert;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Alert._jQueryInterface;\n  };\n\n  return Alert;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Button = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'button';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.button';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var ClassName = {\n    ACTIVE: 'active',\n    BUTTON: 'btn',\n    FOCUS: 'focus'\n  };\n  var Selector = {\n    DATA_TOGGLE_CARROT: '[data-toggle^=\"button\"]',\n    DATA_TOGGLE: '[data-toggle=\"buttons\"]',\n    INPUT: 'input',\n    ACTIVE: '.active',\n    BUTTON: '.btn'\n  };\n  var Event = {\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY,\n    FOCUS_BLUR_DATA_API: \"focus\" + EVENT_KEY + DATA_API_KEY + \" \" + (\"blur\" + EVENT_KEY + DATA_API_KEY)\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Button =\n  /*#__PURE__*/\n  function () {\n    function Button(element) {\n      this._element = element;\n    } // getters\n\n\n    var _proto = Button.prototype;\n\n    // public\n    _proto.toggle = function toggle() {\n      var triggerChangeEvent = true;\n      var addAriaPressed = true;\n      var rootElement = $$$1(this._element).closest(Selector.DATA_TOGGLE)[0];\n\n      if (rootElement) {\n        var input = $$$1(this._element).find(Selector.INPUT)[0];\n\n        if (input) {\n          if (input.type === 'radio') {\n            if (input.checked && $$$1(this._element).hasClass(ClassName.ACTIVE)) {\n              triggerChangeEvent = false;\n            } else {\n              var activeElement = $$$1(rootElement).find(Selector.ACTIVE)[0];\n\n              if (activeElement) {\n                $$$1(activeElement).removeClass(ClassName.ACTIVE);\n              }\n            }\n          }\n\n          if (triggerChangeEvent) {\n            if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {\n              return;\n            }\n\n            input.checked = !$$$1(this._element).hasClass(ClassName.ACTIVE);\n            $$$1(input).trigger('change');\n          }\n\n          input.focus();\n          addAriaPressed = false;\n        }\n      }\n\n      if (addAriaPressed) {\n        this._element.setAttribute('aria-pressed', !$$$1(this._element).hasClass(ClassName.ACTIVE));\n      }\n\n      if (triggerChangeEvent) {\n        $$$1(this._element).toggleClass(ClassName.ACTIVE);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1.removeData(this._element, DATA_KEY);\n      this._element = null;\n    }; // static\n\n\n    Button._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $$$1(this).data(DATA_KEY);\n\n        if (!data) {\n          data = new Button(this);\n          $$$1(this).data(DATA_KEY, data);\n        }\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Button, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }]);\n    return Button;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\n    event.preventDefault();\n    var button = event.target;\n\n    if (!$$$1(button).hasClass(ClassName.BUTTON)) {\n      button = $$$1(button).closest(Selector.BUTTON);\n    }\n\n    Button._jQueryInterface.call($$$1(button), 'toggle');\n  }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {\n    var button = $$$1(event.target).closest(Selector.BUTTON)[0];\n    $$$1(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = Button._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Button;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Button._jQueryInterface;\n  };\n\n  return Button;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Carousel = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'carousel';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.carousel';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var TRANSITION_DURATION = 600;\n  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n  var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  var Default = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true\n  };\n  var DefaultType = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean'\n  };\n  var Direction = {\n    NEXT: 'next',\n    PREV: 'prev',\n    LEFT: 'left',\n    RIGHT: 'right'\n  };\n  var Event = {\n    SLIDE: \"slide\" + EVENT_KEY,\n    SLID: \"slid\" + EVENT_KEY,\n    KEYDOWN: \"keydown\" + EVENT_KEY,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY,\n    TOUCHEND: \"touchend\" + EVENT_KEY,\n    LOAD_DATA_API: \"load\" + EVENT_KEY + DATA_API_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    CAROUSEL: 'carousel',\n    ACTIVE: 'active',\n    SLIDE: 'slide',\n    RIGHT: 'carousel-item-right',\n    LEFT: 'carousel-item-left',\n    NEXT: 'carousel-item-next',\n    PREV: 'carousel-item-prev',\n    ITEM: 'carousel-item'\n  };\n  var Selector = {\n    ACTIVE: '.active',\n    ACTIVE_ITEM: '.active.carousel-item',\n    ITEM: '.carousel-item',\n    NEXT_PREV: '.carousel-item-next, .carousel-item-prev',\n    INDICATORS: '.carousel-indicators',\n    DATA_SLIDE: '[data-slide], [data-slide-to]',\n    DATA_RIDE: '[data-ride=\"carousel\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Carousel =\n  /*#__PURE__*/\n  function () {\n    function Carousel(element, config) {\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this._config = this._getConfig(config);\n      this._element = $$$1(element)[0];\n      this._indicatorsElement = $$$1(this._element).find(Selector.INDICATORS)[0];\n\n      this._addEventListeners();\n    } // getters\n\n\n    var _proto = Carousel.prototype;\n\n    // public\n    _proto.next = function next() {\n      if (!this._isSliding) {\n        this._slide(Direction.NEXT);\n      }\n    };\n\n    _proto.nextWhenVisible = function nextWhenVisible() {\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && $$$1(this._element).is(':visible') && $$$1(this._element).css('visibility') !== 'hidden') {\n        this.next();\n      }\n    };\n\n    _proto.prev = function prev() {\n      if (!this._isSliding) {\n        this._slide(Direction.PREV);\n      }\n    };\n\n    _proto.pause = function pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if ($$$1(this._element).find(Selector.NEXT_PREV)[0] && Util.supportsTransitionEnd()) {\n        Util.triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    };\n\n    _proto.cycle = function cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config.interval && !this._isPaused) {\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    };\n\n    _proto.to = function to(index) {\n      var _this = this;\n\n      this._activeElement = $$$1(this._element).find(Selector.ACTIVE_ITEM)[0];\n\n      var activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        $$$1(this._element).one(Event.SLID, function () {\n          return _this.to(index);\n        });\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;\n\n      this._slide(direction, this._items[index]);\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1(this._element).off(EVENT_KEY);\n      $$$1.removeData(this._element, DATA_KEY);\n      this._items = null;\n      this._config = null;\n      this._element = null;\n      this._interval = null;\n      this._isPaused = null;\n      this._isSliding = null;\n      this._activeElement = null;\n      this._indicatorsElement = null;\n    }; // private\n\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, Default, config);\n      Util.typeCheckConfig(NAME, config, DefaultType);\n      return config;\n    };\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this2 = this;\n\n      if (this._config.keyboard) {\n        $$$1(this._element).on(Event.KEYDOWN, function (event) {\n          return _this2._keydown(event);\n        });\n      }\n\n      if (this._config.pause === 'hover') {\n        $$$1(this._element).on(Event.MOUSEENTER, function (event) {\n          return _this2.pause(event);\n        }).on(Event.MOUSELEAVE, function (event) {\n          return _this2.cycle(event);\n        });\n\n        if ('ontouchstart' in document.documentElement) {\n          // if it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          $$$1(this._element).on(Event.TOUCHEND, function () {\n            _this2.pause();\n\n            if (_this2.touchTimeout) {\n              clearTimeout(_this2.touchTimeout);\n            }\n\n            _this2.touchTimeout = setTimeout(function (event) {\n              return _this2.cycle(event);\n            }, TOUCHEVENT_COMPAT_WAIT + _this2._config.interval);\n          });\n        }\n      }\n    };\n\n    _proto._keydown = function _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      switch (event.which) {\n        case ARROW_LEFT_KEYCODE:\n          event.preventDefault();\n          this.prev();\n          break;\n\n        case ARROW_RIGHT_KEYCODE:\n          event.preventDefault();\n          this.next();\n          break;\n\n        default:\n          return;\n      }\n    };\n\n    _proto._getItemIndex = function _getItemIndex(element) {\n      this._items = $$$1.makeArray($$$1(element).parent().find(Selector.ITEM));\n      return this._items.indexOf(element);\n    };\n\n    _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n      var isNextDirection = direction === Direction.NEXT;\n      var isPrevDirection = direction === Direction.PREV;\n\n      var activeIndex = this._getItemIndex(activeElement);\n\n      var lastItemIndex = this._items.length - 1;\n      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n      if (isGoingToWrap && !this._config.wrap) {\n        return activeElement;\n      }\n\n      var delta = direction === Direction.PREV ? -1 : 1;\n      var itemIndex = (activeIndex + delta) % this._items.length;\n      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n    };\n\n    _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      var targetIndex = this._getItemIndex(relatedTarget);\n\n      var fromIndex = this._getItemIndex($$$1(this._element).find(Selector.ACTIVE_ITEM)[0]);\n\n      var slideEvent = $$$1.Event(Event.SLIDE, {\n        relatedTarget: relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n      $$$1(this._element).trigger(slideEvent);\n      return slideEvent;\n    };\n\n    _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        $$$1(this._indicatorsElement).find(Selector.ACTIVE).removeClass(ClassName.ACTIVE);\n\n        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n        if (nextIndicator) {\n          $$$1(nextIndicator).addClass(ClassName.ACTIVE);\n        }\n      }\n    };\n\n    _proto._slide = function _slide(direction, element) {\n      var _this3 = this;\n\n      var activeElement = $$$1(this._element).find(Selector.ACTIVE_ITEM)[0];\n\n      var activeElementIndex = this._getItemIndex(activeElement);\n\n      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n      var nextElementIndex = this._getItemIndex(nextElement);\n\n      var isCycling = Boolean(this._interval);\n      var directionalClassName;\n      var orderClassName;\n      var eventDirectionName;\n\n      if (direction === Direction.NEXT) {\n        directionalClassName = ClassName.LEFT;\n        orderClassName = ClassName.NEXT;\n        eventDirectionName = Direction.LEFT;\n      } else {\n        directionalClassName = ClassName.RIGHT;\n        orderClassName = ClassName.PREV;\n        eventDirectionName = Direction.RIGHT;\n      }\n\n      if (nextElement && $$$1(nextElement).hasClass(ClassName.ACTIVE)) {\n        this._isSliding = false;\n        return;\n      }\n\n      var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      var slidEvent = $$$1.Event(Event.SLID, {\n        relatedTarget: nextElement,\n        direction: eventDirectionName,\n        from: activeElementIndex,\n        to: nextElementIndex\n      });\n\n      if (Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.SLIDE)) {\n        $$$1(nextElement).addClass(orderClassName);\n        Util.reflow(nextElement);\n        $$$1(activeElement).addClass(directionalClassName);\n        $$$1(nextElement).addClass(directionalClassName);\n        $$$1(activeElement).one(Util.TRANSITION_END, function () {\n          $$$1(nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(ClassName.ACTIVE);\n          $$$1(activeElement).removeClass(ClassName.ACTIVE + \" \" + orderClassName + \" \" + directionalClassName);\n          _this3._isSliding = false;\n          setTimeout(function () {\n            return $$$1(_this3._element).trigger(slidEvent);\n          }, 0);\n        }).emulateTransitionEnd(TRANSITION_DURATION);\n      } else {\n        $$$1(activeElement).removeClass(ClassName.ACTIVE);\n        $$$1(nextElement).addClass(ClassName.ACTIVE);\n        this._isSliding = false;\n        $$$1(this._element).trigger(slidEvent);\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    }; // static\n\n\n    Carousel._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $$$1(this).data(DATA_KEY);\n\n        var _config = _extends({}, Default, $$$1(this).data());\n\n        if (typeof config === 'object') {\n          _config = _extends({}, _config, config);\n        }\n\n        var action = typeof config === 'string' ? config : _config.slide;\n\n        if (!data) {\n          data = new Carousel(this, _config);\n          $$$1(this).data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'number') {\n          data.to(config);\n        } else if (typeof action === 'string') {\n          if (typeof data[action] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + action + \"\\\"\");\n          }\n\n          data[action]();\n        } else if (_config.interval) {\n          data.pause();\n          data.cycle();\n        }\n      });\n    };\n\n    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n      var selector = Util.getSelectorFromElement(this);\n\n      if (!selector) {\n        return;\n      }\n\n      var target = $$$1(selector)[0];\n\n      if (!target || !$$$1(target).hasClass(ClassName.CAROUSEL)) {\n        return;\n      }\n\n      var config = _extends({}, $$$1(target).data(), $$$1(this).data());\n      var slideIndex = this.getAttribute('data-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel._jQueryInterface.call($$$1(target), config);\n\n      if (slideIndex) {\n        $$$1(target).data(DATA_KEY).to(slideIndex);\n      }\n\n      event.preventDefault();\n    };\n\n    _createClass(Carousel, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n    return Carousel;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);\n  $$$1(window).on(Event.LOAD_DATA_API, function () {\n    $$$1(Selector.DATA_RIDE).each(function () {\n      var $carousel = $$$1(this);\n\n      Carousel._jQueryInterface.call($carousel, $carousel.data());\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = Carousel._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Carousel;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Carousel._jQueryInterface;\n  };\n\n  return Carousel;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Collapse = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'collapse';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.collapse';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var TRANSITION_DURATION = 600;\n  var Default = {\n    toggle: true,\n    parent: ''\n  };\n  var DefaultType = {\n    toggle: 'boolean',\n    parent: '(string|element)'\n  };\n  var Event = {\n    SHOW: \"show\" + EVENT_KEY,\n    SHOWN: \"shown\" + EVENT_KEY,\n    HIDE: \"hide\" + EVENT_KEY,\n    HIDDEN: \"hidden\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    SHOW: 'show',\n    COLLAPSE: 'collapse',\n    COLLAPSING: 'collapsing',\n    COLLAPSED: 'collapsed'\n  };\n  var Dimension = {\n    WIDTH: 'width',\n    HEIGHT: 'height'\n  };\n  var Selector = {\n    ACTIVES: '.show, .collapsing',\n    DATA_TOGGLE: '[data-toggle=\"collapse\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Collapse =\n  /*#__PURE__*/\n  function () {\n    function Collapse(element, config) {\n      this._isTransitioning = false;\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._triggerArray = $$$1.makeArray($$$1(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n      var tabToggles = $$$1(Selector.DATA_TOGGLE);\n\n      for (var i = 0; i < tabToggles.length; i++) {\n        var elem = tabToggles[i];\n        var selector = Util.getSelectorFromElement(elem);\n\n        if (selector !== null && $$$1(selector).filter(element).length > 0) {\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._parent = this._config.parent ? this._getParent() : null;\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // getters\n\n\n    var _proto = Collapse.prototype;\n\n    // public\n    _proto.toggle = function toggle() {\n      if ($$$1(this._element).hasClass(ClassName.SHOW)) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._isTransitioning || $$$1(this._element).hasClass(ClassName.SHOW)) {\n        return;\n      }\n\n      var actives;\n      var activesData;\n\n      if (this._parent) {\n        actives = $$$1.makeArray($$$1(this._parent).children().children(Selector.ACTIVES));\n\n        if (!actives.length) {\n          actives = null;\n        }\n      }\n\n      if (actives) {\n        activesData = $$$1(actives).data(DATA_KEY);\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      var startEvent = $$$1.Event(Event.SHOW);\n      $$$1(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (actives) {\n        Collapse._jQueryInterface.call($$$1(actives), 'hide');\n\n        if (!activesData) {\n          $$$1(actives).data(DATA_KEY, null);\n        }\n      }\n\n      var dimension = this._getDimension();\n\n      $$$1(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);\n      this._element.style[dimension] = 0;\n\n      if (this._triggerArray.length) {\n        $$$1(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        $$$1(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);\n        _this._element.style[dimension] = '';\n\n        _this.setTransitioning(false);\n\n        $$$1(_this._element).trigger(Event.SHOWN);\n      };\n\n      if (!Util.supportsTransitionEnd()) {\n        complete();\n        return;\n      }\n\n      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      var scrollSize = \"scroll\" + capitalizedDimension;\n      $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\n      this._element.style[dimension] = this._element[scrollSize] + \"px\";\n    };\n\n    _proto.hide = function hide() {\n      var _this2 = this;\n\n      if (this._isTransitioning || !$$$1(this._element).hasClass(ClassName.SHOW)) {\n        return;\n      }\n\n      var startEvent = $$$1.Event(Event.HIDE);\n      $$$1(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      var dimension = this._getDimension();\n\n      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n      Util.reflow(this._element);\n      $$$1(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);\n\n      if (this._triggerArray.length) {\n        for (var i = 0; i < this._triggerArray.length; i++) {\n          var trigger = this._triggerArray[i];\n          var selector = Util.getSelectorFromElement(trigger);\n\n          if (selector !== null) {\n            var $elem = $$$1(selector);\n\n            if (!$elem.hasClass(ClassName.SHOW)) {\n              $$$1(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);\n            }\n          }\n        }\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        _this2.setTransitioning(false);\n\n        $$$1(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);\n      };\n\n      this._element.style[dimension] = '';\n\n      if (!Util.supportsTransitionEnd()) {\n        complete();\n        return;\n      }\n\n      $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\n    };\n\n    _proto.setTransitioning = function setTransitioning(isTransitioning) {\n      this._isTransitioning = isTransitioning;\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1.removeData(this._element, DATA_KEY);\n      this._config = null;\n      this._parent = null;\n      this._element = null;\n      this._triggerArray = null;\n      this._isTransitioning = null;\n    }; // private\n\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, Default, config);\n      config.toggle = Boolean(config.toggle); // coerce string values\n\n      Util.typeCheckConfig(NAME, config, DefaultType);\n      return config;\n    };\n\n    _proto._getDimension = function _getDimension() {\n      var hasWidth = $$$1(this._element).hasClass(Dimension.WIDTH);\n      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n    };\n\n    _proto._getParent = function _getParent() {\n      var _this3 = this;\n\n      var parent = null;\n\n      if (Util.isElement(this._config.parent)) {\n        parent = this._config.parent; // it's a jQuery object\n\n        if (typeof this._config.parent.jquery !== 'undefined') {\n          parent = this._config.parent[0];\n        }\n      } else {\n        parent = $$$1(this._config.parent)[0];\n      }\n\n      var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n      $$$1(parent).find(selector).each(function (i, element) {\n        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n      });\n      return parent;\n    };\n\n    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n      if (element) {\n        var isOpen = $$$1(element).hasClass(ClassName.SHOW);\n\n        if (triggerArray.length) {\n          $$$1(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n        }\n      }\n    }; // static\n\n\n    Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      return selector ? $$$1(selector)[0] : null;\n    };\n\n    Collapse._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $$$1(this);\n        var data = $this.data(DATA_KEY);\n\n        var _config = _extends({}, Default, $this.data(), typeof config === 'object' && config);\n\n        if (!data && _config.toggle && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        if (!data) {\n          data = new Collapse(this, _config);\n          $this.data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Collapse, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n    return Collapse;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.currentTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    var $trigger = $$$1(this);\n    var selector = Util.getSelectorFromElement(this);\n    $$$1(selector).each(function () {\n      var $target = $$$1(this);\n      var data = $target.data(DATA_KEY);\n      var config = data ? 'toggle' : $trigger.data();\n\n      Collapse._jQueryInterface.call($target, config);\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = Collapse._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Collapse;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Collapse._jQueryInterface;\n  };\n\n  return Collapse;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Dropdown = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'dropdown';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.dropdown';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE);\n  var Event = {\n    HIDE: \"hide\" + EVENT_KEY,\n    HIDDEN: \"hidden\" + EVENT_KEY,\n    SHOW: \"show\" + EVENT_KEY,\n    SHOWN: \"shown\" + EVENT_KEY,\n    CLICK: \"click\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY,\n    KEYDOWN_DATA_API: \"keydown\" + EVENT_KEY + DATA_API_KEY,\n    KEYUP_DATA_API: \"keyup\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    DISABLED: 'disabled',\n    SHOW: 'show',\n    DROPUP: 'dropup',\n    DROPRIGHT: 'dropright',\n    DROPLEFT: 'dropleft',\n    MENURIGHT: 'dropdown-menu-right',\n    MENULEFT: 'dropdown-menu-left',\n    POSITION_STATIC: 'position-static'\n  };\n  var Selector = {\n    DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n    FORM_CHILD: '.dropdown form',\n    MENU: '.dropdown-menu',\n    NAVBAR_NAV: '.navbar-nav',\n    VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled)'\n  };\n  var AttachmentMap = {\n    TOP: 'top-start',\n    TOPEND: 'top-end',\n    BOTTOM: 'bottom-start',\n    BOTTOMEND: 'bottom-end',\n    RIGHT: 'right-start',\n    RIGHTEND: 'right-end',\n    LEFT: 'left-start',\n    LEFTEND: 'left-end'\n  };\n  var Default = {\n    offset: 0,\n    flip: true,\n    boundary: 'scrollParent'\n  };\n  var DefaultType = {\n    offset: '(number|string|function)',\n    flip: 'boolean',\n    boundary: '(string|element)'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Dropdown =\n  /*#__PURE__*/\n  function () {\n    function Dropdown(element, config) {\n      this._element = element;\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n\n      this._addEventListeners();\n    } // getters\n\n\n    var _proto = Dropdown.prototype;\n\n    // public\n    _proto.toggle = function toggle() {\n      if (this._element.disabled || $$$1(this._element).hasClass(ClassName.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      var isActive = $$$1(this._menu).hasClass(ClassName.SHOW);\n\n      Dropdown._clearMenus();\n\n      if (isActive) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $$$1.Event(Event.SHOW, relatedTarget);\n      $$$1(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      } // Disable totally Popper.js for Dropdown in Navbar\n\n\n      if (!this._inNavbar) {\n        /**\n         * Check for Popper dependency\n         * Popper - https://popper.js.org\n         */\n        if (typeof Popper === 'undefined') {\n          throw new Error('Bootstrap dropdown require Popper.js (https://popper.js.org)');\n        }\n\n        var element = this._element; // for dropup with alignment we use the parent as popper container\n\n        if ($$$1(parent).hasClass(ClassName.DROPUP)) {\n          if ($$$1(this._menu).hasClass(ClassName.MENULEFT) || $$$1(this._menu).hasClass(ClassName.MENURIGHT)) {\n            element = parent;\n          }\n        } // If boundary is not `scrollParent`, then set position to `static`\n        // to allow the menu to \"escape\" the scroll parent's boundaries\n        // https://github.com/twbs/bootstrap/issues/24251\n\n\n        if (this._config.boundary !== 'scrollParent') {\n          $$$1(parent).addClass(ClassName.POSITION_STATIC);\n        }\n\n        this._popper = new Popper(element, this._menu, this._getPopperConfig());\n      } // if this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && !$$$1(parent).closest(Selector.NAVBAR_NAV).length) {\n        $$$1('body').children().on('mouseover', null, $$$1.noop);\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      $$$1(this._menu).toggleClass(ClassName.SHOW);\n      $$$1(parent).toggleClass(ClassName.SHOW).trigger($$$1.Event(Event.SHOWN, relatedTarget));\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1.removeData(this._element, DATA_KEY);\n      $$$1(this._element).off(EVENT_KEY);\n      this._element = null;\n      this._menu = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n\n        this._popper = null;\n      }\n    };\n\n    _proto.update = function update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    }; // private\n\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this = this;\n\n      $$$1(this._element).on(Event.CLICK, function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        _this.toggle();\n      });\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, this.constructor.Default, $$$1(this._element).data(), config);\n      Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._getMenuElement = function _getMenuElement() {\n      if (!this._menu) {\n        var parent = Dropdown._getParentFromElement(this._element);\n\n        this._menu = $$$1(parent).find(Selector.MENU)[0];\n      }\n\n      return this._menu;\n    };\n\n    _proto._getPlacement = function _getPlacement() {\n      var $parentDropdown = $$$1(this._element).parent();\n      var placement = AttachmentMap.BOTTOM; // Handle dropup\n\n      if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n        placement = AttachmentMap.TOP;\n\n        if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {\n          placement = AttachmentMap.TOPEND;\n        }\n      } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n        placement = AttachmentMap.RIGHT;\n      } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n        placement = AttachmentMap.LEFT;\n      } else if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {\n        placement = AttachmentMap.BOTTOMEND;\n      }\n\n      return placement;\n    };\n\n    _proto._detectNavbar = function _detectNavbar() {\n      return $$$1(this._element).closest('.navbar').length > 0;\n    };\n\n    _proto._getPopperConfig = function _getPopperConfig() {\n      var _this2 = this;\n\n      var offsetConf = {};\n\n      if (typeof this._config.offset === 'function') {\n        offsetConf.fn = function (data) {\n          data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets) || {});\n          return data;\n        };\n      } else {\n        offsetConf.offset = this._config.offset;\n      }\n\n      var popperConfig = {\n        placement: this._getPlacement(),\n        modifiers: {\n          offset: offsetConf,\n          flip: {\n            enabled: this._config.flip\n          },\n          preventOverflow: {\n            boundariesElement: this._config.boundary\n          }\n        }\n      };\n      return popperConfig;\n    }; // static\n\n\n    Dropdown._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $$$1(this).data(DATA_KEY);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data) {\n          data = new Dropdown(this, _config);\n          $$$1(this).data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    Dropdown._clearMenus = function _clearMenus(event) {\n      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n        return;\n      }\n\n      var toggles = $$$1.makeArray($$$1(Selector.DATA_TOGGLE));\n\n      for (var i = 0; i < toggles.length; i++) {\n        var parent = Dropdown._getParentFromElement(toggles[i]);\n\n        var context = $$$1(toggles[i]).data(DATA_KEY);\n        var relatedTarget = {\n          relatedTarget: toggles[i]\n        };\n\n        if (!context) {\n          continue;\n        }\n\n        var dropdownMenu = context._menu;\n\n        if (!$$$1(parent).hasClass(ClassName.SHOW)) {\n          continue;\n        }\n\n        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $$$1.contains(parent, event.target)) {\n          continue;\n        }\n\n        var hideEvent = $$$1.Event(Event.HIDE, relatedTarget);\n        $$$1(parent).trigger(hideEvent);\n\n        if (hideEvent.isDefaultPrevented()) {\n          continue;\n        } // if this is a touch-enabled device we remove the extra\n        // empty mouseover listeners we added for iOS support\n\n\n        if ('ontouchstart' in document.documentElement) {\n          $$$1('body').children().off('mouseover', null, $$$1.noop);\n        }\n\n        toggles[i].setAttribute('aria-expanded', 'false');\n        $$$1(dropdownMenu).removeClass(ClassName.SHOW);\n        $$$1(parent).removeClass(ClassName.SHOW).trigger($$$1.Event(Event.HIDDEN, relatedTarget));\n      }\n    };\n\n    Dropdown._getParentFromElement = function _getParentFromElement(element) {\n      var parent;\n      var selector = Util.getSelectorFromElement(element);\n\n      if (selector) {\n        parent = $$$1(selector)[0];\n      }\n\n      return parent || element.parentNode;\n    };\n\n    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $$$1(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (this.disabled || $$$1(this).hasClass(ClassName.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this);\n\n      var isActive = $$$1(parent).hasClass(ClassName.SHOW);\n\n      if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n        if (event.which === ESCAPE_KEYCODE) {\n          var toggle = $$$1(parent).find(Selector.DATA_TOGGLE)[0];\n          $$$1(toggle).trigger('focus');\n        }\n\n        $$$1(this).trigger('click');\n        return;\n      }\n\n      var items = $$$1(parent).find(Selector.VISIBLE_ITEMS).get();\n\n      if (!items.length) {\n        return;\n      }\n\n      var index = items.indexOf(event.target);\n\n      if (event.which === ARROW_UP_KEYCODE && index > 0) {\n        // up\n        index--;\n      }\n\n      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n        // down\n        index++;\n      }\n\n      if (index < 0) {\n        index = 0;\n      }\n\n      items[index].focus();\n    };\n\n    _createClass(Dropdown, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType;\n      }\n    }]);\n    return Dropdown;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + \" \" + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    Dropdown._jQueryInterface.call($$$1(this), 'toggle');\n  }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {\n    e.stopPropagation();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = Dropdown._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Dropdown;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Dropdown._jQueryInterface;\n  };\n\n  return Dropdown;\n}($, Popper);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Modal = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'modal';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.modal';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var TRANSITION_DURATION = 300;\n  var BACKDROP_TRANSITION_DURATION = 150;\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var Default = {\n    backdrop: true,\n    keyboard: true,\n    focus: true,\n    show: true\n  };\n  var DefaultType = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean',\n    show: 'boolean'\n  };\n  var Event = {\n    HIDE: \"hide\" + EVENT_KEY,\n    HIDDEN: \"hidden\" + EVENT_KEY,\n    SHOW: \"show\" + EVENT_KEY,\n    SHOWN: \"shown\" + EVENT_KEY,\n    FOCUSIN: \"focusin\" + EVENT_KEY,\n    RESIZE: \"resize\" + EVENT_KEY,\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY,\n    KEYDOWN_DISMISS: \"keydown.dismiss\" + EVENT_KEY,\n    MOUSEUP_DISMISS: \"mouseup.dismiss\" + EVENT_KEY,\n    MOUSEDOWN_DISMISS: \"mousedown.dismiss\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\n    BACKDROP: 'modal-backdrop',\n    OPEN: 'modal-open',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector = {\n    DIALOG: '.modal-dialog',\n    DATA_TOGGLE: '[data-toggle=\"modal\"]',\n    DATA_DISMISS: '[data-dismiss=\"modal\"]',\n    FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n    STICKY_CONTENT: '.sticky-top',\n    NAVBAR_TOGGLER: '.navbar-toggler'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Modal =\n  /*#__PURE__*/\n  function () {\n    function Modal(element, config) {\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._dialog = $$$1(element).find(Selector.DIALOG)[0];\n      this._backdrop = null;\n      this._isShown = false;\n      this._isBodyOverflowing = false;\n      this._ignoreBackdropClick = false;\n      this._originalBodyPadding = 0;\n      this._scrollbarWidth = 0;\n    } // getters\n\n\n    var _proto = Modal.prototype;\n\n    // public\n    _proto.toggle = function toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    };\n\n    _proto.show = function show(relatedTarget) {\n      var _this = this;\n\n      if (this._isTransitioning || this._isShown) {\n        return;\n      }\n\n      if (Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.FADE)) {\n        this._isTransitioning = true;\n      }\n\n      var showEvent = $$$1.Event(Event.SHOW, {\n        relatedTarget: relatedTarget\n      });\n      $$$1(this._element).trigger(showEvent);\n\n      if (this._isShown || showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = true;\n\n      this._checkScrollbar();\n\n      this._setScrollbar();\n\n      this._adjustDialog();\n\n      $$$1(document.body).addClass(ClassName.OPEN);\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $$$1(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {\n        return _this.hide(event);\n      });\n      $$$1(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {\n        $$$1(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {\n          if ($$$1(event.target).is(_this._element)) {\n            _this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(function () {\n        return _this._showElement(relatedTarget);\n      });\n    };\n\n    _proto.hide = function hide(event) {\n      var _this2 = this;\n\n      if (event) {\n        event.preventDefault();\n      }\n\n      if (this._isTransitioning || !this._isShown) {\n        return;\n      }\n\n      var hideEvent = $$$1.Event(Event.HIDE);\n      $$$1(this._element).trigger(hideEvent);\n\n      if (!this._isShown || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = false;\n      var transition = Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.FADE);\n\n      if (transition) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $$$1(document).off(Event.FOCUSIN);\n      $$$1(this._element).removeClass(ClassName.SHOW);\n      $$$1(this._element).off(Event.CLICK_DISMISS);\n      $$$1(this._dialog).off(Event.MOUSEDOWN_DISMISS);\n\n      if (transition) {\n        $$$1(this._element).one(Util.TRANSITION_END, function (event) {\n          return _this2._hideModal(event);\n        }).emulateTransitionEnd(TRANSITION_DURATION);\n      } else {\n        this._hideModal();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1.removeData(this._element, DATA_KEY);\n      $$$1(window, document, this._element, this._backdrop).off(EVENT_KEY);\n      this._config = null;\n      this._element = null;\n      this._dialog = null;\n      this._backdrop = null;\n      this._isShown = null;\n      this._isBodyOverflowing = null;\n      this._ignoreBackdropClick = null;\n      this._scrollbarWidth = null;\n    };\n\n    _proto.handleUpdate = function handleUpdate() {\n      this._adjustDialog();\n    }; // private\n\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, Default, config);\n      Util.typeCheckConfig(NAME, config, DefaultType);\n      return config;\n    };\n\n    _proto._showElement = function _showElement(relatedTarget) {\n      var _this3 = this;\n\n      var transition = Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.FADE);\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // don't move modals dom position\n        document.body.appendChild(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.scrollTop = 0;\n\n      if (transition) {\n        Util.reflow(this._element);\n      }\n\n      $$$1(this._element).addClass(ClassName.SHOW);\n\n      if (this._config.focus) {\n        this._enforceFocus();\n      }\n\n      var shownEvent = $$$1.Event(Event.SHOWN, {\n        relatedTarget: relatedTarget\n      });\n\n      var transitionComplete = function transitionComplete() {\n        if (_this3._config.focus) {\n          _this3._element.focus();\n        }\n\n        _this3._isTransitioning = false;\n        $$$1(_this3._element).trigger(shownEvent);\n      };\n\n      if (transition) {\n        $$$1(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);\n      } else {\n        transitionComplete();\n      }\n    };\n\n    _proto._enforceFocus = function _enforceFocus() {\n      var _this4 = this;\n\n      $$$1(document).off(Event.FOCUSIN) // guard against infinite focus loop\n      .on(Event.FOCUSIN, function (event) {\n        if (document !== event.target && _this4._element !== event.target && !$$$1(_this4._element).has(event.target).length) {\n          _this4._element.focus();\n        }\n      });\n    };\n\n    _proto._setEscapeEvent = function _setEscapeEvent() {\n      var _this5 = this;\n\n      if (this._isShown && this._config.keyboard) {\n        $$$1(this._element).on(Event.KEYDOWN_DISMISS, function (event) {\n          if (event.which === ESCAPE_KEYCODE) {\n            event.preventDefault();\n\n            _this5.hide();\n          }\n        });\n      } else if (!this._isShown) {\n        $$$1(this._element).off(Event.KEYDOWN_DISMISS);\n      }\n    };\n\n    _proto._setResizeEvent = function _setResizeEvent() {\n      var _this6 = this;\n\n      if (this._isShown) {\n        $$$1(window).on(Event.RESIZE, function (event) {\n          return _this6.handleUpdate(event);\n        });\n      } else {\n        $$$1(window).off(Event.RESIZE);\n      }\n    };\n\n    _proto._hideModal = function _hideModal() {\n      var _this7 = this;\n\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._isTransitioning = false;\n\n      this._showBackdrop(function () {\n        $$$1(document.body).removeClass(ClassName.OPEN);\n\n        _this7._resetAdjustments();\n\n        _this7._resetScrollbar();\n\n        $$$1(_this7._element).trigger(Event.HIDDEN);\n      });\n    };\n\n    _proto._removeBackdrop = function _removeBackdrop() {\n      if (this._backdrop) {\n        $$$1(this._backdrop).remove();\n        this._backdrop = null;\n      }\n    };\n\n    _proto._showBackdrop = function _showBackdrop(callback) {\n      var _this8 = this;\n\n      var animate = $$$1(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';\n\n      if (this._isShown && this._config.backdrop) {\n        var doAnimate = Util.supportsTransitionEnd() && animate;\n        this._backdrop = document.createElement('div');\n        this._backdrop.className = ClassName.BACKDROP;\n\n        if (animate) {\n          $$$1(this._backdrop).addClass(animate);\n        }\n\n        $$$1(this._backdrop).appendTo(document.body);\n        $$$1(this._element).on(Event.CLICK_DISMISS, function (event) {\n          if (_this8._ignoreBackdropClick) {\n            _this8._ignoreBackdropClick = false;\n            return;\n          }\n\n          if (event.target !== event.currentTarget) {\n            return;\n          }\n\n          if (_this8._config.backdrop === 'static') {\n            _this8._element.focus();\n          } else {\n            _this8.hide();\n          }\n        });\n\n        if (doAnimate) {\n          Util.reflow(this._backdrop);\n        }\n\n        $$$1(this._backdrop).addClass(ClassName.SHOW);\n\n        if (!callback) {\n          return;\n        }\n\n        if (!doAnimate) {\n          callback();\n          return;\n        }\n\n        $$$1(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);\n      } else if (!this._isShown && this._backdrop) {\n        $$$1(this._backdrop).removeClass(ClassName.SHOW);\n\n        var callbackRemove = function callbackRemove() {\n          _this8._removeBackdrop();\n\n          if (callback) {\n            callback();\n          }\n        };\n\n        if (Util.supportsTransitionEnd() && $$$1(this._element).hasClass(ClassName.FADE)) {\n          $$$1(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);\n        } else {\n          callbackRemove();\n        }\n      } else if (callback) {\n        callback();\n      }\n    }; // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // todo (fat): these should probably be refactored out of modal.js\n    // ----------------------------------------------------------------------\n\n\n    _proto._adjustDialog = function _adjustDialog() {\n      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      if (!this._isBodyOverflowing && isModalOverflowing) {\n        this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n      }\n\n      if (this._isBodyOverflowing && !isModalOverflowing) {\n        this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n      }\n    };\n\n    _proto._resetAdjustments = function _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    };\n\n    _proto._checkScrollbar = function _checkScrollbar() {\n      var rect = document.body.getBoundingClientRect();\n      this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;\n      this._scrollbarWidth = this._getScrollbarWidth();\n    };\n\n    _proto._setScrollbar = function _setScrollbar() {\n      var _this9 = this;\n\n      if (this._isBodyOverflowing) {\n        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n        // Adjust fixed content padding\n        $$$1(Selector.FIXED_CONTENT).each(function (index, element) {\n          var actualPadding = $$$1(element)[0].style.paddingRight;\n          var calculatedPadding = $$$1(element).css('padding-right');\n          $$$1(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + \"px\");\n        }); // Adjust sticky content margin\n\n        $$$1(Selector.STICKY_CONTENT).each(function (index, element) {\n          var actualMargin = $$$1(element)[0].style.marginRight;\n          var calculatedMargin = $$$1(element).css('margin-right');\n          $$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + \"px\");\n        }); // Adjust navbar-toggler margin\n\n        $$$1(Selector.NAVBAR_TOGGLER).each(function (index, element) {\n          var actualMargin = $$$1(element)[0].style.marginRight;\n          var calculatedMargin = $$$1(element).css('margin-right');\n          $$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this9._scrollbarWidth + \"px\");\n        }); // Adjust body padding\n\n        var actualPadding = document.body.style.paddingRight;\n        var calculatedPadding = $$$1('body').css('padding-right');\n        $$$1('body').data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n      }\n    };\n\n    _proto._resetScrollbar = function _resetScrollbar() {\n      // Restore fixed content padding\n      $$$1(Selector.FIXED_CONTENT).each(function (index, element) {\n        var padding = $$$1(element).data('padding-right');\n\n        if (typeof padding !== 'undefined') {\n          $$$1(element).css('padding-right', padding).removeData('padding-right');\n        }\n      }); // Restore sticky content and navbar-toggler margin\n\n      $$$1(Selector.STICKY_CONTENT + \", \" + Selector.NAVBAR_TOGGLER).each(function (index, element) {\n        var margin = $$$1(element).data('margin-right');\n\n        if (typeof margin !== 'undefined') {\n          $$$1(element).css('margin-right', margin).removeData('margin-right');\n        }\n      }); // Restore body padding\n\n      var padding = $$$1('body').data('padding-right');\n\n      if (typeof padding !== 'undefined') {\n        $$$1('body').css('padding-right', padding).removeData('padding-right');\n      }\n    };\n\n    _proto._getScrollbarWidth = function _getScrollbarWidth() {\n      // thx d.walsh\n      var scrollDiv = document.createElement('div');\n      scrollDiv.className = ClassName.SCROLLBAR_MEASURER;\n      document.body.appendChild(scrollDiv);\n      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n      document.body.removeChild(scrollDiv);\n      return scrollbarWidth;\n    }; // static\n\n\n    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        var data = $$$1(this).data(DATA_KEY);\n\n        var _config = _extends({}, Modal.Default, $$$1(this).data(), typeof config === 'object' && config);\n\n        if (!data) {\n          data = new Modal(this, _config);\n          $$$1(this).data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](relatedTarget);\n        } else if (_config.show) {\n          data.show(relatedTarget);\n        }\n      });\n    };\n\n    _createClass(Modal, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n    return Modal;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n    var _this10 = this;\n\n    var target;\n    var selector = Util.getSelectorFromElement(this);\n\n    if (selector) {\n      target = $$$1(selector)[0];\n    }\n\n    var config = $$$1(target).data(DATA_KEY) ? 'toggle' : _extends({}, $$$1(target).data(), $$$1(this).data());\n\n    if (this.tagName === 'A' || this.tagName === 'AREA') {\n      event.preventDefault();\n    }\n\n    var $target = $$$1(target).one(Event.SHOW, function (showEvent) {\n      if (showEvent.isDefaultPrevented()) {\n        // only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      $target.one(Event.HIDDEN, function () {\n        if ($$$1(_this10).is(':visible')) {\n          _this10.focus();\n        }\n      });\n    });\n\n    Modal._jQueryInterface.call($$$1(target), config, this);\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = Modal._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Modal;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Modal._jQueryInterface;\n  };\n\n  return Modal;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Tooltip = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'tooltip';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.tooltip';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var TRANSITION_DURATION = 150;\n  var CLASS_PREFIX = 'bs-tooltip';\n  var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n  var DefaultType = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(number|string)',\n    container: '(string|element|boolean)',\n    fallbackPlacement: '(string|array)',\n    boundary: '(string|element)'\n  };\n  var AttachmentMap = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: 'right',\n    BOTTOM: 'bottom',\n    LEFT: 'left'\n  };\n  var Default = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: 0,\n    container: false,\n    fallbackPlacement: 'flip',\n    boundary: 'scrollParent'\n  };\n  var HoverState = {\n    SHOW: 'show',\n    OUT: 'out'\n  };\n  var Event = {\n    HIDE: \"hide\" + EVENT_KEY,\n    HIDDEN: \"hidden\" + EVENT_KEY,\n    SHOW: \"show\" + EVENT_KEY,\n    SHOWN: \"shown\" + EVENT_KEY,\n    INSERTED: \"inserted\" + EVENT_KEY,\n    CLICK: \"click\" + EVENT_KEY,\n    FOCUSIN: \"focusin\" + EVENT_KEY,\n    FOCUSOUT: \"focusout\" + EVENT_KEY,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY\n  };\n  var ClassName = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector = {\n    TOOLTIP: '.tooltip',\n    TOOLTIP_INNER: '.tooltip-inner',\n    ARROW: '.arrow'\n  };\n  var Trigger = {\n    HOVER: 'hover',\n    FOCUS: 'focus',\n    CLICK: 'click',\n    MANUAL: 'manual'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tooltip =\n  /*#__PURE__*/\n  function () {\n    function Tooltip(element, config) {\n      /**\n       * Check for Popper dependency\n       * Popper - https://popper.js.org\n       */\n      if (typeof Popper === 'undefined') {\n        throw new Error('Bootstrap tooltips require Popper.js (https://popper.js.org)');\n      } // private\n\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // protected\n\n      this.element = element;\n      this.config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // getters\n\n\n    var _proto = Tooltip.prototype;\n\n    // public\n    _proto.enable = function enable() {\n      this._isEnabled = true;\n    };\n\n    _proto.disable = function disable() {\n      this._isEnabled = false;\n    };\n\n    _proto.toggleEnabled = function toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    };\n\n    _proto.toggle = function toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        var dataKey = this.constructor.DATA_KEY;\n        var context = $$$1(event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $$$1(event.currentTarget).data(dataKey, context);\n        }\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if ($$$1(this.getTipElement()).hasClass(ClassName.SHOW)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      $$$1.removeData(this.element, this.constructor.DATA_KEY);\n      $$$1(this.element).off(this.constructor.EVENT_KEY);\n      $$$1(this.element).closest('.modal').off('hide.bs.modal');\n\n      if (this.tip) {\n        $$$1(this.tip).remove();\n      }\n\n      this._isEnabled = null;\n      this._timeout = null;\n      this._hoverState = null;\n      this._activeTrigger = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n      }\n\n      this._popper = null;\n      this.element = null;\n      this.config = null;\n      this.tip = null;\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if ($$$1(this.element).css('display') === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      var showEvent = $$$1.Event(this.constructor.Event.SHOW);\n\n      if (this.isWithContent() && this._isEnabled) {\n        $$$1(this.element).trigger(showEvent);\n        var isInTheDom = $$$1.contains(this.element.ownerDocument.documentElement, this.element);\n\n        if (showEvent.isDefaultPrevented() || !isInTheDom) {\n          return;\n        }\n\n        var tip = this.getTipElement();\n        var tipId = Util.getUID(this.constructor.NAME);\n        tip.setAttribute('id', tipId);\n        this.element.setAttribute('aria-describedby', tipId);\n        this.setContent();\n\n        if (this.config.animation) {\n          $$$1(tip).addClass(ClassName.FADE);\n        }\n\n        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n        var attachment = this._getAttachment(placement);\n\n        this.addAttachmentClass(attachment);\n        var container = this.config.container === false ? document.body : $$$1(this.config.container);\n        $$$1(tip).data(this.constructor.DATA_KEY, this);\n\n        if (!$$$1.contains(this.element.ownerDocument.documentElement, this.tip)) {\n          $$$1(tip).appendTo(container);\n        }\n\n        $$$1(this.element).trigger(this.constructor.Event.INSERTED);\n        this._popper = new Popper(this.element, tip, {\n          placement: attachment,\n          modifiers: {\n            offset: {\n              offset: this.config.offset\n            },\n            flip: {\n              behavior: this.config.fallbackPlacement\n            },\n            arrow: {\n              element: Selector.ARROW\n            },\n            preventOverflow: {\n              boundariesElement: this.config.boundary\n            }\n          },\n          onCreate: function onCreate(data) {\n            if (data.originalPlacement !== data.placement) {\n              _this._handlePopperPlacementChange(data);\n            }\n          },\n          onUpdate: function onUpdate(data) {\n            _this._handlePopperPlacementChange(data);\n          }\n        });\n        $$$1(tip).addClass(ClassName.SHOW); // if this is a touch-enabled device we add extra\n        // empty mouseover listeners to the body's immediate children;\n        // only needed because of broken event delegation on iOS\n        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n        if ('ontouchstart' in document.documentElement) {\n          $$$1('body').children().on('mouseover', null, $$$1.noop);\n        }\n\n        var complete = function complete() {\n          if (_this.config.animation) {\n            _this._fixTransition();\n          }\n\n          var prevHoverState = _this._hoverState;\n          _this._hoverState = null;\n          $$$1(_this.element).trigger(_this.constructor.Event.SHOWN);\n\n          if (prevHoverState === HoverState.OUT) {\n            _this._leave(null, _this);\n          }\n        };\n\n        if (Util.supportsTransitionEnd() && $$$1(this.tip).hasClass(ClassName.FADE)) {\n          $$$1(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);\n        } else {\n          complete();\n        }\n      }\n    };\n\n    _proto.hide = function hide(callback) {\n      var _this2 = this;\n\n      var tip = this.getTipElement();\n      var hideEvent = $$$1.Event(this.constructor.Event.HIDE);\n\n      var complete = function complete() {\n        if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {\n          tip.parentNode.removeChild(tip);\n        }\n\n        _this2._cleanTipClass();\n\n        _this2.element.removeAttribute('aria-describedby');\n\n        $$$1(_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n        if (_this2._popper !== null) {\n          _this2._popper.destroy();\n        }\n\n        if (callback) {\n          callback();\n        }\n      };\n\n      $$$1(this.element).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $$$1(tip).removeClass(ClassName.SHOW); // if this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        $$$1('body').children().off('mouseover', null, $$$1.noop);\n      }\n\n      this._activeTrigger[Trigger.CLICK] = false;\n      this._activeTrigger[Trigger.FOCUS] = false;\n      this._activeTrigger[Trigger.HOVER] = false;\n\n      if (Util.supportsTransitionEnd() && $$$1(this.tip).hasClass(ClassName.FADE)) {\n        $$$1(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\n      } else {\n        complete();\n      }\n\n      this._hoverState = '';\n    };\n\n    _proto.update = function update() {\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    }; // protected\n\n\n    _proto.isWithContent = function isWithContent() {\n      return Boolean(this.getTitle());\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $$$1(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $$$1(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var $tip = $$$1(this.getTipElement());\n      this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());\n      $tip.removeClass(ClassName.FADE + \" \" + ClassName.SHOW);\n    };\n\n    _proto.setElementContent = function setElementContent($element, content) {\n      var html = this.config.html;\n\n      if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n        // content is a DOM node or a jQuery\n        if (html) {\n          if (!$$$1(content).parent().is($element)) {\n            $element.empty().append(content);\n          }\n        } else {\n          $element.text($$$1(content).text());\n        }\n      } else {\n        $element[html ? 'html' : 'text'](content);\n      }\n    };\n\n    _proto.getTitle = function getTitle() {\n      var title = this.element.getAttribute('data-original-title');\n\n      if (!title) {\n        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n      }\n\n      return title;\n    }; // private\n\n\n    _proto._getAttachment = function _getAttachment(placement) {\n      return AttachmentMap[placement.toUpperCase()];\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this3 = this;\n\n      var triggers = this.config.trigger.split(' ');\n      triggers.forEach(function (trigger) {\n        if (trigger === 'click') {\n          $$$1(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) {\n            return _this3.toggle(event);\n          });\n        } else if (trigger !== Trigger.MANUAL) {\n          var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;\n          var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;\n          $$$1(_this3.element).on(eventIn, _this3.config.selector, function (event) {\n            return _this3._enter(event);\n          }).on(eventOut, _this3.config.selector, function (event) {\n            return _this3._leave(event);\n          });\n        }\n\n        $$$1(_this3.element).closest('.modal').on('hide.bs.modal', function () {\n          return _this3.hide();\n        });\n      });\n\n      if (this.config.selector) {\n        this.config = _extends({}, this.config, {\n          trigger: 'manual',\n          selector: ''\n        });\n      } else {\n        this._fixTitle();\n      }\n    };\n\n    _proto._fixTitle = function _fixTitle() {\n      var titleType = typeof this.element.getAttribute('data-original-title');\n\n      if (this.element.getAttribute('title') || titleType !== 'string') {\n        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n        this.element.setAttribute('title', '');\n      }\n    };\n\n    _proto._enter = function _enter(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $$$1(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $$$1(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\n      }\n\n      if ($$$1(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n        context._hoverState = HoverState.SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.SHOW;\n\n      if (!context.config.delay || !context.config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.SHOW) {\n          context.show();\n        }\n      }, context.config.delay.show);\n    };\n\n    _proto._leave = function _leave(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $$$1(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $$$1(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.OUT;\n\n      if (!context.config.delay || !context.config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.OUT) {\n          context.hide();\n        }\n      }, context.config.delay.hide);\n    };\n\n    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n      for (var trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, this.constructor.Default, $$$1(this.element).data(), config);\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._getDelegateConfig = function _getDelegateConfig() {\n      var config = {};\n\n      if (this.config) {\n        for (var key in this.config) {\n          if (this.constructor.Default[key] !== this.config[key]) {\n            config[key] = this.config[key];\n          }\n        }\n      }\n\n      return config;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $$$1(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    };\n\n    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(data) {\n      this._cleanTipClass();\n\n      this.addAttachmentClass(this._getAttachment(data.placement));\n    };\n\n    _proto._fixTransition = function _fixTransition() {\n      var tip = this.getTipElement();\n      var initConfigAnimation = this.config.animation;\n\n      if (tip.getAttribute('x-placement') !== null) {\n        return;\n      }\n\n      $$$1(tip).removeClass(ClassName.FADE);\n      this.config.animation = false;\n      this.hide();\n      this.show();\n      this.config.animation = initConfigAnimation;\n    }; // static\n\n\n    Tooltip._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $$$1(this).data(DATA_KEY);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Tooltip(this, _config);\n          $$$1(this).data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tooltip, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType;\n      }\n    }]);\n    return Tooltip;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1.fn[NAME] = Tooltip._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Tooltip;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Tooltip._jQueryInterface;\n  };\n\n  return Tooltip;\n}($, Popper);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Popover = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'popover';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.popover';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var CLASS_PREFIX = 'bs-popover';\n  var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n  var Default = _extends({}, Tooltip.Default, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n  });\n  var DefaultType = _extends({}, Tooltip.DefaultType, {\n    content: '(string|element|function)'\n  });\n  var ClassName = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector = {\n    TITLE: '.popover-header',\n    CONTENT: '.popover-body'\n  };\n  var Event = {\n    HIDE: \"hide\" + EVENT_KEY,\n    HIDDEN: \"hidden\" + EVENT_KEY,\n    SHOW: \"show\" + EVENT_KEY,\n    SHOWN: \"shown\" + EVENT_KEY,\n    INSERTED: \"inserted\" + EVENT_KEY,\n    CLICK: \"click\" + EVENT_KEY,\n    FOCUSIN: \"focusin\" + EVENT_KEY,\n    FOCUSOUT: \"focusout\" + EVENT_KEY,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Popover =\n  /*#__PURE__*/\n  function (_Tooltip) {\n    _inheritsLoose(Popover, _Tooltip);\n\n    function Popover() {\n      return _Tooltip.apply(this, arguments) || this;\n    }\n\n    var _proto = Popover.prototype;\n\n    // overrides\n    _proto.isWithContent = function isWithContent() {\n      return this.getTitle() || this._getContent();\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $$$1(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $$$1(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var $tip = $$$1(this.getTipElement()); // we use append for html objects to maintain js events\n\n      this.setElementContent($tip.find(Selector.TITLE), this.getTitle());\n\n      var content = this._getContent();\n\n      if (typeof content === 'function') {\n        content = content.call(this.element);\n      }\n\n      this.setElementContent($tip.find(Selector.CONTENT), content);\n      $tip.removeClass(ClassName.FADE + \" \" + ClassName.SHOW);\n    }; // private\n\n\n    _proto._getContent = function _getContent() {\n      return this.element.getAttribute('data-content') || this.config.content;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $$$1(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    }; // static\n\n\n    Popover._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $$$1(this).data(DATA_KEY);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data && /destroy|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Popover(this, _config);\n          $$$1(this).data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Popover, null, [{\n      key: \"VERSION\",\n      // getters\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType;\n      }\n    }]);\n    return Popover;\n  }(Tooltip);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1.fn[NAME] = Popover._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Popover;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Popover._jQueryInterface;\n  };\n\n  return Popover;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar ScrollSpy = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'scrollspy';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.scrollspy';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var Default = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  var DefaultType = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  var Event = {\n    ACTIVATE: \"activate\" + EVENT_KEY,\n    SCROLL: \"scroll\" + EVENT_KEY,\n    LOAD_DATA_API: \"load\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    DROPDOWN_ITEM: 'dropdown-item',\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active'\n  };\n  var Selector = {\n    DATA_SPY: '[data-spy=\"scroll\"]',\n    ACTIVE: '.active',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    NAV_LINKS: '.nav-link',\n    NAV_ITEMS: '.nav-item',\n    LIST_ITEMS: '.list-group-item',\n    DROPDOWN: '.dropdown',\n    DROPDOWN_ITEMS: '.dropdown-item',\n    DROPDOWN_TOGGLE: '.dropdown-toggle'\n  };\n  var OffsetMethod = {\n    OFFSET: 'offset',\n    POSITION: 'position'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var ScrollSpy =\n  /*#__PURE__*/\n  function () {\n    function ScrollSpy(element, config) {\n      var _this = this;\n\n      this._element = element;\n      this._scrollElement = element.tagName === 'BODY' ? window : element;\n      this._config = this._getConfig(config);\n      this._selector = this._config.target + \" \" + Selector.NAV_LINKS + \",\" + (this._config.target + \" \" + Selector.LIST_ITEMS + \",\") + (this._config.target + \" \" + Selector.DROPDOWN_ITEMS);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      $$$1(this._scrollElement).on(Event.SCROLL, function (event) {\n        return _this._process(event);\n      });\n      this.refresh();\n\n      this._process();\n    } // getters\n\n\n    var _proto = ScrollSpy.prototype;\n\n    // public\n    _proto.refresh = function refresh() {\n      var _this2 = this;\n\n      var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;\n      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      var targets = $$$1.makeArray($$$1(this._selector));\n      targets.map(function (element) {\n        var target;\n        var targetSelector = Util.getSelectorFromElement(element);\n\n        if (targetSelector) {\n          target = $$$1(targetSelector)[0];\n        }\n\n        if (target) {\n          var targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            // todo (fat): remove sketch reliance on jQuery position/offset\n            return [$$$1(target)[offsetMethod]().top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(function (item) {\n        return item;\n      }).sort(function (a, b) {\n        return a[0] - b[0];\n      }).forEach(function (item) {\n        _this2._offsets.push(item[0]);\n\n        _this2._targets.push(item[1]);\n      });\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1.removeData(this._element, DATA_KEY);\n      $$$1(this._scrollElement).off(EVENT_KEY);\n      this._element = null;\n      this._scrollElement = null;\n      this._config = null;\n      this._selector = null;\n      this._offsets = null;\n      this._targets = null;\n      this._activeTarget = null;\n      this._scrollHeight = null;\n    }; // private\n\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _extends({}, Default, config);\n\n      if (typeof config.target !== 'string') {\n        var id = $$$1(config.target).attr('id');\n\n        if (!id) {\n          id = Util.getUID(NAME);\n          $$$1(config.target).attr('id', id);\n        }\n\n        config.target = \"#\" + id;\n      }\n\n      Util.typeCheckConfig(NAME, config, DefaultType);\n      return config;\n    };\n\n    _proto._getScrollTop = function _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    };\n\n    _proto._getScrollHeight = function _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    };\n\n    _proto._getOffsetHeight = function _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    };\n\n    _proto._process = function _process() {\n      var scrollTop = this._getScrollTop() + this._config.offset;\n\n      var scrollHeight = this._getScrollHeight();\n\n      var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        var target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      for (var i = this._offsets.length; i--;) {\n        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    };\n\n    _proto._activate = function _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      var queries = this._selector.split(','); // eslint-disable-next-line arrow-body-style\n\n\n      queries = queries.map(function (selector) {\n        return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + (selector + \"[href=\\\"\" + target + \"\\\"]\");\n      });\n      var $link = $$$1(queries.join(','));\n\n      if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n        $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);\n        $link.addClass(ClassName.ACTIVE);\n      } else {\n        // Set triggered link as active\n        $link.addClass(ClassName.ACTIVE); // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n        $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_LINKS + \", \" + Selector.LIST_ITEMS).addClass(ClassName.ACTIVE); // Handle special case when .nav-link is inside .nav-item\n\n        $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);\n      }\n\n      $$$1(this._scrollElement).trigger(Event.ACTIVATE, {\n        relatedTarget: target\n      });\n    };\n\n    _proto._clear = function _clear() {\n      $$$1(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);\n    }; // static\n\n\n    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $$$1(this).data(DATA_KEY);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new ScrollSpy(this, _config);\n          $$$1(this).data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(ScrollSpy, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n    return ScrollSpy;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(window).on(Event.LOAD_DATA_API, function () {\n    var scrollSpys = $$$1.makeArray($$$1(Selector.DATA_SPY));\n\n    for (var i = scrollSpys.length; i--;) {\n      var $spy = $$$1(scrollSpys[i]);\n\n      ScrollSpy._jQueryInterface.call($spy, $spy.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = ScrollSpy._jQueryInterface;\n  $$$1.fn[NAME].Constructor = ScrollSpy;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return ScrollSpy._jQueryInterface;\n  };\n\n  return ScrollSpy;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-beta.3): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nvar Tab = function ($$$1) {\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  var NAME = 'tab';\n  var VERSION = '4.0.0-beta.3';\n  var DATA_KEY = 'bs.tab';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $$$1.fn[NAME];\n  var TRANSITION_DURATION = 150;\n  var Event = {\n    HIDE: \"hide\" + EVENT_KEY,\n    HIDDEN: \"hidden\" + EVENT_KEY,\n    SHOW: \"show\" + EVENT_KEY,\n    SHOWN: \"shown\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active',\n    DISABLED: 'disabled',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector = {\n    DROPDOWN: '.dropdown',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    ACTIVE: '.active',\n    ACTIVE_UL: '> li > .active',\n    DATA_TOGGLE: '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n    DROPDOWN_TOGGLE: '.dropdown-toggle',\n    DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tab =\n  /*#__PURE__*/\n  function () {\n    function Tab(element) {\n      this._element = element;\n    } // getters\n\n\n    var _proto = Tab.prototype;\n\n    // public\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $$$1(this._element).hasClass(ClassName.ACTIVE) || $$$1(this._element).hasClass(ClassName.DISABLED)) {\n        return;\n      }\n\n      var target;\n      var previous;\n      var listElement = $$$1(this._element).closest(Selector.NAV_LIST_GROUP)[0];\n      var selector = Util.getSelectorFromElement(this._element);\n\n      if (listElement) {\n        var itemSelector = listElement.nodeName === 'UL' ? Selector.ACTIVE_UL : Selector.ACTIVE;\n        previous = $$$1.makeArray($$$1(listElement).find(itemSelector));\n        previous = previous[previous.length - 1];\n      }\n\n      var hideEvent = $$$1.Event(Event.HIDE, {\n        relatedTarget: this._element\n      });\n      var showEvent = $$$1.Event(Event.SHOW, {\n        relatedTarget: previous\n      });\n\n      if (previous) {\n        $$$1(previous).trigger(hideEvent);\n      }\n\n      $$$1(this._element).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (selector) {\n        target = $$$1(selector)[0];\n      }\n\n      this._activate(this._element, listElement);\n\n      var complete = function complete() {\n        var hiddenEvent = $$$1.Event(Event.HIDDEN, {\n          relatedTarget: _this._element\n        });\n        var shownEvent = $$$1.Event(Event.SHOWN, {\n          relatedTarget: previous\n        });\n        $$$1(previous).trigger(hiddenEvent);\n        $$$1(_this._element).trigger(shownEvent);\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $$$1.removeData(this._element, DATA_KEY);\n      this._element = null;\n    }; // private\n\n\n    _proto._activate = function _activate(element, container, callback) {\n      var _this2 = this;\n\n      var activeElements;\n\n      if (container.nodeName === 'UL') {\n        activeElements = $$$1(container).find(Selector.ACTIVE_UL);\n      } else {\n        activeElements = $$$1(container).children(Selector.ACTIVE);\n      }\n\n      var active = activeElements[0];\n      var isTransitioning = callback && Util.supportsTransitionEnd() && active && $$$1(active).hasClass(ClassName.FADE);\n\n      var complete = function complete() {\n        return _this2._transitionComplete(element, active, callback);\n      };\n\n      if (active && isTransitioning) {\n        $$$1(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);\n      } else {\n        complete();\n      }\n    };\n\n    _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n      if (active) {\n        $$$1(active).removeClass(ClassName.SHOW + \" \" + ClassName.ACTIVE);\n        var dropdownChild = $$$1(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];\n\n        if (dropdownChild) {\n          $$$1(dropdownChild).removeClass(ClassName.ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      $$$1(element).addClass(ClassName.ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      Util.reflow(element);\n      $$$1(element).addClass(ClassName.SHOW);\n\n      if (element.parentNode && $$$1(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\n        var dropdownElement = $$$1(element).closest(Selector.DROPDOWN)[0];\n\n        if (dropdownElement) {\n          $$$1(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    }; // static\n\n\n    Tab._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $$$1(this);\n        var data = $this.data(DATA_KEY);\n\n        if (!data) {\n          data = new Tab(this);\n          $this.data(DATA_KEY, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new Error(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tab, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }]);\n    return Tab;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n\n    Tab._jQueryInterface.call($$$1(this), 'show');\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $$$1.fn[NAME] = Tab._jQueryInterface;\n  $$$1.fn[NAME].Constructor = Tab;\n\n  $$$1.fn[NAME].noConflict = function () {\n    $$$1.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Tab._jQueryInterface;\n  };\n\n  return Tab;\n}($);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.0.0-alpha.6): index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n(function ($$$1) {\n  if (typeof $$$1 === 'undefined') {\n    throw new Error('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n  }\n\n  var version = $$$1.fn.jquery.split(' ')[0].split('.');\n  var minMajor = 1;\n  var ltMajor = 2;\n  var minMinor = 9;\n  var minPatch = 1;\n  var maxMajor = 4;\n\n  if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n    throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n  }\n})($);\n\nexports.Util = Util;\nexports.Alert = Alert;\nexports.Button = Button;\nexports.Carousel = Carousel;\nexports.Collapse = Collapse;\nexports.Dropdown = Dropdown;\nexports.Modal = Modal;\nexports.Popover = Popover;\nexports.Scrollspy = ScrollSpy;\nexports.Tab = Tab;\nexports.Tooltip = Tooltip;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=bootstrap.js.map\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/bootstrap.html",
    "content": ""
  },
  {
    "path": "packages/browser-sync/test/fixtures/bower.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>Document</title>\n    <link rel=\"stylesheet\" id=\"css-style\" href=\"bower_components/app.css\">\n</head>\n<body>\n    <h1>Bower Components</h1>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync/test/fixtures/bower_components/app.css",
    "content": "body {\n    background: orange;\n}"
  },
  {
    "path": "packages/browser-sync/test/fixtures/config/config.js",
    "content": "/*\n |--------------------------------------------------------------------------\n | Browser-sync config file\n |--------------------------------------------------------------------------\n |\n | Please report any issues you encounter:\n |  https://github.com/shakyShane/browser-sync/issues\n |\n */\nmodule.exports = {\n\n    /*\n     |--------------------------------------------------------------------------\n     | Files\n     |--------------------------------------------------------------------------\n     |\n     | Here you can specify which files should be watched for changes.\n     | Below are a few examples of accepted patterns.\n     | For more information check: https://github.com/isaacs/minimatch\n     |\n     */\n    // Examples:\n    // files: \"css/*.css\",\n    // files: [\"css/*.css\", \"css/**/*.css\"],\n    // files: [\"css/*.css\", \"app/*.html\"],\n    files: [],\n\n    /*\n     |--------------------------------------------------------------------------\n     | Host\n     |--------------------------------------------------------------------------\n     |\n     | Browser-sync will auto detect a suitable IP to be used, if that doesn't work, or\n     | if you already know which IP to use - you can specify it here.\n     |\n     |   host: \"192.168.0.4\"\n     |\n     */\n    host: null,\n\n    /*\n     |--------------------------------------------------------------------------\n     | Ghost Mode\n     |--------------------------------------------------------------------------\n     |\n     | Enable/disable individual ghostMode options.\n     |\n     */\n    ghostMode: {\n        clickedLinks: false, // Allow click events on <a> elements (buggy, avoid if possible)\n        links: true,\n        forms: true,\n        scroll: true\n    },\n\n    /*\n     |--------------------------------------------------------------------------\n     | Server\n     |--------------------------------------------------------------------------\n     |\n     | Use the built-in server when working with static HTML files.\n     | Note: NOT to be used if you're using the proxy.\n     |\n     |   server: {\n     |       baseDir: \"app\"\n     |   },\n     |   server: {\n     |       baseDir: \"./\"\n     |   },\n     |   server: {\n     |       baseDir: \"./\",\n     |       index: \"index.htm\"\n     |   },\n     */\n    server: false,\n\n    /*\n     |--------------------------------------------------------------------------\n     | Proxy\n     |--------------------------------------------------------------------------\n     |\n     | If you have an existing server setup, you can use the proxy to inject the snippets.\n     | Note: NOT to be used if you're using the built-in server.\n     |\n     | IP based proxy example.\n     |   proxy: {\n     |      host: \"127.0.0.1\",\n     |      port: 8000\n     |   }\n     |\n     | vhost based proxy example.\n     |   proxy: {\n     |      host: \"local.dev\",\n     |      port: 8000,\n     |   }\n     |\n     */\n    proxy: false,\n\n    /*\n     |--------------------------------------------------------------------------\n     | Open (true|false)\n     |--------------------------------------------------------------------------\n     |\n     | Should the browser be opened automatically?\n     |\n     */\n    open: true,\n\n    /*\n     |--------------------------------------------------------------------------\n     | Timestamps (true|false)\n     |--------------------------------------------------------------------------\n     |\n     | Should timestamps be appended to injected files?\n     | (if you don't know why you would ever need to turn this off, then leave it on)\n     |\n     */\n    timestamps: true,\n\n    /*\n     |--------------------------------------------------------------------------\n     | File Timeout (milliseconds)\n     |--------------------------------------------------------------------------\n     |\n     | If you're using a pre-processor (like SASS) & you find that the file watching is erratic,\n     | you can increase the amount of time to wait after a file changed here.\n     |\n     */\n    fileTimeout: 1000,\n\n    /*\n     |--------------------------------------------------------------------------\n     | Scroll Throttle (milliseconds)\n     |--------------------------------------------------------------------------\n     |\n     | If you experience any problems with the scroll sync, you can throttle how quickly the events\n     | are sent. (0-200 works best)\n     |\n     */\n    scrollThrottle: 0,\n\n    /*\n     |--------------------------------------------------------------------------\n     | Notify (true|false)\n     |--------------------------------------------------------------------------\n     |\n     | By default, Browser-Sync will flash a message in the browser when a file changes,\n     | you can turn it off here if you don't want it.\n     |\n     */\n    notify: true\n};\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/config/si-config-partial.js",
    "content": "module.exports = {\n    files: \"test/fixtures/**/*.css\",\n    testConfig: true,\n    server:false\n};\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/config/si-config-ports.js",
    "content": "module.exports = {\n    files: \"test/fixtures/**/*.css\",\n    testConfig: true,\n    logLevel: \"info\",\n    background: false,\n    reloadFileTypes: ['php', 'html', 'js', 'erb'],\n    injectFileTypes: ['css', 'png', 'jpg', 'svg', 'gif'],\n    host: null,\n    ports: {\n        min: 4000,\n        max: 4004\n    },\n    ghostMode: {\n        links: true,\n        forms: true,\n        scroll: true\n    },\n    server: {\n        baseDir: \"test/fixtures\"\n    },\n    open: true\n};"
  },
  {
    "path": "packages/browser-sync/test/fixtures/config/si-config-proxy.js",
    "content": "module.exports = {\n    files: \"test/fixtures/**/*.css\",\n    testConfig: true,\n    logLevel: \"info\",\n    background: false,\n    reloadFileTypes: ['php', 'html', 'js', 'erb'],\n    injectFileTypes: ['css', 'png', 'jpg', 'svg', 'gif'],\n    host: null,\n    ghostMode: {\n        links: true,\n        forms: true,\n        scroll: true\n    },\n    proxy: {\n        host: \"192.168.0.4\",\n        port: \"8000\"\n    },\n    open: true\n};\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/config/si-config.js",
    "content": "module.exports = {\n    files: [\"test/fixtures/**/*.css\", \"test/fixtures/**/*.html\"],\n    testConfig: true,\n    logLevel: \"debug\",\n    open: false,    \n    server: {\n        baseDir: \"test/fixtures\"\n    }\n};\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/config/si-default-config.js",
    "content": "module.exports = {\n    logLevel: \"info\",\n    files: \"test/fixtures/assets/style.css\",\n    background: false,\n    defaultConfig: true,\n    reloadFileTypes: ['php', 'html', 'js', 'erb'],\n    injectFileTypes: ['css', 'png', 'jpg', 'svg', 'gif'],\n    host: null,\n    ghostMode: {\n        links: false,\n        forms: false,\n        scroll: false\n    },\n    server: false,\n    open: true,\n    notify: true\n};"
  },
  {
    "path": "packages/browser-sync/test/fixtures/css/bootstrap-less.css",
    "content": "/*!\n * Bootstrap v3.0.3 (http://getbootstrap.com)\n * Copyright 2013 Twitter, Inc.\n * Licensed under http://www.apache.org/licenses/LICENSE-2.0\n */\n/*! normalize.css v2.1.3 | MIT License | git.io/normalize */\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\na {\n  background: transparent;\n}\na:focus {\n  outline: thin dotted;\n}\na:active,\na:hover {\n  outline: 0;\n}\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\nmark {\n  color: #000;\n  background: #ff0;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\npre {\n  white-space: pre-wrap;\n}\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\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: 0;\n}\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\nlegend {\n  padding: 0;\n  border: 0;\n}\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\nbutton,\ninput {\n  line-height: normal;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-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^=\"javascript:\"]:after,\n  a[href^=\"#\"]: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  @page {\n    margin: 2cm .5cm;\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  .table td,\n  .table th {\n    background-color: #fff !important;\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-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\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: #428bca;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\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  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\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: #999999;\n}\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\nh2 small,\nh3 small,\nh1 .small,\nh2 .small,\nh3 .small {\n  font-size: 65%;\n}\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\nh5 small,\nh6 small,\nh4 .small,\nh5 .small,\nh6 .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: 200;\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}\ncite {\n  font-style: normal;\n}\n.text-muted {\n  color: #999999;\n}\n.text-primary {\n  color: #428bca;\n}\n.text-primary:hover {\n  color: #3071a9;\n}\n.text-warning {\n  color: #8a6d3b;\n}\n.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\n.text-danger:hover {\n  color: #843534;\n}\n.text-success {\n  color: #3c763d;\n}\n.text-success:hover {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\n.text-info:hover {\n  color: #245269;\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.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}\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n.list-inline > li:first-child {\n  padding-left: 0;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.428571429;\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    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\nblockquote p:last-child {\n  margin-bottom: 0;\n}\nblockquote small,\nblockquote .small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\nblockquote.pull-right p,\nblockquote.pull-right small,\nblockquote.pull-right .small {\n  text-align: right;\n}\nblockquote.pull-right small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\nblockquote.pull-right small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\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  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\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  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n.container:after {\n  clear: both;\n}\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n.container:after {\n  clear: both;\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.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n.row:after {\n  clear: both;\n}\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n.row:after {\n  clear: both;\n}\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666666666666%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333333334%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666666666666%;\n}\n.col-xs-pull-7 {\n  right: 58.333333333333336%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666666666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.666666666666664%;\n}\n.col-xs-pull-1 {\n  right: 8.333333333333332%;\n}\n.col-xs-pull-0 {\n  right: 0;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666666666666%;\n}\n.col-xs-push-10 {\n  left: 83.33333333333334%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666666666666%;\n}\n.col-xs-push-7 {\n  left: 58.333333333333336%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666666666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.666666666666664%;\n}\n.col-xs-push-1 {\n  left: 8.333333333333332%;\n}\n.col-xs-push-0 {\n  left: 0;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666666666666%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333333334%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666666666666%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.333333333333336%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666666666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.666666666666664%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.333333333333332%;\n}\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11,\n  .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-0 {\n    right: 0;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-0 {\n    left: 0;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11,\n  .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-0 {\n    right: 0;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-0 {\n    left: 0;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11,\n  .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-0 {\n    right: 0;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-0 {\n    left: 0;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\nth {\n  text-align: left;\n}\n.table {\n  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.428571429;\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) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n.table > thead > tr > .active,\n.table > tbody > tr > .active,\n.table > tfoot > tr > .active,\n.table > thead > .active > td,\n.table > tbody > .active > td,\n.table > tfoot > .active > td,\n.table > thead > .active > th,\n.table > tbody > .active > th,\n.table > tfoot > .active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > .active:hover,\n.table-hover > tbody > .active:hover > td,\n.table-hover > tbody > .active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > .success,\n.table > tbody > tr > .success,\n.table > tfoot > tr > .success,\n.table > thead > .success > td,\n.table > tbody > .success > td,\n.table > tfoot > .success > td,\n.table > thead > .success > th,\n.table > tbody > .success > th,\n.table > tfoot > .success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > .success:hover,\n.table-hover > tbody > .success:hover > td,\n.table-hover > tbody > .success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > .danger,\n.table > tbody > tr > .danger,\n.table > tfoot > tr > .danger,\n.table > thead > .danger > td,\n.table > tbody > .danger > td,\n.table > tfoot > .danger > td,\n.table > thead > .danger > th,\n.table > tbody > .danger > th,\n.table > tfoot > .danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > .danger:hover,\n.table-hover > tbody > .danger:hover > td,\n.table-hover > tbody > .danger:hover > th {\n  background-color: #ebcccc;\n}\n.table > thead > tr > .warning,\n.table > tbody > tr > .warning,\n.table > tfoot > tr > .warning,\n.table > thead > .warning > td,\n.table > tbody > .warning > td,\n.table > tfoot > .warning > td,\n.table > thead > .warning > th,\n.table > tbody > .warning > th,\n.table > tfoot > .warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > .warning:hover,\n.table-hover > tbody > .warning:hover > td,\n.table-hover > tbody > .warning:hover > th {\n  background-color: #faf2cc;\n}\n@media (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    -webkit-overflow-scrolling: touch;\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}\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  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\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}\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\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.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control:-moz-placeholder {\n  color: #999999;\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}\ntextarea.form-control {\n  height: auto;\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n.radio label,\n.checkbox label {\n  display: inline;\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  float: left;\n  margin-left: -20px;\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  font-weight: normal;\n  vertical-align: middle;\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],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm {\n  height: auto;\n}\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg {\n  height: auto;\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  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\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  background-color: #fcf8e3;\n  border-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  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\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  background-color: #f2dede;\n  border-color: #a94442;\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  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\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  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n.form-control-static {\n  margin-bottom: 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  }\n  .form-inline select.form-control {\n    width: auto;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n.form-horizontal .form-group:after {\n  clear: both;\n}\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n.form-horizontal .form-group:after {\n  clear: both;\n}\n.form-horizontal .form-control-static {\n  padding-top: 7px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  -o-user-select: none;\n  user-select: none;\n}\n.btn: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  color: #333333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\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:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\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: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: #fff;\n}\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\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: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: #428bca;\n  border-color: #357ebd;\n}\n.btn-primary .badge {\n  color: #428bca;\n  background-color: #fff;\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:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\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: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: #fff;\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:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\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: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: #fff;\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:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\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: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: #fff;\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:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\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: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: #fff;\n}\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\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: #2a6496;\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: #999999;\n  text-decoration: none;\n}\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs {\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  padding-right: 0;\n  padding-left: 0;\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  -webkit-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n}\n.collapse.in {\n  display: block;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n  transition: height 0.35s ease;\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  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon:empty {\n  width: 1em;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro: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.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  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\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.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\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  background-color: #428bca;\n  outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 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    right: 0;\n    left: 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:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\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:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n.btn-toolbar:after {\n  clear: both;\n}\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n.btn-toolbar:after {\n  clear: both;\n}\n.btn-toolbar .btn-group {\n  float: left;\n}\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-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-top-right-radius: 0;\n  border-bottom-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-top-right-radius: 0;\n  border-bottom-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-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\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-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\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:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n.btn-group-vertical > .btn-group:after {\n  clear: both;\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-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\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 > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-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  border-collapse: separate;\n  table-layout: fixed;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: 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-right: 0;\n  padding-left: 0;\n}\n.input-group .form-control {\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 {\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 {\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 > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-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 > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\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  white-space: nowrap;\n}\n.input-group-btn:first-child > .btn {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n.nav:after {\n  clear: both;\n}\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n.nav:after {\n  clear: both;\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: #999999;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\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.428571429;\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  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\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  margin-bottom: 5px;\n  text-align: center;\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: #428bca;\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  margin-bottom: 5px;\n  text-align: center;\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}\n.tab-content > .active {\n  display: block;\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.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n.navbar:after {\n  clear: both;\n}\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n.navbar:after {\n  clear: both;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n.navbar-header:after {\n  clear: both;\n}\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n.navbar-header:after {\n  clear: both;\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\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:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n.navbar-collapse:after {\n  clear: both;\n}\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n.navbar-collapse:after {\n  clear: both;\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    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-right: 0;\n    padding-left: 0;\n  }\n}\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .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}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\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 .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  .navbar-nav.navbar-right:last-child {\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  }\n}\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\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  }\n  .navbar-form select.form-control {\n    width: auto;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n  .navbar-form.navbar-right:last-child {\n    margin-right: -15px;\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-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\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-right: 15px;\n    margin-left: 15px;\n  }\n  .navbar-text.navbar-right:last-child {\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: #cccccc;\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  color: #555555;\n  background-color: #e7e7e7;\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-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #999999;\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: #999999;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\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  color: #ffffff;\n  background-color: #080808;\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: #999999;\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: #999999;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\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  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n  color: #999999;\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  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\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-top-right-radius: 4px;\n  border-bottom-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  background-color: #eeeeee;\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  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\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: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\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-top-right-radius: 6px;\n  border-bottom-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-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n.pager:after {\n  clear: both;\n}\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n.pager:after {\n  clear: both;\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: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\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}\n.label[href]:hover,\n.label[href]: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: #999999;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n.label-primary {\n  background-color: #428bca;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\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  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  line-height: 1;\n  color: inherit;\n}\n.jumbotron p {\n  line-height: 1.4;\n}\n.container .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-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 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.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  margin-right: auto;\n  margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #428bca;\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  padding-right: 35px;\n}\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\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  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\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: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress-striped .progress-bar {\n  background-image: -webkit-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-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  -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: -webkit-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-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: -webkit-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-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: -webkit-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-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: -webkit-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-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.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-object {\n  display: block;\n}\n.media-heading {\n  margin: 0 0 5px;\n}\n.media > .pull-left {\n  margin-right: 10px;\n}\n.media > .pull-right {\n  margin-left: 10px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\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}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\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  background-color: #f5f5f5;\n}\na.list-group-item.active,\na.list-group-item.active:hover,\na.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\na.list-group-item.active .list-group-item-heading,\na.list-group-item.active:hover .list-group-item-heading,\na.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item.active .list-group-item-text,\na.list-group-item.active:hover .list-group-item-text,\na.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\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  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n.panel-body:after {\n  clear: both;\n}\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n.panel-body:after {\n  clear: both;\n}\n.panel > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table {\n  margin-bottom: 0;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive {\n  border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child th,\n.panel > .table > tbody: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:last-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > th,\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.panel > .table-bordered > thead > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > td,\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  border-bottom: 0;\n}\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\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-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\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  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-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n.panel-primary {\n  border-color: #428bca;\n}\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\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-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\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-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-footer + .panel-collapse .panel-body {\n  border-bottom-color: #ebccd1;\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-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\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  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -moz-transition: -moz-transform 0.3s ease-out;\n  -o-transition: -o-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-dialog {\n  position: relative;\n  z-index: 1050;\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  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\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  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.modal-footer:after {\n  clear: both;\n}\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.modal-footer:after {\n  clear: both;\n}\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\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@media screen and (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\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-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\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  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\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  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\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  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\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  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\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  color: #ffffff;\n  text-decoration: none;\n  outline: 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}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -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  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\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 .glyphicons-chevron-left,\n  .carousel-control .glyphicons-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n.clearfix:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: 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,\ntr.visible-xs,\nth.visible-xs,\ntd.visible-xs {\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 (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  table.visible-xs.visible-sm {\n    display: table;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  table.visible-xs.visible-md {\n    display: table;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  table.visible-xs.visible-lg {\n    display: table;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n.visible-sm,\ntr.visible-sm,\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  table.visible-sm.visible-xs {\n    display: table;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !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: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  table.visible-sm.visible-md {\n    display: table;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  table.visible-sm.visible-lg {\n    display: table;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n.visible-md,\ntr.visible-md,\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  table.visible-md.visible-xs {\n    display: table;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  table.visible-md.visible-sm {\n    display: table;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !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: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  table.visible-md.visible-lg {\n    display: table;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n.visible-lg,\ntr.visible-lg,\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  table.visible-lg.visible-xs {\n    display: table;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  table.visible-lg.visible-sm {\n    display: table;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  table.visible-lg.visible-md {\n    display: table;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !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.hidden-xs {\n  display: block !important;\n}\ntable.hidden-xs {\n  display: table;\n}\ntr.hidden-xs {\n  display: table-row !important;\n}\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n@media (max-width: 767px) {\n  .hidden-xs,\n  tr.hidden-xs,\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm,\n  tr.hidden-xs.hidden-sm,\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md,\n  tr.hidden-xs.hidden-md,\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg,\n  tr.hidden-xs.hidden-lg,\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n.hidden-sm {\n  display: block !important;\n}\ntable.hidden-sm {\n  display: table;\n}\ntr.hidden-sm {\n  display: table-row !important;\n}\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs,\n  tr.hidden-sm.hidden-xs,\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm,\n  tr.hidden-sm,\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md,\n  tr.hidden-sm.hidden-md,\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg,\n  tr.hidden-sm.hidden-lg,\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n.hidden-md {\n  display: block !important;\n}\ntable.hidden-md {\n  display: table;\n}\ntr.hidden-md {\n  display: table-row !important;\n}\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs,\n  tr.hidden-md.hidden-xs,\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm,\n  tr.hidden-md.hidden-sm,\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md,\n  tr.hidden-md,\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg,\n  tr.hidden-md.hidden-lg,\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n.hidden-lg {\n  display: block !important;\n}\ntable.hidden-lg {\n  display: table;\n}\ntr.hidden-lg {\n  display: table-row !important;\n}\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs,\n  tr.hidden-lg.hidden-xs,\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm,\n  tr.hidden-lg.hidden-sm,\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md,\n  tr.hidden-lg.hidden-md,\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg,\n  tr.hidden-lg,\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print,\ntr.visible-print,\nth.visible-print,\ntd.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  .hidden-print,\n  tr.hidden-print,\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}\nbody {\n  background: pink;\n}\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/css/bootstrap-scss.css",
    "content": "/*!\n * Bootstrap v3.0.3 (http://getbootstrap.com)\n * Copyright 2013 Twitter, Inc.\n * Licensed under http://www.apache.org/licenses/LICENSE-2.0\n */\n/*! normalize.css v2.1.3 | MIT License | git.io/normalize */\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block; }\n\naudio,\ncanvas,\nvideo {\n  display: inline-block; }\n\naudio:not([controls]) {\n  display: none;\n  height: 0; }\n\n[hidden],\ntemplate {\n  display: none; }\n\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%; }\n\nbody {\n  margin: 0; }\n\na {\n  background: transparent; }\n\na:focus {\n  outline: thin dotted; }\n\na:active,\na:hover {\n  outline: 0; }\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em; }\n\nabbr[title] {\n  border-bottom: 1px dotted; }\n\nb,\nstrong {\n  font-weight: bold; }\n\ndfn {\n  font-style: italic; }\n\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box; }\n\nmark {\n  color: #000;\n  background: #ff0; }\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em; }\n\npre {\n  white-space: pre-wrap; }\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\"; }\n\nsmall {\n  font-size: 80%; }\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\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: 0; }\n\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0; }\n\nlegend {\n  padding: 0;\n  border: 0; }\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%; }\n\nbutton,\ninput {\n  line-height: normal; }\n\nbutton,\nselect {\n  text-transform: none; }\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button; }\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default; }\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box; }\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  -webkit-appearance: textfield; }\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none; }\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0; }\n\ntextarea {\n  overflow: auto;\n  vertical-align: top; }\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0; }\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-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^=\"javascript:\"]:after,\n  a[href^=\"#\"]: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  @page {\n    margin: 2cm .5cm; }\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  .table td,\n  .table th {\n    background-color: #fff !important; }\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-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important; } }\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box; }\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }\n\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\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: #428bca;\n  text-decoration: none; }\n\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline; }\n\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px; }\n\nimg {\n  vertical-align: middle; }\n\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%; }\n\n.img-rounded {\n  border-radius: 6px; }\n\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out; }\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  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0; }\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\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: #999999; }\n\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px; }\n\nh1 small,\nh2 small,\nh3 small,\nh1 .small,\nh2 .small,\nh3 .small {\n  font-size: 65%; }\n\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px; }\n\nh4 small,\nh5 small,\nh6 small,\nh4 .small,\nh5 .small,\nh6 .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: 200;\n  line-height: 1.4; }\n\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px; } }\nsmall,\n.small {\n  font-size: 85%; }\n\ncite {\n  font-style: normal; }\n\n.text-muted {\n  color: #999999; }\n\n.text-primary {\n  color: #428bca; }\n\n.text-primary:hover {\n  color: #3071a9; }\n\n.text-warning {\n  color: #8a6d3b; }\n\n.text-warning:hover {\n  color: #66512c; }\n\n.text-danger {\n  color: #a94442; }\n\n.text-danger:hover {\n  color: #843534; }\n\n.text-success {\n  color: #3c763d; }\n\n.text-success:hover {\n  color: #2b542c; }\n\n.text-info {\n  color: #31708f; }\n\n.text-info:hover {\n  color: #245269; }\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.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\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px; }\n\n.list-inline > li:first-child {\n  padding-left: 0; }\n\ndl {\n  margin-top: 0;\n  margin-bottom: 20px; }\n\ndt,\ndd {\n  line-height: 1.428571429; }\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    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap; }\n\n  .dl-horizontal dd {\n    margin-left: 180px; }\n\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \"; }\n\n  .dl-horizontal dd:after {\n    clear: both; }\n\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \"; }\n\n  .dl-horizontal dd:after {\n    clear: both; } }\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999; }\n\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase; }\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee; }\n\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25; }\n\nblockquote p:last-child {\n  margin-bottom: 0; }\n\nblockquote small,\nblockquote .small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999; }\n\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0'; }\n\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0; }\n\nblockquote.pull-right p,\nblockquote.pull-right small,\nblockquote.pull-right .small {\n  text-align: right; }\n\nblockquote.pull-right small:before,\nblockquote.pull-right .small:before {\n  content: ''; }\n\nblockquote.pull-right small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014'; }\n\nblockquote:before,\nblockquote:after {\n  content: \"\"; }\n\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429; }\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  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px; }\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\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  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto; }\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \"; }\n\n.container:after {\n  clear: both; }\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \"; }\n\n.container:after {\n  clear: both; }\n\n@media (min-width: 768px) {\n  .container {\n    width: 750px; } }\n@media (min-width: 992px) {\n  .container {\n    width: 970px; } }\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px; } }\n.row {\n  margin-right: -15px;\n  margin-left: -15px; }\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \"; }\n\n.row:after {\n  clear: both; }\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \"; }\n\n.row:after {\n  clear: both; }\n\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px; }\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n  float: left; }\n\n.col-xs-12 {\n  width: 100%; }\n\n.col-xs-11 {\n  width: 91.66666666666666%; }\n\n.col-xs-10 {\n  width: 83.33333333333334%; }\n\n.col-xs-9 {\n  width: 75%; }\n\n.col-xs-8 {\n  width: 66.66666666666666%; }\n\n.col-xs-7 {\n  width: 58.333333333333336%; }\n\n.col-xs-6 {\n  width: 50%; }\n\n.col-xs-5 {\n  width: 41.66666666666667%; }\n\n.col-xs-4 {\n  width: 33.33333333333333%; }\n\n.col-xs-3 {\n  width: 25%; }\n\n.col-xs-2 {\n  width: 16.666666666666664%; }\n\n.col-xs-1 {\n  width: 8.333333333333332%; }\n\n.col-xs-pull-12 {\n  right: 100%; }\n\n.col-xs-pull-11 {\n  right: 91.66666666666666%; }\n\n.col-xs-pull-10 {\n  right: 83.33333333333334%; }\n\n.col-xs-pull-9 {\n  right: 75%; }\n\n.col-xs-pull-8 {\n  right: 66.66666666666666%; }\n\n.col-xs-pull-7 {\n  right: 58.333333333333336%; }\n\n.col-xs-pull-6 {\n  right: 50%; }\n\n.col-xs-pull-5 {\n  right: 41.66666666666667%; }\n\n.col-xs-pull-4 {\n  right: 33.33333333333333%; }\n\n.col-xs-pull-3 {\n  right: 25%; }\n\n.col-xs-pull-2 {\n  right: 16.666666666666664%; }\n\n.col-xs-pull-1 {\n  right: 8.333333333333332%; }\n\n.col-xs-pull-0 {\n  right: 0; }\n\n.col-xs-push-12 {\n  left: 100%; }\n\n.col-xs-push-11 {\n  left: 91.66666666666666%; }\n\n.col-xs-push-10 {\n  left: 83.33333333333334%; }\n\n.col-xs-push-9 {\n  left: 75%; }\n\n.col-xs-push-8 {\n  left: 66.66666666666666%; }\n\n.col-xs-push-7 {\n  left: 58.333333333333336%; }\n\n.col-xs-push-6 {\n  left: 50%; }\n\n.col-xs-push-5 {\n  left: 41.66666666666667%; }\n\n.col-xs-push-4 {\n  left: 33.33333333333333%; }\n\n.col-xs-push-3 {\n  left: 25%; }\n\n.col-xs-push-2 {\n  left: 16.666666666666664%; }\n\n.col-xs-push-1 {\n  left: 8.333333333333332%; }\n\n.col-xs-push-0 {\n  left: 0; }\n\n.col-xs-offset-12 {\n  margin-left: 100%; }\n\n.col-xs-offset-11 {\n  margin-left: 91.66666666666666%; }\n\n.col-xs-offset-10 {\n  margin-left: 83.33333333333334%; }\n\n.col-xs-offset-9 {\n  margin-left: 75%; }\n\n.col-xs-offset-8 {\n  margin-left: 66.66666666666666%; }\n\n.col-xs-offset-7 {\n  margin-left: 58.333333333333336%; }\n\n.col-xs-offset-6 {\n  margin-left: 50%; }\n\n.col-xs-offset-5 {\n  margin-left: 41.66666666666667%; }\n\n.col-xs-offset-4 {\n  margin-left: 33.33333333333333%; }\n\n.col-xs-offset-3 {\n  margin-left: 25%; }\n\n.col-xs-offset-2 {\n  margin-left: 16.666666666666664%; }\n\n.col-xs-offset-1 {\n  margin-left: 8.333333333333332%; }\n\n.col-xs-offset-0 {\n  margin-left: 0; }\n\n@media (min-width: 768px) {\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11,\n  .col-sm-12 {\n    float: left; }\n\n  .col-sm-12 {\n    width: 100%; }\n\n  .col-sm-11 {\n    width: 91.66666666666666%; }\n\n  .col-sm-10 {\n    width: 83.33333333333334%; }\n\n  .col-sm-9 {\n    width: 75%; }\n\n  .col-sm-8 {\n    width: 66.66666666666666%; }\n\n  .col-sm-7 {\n    width: 58.333333333333336%; }\n\n  .col-sm-6 {\n    width: 50%; }\n\n  .col-sm-5 {\n    width: 41.66666666666667%; }\n\n  .col-sm-4 {\n    width: 33.33333333333333%; }\n\n  .col-sm-3 {\n    width: 25%; }\n\n  .col-sm-2 {\n    width: 16.666666666666664%; }\n\n  .col-sm-1 {\n    width: 8.333333333333332%; }\n\n  .col-sm-pull-12 {\n    right: 100%; }\n\n  .col-sm-pull-11 {\n    right: 91.66666666666666%; }\n\n  .col-sm-pull-10 {\n    right: 83.33333333333334%; }\n\n  .col-sm-pull-9 {\n    right: 75%; }\n\n  .col-sm-pull-8 {\n    right: 66.66666666666666%; }\n\n  .col-sm-pull-7 {\n    right: 58.333333333333336%; }\n\n  .col-sm-pull-6 {\n    right: 50%; }\n\n  .col-sm-pull-5 {\n    right: 41.66666666666667%; }\n\n  .col-sm-pull-4 {\n    right: 33.33333333333333%; }\n\n  .col-sm-pull-3 {\n    right: 25%; }\n\n  .col-sm-pull-2 {\n    right: 16.666666666666664%; }\n\n  .col-sm-pull-1 {\n    right: 8.333333333333332%; }\n\n  .col-sm-pull-0 {\n    right: 0; }\n\n  .col-sm-push-12 {\n    left: 100%; }\n\n  .col-sm-push-11 {\n    left: 91.66666666666666%; }\n\n  .col-sm-push-10 {\n    left: 83.33333333333334%; }\n\n  .col-sm-push-9 {\n    left: 75%; }\n\n  .col-sm-push-8 {\n    left: 66.66666666666666%; }\n\n  .col-sm-push-7 {\n    left: 58.333333333333336%; }\n\n  .col-sm-push-6 {\n    left: 50%; }\n\n  .col-sm-push-5 {\n    left: 41.66666666666667%; }\n\n  .col-sm-push-4 {\n    left: 33.33333333333333%; }\n\n  .col-sm-push-3 {\n    left: 25%; }\n\n  .col-sm-push-2 {\n    left: 16.666666666666664%; }\n\n  .col-sm-push-1 {\n    left: 8.333333333333332%; }\n\n  .col-sm-push-0 {\n    left: 0; }\n\n  .col-sm-offset-12 {\n    margin-left: 100%; }\n\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%; }\n\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%; }\n\n  .col-sm-offset-9 {\n    margin-left: 75%; }\n\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%; }\n\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%; }\n\n  .col-sm-offset-6 {\n    margin-left: 50%; }\n\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%; }\n\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%; }\n\n  .col-sm-offset-3 {\n    margin-left: 25%; }\n\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%; }\n\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%; }\n\n  .col-sm-offset-0 {\n    margin-left: 0; } }\n@media (min-width: 992px) {\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11,\n  .col-md-12 {\n    float: left; }\n\n  .col-md-12 {\n    width: 100%; }\n\n  .col-md-11 {\n    width: 91.66666666666666%; }\n\n  .col-md-10 {\n    width: 83.33333333333334%; }\n\n  .col-md-9 {\n    width: 75%; }\n\n  .col-md-8 {\n    width: 66.66666666666666%; }\n\n  .col-md-7 {\n    width: 58.333333333333336%; }\n\n  .col-md-6 {\n    width: 50%; }\n\n  .col-md-5 {\n    width: 41.66666666666667%; }\n\n  .col-md-4 {\n    width: 33.33333333333333%; }\n\n  .col-md-3 {\n    width: 25%; }\n\n  .col-md-2 {\n    width: 16.666666666666664%; }\n\n  .col-md-1 {\n    width: 8.333333333333332%; }\n\n  .col-md-pull-12 {\n    right: 100%; }\n\n  .col-md-pull-11 {\n    right: 91.66666666666666%; }\n\n  .col-md-pull-10 {\n    right: 83.33333333333334%; }\n\n  .col-md-pull-9 {\n    right: 75%; }\n\n  .col-md-pull-8 {\n    right: 66.66666666666666%; }\n\n  .col-md-pull-7 {\n    right: 58.333333333333336%; }\n\n  .col-md-pull-6 {\n    right: 50%; }\n\n  .col-md-pull-5 {\n    right: 41.66666666666667%; }\n\n  .col-md-pull-4 {\n    right: 33.33333333333333%; }\n\n  .col-md-pull-3 {\n    right: 25%; }\n\n  .col-md-pull-2 {\n    right: 16.666666666666664%; }\n\n  .col-md-pull-1 {\n    right: 8.333333333333332%; }\n\n  .col-md-pull-0 {\n    right: 0; }\n\n  .col-md-push-12 {\n    left: 100%; }\n\n  .col-md-push-11 {\n    left: 91.66666666666666%; }\n\n  .col-md-push-10 {\n    left: 83.33333333333334%; }\n\n  .col-md-push-9 {\n    left: 75%; }\n\n  .col-md-push-8 {\n    left: 66.66666666666666%; }\n\n  .col-md-push-7 {\n    left: 58.333333333333336%; }\n\n  .col-md-push-6 {\n    left: 50%; }\n\n  .col-md-push-5 {\n    left: 41.66666666666667%; }\n\n  .col-md-push-4 {\n    left: 33.33333333333333%; }\n\n  .col-md-push-3 {\n    left: 25%; }\n\n  .col-md-push-2 {\n    left: 16.666666666666664%; }\n\n  .col-md-push-1 {\n    left: 8.333333333333332%; }\n\n  .col-md-push-0 {\n    left: 0; }\n\n  .col-md-offset-12 {\n    margin-left: 100%; }\n\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%; }\n\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%; }\n\n  .col-md-offset-9 {\n    margin-left: 75%; }\n\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%; }\n\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%; }\n\n  .col-md-offset-6 {\n    margin-left: 50%; }\n\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%; }\n\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%; }\n\n  .col-md-offset-3 {\n    margin-left: 25%; }\n\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%; }\n\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%; }\n\n  .col-md-offset-0 {\n    margin-left: 0; } }\n@media (min-width: 1200px) {\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11,\n  .col-lg-12 {\n    float: left; }\n\n  .col-lg-12 {\n    width: 100%; }\n\n  .col-lg-11 {\n    width: 91.66666666666666%; }\n\n  .col-lg-10 {\n    width: 83.33333333333334%; }\n\n  .col-lg-9 {\n    width: 75%; }\n\n  .col-lg-8 {\n    width: 66.66666666666666%; }\n\n  .col-lg-7 {\n    width: 58.333333333333336%; }\n\n  .col-lg-6 {\n    width: 50%; }\n\n  .col-lg-5 {\n    width: 41.66666666666667%; }\n\n  .col-lg-4 {\n    width: 33.33333333333333%; }\n\n  .col-lg-3 {\n    width: 25%; }\n\n  .col-lg-2 {\n    width: 16.666666666666664%; }\n\n  .col-lg-1 {\n    width: 8.333333333333332%; }\n\n  .col-lg-pull-12 {\n    right: 100%; }\n\n  .col-lg-pull-11 {\n    right: 91.66666666666666%; }\n\n  .col-lg-pull-10 {\n    right: 83.33333333333334%; }\n\n  .col-lg-pull-9 {\n    right: 75%; }\n\n  .col-lg-pull-8 {\n    right: 66.66666666666666%; }\n\n  .col-lg-pull-7 {\n    right: 58.333333333333336%; }\n\n  .col-lg-pull-6 {\n    right: 50%; }\n\n  .col-lg-pull-5 {\n    right: 41.66666666666667%; }\n\n  .col-lg-pull-4 {\n    right: 33.33333333333333%; }\n\n  .col-lg-pull-3 {\n    right: 25%; }\n\n  .col-lg-pull-2 {\n    right: 16.666666666666664%; }\n\n  .col-lg-pull-1 {\n    right: 8.333333333333332%; }\n\n  .col-lg-pull-0 {\n    right: 0; }\n\n  .col-lg-push-12 {\n    left: 100%; }\n\n  .col-lg-push-11 {\n    left: 91.66666666666666%; }\n\n  .col-lg-push-10 {\n    left: 83.33333333333334%; }\n\n  .col-lg-push-9 {\n    left: 75%; }\n\n  .col-lg-push-8 {\n    left: 66.66666666666666%; }\n\n  .col-lg-push-7 {\n    left: 58.333333333333336%; }\n\n  .col-lg-push-6 {\n    left: 50%; }\n\n  .col-lg-push-5 {\n    left: 41.66666666666667%; }\n\n  .col-lg-push-4 {\n    left: 33.33333333333333%; }\n\n  .col-lg-push-3 {\n    left: 25%; }\n\n  .col-lg-push-2 {\n    left: 16.666666666666664%; }\n\n  .col-lg-push-1 {\n    left: 8.333333333333332%; }\n\n  .col-lg-push-0 {\n    left: 0; }\n\n  .col-lg-offset-12 {\n    margin-left: 100%; }\n\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%; }\n\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%; }\n\n  .col-lg-offset-9 {\n    margin-left: 75%; }\n\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%; }\n\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%; }\n\n  .col-lg-offset-6 {\n    margin-left: 50%; }\n\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%; }\n\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%; }\n\n  .col-lg-offset-3 {\n    margin-left: 25%; }\n\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%; }\n\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%; }\n\n  .col-lg-offset-0 {\n    margin-left: 0; } }\ntable {\n  max-width: 100%;\n  background-color: transparent; }\n\nth {\n  text-align: left; }\n\n.table {\n  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.428571429;\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) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9; }\n\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5; }\n\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none; }\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none; }\n\n.table > thead > tr > .active,\n.table > tbody > tr > .active,\n.table > tfoot > tr > .active,\n.table > thead > .active > td,\n.table > tbody > .active > td,\n.table > tfoot > .active > td,\n.table > thead > .active > th,\n.table > tbody > .active > th,\n.table > tfoot > .active > th {\n  background-color: #f5f5f5; }\n\n.table-hover > tbody > tr > .active:hover,\n.table-hover > tbody > .active:hover > td,\n.table-hover > tbody > .active:hover > th {\n  background-color: #e8e8e8; }\n\n.table > thead > tr > .success,\n.table > tbody > tr > .success,\n.table > tfoot > tr > .success,\n.table > thead > .success > td,\n.table > tbody > .success > td,\n.table > tfoot > .success > td,\n.table > thead > .success > th,\n.table > tbody > .success > th,\n.table > tfoot > .success > th {\n  background-color: #dff0d8; }\n\n.table-hover > tbody > tr > .success:hover,\n.table-hover > tbody > .success:hover > td,\n.table-hover > tbody > .success:hover > th {\n  background-color: #d0e9c6; }\n\n.table > thead > tr > .danger,\n.table > tbody > tr > .danger,\n.table > tfoot > tr > .danger,\n.table > thead > .danger > td,\n.table > tbody > .danger > td,\n.table > tfoot > .danger > td,\n.table > thead > .danger > th,\n.table > tbody > .danger > th,\n.table > tfoot > .danger > th {\n  background-color: #f2dede; }\n\n.table-hover > tbody > tr > .danger:hover,\n.table-hover > tbody > .danger:hover > td,\n.table-hover > tbody > .danger:hover > th {\n  background-color: #ebcccc; }\n\n.table > thead > tr > .warning,\n.table > tbody > tr > .warning,\n.table > tfoot > tr > .warning,\n.table > thead > .warning > td,\n.table > tbody > .warning > td,\n.table > tfoot > .warning > td,\n.table > thead > .warning > th,\n.table > tbody > .warning > th,\n.table > tfoot > .warning > th {\n  background-color: #fcf8e3; }\n\n.table-hover > tbody > tr > .warning:hover,\n.table-hover > tbody > .warning:hover > td,\n.table-hover > tbody > .warning:hover > th {\n  background-color: #faf2cc; }\n\n@media (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    -webkit-overflow-scrolling: touch; }\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; } }\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 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  margin-bottom: 5px;\n  font-weight: bold; }\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box; }\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n  line-height: normal; }\n\ninput[type=\"file\"] {\n  display: block; }\n\nselect[multiple],\nselect[size] {\n  height: auto; }\n\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit; }\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\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto; }\n\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle; }\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.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; }\n\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); }\n\n.form-control:-moz-placeholder {\n  color: #999999; }\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\ntextarea.form-control {\n  height: auto; }\n\n.form-group {\n  margin-bottom: 15px; }\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle; }\n\n.radio label,\n.checkbox label {\n  display: inline;\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  float: left;\n  margin-left: -20px; }\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  font-weight: normal;\n  vertical-align: middle;\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],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed; }\n\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\nselect.input-sm {\n  height: 30px;\n  line-height: 30px; }\n\ntextarea.input-sm {\n  height: auto; }\n\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px; }\n\nselect.input-lg {\n  height: 46px;\n  line-height: 46px; }\n\ntextarea.input-lg {\n  height: auto; }\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  color: #8a6d3b; }\n\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\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  background-color: #fcf8e3;\n  border-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  color: #a94442; }\n\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\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  background-color: #f2dede;\n  border-color: #a94442; }\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  color: #3c763d; }\n\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\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  background-color: #dff0d8;\n  border-color: #3c763d; }\n\n.form-control-static {\n  margin-bottom: 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\n  .form-inline select.form-control {\n    width: auto; }\n\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0; }\n\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0; } }\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0; }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px; }\n\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px; }\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \"; }\n\n.form-horizontal .form-group:after {\n  clear: both; }\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \"; }\n\n.form-horizontal .form-group:after {\n  clear: both; }\n\n.form-horizontal .form-control-static {\n  padding-top: 7px; }\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right; } }\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  -o-user-select: none;\n  user-select: none; }\n\n.btn: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  color: #333333;\n  text-decoration: none; }\n\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }\n\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\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:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\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: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: #fff; }\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd; }\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e; }\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: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: #428bca;\n  border-color: #357ebd; }\n\n.btn-primary .badge {\n  color: #428bca;\n  background-color: #fff; }\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:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\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: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: #fff; }\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:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\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: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: #fff; }\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:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\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: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: #fff; }\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:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\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: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: #fff; }\n\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0; }\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\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: #2a6496;\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: #999999;\n  text-decoration: none; }\n\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px; }\n\n.btn-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\n.btn-xs {\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  padding-right: 0;\n  padding-left: 0; }\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  -webkit-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear; }\n\n.fade.in {\n  opacity: 1; }\n\n.collapse {\n  display: none; }\n\n.collapse.in {\n  display: block; }\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n  transition: height 0.35s ease; }\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  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -moz-osx-font-smoothing: grayscale; }\n\n.glyphicon:empty {\n  width: 1em; }\n\n.glyphicon-asterisk:before {\n  content: \"\\2a\"; }\n\n.glyphicon-plus:before {\n  content: \"\\2b\"; }\n\n.glyphicon-euro: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.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  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\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.428571429;\n  color: #333333;\n  white-space: nowrap; }\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\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  background-color: #428bca;\n  outline: 0; }\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999; }\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); }\n\n.open > .dropdown-menu {\n  display: block; }\n\n.open > a {\n  outline: 0; }\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999; }\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 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    right: 0;\n    left: auto; } }\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:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none; }\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:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \"; }\n\n.btn-toolbar:after {\n  clear: both; }\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \"; }\n\n.btn-toolbar:after {\n  clear: both; }\n\n.btn-toolbar .btn-group {\n  float: left; }\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-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-top-right-radius: 0;\n  border-bottom-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-top-right-radius: 0;\n  border-bottom-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-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px; }\n\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-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px; }\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px; }\n\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px; }\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }\n\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\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:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \"; }\n\n.btn-group-vertical > .btn-group:after {\n  clear: both; }\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \"; }\n\n.btn-group-vertical > .btn-group:after {\n  clear: both; }\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-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\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 > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0; }\n\n.btn-group-vertical > .btn-group:last-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  border-collapse: separate;\n  table-layout: fixed; }\n\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%; }\n\n.btn-group-justified > .btn-group .btn {\n  width: 100%; }\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: 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-right: 0;\n  padding-left: 0; }\n\n.input-group .form-control {\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 {\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 {\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 > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-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 > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\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  white-space: nowrap; }\n\n.input-group-btn:first-child > .btn {\n  margin-right: -1px; }\n\n.input-group-btn:last-child > .btn {\n  margin-left: -1px; }\n\n.input-group-btn > .btn {\n  position: relative; }\n\n.input-group-btn > .btn + .btn {\n  margin-left: -4px; }\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2; }\n\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none; }\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \"; }\n\n.nav:after {\n  clear: both; }\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \"; }\n\n.nav:after {\n  clear: both; }\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: #999999; }\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent; }\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca; }\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.428571429;\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  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent; }\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  margin-bottom: 5px;\n  text-align: center; }\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.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.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: #428bca; }\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  margin-bottom: 5px;\n  text-align: center; }\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.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.tab-content > .tab-pane {\n  display: none; }\n\n.tab-content > .active {\n  display: block; }\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.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \"; }\n\n.navbar:after {\n  clear: both; }\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \"; }\n\n.navbar:after {\n  clear: both; }\n\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px; } }\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \"; }\n\n.navbar-header:after {\n  clear: both; }\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \"; }\n\n.navbar-header:after {\n  clear: both; }\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left; } }\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\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:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \"; }\n\n.navbar-collapse:after {\n  clear: both; }\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \"; }\n\n.navbar-collapse:after {\n  clear: both; }\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    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-right: 0;\n    padding-left: 0; } }\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px; }\n\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0; } }\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.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.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\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none; }\n\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px; } }\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\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 .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.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@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  .navbar-nav.navbar-right:last-child {\n    margin-right: -15px; } }\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important; }\n\n  .navbar-right {\n    float: right !important; } }\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); }\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\n  .navbar-form select.form-control {\n    width: auto; }\n\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0; }\n\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0; } }\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px; } }\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none; }\n\n  .navbar-form.navbar-right:last-child {\n    margin-right: -15px; } }\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-bottom-right-radius: 0;\n  border-bottom-left-radius: 0; }\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto; }\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-right: 15px;\n    margin-left: 15px; }\n\n  .navbar-text.navbar-right:last-child {\n    margin-right: 0; } }\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: #cccccc; }\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  color: #555555;\n  background-color: #e7e7e7; }\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.navbar-default .navbar-link {\n  color: #777777; }\n\n.navbar-default .navbar-link:hover {\n  color: #333333; }\n\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808; }\n\n.navbar-inverse .navbar-brand {\n  color: #999999; }\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: #999999; }\n\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999; }\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  color: #ffffff;\n  background-color: #080808; }\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: #999999; }\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.navbar-inverse .navbar-link {\n  color: #999999; }\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff; }\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  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\"; }\n\n.breadcrumb > .active {\n  color: #999999; }\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  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd; }\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-top-right-radius: 4px;\n  border-bottom-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  background-color: #eeeeee; }\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  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca; }\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: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd; }\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-top-right-radius: 6px;\n  border-bottom-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-top-right-radius: 3px;\n  border-bottom-right-radius: 3px; }\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none; }\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \"; }\n\n.pager:after {\n  clear: both; }\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \"; }\n\n.pager:after {\n  clear: both; }\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: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff; }\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\n.label[href]:hover,\n.label[href]: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: #999999; }\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080; }\n\n.label-primary {\n  background-color: #428bca; }\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9; }\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  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px; }\n\n.badge:empty {\n  display: none; }\n\n.btn .badge {\n  position: relative;\n  top: -1px; }\n\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer; }\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff; }\n\n.nav-pills > li > a > .badge {\n  margin-left: 3px; }\n\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee; }\n\n.jumbotron h1,\n.jumbotron .h1 {\n  line-height: 1;\n  color: inherit; }\n\n.jumbotron p {\n  line-height: 1.4; }\n\n.container .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-top: 48px;\n    padding-bottom: 48px; }\n\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px; }\n\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px; } }\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out; }\n\n.thumbnail > img,\n.thumbnail a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  margin-right: auto;\n  margin-left: auto; }\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #428bca; }\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  padding-right: 35px; }\n\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit; }\n\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6; }\n\n.alert-success hr {\n  border-top-color: #c9e2b3; }\n\n.alert-success .alert-link {\n  color: #2b542c; }\n\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1; }\n\n.alert-info hr {\n  border-top-color: #a6e1ec; }\n\n.alert-info .alert-link {\n  color: #245269; }\n\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc; }\n\n.alert-warning hr {\n  border-top-color: #f7e1b5; }\n\n.alert-warning .alert-link {\n  color: #66512c; }\n\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1; }\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@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0; }\n\n  to {\n    background-position: 0 0; } }\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\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: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n  transition: width 0.6s ease; }\n\n.progress-striped .progress-bar {\n  background-image: -webkit-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-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  -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: -webkit-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-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: -webkit-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-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: -webkit-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-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: -webkit-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-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.media-body {\n  overflow: hidden;\n  zoom: 1; }\n\n.media,\n.media .media {\n  margin-top: 15px; }\n\n.media:first-child {\n  margin-top: 0; }\n\n.media-object {\n  display: block; }\n\n.media-heading {\n  margin: 0 0 5px; }\n\n.media > .pull-left {\n  margin-right: 10px; }\n\n.media > .pull-right {\n  margin-left: 10px; }\n\n.media-list {\n  padding-left: 0;\n  list-style: none; }\n\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px; }\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\n.list-group-item > .badge {\n  float: right; }\n\n.list-group-item > .badge + .badge {\n  margin-right: 5px; }\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  background-color: #f5f5f5; }\n\na.list-group-item.active,\na.list-group-item.active:hover,\na.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca; }\n\na.list-group-item.active .list-group-item-heading,\na.list-group-item.active:hover .list-group-item-heading,\na.list-group-item.active:focus .list-group-item-heading {\n  color: inherit; }\n\na.list-group-item.active .list-group-item-text,\na.list-group-item.active:hover .list-group-item-text,\na.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7; }\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  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); }\n\n.panel-body {\n  padding: 15px; }\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \"; }\n\n.panel-body:after {\n  clear: both; }\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \"; }\n\n.panel-body:after {\n  clear: both; }\n\n.panel > .list-group {\n  margin-bottom: 0; }\n\n.panel > .list-group .list-group-item {\n  border-width: 1px 0; }\n\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0; }\n\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0; }\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0; }\n\n.panel > .table,\n.panel > .table-responsive > .table {\n  margin-bottom: 0; }\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive {\n  border-top: 1px solid #dddddd; }\n\n.panel > .table > tbody:first-child th,\n.panel > .table > tbody: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:last-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > th,\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.panel > .table-bordered > thead > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > td,\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  border-bottom: 0; }\n\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0; }\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-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\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  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-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd; }\n\n.panel-primary {\n  border-color: #428bca; }\n\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca; }\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca; }\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca; }\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-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6; }\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-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-footer + .panel-collapse .panel-body {\n  border-bottom-color: #ebccd1; }\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-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1; }\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\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  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll; }\n\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -moz-transition: -moz-transform 0.3s ease-out;\n  -o-transition: -o-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-dialog {\n  position: relative;\n  z-index: 1050;\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  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box; }\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\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  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5; }\n\n.modal-header .close {\n  margin-top: -2px; }\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429; }\n\n.modal-body {\n  position: relative;\n  padding: 20px; }\n\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5; }\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \"; }\n\n.modal-footer:after {\n  clear: both; }\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \"; }\n\n.modal-footer:after {\n  clear: both; }\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px; }\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@media screen and (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto; }\n\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } }\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible; }\n\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90); }\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px; }\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px; }\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px; }\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px; }\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-top-color: #000000;\n  border-width: 5px 5px 0; }\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0; }\n\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0; }\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0; }\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px; }\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px; }\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px; }\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px; }\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box; }\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  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\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  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0; }\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \"; }\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0; }\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \"; }\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0; }\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \"; }\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0; }\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \"; }\n\n.carousel {\n  position: relative; }\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden; }\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left; }\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1; }\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  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50); }\n\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\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  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\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  color: #ffffff;\n  text-decoration: none;\n  outline: 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\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%; }\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -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  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none; }\n\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #ffffff;\n  border-radius: 10px; }\n\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff; }\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\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 .glyphicons-chevron-left,\n  .carousel-control .glyphicons-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px; }\n\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px; }\n\n  .carousel-indicators {\n    bottom: 20px; } }\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \"; }\n\n.clearfix:after {\n  clear: both; }\n\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: 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,\ntr.visible-xs,\nth.visible-xs,\ntd.visible-xs {\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@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important; }\n\n  table.visible-xs.visible-sm {\n    display: table; }\n\n  tr.visible-xs.visible-sm {\n    display: table-row !important; }\n\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important; } }\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important; }\n\n  table.visible-xs.visible-md {\n    display: table; }\n\n  tr.visible-xs.visible-md {\n    display: table-row !important; }\n\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important; } }\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important; }\n\n  table.visible-xs.visible-lg {\n    display: table; }\n\n  tr.visible-xs.visible-lg {\n    display: table-row !important; }\n\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important; } }\n.visible-sm,\ntr.visible-sm,\nth.visible-sm,\ntd.visible-sm {\n  display: none !important; }\n\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important; }\n\n  table.visible-sm.visible-xs {\n    display: table; }\n\n  tr.visible-sm.visible-xs {\n    display: table-row !important; }\n\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important; } }\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@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important; }\n\n  table.visible-sm.visible-md {\n    display: table; }\n\n  tr.visible-sm.visible-md {\n    display: table-row !important; }\n\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important; } }\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important; }\n\n  table.visible-sm.visible-lg {\n    display: table; }\n\n  tr.visible-sm.visible-lg {\n    display: table-row !important; }\n\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important; } }\n.visible-md,\ntr.visible-md,\nth.visible-md,\ntd.visible-md {\n  display: none !important; }\n\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important; }\n\n  table.visible-md.visible-xs {\n    display: table; }\n\n  tr.visible-md.visible-xs {\n    display: table-row !important; }\n\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important; } }\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important; }\n\n  table.visible-md.visible-sm {\n    display: table; }\n\n  tr.visible-md.visible-sm {\n    display: table-row !important; }\n\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important; } }\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@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important; }\n\n  table.visible-md.visible-lg {\n    display: table; }\n\n  tr.visible-md.visible-lg {\n    display: table-row !important; }\n\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important; } }\n.visible-lg,\ntr.visible-lg,\nth.visible-lg,\ntd.visible-lg {\n  display: none !important; }\n\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important; }\n\n  table.visible-lg.visible-xs {\n    display: table; }\n\n  tr.visible-lg.visible-xs {\n    display: table-row !important; }\n\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important; } }\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important; }\n\n  table.visible-lg.visible-sm {\n    display: table; }\n\n  tr.visible-lg.visible-sm {\n    display: table-row !important; }\n\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important; } }\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important; }\n\n  table.visible-lg.visible-md {\n    display: table; }\n\n  tr.visible-lg.visible-md {\n    display: table-row !important; }\n\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important; } }\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.hidden-xs {\n  display: block !important; }\n\ntable.hidden-xs {\n  display: table; }\n\ntr.hidden-xs {\n  display: table-row !important; }\n\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important; }\n\n@media (max-width: 767px) {\n  .hidden-xs,\n  tr.hidden-xs,\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important; } }\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm,\n  tr.hidden-xs.hidden-sm,\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important; } }\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md,\n  tr.hidden-xs.hidden-md,\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important; } }\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg,\n  tr.hidden-xs.hidden-lg,\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important; } }\n.hidden-sm {\n  display: block !important; }\n\ntable.hidden-sm {\n  display: table; }\n\ntr.hidden-sm {\n  display: table-row !important; }\n\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important; }\n\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs,\n  tr.hidden-sm.hidden-xs,\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important; } }\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm,\n  tr.hidden-sm,\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important; } }\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md,\n  tr.hidden-sm.hidden-md,\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important; } }\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg,\n  tr.hidden-sm.hidden-lg,\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important; } }\n.hidden-md {\n  display: block !important; }\n\ntable.hidden-md {\n  display: table; }\n\ntr.hidden-md {\n  display: table-row !important; }\n\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important; }\n\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs,\n  tr.hidden-md.hidden-xs,\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important; } }\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm,\n  tr.hidden-md.hidden-sm,\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important; } }\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md,\n  tr.hidden-md,\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important; } }\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg,\n  tr.hidden-md.hidden-lg,\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important; } }\n.hidden-lg {\n  display: block !important; }\n\ntable.hidden-lg {\n  display: table; }\n\ntr.hidden-lg {\n  display: table-row !important; }\n\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important; }\n\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs,\n  tr.hidden-lg.hidden-xs,\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important; } }\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm,\n  tr.hidden-lg.hidden-sm,\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important; } }\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md,\n  tr.hidden-lg.hidden-md,\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important; } }\n@media (min-width: 1200px) {\n  .hidden-lg,\n  tr.hidden-lg,\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important; } }\n.visible-print,\ntr.visible-print,\nth.visible-print,\ntd.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  .hidden-print,\n  tr.hidden-print,\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important; } }\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.0.3 (http://getbootstrap.com)\n * Copyright 2013 Twitter, Inc.\n * Licensed under http://www.apache.org/licenses/LICENSE-2.0\n */\n/*! normalize.css v2.1.3 | MIT License | git.io/normalize */\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\na {\n  background: transparent;\n}\na:focus {\n  outline: thin dotted;\n}\na:active,\na:hover {\n  outline: 0;\n}\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\nmark {\n  color: #000;\n  background: #ff0;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\npre {\n  white-space: pre-wrap;\n}\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\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: 0;\n}\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\nlegend {\n  padding: 0;\n  border: 0;\n}\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\nbutton,\ninput {\n  line-height: normal;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-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^=\"javascript:\"]:after,\n  a[href^=\"#\"]: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  @page {\n    margin: 2cm .5cm;\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  .table td,\n  .table th {\n    background-color: #fff !important;\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-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\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: #428bca;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\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  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\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: #999999;\n}\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\nh2 small,\nh3 small,\nh1 .small,\nh2 .small,\nh3 .small {\n  font-size: 65%;\n}\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\nh5 small,\nh6 small,\nh4 .small,\nh5 .small,\nh6 .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: 200;\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}\ncite {\n  font-style: normal;\n}\n.text-muted {\n  color: #999999;\n}\n.text-primary {\n  color: #428bca;\n}\n.text-primary:hover {\n  color: #3071a9;\n}\n.text-warning {\n  color: #8a6d3b;\n}\n.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\n.text-danger:hover {\n  color: #843534;\n}\n.text-success {\n  color: #3c763d;\n}\n.text-success:hover {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\n.text-info:hover {\n  color: #245269;\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.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}\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n.list-inline > li:first-child {\n  padding-left: 0;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.428571429;\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    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\nblockquote p:last-child {\n  margin-bottom: 0;\n}\nblockquote small,\nblockquote .small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\nblockquote.pull-right p,\nblockquote.pull-right small,\nblockquote.pull-right .small {\n  text-align: right;\n}\nblockquote.pull-right small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\nblockquote.pull-right small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\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  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\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  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n.container:after {\n  clear: both;\n}\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n.container:after {\n  clear: both;\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.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n.row:after {\n  clear: both;\n}\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n.row:after {\n  clear: both;\n}\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666666666666%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333333334%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666666666666%;\n}\n.col-xs-pull-7 {\n  right: 58.333333333333336%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666666666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.666666666666664%;\n}\n.col-xs-pull-1 {\n  right: 8.333333333333332%;\n}\n.col-xs-pull-0 {\n  right: 0;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666666666666%;\n}\n.col-xs-push-10 {\n  left: 83.33333333333334%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666666666666%;\n}\n.col-xs-push-7 {\n  left: 58.333333333333336%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666666666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.666666666666664%;\n}\n.col-xs-push-1 {\n  left: 8.333333333333332%;\n}\n.col-xs-push-0 {\n  left: 0;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666666666666%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333333334%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666666666666%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.333333333333336%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666666666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.666666666666664%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.333333333333332%;\n}\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11,\n  .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-0 {\n    right: 0;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-0 {\n    left: 0;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11,\n  .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-0 {\n    right: 0;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-0 {\n    left: 0;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11,\n  .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-0 {\n    right: 0;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-0 {\n    left: 0;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\nth {\n  text-align: left;\n}\n.table {\n  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.428571429;\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) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n.table > thead > tr > .active,\n.table > tbody > tr > .active,\n.table > tfoot > tr > .active,\n.table > thead > .active > td,\n.table > tbody > .active > td,\n.table > tfoot > .active > td,\n.table > thead > .active > th,\n.table > tbody > .active > th,\n.table > tfoot > .active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > .active:hover,\n.table-hover > tbody > .active:hover > td,\n.table-hover > tbody > .active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > .success,\n.table > tbody > tr > .success,\n.table > tfoot > tr > .success,\n.table > thead > .success > td,\n.table > tbody > .success > td,\n.table > tfoot > .success > td,\n.table > thead > .success > th,\n.table > tbody > .success > th,\n.table > tfoot > .success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > .success:hover,\n.table-hover > tbody > .success:hover > td,\n.table-hover > tbody > .success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > .danger,\n.table > tbody > tr > .danger,\n.table > tfoot > tr > .danger,\n.table > thead > .danger > td,\n.table > tbody > .danger > td,\n.table > tfoot > .danger > td,\n.table > thead > .danger > th,\n.table > tbody > .danger > th,\n.table > tfoot > .danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > .danger:hover,\n.table-hover > tbody > .danger:hover > td,\n.table-hover > tbody > .danger:hover > th {\n  background-color: #ebcccc;\n}\n.table > thead > tr > .warning,\n.table > tbody > tr > .warning,\n.table > tfoot > tr > .warning,\n.table > thead > .warning > td,\n.table > tbody > .warning > td,\n.table > tfoot > .warning > td,\n.table > thead > .warning > th,\n.table > tbody > .warning > th,\n.table > tfoot > .warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > .warning:hover,\n.table-hover > tbody > .warning:hover > td,\n.table-hover > tbody > .warning:hover > th {\n  background-color: #faf2cc;\n}\n@media (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    -webkit-overflow-scrolling: touch;\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}\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  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\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}\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\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.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control:-moz-placeholder {\n  color: #999999;\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}\ntextarea.form-control {\n  height: auto;\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n.radio label,\n.checkbox label {\n  display: inline;\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  float: left;\n  margin-left: -20px;\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  font-weight: normal;\n  vertical-align: middle;\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],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm {\n  height: auto;\n}\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg {\n  height: auto;\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  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\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  background-color: #fcf8e3;\n  border-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  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\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  background-color: #f2dede;\n  border-color: #a94442;\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  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\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  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n.form-control-static {\n  margin-bottom: 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  }\n  .form-inline select.form-control {\n    width: auto;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n.form-horizontal .form-group:after {\n  clear: both;\n}\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n.form-horizontal .form-group:after {\n  clear: both;\n}\n.form-horizontal .form-control-static {\n  padding-top: 7px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  -o-user-select: none;\n  user-select: none;\n}\n.btn: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  color: #333333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\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:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\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: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: #fff;\n}\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\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: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: #428bca;\n  border-color: #357ebd;\n}\n.btn-primary .badge {\n  color: #428bca;\n  background-color: #fff;\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:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\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: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: #fff;\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:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\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: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: #fff;\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:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\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: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: #fff;\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:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\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: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: #fff;\n}\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\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: #2a6496;\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: #999999;\n  text-decoration: none;\n}\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs {\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  padding-right: 0;\n  padding-left: 0;\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  -webkit-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n}\n.collapse.in {\n  display: block;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n  transition: height 0.35s ease;\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  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon:empty {\n  width: 1em;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro: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.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  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\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.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\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  background-color: #428bca;\n  outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 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    right: 0;\n    left: 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:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\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:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n.btn-toolbar:after {\n  clear: both;\n}\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n.btn-toolbar:after {\n  clear: both;\n}\n.btn-toolbar .btn-group {\n  float: left;\n}\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-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-top-right-radius: 0;\n  border-bottom-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-top-right-radius: 0;\n  border-bottom-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-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\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-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\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:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n.btn-group-vertical > .btn-group:after {\n  clear: both;\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-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\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 > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-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  border-collapse: separate;\n  table-layout: fixed;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: 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-right: 0;\n  padding-left: 0;\n}\n.input-group .form-control {\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 {\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 {\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 > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-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 > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\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  white-space: nowrap;\n}\n.input-group-btn:first-child > .btn {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n.nav:after {\n  clear: both;\n}\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n.nav:after {\n  clear: both;\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: #999999;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\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.428571429;\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  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\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  margin-bottom: 5px;\n  text-align: center;\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: #428bca;\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  margin-bottom: 5px;\n  text-align: center;\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}\n.tab-content > .active {\n  display: block;\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.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n.navbar:after {\n  clear: both;\n}\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n.navbar:after {\n  clear: both;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n.navbar-header:after {\n  clear: both;\n}\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n.navbar-header:after {\n  clear: both;\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\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:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n.navbar-collapse:after {\n  clear: both;\n}\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n.navbar-collapse:after {\n  clear: both;\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    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-right: 0;\n    padding-left: 0;\n  }\n}\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .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}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\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 .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  .navbar-nav.navbar-right:last-child {\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  }\n}\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\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  }\n  .navbar-form select.form-control {\n    width: auto;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n  .navbar-form.navbar-right:last-child {\n    margin-right: -15px;\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-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\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-right: 15px;\n    margin-left: 15px;\n  }\n  .navbar-text.navbar-right:last-child {\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: #cccccc;\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  color: #555555;\n  background-color: #e7e7e7;\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-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #999999;\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: #999999;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\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  color: #ffffff;\n  background-color: #080808;\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: #999999;\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: #999999;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\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  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n  color: #999999;\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  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\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-top-right-radius: 4px;\n  border-bottom-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  background-color: #eeeeee;\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  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\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: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\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-top-right-radius: 6px;\n  border-bottom-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-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n.pager:after {\n  clear: both;\n}\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n.pager:after {\n  clear: both;\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: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\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}\n.label[href]:hover,\n.label[href]: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: #999999;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n.label-primary {\n  background-color: #428bca;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\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  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  line-height: 1;\n  color: inherit;\n}\n.jumbotron p {\n  line-height: 1.4;\n}\n.container .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-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 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.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  margin-right: auto;\n  margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #428bca;\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  padding-right: 35px;\n}\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\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  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\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: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress-striped .progress-bar {\n  background-image: -webkit-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-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  -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: -webkit-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-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: -webkit-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-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: -webkit-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-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: -webkit-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-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.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-object {\n  display: block;\n}\n.media-heading {\n  margin: 0 0 5px;\n}\n.media > .pull-left {\n  margin-right: 10px;\n}\n.media > .pull-right {\n  margin-left: 10px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\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}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\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  background-color: #f5f5f5;\n}\na.list-group-item.active,\na.list-group-item.active:hover,\na.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\na.list-group-item.active .list-group-item-heading,\na.list-group-item.active:hover .list-group-item-heading,\na.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item.active .list-group-item-text,\na.list-group-item.active:hover .list-group-item-text,\na.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\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  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n.panel-body:after {\n  clear: both;\n}\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n.panel-body:after {\n  clear: both;\n}\n.panel > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table {\n  margin-bottom: 0;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive {\n  border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child th,\n.panel > .table > tbody: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:last-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > th,\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.panel > .table-bordered > thead > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > td,\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  border-bottom: 0;\n}\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\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-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\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  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-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n.panel-primary {\n  border-color: #428bca;\n}\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\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-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\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-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-footer + .panel-collapse .panel-body {\n  border-bottom-color: #ebccd1;\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-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\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  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -moz-transition: -moz-transform 0.3s ease-out;\n  -o-transition: -o-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-dialog {\n  position: relative;\n  z-index: 1050;\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  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\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  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.modal-footer:after {\n  clear: both;\n}\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.modal-footer:after {\n  clear: both;\n}\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\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@media screen and (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\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-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\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  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\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  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\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  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\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  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\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  color: #ffffff;\n  text-decoration: none;\n  outline: 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}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -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  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\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 .glyphicons-chevron-left,\n  .carousel-control .glyphicons-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n.clearfix:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: 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,\ntr.visible-xs,\nth.visible-xs,\ntd.visible-xs {\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 (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  table.visible-xs.visible-sm {\n    display: table;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  table.visible-xs.visible-md {\n    display: table;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  table.visible-xs.visible-lg {\n    display: table;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n.visible-sm,\ntr.visible-sm,\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  table.visible-sm.visible-xs {\n    display: table;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !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: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  table.visible-sm.visible-md {\n    display: table;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  table.visible-sm.visible-lg {\n    display: table;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n.visible-md,\ntr.visible-md,\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  table.visible-md.visible-xs {\n    display: table;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  table.visible-md.visible-sm {\n    display: table;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !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: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  table.visible-md.visible-lg {\n    display: table;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n.visible-lg,\ntr.visible-lg,\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  table.visible-lg.visible-xs {\n    display: table;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  table.visible-lg.visible-sm {\n    display: table;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  table.visible-lg.visible-md {\n    display: table;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !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.hidden-xs {\n  display: block !important;\n}\ntable.hidden-xs {\n  display: table;\n}\ntr.hidden-xs {\n  display: table-row !important;\n}\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n@media (max-width: 767px) {\n  .hidden-xs,\n  tr.hidden-xs,\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm,\n  tr.hidden-xs.hidden-sm,\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md,\n  tr.hidden-xs.hidden-md,\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg,\n  tr.hidden-xs.hidden-lg,\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n.hidden-sm {\n  display: block !important;\n}\ntable.hidden-sm {\n  display: table;\n}\ntr.hidden-sm {\n  display: table-row !important;\n}\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs,\n  tr.hidden-sm.hidden-xs,\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm,\n  tr.hidden-sm,\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md,\n  tr.hidden-sm.hidden-md,\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg,\n  tr.hidden-sm.hidden-lg,\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n.hidden-md {\n  display: block !important;\n}\ntable.hidden-md {\n  display: table;\n}\ntr.hidden-md {\n  display: table-row !important;\n}\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs,\n  tr.hidden-md.hidden-xs,\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm,\n  tr.hidden-md.hidden-sm,\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md,\n  tr.hidden-md,\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg,\n  tr.hidden-md.hidden-lg,\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n.hidden-lg {\n  display: block !important;\n}\ntable.hidden-lg {\n  display: table;\n}\ntr.hidden-lg {\n  display: table-row !important;\n}\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs,\n  tr.hidden-lg.hidden-xs,\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm,\n  tr.hidden-lg.hidden-sm,\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md,\n  tr.hidden-lg.hidden-md,\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg,\n  tr.hidden-lg,\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print,\ntr.visible-print,\nth.visible-print,\ntd.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  .hidden-print,\n  tr.hidden-print,\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/fonts/roboto/Roboto-Regular-demo.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\t<script src=\"specimen_files/easytabs.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\t<link rel=\"stylesheet\" href=\"specimen_files/specimen_stylesheet.css\" type=\"text/css\" charset=\"utf-8\" />\n\t<link rel=\"stylesheet\" href=\"stylesheet.css\" type=\"text/css\" charset=\"utf-8\" />\n\n\t<style type=\"text/css\">\n\t\t\tbody{\n\t\t\tfont-family: 'robotoregular';\n\t\t\t\t\t}\n</style>\n\n<title>Roboto Regular Specimen</title>\n\t\n\t\n\t<script type=\"text/javascript\" charset=\"utf-8\">\n\t\t$(document).ready(function() {\n\t\t\t$('#container').easyTabs({defaultContent:1});\n\t\t});\n\t</script>\n</head>\n\n<body>\n<div id=\"container\">\n\t<div id=\"header\">\n\t\tRoboto Regular\t</div>\n\t<ul class=\"tabs\">\n\t\t<li><a href=\"#specimen\">Specimen</a></li>\n\t\t<li><a href=\"#layout\">Sample Layout</a></li>\n\t\t<li><a href=\"#installing\">Installing Webfonts</a></li>\n\t\t\n\t</ul>\n\t\n\t<div id=\"main_content\">\n\n\t\t\n\t\t\t<div id=\"specimen\">\n\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<div class=\"huge\">AaBb</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"glyph_range\">A&#x200B;B&#x200b;C&#x200b;D&#x200b;E&#x200b;F&#x200b;G&#x200b;H&#x200b;I&#x200b;J&#x200b;K&#x200b;L&#x200b;M&#x200b;N&#x200b;O&#x200b;P&#x200b;Q&#x200b;R&#x200b;S&#x200b;T&#x200b;U&#x200b;V&#x200b;W&#x200b;X&#x200b;Y&#x200b;Z&#x200b;a&#x200b;b&#x200b;c&#x200b;d&#x200b;e&#x200b;f&#x200b;g&#x200b;h&#x200b;i&#x200b;j&#x200b;k&#x200b;l&#x200b;m&#x200b;n&#x200b;o&#x200b;p&#x200b;q&#x200b;r&#x200b;s&#x200b;t&#x200b;u&#x200b;v&#x200b;w&#x200b;x&#x200b;y&#x200b;z&#x200b;1&#x200b;2&#x200b;3&#x200b;4&#x200b;5&#x200b;6&#x200b;7&#x200b;8&#x200b;9&#x200b;0&#x200b;&amp;&#x200b;.&#x200b;,&#x200b;?&#x200b;!&#x200b;&#64;&#x200b;(&#x200b;)&#x200b;#&#x200b;$&#x200b;%&#x200b;*&#x200b;+&#x200b;-&#x200b;=&#x200b;:&#x200b;;</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<table class=\"sample_table\">\n\t\t\t\t\t\t\t<tr><td>10</td><td class=\"size10\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>11</td><td class=\"size11\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>12</td><td class=\"size12\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>13</td><td class=\"size13\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>14</td><td class=\"size14\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>16</td><td class=\"size16\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>18</td><td class=\"size18\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>20</td><td class=\"size20\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>24</td><td class=\"size24\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>30</td><td class=\"size30\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>36</td><td class=\"size36\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>48</td><td class=\"size48\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>60</td><td class=\"size60\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>72</td><td class=\"size72\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>90</td><td class=\"size90\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\n\t\t\t\t</div>\n\t\t\n\t\t\n\t\t\n\t\t\t\t\t\t\t\t<div class=\"section\" id=\"bodycomparison\">\n\n\n\t\t\t\t\t\t\t\t\t\t<div id=\"xheight\">\n\t\t\t\t<div class=\"fontbody\">&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;body</div><div class=\"arialbody\">body</div><div class=\"verdanabody\">body</div><div class=\"georgiabody\">body</div></div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"fontbody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Roboto Regular</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"arialbody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Arial</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"verdanabody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Verdana</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"georgiabody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Georgia</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\n\n\t\t\t\t\t\t\t\t</div>\n\t\t\n\t\t\n\t\t\t\t<div class=\"section psample psample_row1\" id=\"\">\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid2 firstcol\">\n\t\t\t\t\t\t<p class=\"size10\"><span>10.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size11\"><span>11.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size12\"><span>12.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size13\"><span>13.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section psample psample_row2\" id=\"\">\n\t\t\t\t\t<div class=\"grid3 firstcol\">\n\t\t\t\t\t\t<p class=\"size14\"><span>14.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size16\"><span>16.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid5\">\n\t\t\t\t\t\t<p class=\"size18\"><span>18.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row3\" id=\"\">\n\t\t\t\t\t<div class=\"grid5 firstcol\">\n\t\t\t\t\t\t<p class=\"size20\"><span>20.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid7\">\n\t\t\t\t\t\t<p class=\"size24\"><span>24.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row4\" id=\"\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<p class=\"size30\"><span>30.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row1 fullreverse\">\n\t\t\t\t\t<div class=\"grid2 firstcol\">\n\t\t\t\t\t\t<p class=\"size10\"><span>10.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size11\"><span>11.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size12\"><span>12.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size13\"><span>13.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row2 fullreverse\">\n\t\t\t\t\t<div class=\"grid3 firstcol\">\n\t\t\t\t\t\t<p class=\"size14\"><span>14.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size16\"><span>16.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid5\">\n\t\t\t\t\t\t<p class=\"size18\"><span>18.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample fullreverse psample_row3\" id=\"\">\n\t\t\t\t\t<div class=\"grid5 firstcol\">\n\t\t\t\t\t\t<p class=\"size20\"><span>20.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid7\">\n\t\t\t\t\t\t<p class=\"size24\"><span>24.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample fullreverse psample_row4\" id=\"\" style=\"border-bottom: 20px #000 solid;\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<p class=\"size30\"><span>30.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div id=\"layout\">\n\t\t\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<h1>Lorem Ipsum Dolor</h1>\n\t\t\t\t\t\t<h2>Etiam porta sem malesuada magna mollis euismod</h2>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<p class=\"byline\">By <a href=\"#link\">Aenean Lacinia</a></p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid8 firstcol\">\n\t\t\t\t\t\t<p class=\"large\">Donec sed odio dui. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t<h3>Pellentesque ornare sem</h3>\n\n\t\t\t\t\t\t<p>Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas faucibus mollis interdum. Donec ullamcorper nulla non metus auctor fringilla. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam id dolor id nibh ultricies vehicula ut id elit. </p>\n\n\t\t\t\t\t\t<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </p>\n\n\t\t\t\t\t\t<p>Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean lacinia bibendum nulla sed consectetur. </p>\n\n\t\t\t\t\t\t<p>Nullam quis risus eget urna mollis ornare vel eu leo. Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec ullamcorper nulla non metus auctor fringilla. </p>\n\n\t\t\t\t\t\t<h3>Cras mattis consectetur</h3>\n\n\t\t\t\t\t\t<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean lacinia bibendum nulla sed consectetur. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Cras mattis consectetur purus sit amet fermentum. </p>\n\n\t\t\t\t\t\t<p>Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis ornare vel eu leo. Cras mattis consectetur purus sit amet fermentum.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid4 sidebar\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class=\"box reverse\">\n\t\t\t\t\t\t\t<p class=\"last\">Nullam quis risus eget urna mollis ornare vel eu leo. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. </p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<p class=\"caption\">Maecenas sed diam eget risus varius.</p>\n\n\t\t\t\t\t\t<p>Vestibulum id ligula porta felis euismod semper. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t\n\n\t\t\t\t\t\t<p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Aenean lacinia bibendum nulla sed consectetur. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean lacinia bibendum nulla sed consectetur. Nullam quis risus eget urna mollis ornare vel eu leo. </p>\n\n\t\t\t\t\t\t<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec ullamcorper nulla non metus auctor fringilla. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t</div>\n\n\n\n\n\n\n\n\t\t\n\t\t\n\t\t<div id=\"specs\">\n\t\t\t\n\t\t</div>\n\t\n\t\t<div id=\"installing\">\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"grid7 firstcol\">\n\t\t\t\t\t<h1>Installing Webfonts</h1>\n\t\t\t\t\t\n\t\t\t\t\t<p>Webfonts are supported by all major browser platforms but not all in the same way. There are currently four different font formats that must be included in order to target all browsers. This includes TTF, WOFF, EOT and SVG.</p>\n\t\t\t\t\t\n\t\t\t\t\t<h2>1. Upload your webfonts</h2>\n\t\t\t\t\t<p>You must upload your webfont kit to your website. They should be in or near the same directory as your CSS files.</p>\n\t\t\t\t\t\n\t\t\t\t\t<h2>2. Include the webfont stylesheet</h2>\n\t\t\t\t\t<p>A special CSS @font-face declaration helps the various browsers select the appropriate font it needs without causing you a bunch of headaches. Learn more about this syntax by reading the <a href=\"http://www.fontspring.com/blog/further-hardening-of-the-bulletproof-syntax\">Fontspring blog post</a> about it. The code for it is as follows:</p>\n\t\t\t\t\t\n\t\t\t\t\t\n<code>\n@font-face{ \n\tfont-family: 'MyWebFont';\n\tsrc: url('WebFont.eot');\n\tsrc: url('WebFont.eot?iefix') format('eot'),\n\t     url('WebFont.woff') format('woff'),\n\t     url('WebFont.ttf') format('truetype'),\n\t     url('WebFont.svg#webfont') format('svg');\n}\n</code>\n\n\t<p>We've already gone ahead and generated the code for you. All you have to do is link to the stylesheet in your HTML, like this:</p>\n\t<code>&lt;link rel=&quot;stylesheet&quot; href=&quot;stylesheet.css&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;</code>\n\n\t\t\t\t\t<h2>3. Modify your own stylesheet</h2>\n\t\t\t\t\t<p>To take advantage of your new fonts, you must tell your stylesheet to use them. Look at the original @font-face declaration above and find the property called \"font-family.\" The name linked there will be what you use to reference the font. Prepend that webfont name to the font stack in the \"font-family\" property, inside the selector you want to change. For example:</p>\n<code>p { font-family: 'MyWebFont', Arial, sans-serif; }</code>\n\n<h2>4. Test</h2>\n<p>Getting webfonts to work cross-browser <em>can</em> be tricky. Use the information in the sidebar to help you if you find that fonts aren't loading in a particular browser.</p>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"grid5 sidebar\">\n\t\t\t\t\t<div class=\"box\">\n\t\t\t\t\t\t<h2>Troubleshooting<br />Font-Face Problems</h2>\n\t\t\t\t\t\t<p>Having trouble getting your webfonts to load in your new website? Here are some tips to sort out what might be the problem.</p>\n\n\t\t\t\t\t\t<h3>Fonts not showing in any browser</h3>\n\n\t\t\t\t\t\t<p>This sounds like you need to work on the plumbing. You either did not upload the fonts to the correct directory, or you did not link the fonts properly in the CSS. If you've confirmed that all this is correct and you still have a problem, take a look at your .htaccess file and see if requests are getting intercepted.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in iPhone or iPad</h3>\n\n\t\t\t\t\t\t<p>The most common problem here is that you are serving the fonts from an IIS server. IIS refuses to serve files that have unknown MIME types. If that is the case, you must set the MIME type for SVG to \"image/svg+xml\" in the server settings. Follow these instructions from Microsoft if you need help.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in Firefox</h3>\n\n\t\t\t\t\t\t<p>The primary reason for this failure? You are still using a version Firefox older than 3.5. So upgrade already! If that isn't it, then you are very likely serving fonts from a different domain. Firefox requires that all font assets be served from the same domain. Lastly it is possible that you need to add WOFF to your list of MIME types (if you are serving via IIS.)</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in IE</h3>\n\n\t\t\t\t\t\t<p>Are you looking at Internet Explorer on an actual Windows machine or are you cheating by using a service like Adobe BrowserLab? Many of these screenshot services do not render @font-face for IE. Best to test it on a real machine.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in IE9</h3>\n\n\t\t\t\t\t\t<p>IE9, like Firefox, requires that fonts be served from the same domain as the website. Make sure that is the case.</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\n\t\t</div>\n\t\n\t</div>\n\t<div id=\"footer\">\n\t\t<p>&copy;2010-2011 Fontspring. All rights reserved.</p>\n\t</div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/fonts/roboto/stylesheet.css",
    "content": "@font-face {\n    font-family: 'robotoregular';\n    src: url('Roboto-Regular-webfont.eot');\n    src: url('Roboto-Regular-webfont.eot?#iefix') format('embedded-opentype'),\n         url('Roboto-Regular-webfont.woff') format('woff'),\n         url('Roboto-Regular-webfont.ttf') format('truetype'),\n         url('Roboto-Regular-webfont.svg#robotoregular') format('svg');\n    font-weight: normal;\n    font-style: normal;\n\n}\n\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/forms.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Forms</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\"/>\n\n</head>\n<body>\n<div class=\"container\">\n    <h1>Browsersync Ghost Mode: Form sync</h1>\n\n    <p>Links: synced</p>\n    <a href=\"index.html\">Hompage</a>\n\n    <form id=\"form-01\">\n        <p><label for=\"name\">Text Inputs: synced</label></p>\n        <input type=\"text\" name=\"name\" value=\"\" id=\"name\"/>\n\n        <p><label for=\"email\">Email Inputs: synced</label></p>\n        <input type=\"email\" name=\"email\" value=\"\" id=\"email\"/>\n        <p><label for=\"password\">Passwords Inputs: synced</label></p>\n        <input type=\"password\" name=\"password\" value=\"\" id=\"password\"/>\n\n        <p><label for=\"country\">Select Boxes: synced</label></p>\n        <select name=\"country\" id=\"country\">\n            <option value=\"uk\">Uk</option>\n            <option value=\"spain\">Spain</option>\n            <option value=\"france\">France</option>\n        </select>\n\n        <p>Radio Buttons: synced </p>\n\n        <p>\n            <label for=\"confirm-1\">Yes</label>\n            <input type=\"radio\" name=\"confirm\" id=\"confirm-1\" value=\"1\"/>\n            <label for=\"confirm-0\">No</label>\n            <input type=\"radio\" name=\"confirm\" id=\"confirm-0\" value=\"0\"/>\n        </p>\n\n        <p>Check Boxes: synced</p>\n\n        <div>\n            <label for=\"option-1\">Option 1</label>\n            <input type=\"checkbox\" name=\"checkbox\" id=\"option-1\">\n            <label for=\"option-2\">Option 2</label>\n            <input type=\"checkbox\" name=\"checkbox\" id=\"option-2\">\n        </div>\n\n        <p>Labels</p>\n\n        <div>\n            <label for=\"option-3\"><span>Option 1</span></label>\n            <input type=\"checkbox\" name=\"checkbox\" id=\"option-3\">\n            <label for=\"option-4\">Option 2</label>\n            <input type=\"checkbox\" name=\"checkbox\" id=\"option-4\">\n        </div>\n\n        <p><label for=\"message\">Text Areas: synced</label></p>\n        <textarea name=\"message\" id=\"message\" cols=\"30\" rows=\"10\"></textarea>\n\n        <input type=\"submit\" value=\"Submit\" />\n        <input type=\"reset\" value=\"Reset\" />\n    </form>\n\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/iframe.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\"/>\n    <link rel=\"stylesheet\" href=\"fonts/roboto/stylesheet.css\"/>\n</head>\n<body>\n\n    <h1 style=\"font-family: robotoregular, serif\">Browsersync + iFrame</h1>\n    <a href=\"forms.html\">Forms</a>\n    <a href=\"scrolling.html\">Scrolling Window</a>\n\n    <iframe src=\"sass.html\" frameborder=\"0\"></iframe>\n\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/images.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page for images</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\">\n</head>\n<body>\n    <img src=\"img/cam-secure.png\" alt=\"\" id=\"img-src-attr\">\n    <div id=\"img-style\"\n         style=\"width: 128px; height: 128px; background: url(img/cam-secure-02.png); border: 2px dashed grey\"></div>\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/import-link.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" href=\"assets/import.css\" />\n</head>\n<body>\n    <p>With CSS imports</p>\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/import.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <style type=\"text/css\">\n        @import url(\"assets/import.css\");\n    </style>\n</head>\n<body>\n    <p>With CSS imports</p>\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/index-amd.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page (AMD)</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\"/>\n    <link rel=\"stylesheet\" href=\"fonts/roboto/stylesheet.css\"/>\n    <script src=\"requirejs/require.js\"></script>\n</head>\n<body>\n\n    <h1 style=\"font-family: robotoregular, serif\">Browsersync + Public URL</h1>\n    <a href=\"forms.html\">Forms</a>\n    <a href=\"scrolling.html\">Scrolling Window</a>\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/index-large.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\"/>\n</head>\n<body>\n\n    <h1>Hello from the test</h1>\n    <a href=\"forms.html\">Forms</a>\n    <a href=\"scrolling.html\">Scrolling Window</a>\n\n    <a href=\"forms.html\">\n        <div>\n            <div>\n                <img src=\"http://placekitten.com/400/600\" alt=\"\"/>\n            </div>\n        </div>\n    </a>\n    <a href=\"forms.html\">\n        <div>\n            <div>\n                <img src=\"http://placekitten.com/400/600\" alt=\"\"/>\n            </div>\n        </div>\n    </a>\n\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Debitis dolorem eligendi\n            exercitationem impedit minus molestiae quia quidem reprehenderit rerum ut. Ab cum\n            debitis laborum necessitatibus officia quia tempore voluptatum! Placeat.</p>\n\n        <p>Aliquid animi expedita, illum ipsum iusto non officia temporibus tenetur ut! Asperiores\n            aspernatur deserunt dignissimos enim exercitationem expedita labore, laborum natus neque\n            odit officiis provident quae quaerat quibusdam sequi, voluptas?</p>\n\n        <p>Deserunt enim esse itaque magnam nam quidem sapiente suscipit temporibus veniam? Beatae,\n            commodi delectus dicta doloremque explicabo ipsum libero natus sapiente sunt suscipit\n            tempore, unde, veniam voluptas. Beatae dolor, tenetur.</p>\n\n        <p>Dolorem nulla quidem sapiente voluptatum! Ea impedit ipsam minima nemo ratione recusandae\n            reprehenderit saepe sint vero! Distinctio ducimus eius fugiat laborum, quaerat quas\n            quos. Assumenda et expedita facere maiores. Culpa!</p>\n\n        <p>Ex, officiis quos. Atque debitis ex expedita harum nisi non optio reiciendis sit\n            voluptates! Aspernatur at delectus et expedita illo, impedit in non sint! Alias iure\n            natus perspiciatis quisquam suscipit?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque blanditiis commodi\n            corporis cumque distinctio dolor dolore dolorem, explicabo fuga, fugit maiores, nam\n            nesciunt optio quam quo rem ullam. Autem, est!</p>\n\n        <p>Aspernatur eveniet fugit ipsum maxime nobis placeat quis repellat voluptatem. Assumenda\n            exercitationem, ipsam ipsum neque nesciunt perferendis quod ullam. Dolores doloribus\n            ducimus enim facilis in possimus quae quis tempore voluptatem!</p>\n\n        <p>Earum eos incidunt quaerat. Aliquam eius eos et ex molestias placeat saepe sed velit.\n            Amet beatae corporis cum dignissimos, distinctio dolore expedita harum incidunt, magnam\n            molestias neque nihil odit ratione.</p>\n\n        <p>Accusantium amet aperiam commodi consequuntur dignissimos distinctio, dolor eos excepturi\n            exercitationem fuga hic illo in incidunt maxime neque nisi nostrum numquam optio\n            perferendis possimus quasi, quod reiciendis repellat velit voluptas.</p>\n\n        <p>Ab accusantium aliquid autem consequatur distinctio dolor eaque eius eum eveniet\n            excepturi harum illo in minima mollitia neque odit omnis, quasi quidem reiciendis\n            repellat reprehenderit sapiente suscipit unde veniam vitae.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Error eveniet nesciunt nostrum\n            nulla, quidem quisquam reiciendis sapiente sint tempora! Consequuntur earum excepturi\n            libero nobis sequi. Debitis eligendi ipsam temporibus vel.</p>\n\n        <p>Eaque rem reprehenderit sint ullam. A aliquid beatae consectetur dolor enim et facilis\n            hic illo ipsam iusto laboriosam magnam maiores nam perferendis porro provident, quo\n            reiciendis, saepe tenetur, velit voluptatem?</p>\n\n        <p>Accusantium ad adipisci commodi cupiditate dolor eligendi, eum impedit ipsum iure nam\n            neque nesciunt nisi nobis quaerat quas quia, quibusdam quidem quis quo recusandae rem\n            suscipit totam, unde veniam voluptatibus!</p>\n\n        <p>Adipisci consectetur maxime modi! Ab amet doloremque earum eligendi facilis ipsam\n            laboriosam nam necessitatibus nobis non odio, omnis perspiciatis quia ratione sint sit\n            tempore, temporibus ut vel vero. Aut, placeat!</p>\n\n        <p>A aliquid aperiam at beatae cumque debitis, dolore dolores ea eaque eius enim explicabo\n            facilis hic illo magnam magni minus numquam officia officiis omnis, qui quidem repellat\n            sint sit unde!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus beatae consectetur\n            distinctio error est exercitationem expedita, necessitatibus officiis possimus quaerat,\n            quis rem repellat vitae? Expedita itaque magnam mollitia rem repudiandae.</p>\n\n        <p>A, animi cupiditate debitis, dignissimos dolorum eveniet explicabo fugiat laboriosam\n            magnam maxime modi nam nisi obcaecati officiis omnis quas quibusdam recusandae,\n            repudiandae sequi sit soluta unde veritatis voluptates! Dolorum, itaque!</p>\n\n        <p>Ad cumque dolor dolore fugit hic iste maiores nisi quae quas quidem! Ad, cum dignissimos\n            dolorum ducimus facere incidunt labore minus natus nisi non pariatur quas quasi\n            quibusdam quo similique!</p>\n\n        <p>Ad cupiditate ex fugiat, iusto omnis possimus sunt tempora ullam vel! Cumque est iure\n            maxime voluptatibus? Aliquam aspernatur culpa dicta eligendi explicabo libero odio quia\n            quidem sapiente sequi! Nostrum, quasi.</p>\n\n        <p>Commodi error incidunt modi. Ad dolores ipsum totam voluptate voluptates. Alias aliquid\n            aspernatur consequuntur deleniti dignissimos excepturi, illo iste laborum magni nisi\n            nobis porro rem similique sint soluta, sunt vero.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet blanditiis consectetur,\n            deleniti dolorem ducimus eum facere facilis fuga illo iusto nihil odit officia\n            praesentium quis rerum temporibus totam voluptates voluptatibus!</p>\n\n        <p>Commodi deserunt distinctio doloremque eos fugit, inventore ipsa laborum modi nesciunt\n            nihil officia officiis quas recusandae repudiandae rerum sapiente temporibus. Ab\n            assumenda consequatur eius error, excepturi in libero optio sunt?</p>\n\n        <p>A adipisci amet architecto, consequuntur corporis debitis deleniti dolores error est\n            eveniet ipsum itaque molestias optio pariatur quasi quis quisquam rem repellat\n            repellendus soluta? Cumque, molestiae, quibusdam. Quia quidem, reiciendis.</p>\n\n        <p>Consectetur delectus error fuga, libero voluptatem voluptatum! Amet aperiam architecto\n            asperiores aspernatur assumenda commodi, debitis delectus eligendi et fuga itaque iusto\n            minus nihil, placeat possimus, ratione reprehenderit rerum tenetur velit.</p>\n\n        <p>Doloribus ducimus eos iste laborum placeat quaerat quam quia, quo repellendus\n            voluptatibus. Aperiam aut cupiditate deserunt dignissimos itaque necessitatibus pariatur\n            sapiente? Asperiores aspernatur minus qui tempora. Alias qui quisquam quo?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis dolorem doloribus,\n            enim harum magnam quisquam sed. A consectetur dignissimos dolorum earum ex hic minus\n            modi obcaecati officiis optio, quos voluptatibus!</p>\n\n        <p>Consectetur cupiditate doloremque ea eius, est ex excepturi fuga fugiat iusto laborum\n            maiores molestias, mollitia nostrum officia optio pariatur porro quae quas quibusdam\n            quod saepe sapiente sequi sint veritatis voluptates?</p>\n\n        <p>Eum quaerat, reprehenderit? A aliquid beatae doloribus error exercitationem expedita\n            impedit in ipsum labore, laudantium minima molestias nesciunt nihil non odit porro quas\n            quibusdam, reiciendis repellat similique velit veritatis voluptatum?</p>\n\n        <p>A accusantium adipisci architecto ipsa libero perferendis placeat praesentium, unde.\n            Accusantium beatae consectetur doloribus esse id laudantium maiores, minima nihil odio\n            quos recusandae, similique tempore voluptatum. Inventore optio suscipit voluptates?</p>\n\n        <p>Adipisci delectus minus, porro recusandae sit totam veniam. Architecto aspernatur,\n            debitis deleniti doloribus et fugit minus necessitatibus nobis odio perferendis placeat,\n            provident quam repellat rerum similique sint, sit suscipit tenetur!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi eligendi esse id illo\n            obcaecati omnis possimus provident reiciendis rem veritatis. Consectetur distinctio\n            dolorum ea eius exercitationem? Dolorum nam quam suscipit.</p>\n\n        <p>Doloremque facilis ipsum nam rem! Alias aliquam aperiam consequuntur cumque cupiditate\n            delectus enim fugiat laboriosam optio perspiciatis placeat, quasi, qui vero! Accusamus\n            ad commodi dolore doloremque facere, incidunt itaque temporibus.</p>\n\n        <p>Amet assumenda consequatur enim error fugit nihil nisi officia officiis quo sapiente!\n            Accusantium aliquam asperiores consequuntur eos, exercitationem explicabo facilis fuga\n            impedit labore molestias nam quod sed tempore temporibus voluptatem.</p>\n\n        <p>Ab at culpa delectus ducimus ea error eum eveniet facere facilis id itaque labore,\n            molestiae mollitia nam necessitatibus nobis officiis optio possimus praesentium, quae\n            quos reprehenderit sapiente tempora tempore voluptatum!</p>\n\n        <p>Alias aspernatur assumenda commodi culpa delectus doloribus eius eos excepturi explicabo\n            in molestias non, officiis perferendis perspiciatis placeat provident ratione repellat\n            tempora temporibus tenetur. Et nostrum quo reiciendis totam velit?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci autem laboriosam\n            libero molestias natus, nihil odio qui quia reiciendis repudiandae sint temporibus vel\n            voluptatem. Ad aliquid neque provident ullam voluptatibus.</p>\n\n        <p>Autem corporis culpa deleniti, dignissimos distinctio dolor dolore eligendi enim, est\n            excepturi fugiat itaque, magnam minima natus nobis nostrum placeat quaerat quasi quis\n            reiciendis repellat soluta sunt suscipit veniam vitae.</p>\n\n        <p>Accusantium asperiores at deserunt dignissimos distinctio doloremque, dolores ea eos fuga\n            fugiat in iusto mollitia nam nemo, nisi obcaecati officiis pariatur perspiciatis quas\n            quasi similique, tempore ut velit voluptatem voluptatibus!</p>\n\n        <p>Ab aspernatur aut blanditiis culpa, cum dolore ea eos exercitationem expedita incidunt\n            libero, molestias non odio odit officia omnis placeat provident quaerat qui\n            reprehenderit repudiandae, similique soluta. Ad consequuntur, totam?</p>\n\n        <p>Alias blanditiis dolore dolorem ducimus expedita illo incidunt, iusto laudantium minima,\n            molestiae necessitatibus, neque nesciunt nobis nulla odit quaerat quas quasi quis\n            quisquam quod saepe sapiente sed sint ut voluptate.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquid architecto, blanditiis\n            dolore ducimus, esse facilis id illum in laudantium odio omnis optio porro quae rem\n            tenetur vel vero voluptas! Perferendis!</p>\n\n        <p>Accusamus animi asperiores assumenda blanditiis corporis, culpa dolor earum eum illum\n            laudantium numquam placeat possimus quae quas quasi quibusdam ratione repellat\n            repellendus repudiandae sapiente sed sint soluta sunt tempore, voluptatibus!</p>\n\n        <p>Ad amet at beatae cumque deserunt dolore dolores doloribus, eaque error esse expedita\n            fuga harum, natus nobis nostrum odio perferendis quas repellendus rerum unde vel veniam\n            vero vitae! Iusto, recusandae.</p>\n\n        <p>Accusamus at ex incidunt iusto mollitia perferendis sequi, vitae. Aperiam earum, et ex\n            facere maiores nemo quos reprehenderit voluptas. Architecto asperiores hic magni natus\n            nemo nesciunt officia quia? Debitis, quaerat.</p>\n\n        <p>A maiores quos sapiente sint sit. Aliquid cupiditate illum incidunt minus neque quasi,\n            qui repellendus sapiente tempore voluptates. A alias aperiam aut excepturi laboriosam\n            laudantium officiis omnis porro praesentium recusandae?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae cumque cupiditate\n            deserunt dicta dignissimos, distinctio ducimus eum facere ipsum laboriosam modi\n            necessitatibus nihil nostrum perferendis quasi quidem similique, sunt veritatis!</p>\n\n        <p>Cupiditate deserunt ducimus eius eligendi, error esse, fuga libero nobis possimus quasi\n            quis rem tempore unde, velit veritatis. Ab ad, dolorem explicabo fugiat nam officia\n            porro voluptas voluptate. Illo, voluptas.</p>\n\n        <p>At deleniti dolore excepturi explicabo neque nostrum quidem ratione repellat. Cupiditate\n            et excepturi fuga fugiat ipsa laborum minima nesciunt nisi nostrum quas quisquam quos,\n            sapiente suscipit, veritatis, voluptatum! Ex, laborum!</p>\n\n        <p>Architecto dolorum eos et impedit ipsa nostrum, nulla officia quia quo sunt! Consequatur\n            dignissimos numquam provident quam. Aliquam ea, esse harum nisi nobis possimus quia quis\n            ratione, saepe tempora, vel?</p>\n\n        <p>Accusantium ad aut commodi consectetur deserunt dolores et excepturi expedita facere id\n            illo ipsa ipsum iure laborum magnam molestiae nesciunt officiis perspiciatis, quaerat\n            quam quisquam quod repellat sit sunt voluptate?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium animi autem cumque\n            cupiditate eaque, earum esse et molestias nam officiis pariatur porro possimus qui\n            quisquam soluta sunt ullam voluptate voluptates?</p>\n\n        <p>Accusantium animi dicta, eius esse ex impedit incidunt minima, neque officia repudiandae\n            soluta suscipit velit? Architecto dicta eos eveniet iusto molestiae numquam obcaecati\n            quam, quo quod recusandae, repellendus repudiandae tempore?</p>\n\n        <p>Adipisci amet animi cupiditate dolores ea eaque esse et facere fuga inventore laudantium\n            libero magnam magni maxime molestiae nam non optio pariatur praesentium, quia sequi unde\n            velit voluptas voluptates voluptatibus.</p>\n\n        <p>Dignissimos, perspiciatis, recusandae! Accusantium aperiam aut commodi cumque, deleniti\n            dolorem, fugit itaque labore non officia optio perferendis provident quaerat quas rerum\n            sapiente sunt tenetur ut vitae voluptate. Assumenda, et, sapiente.</p>\n\n        <p>A assumenda consequatur deleniti dolore dolorum eaque eius, facilis hic incidunt\n            inventore ipsam nemo nostrum nulla numquam odio perspiciatis placeat, praesentium\n            provident quam quas ratione rem sed sequi, tempora veniam.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquid blanditiis dolore ex\n            facere, fugit illo, ipsam laudantium necessitatibus odit placeat quam quisquam quod\n            repellendus reprehenderit soluta temporibus ullam vero voluptas?</p>\n\n        <p>Amet, dolorem odio pariatur quibusdam sit velit voluptas voluptates? Blanditiis\n            doloremque esse laudantium obcaecati, reiciendis repellat? Blanditiis commodi eos esse\n            illo incidunt ipsam maxime nemo praesentium, quam qui, repellat ullam.</p>\n\n        <p>Adipisci commodi consectetur debitis deleniti dolorum eaque fuga fugit harum hic ipsam\n            iusto laborum libero nam nesciunt, numquam, pariatur possimus, qui quia quis quisquam\n            rem repellendus repudiandae sit tenetur voluptate.</p>\n\n        <p>Beatae consequatur debitis dolores facilis fugit hic laborum, magnam maiores maxime\n            minus, perspiciatis provident recusandae repudiandae, sapiente suscipit tempore\n            temporibus tenetur veniam vero vitae. Atque aut id illum qui sunt.</p>\n\n        <p>Assumenda, sit, voluptates! Accusantium aspernatur at consequuntur inventore libero nobis\n            perferendis voluptas voluptatem voluptates. Animi beatae commodi, culpa ea eligendi enim\n            facilis illo minus nam, nesciunt nisi perspiciatis repudiandae unde.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam architecto autem dolor\n            doloremque et facilis hic impedit laboriosam laborum laudantium qui quisquam, quo\n            recusandae repudiandae rerum ut vero! Incidunt, magni!</p>\n\n        <p>Commodi culpa distinctio dolores eius expedita harum itaque molestiae molestias non\n            officia optio, quae quasi quia quibusdam, ratione totam ullam vitae? Odio odit, sunt! A\n            aliquam commodi ipsam nostrum quos!</p>\n\n        <p>Adipisci fuga maiores officia. Ad aliquam aspernatur consequuntur distinctio, eligendi\n            exercitationem fugiat iste itaque iure, magni numquam omnis provident quod repudiandae\n            soluta suscipit ut, veniam voluptas. Fugit iste mollitia vel?</p>\n\n        <p>Aliquid commodi cupiditate eos, excepturi fugiat labore magni maiores numquam optio\n            placeat quaerat sequi similique suscipit tempore ut! Autem debitis ea fuga laudantium\n            quos recusandae sapiente similique voluptatem! Autem, vel!</p>\n\n        <p>Accusantium adipisci dolores exercitationem inventore laboriosam mollitia necessitatibus,\n            obcaecati, omnis quos recusandae velit vitae! Adipisci, in quibusdam. Atque corporis\n            dolore dolorem dolorum esse ipsum quia. Id laboriosam praesentium repellat\n            similique.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Assumenda hic id labore nobis,\n            odio repellendus temporibus. Ad architecto corporis exercitationem illum in\n            necessitatibus nesciunt, vel veniam. Molestiae quasi reiciendis velit!</p>\n\n        <p>Beatae deserunt eos harum praesentium vero? Amet asperiores explicabo fugiat ipsam sunt\n            ullam? Accusamus corporis culpa cumque dolorum earum error fugiat, in ipsam modi\n            molestias nostrum quibusdam sequi similique vitae?</p>\n\n        <p>A aperiam delectus dicta doloribus est ipsam magni necessitatibus nemo obcaecati officiis\n            perferendis quo ratione, recusandae soluta unde veritatis vitae voluptatum. Architecto\n            aut error illum nam nemo nostrum officiis ut.</p>\n\n        <p>Architecto, deleniti dolor dolore doloremque doloribus enim est eum ex excepturi illo\n            incidunt inventore ipsa maxime minima modi necessitatibus non numquam optio perferendis\n            porro possimus quasi, similique tempora veniam voluptatum?</p>\n\n        <p>Asperiores deserunt distinctio fugit id illo, laborum quisquam reprehenderit sapiente\n            sunt veritatis! Aperiam cum cumque dicta dolore ducimus, earum excepturi explicabo,\n            facilis id mollitia nostrum optio quibusdam ullam voluptatibus voluptatum!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Asperiores blanditiis culpa,\n            cum dolorem earum eos est harum iure laborum laudantium molestiae, natus quae, quam qui\n            repudiandae suscipit ullam vel veritatis!</p>\n\n        <p>Ex, fugiat, nisi? Aliquid aut debitis dolore, eaque exercitationem ipsam ipsum\n            necessitatibus odio quam temporibus. Cumque dolores iusto nesciunt? Alias at beatae\n            distinctio ea iure magnam quibusdam sapiente ut vero.</p>\n\n        <p>Fugit libero quos tempora! Ad adipisci, aliquam at aut commodi dolor, est libero,\n            nesciunt nobis nostrum possimus quia rem repellat tempore veritatis voluptas\n            voluptatibus! Esse nobis possimus quisquam recusandae tenetur!</p>\n\n        <p>Cupiditate enim esse omnis quisquam? Ab accusantium aliquam eius esse est et eum\n            exercitationem expedita iusto maxime, minus nulla quas quidem quis rem sit tempora\n            temporibus unde velit voluptatibus! Laborum.</p>\n\n        <p>Amet atque aut, corporis delectus dignissimos dolore dolorem dolores doloribus earum\n            eligendi enim eos eum fuga harum iusto minus mollitia nihil nostrum numquam pariatur\n            perferendis placeat temporibus velit. Minima, provident?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab aliquam, aliquid at\n            blanditiis dolores dolorum eum eveniet hic ipsa iste magni modi mollitia nesciunt nisi\n            nobis nulla optio suscipit ullam?</p>\n\n        <p>Accusamus accusantium amet assumenda at dolor dolore est ex expedita explicabo fugiat\n            laborum magnam mollitia nisi numquam officiis omnis quae quasi quis quisquam, reiciendis\n            repudiandae sequi tenetur ullam ut voluptatem!</p>\n\n        <p>Accusantium animi cum, delectus ea eum ex id incidunt laboriosam perspiciatis praesentium\n            sit soluta temporibus, voluptate. Doloremque error odio possimus totam. Ab aspernatur\n            facilis harum labore nemo nobis, quae repellendus!</p>\n\n        <p>Asperiores assumenda consectetur cumque cupiditate ea eligendi eos error et fugit hic\n            maxime, minus nisi odio optio quam qui quibusdam quo, repudiandae sequi similique sunt\n            tempore totam vel vitae voluptas?</p>\n\n        <p>Cumque doloribus ducimus eligendi ipsum iste non soluta velit. Beatae consequatur cum ea\n            eligendi, ex expedita harum ipsa laudantium quia quisquam. Asperiores consequuntur est\n            iure optio quia rerum sequi, sit!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium animi aut dolor\n            doloremque ducimus eaque exercitationem facere fugit, harum illum magnam, minus\n            necessitatibus non officiis quam quod reprehenderit saepe tempore.</p>\n\n        <p>Aperiam at, et ex, ipsum iure magni maiores nisi obcaecati odit praesentium quia repellat\n            rerum sed similique sunt. Accusamus at autem ducimus esse et inventore iure\n            necessitatibus quibusdam veritatis vitae?</p>\n\n        <p>Debitis labore mollitia odit officia? Ad assumenda corporis, cupiditate doloremque\n            ducimus error ex, optio, perspiciatis possimus rem tenetur veniam veritatis. Excepturi\n            facere facilis harum ipsum magnam nulla vel, velit! Soluta!</p>\n\n        <p>Asperiores eos expedita illum iste laudantium non perspiciatis rem sit? Accusantium\n            assumenda atque, blanditiis cupiditate dolorem doloribus earum, enim esse illo ipsam\n            necessitatibus officia quae repellendus sequi soluta temporibus vero.</p>\n\n        <p>Ad beatae cumque, debitis eius, eveniet excepturi explicabo facilis fugit, illo in libero\n            mollitia nam nemo nobis pariatur placeat porro quasi repellendus repudiandae temporibus\n            tenetur ut vel veniam! Asperiores, omnis.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. A asperiores consectetur cum,\n            eum expedita fugiat iure, minima nisi perspiciatis possimus quia quis quod rem sunt\n            ullam unde, voluptates. Reiciendis, voluptatibus!</p>\n\n        <p>Cum fuga maiores nam natus neque nulla quibusdam, quo repellat reprehenderit veritatis\n            voluptas voluptatum! Architecto dicta doloribus ducimus maxime tenetur. Exercitationem,\n            possimus, sequi. Cumque, eius iste quas rem suscipit tenetur!</p>\n\n        <p>Aliquam aliquid amet aperiam architecto, assumenda autem cum cupiditate dolore earum\n            excepturi fuga id ipsa ipsam, magni numquam odio quidem, repudiandae saepe sed sequi\n            similique soluta sunt tempore tenetur voluptatem!</p>\n\n        <p>Assumenda dolor facilis laboriosam minima molestiae optio pariatur sequi, voluptatem!\n            Enim eum ex facere nobis rem! Distinctio ea id in magnam pariatur qui, reiciendis\n            tenetur vero. Assumenda doloremque odio placeat.</p>\n\n        <p>Accusantium commodi cumque fugit ipsum? Adipisci doloribus iure sequi? Architecto,\n            debitis, deleniti dicta eaque et fuga id illum ipsa labore maiores minima, optio\n            pariatur quia voluptate voluptatem. Culpa, modi, rerum.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto, consectetur\n            deserunt explicabo hic modi obcaecati odit quis suscipit tenetur veritatis! Aspernatur\n            eum fugiat ipsam modi natus quod recusandae repellat voluptatibus.</p>\n\n        <p>Asperiores autem blanditiis consequuntur corporis cupiditate dolorem eius fugit id illum\n            ipsam iusto labore molestias mollitia, natus obcaecati quaerat repellat sapiente sunt\n            tenetur totam unde vel veniam. Facere, impedit, soluta?</p>\n\n        <p>Animi assumenda blanditiis culpa, deserunt doloremque exercitationem explicabo harum\n            molestias nesciunt nostrum, officiis quo, repellendus saepe ullam vitae? Accusantium\n            architecto at aut consectetur consequuntur harum necessitatibus officia possimus sunt\n            tempora!</p>\n\n        <p>Doloremque nisi quibusdam sed. Alias aperiam distinctio doloribus, dolorum ea eligendi\n            error esse eveniet in inventore ipsum molestias nulla odit optio quibusdam quidem\n            ratione recusandae sequi tempora temporibus tenetur velit.</p>\n\n        <p>Aliquid dolore est, fugiat id illo ipsa, laboriosam libero magni maiores non obcaecati\n            officia recusandae repudiandae sapiente suscipit. Non officiis omnis quisquam sed unde!\n            Adipisci impedit iusto rem! Provident, quam?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus, animi blanditiis\n            distinctio dolores eius error inventore laboriosam libero minima nam necessitatibus nemo\n            nihil nisi, obcaecati quam rerum suscipit ullam vitae.</p>\n\n        <p>Ab aliquam aliquid delectus deserunt facere fuga ipsa, ipsam maiores nihil placeat, quia\n            quidem recusandae repellendus voluptatem, voluptatum. Consequatur deserunt dignissimos\n            eaque eligendi fugiat minus natus quas quod sed voluptatibus?</p>\n\n        <p>Deserunt eligendi esse fugiat minus nobis rem, tempora voluptates voluptatibus. Aliquam\n            amet animi architecto assumenda, atque delectus distinctio doloremque dolores, doloribus\n            ea earum laborum magni odit reiciendis saepe sint, soluta.</p>\n\n        <p>Dicta eius inventore optio praesentium repellendus sed vel. Ab architecto assumenda\n            consectetur fugiat id impedit labore magni nam obcaecati placeat, praesentium quidem\n            reprehenderit sapiente sint soluta suscipit velit veritatis voluptatum?</p>\n\n        <p>Accusantium adipisci architecto, assumenda, aut beatae cupiditate deleniti eaque eos ex\n            hic illo in maxime modi necessitatibus nobis perspiciatis quibusdam quis recusandae\n            rerum saepe sint sit suscipit temporibus tenetur vero.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium amet commodi\n            consectetur deleniti dolores ducimus ea ex, iure maxime, nihil nulla possimus qui\n            quidem, quisquam repellendus sequi similique tempore ullam.</p>\n\n        <p>Consequatur culpa debitis delectus dolorum ipsam laborum maxime numquam obcaecati optio,\n            porro possimus ratione repudiandae saepe sequi totam, voluptate voluptatem? Debitis iure\n            magni molestiae non omnis, ratione sit voluptas! Praesentium.</p>\n\n        <p>Debitis eligendi fuga porro quam quis! Ab architecto beatae debitis delectus dignissimos\n            ea ex expedita harum iusto molestias necessitatibus nemo placeat praesentium provident\n            quibusdam repudiandae saepe, sed vel velit voluptates.</p>\n\n        <p>Commodi libero maiores maxime nemo non omnis ratione saepe soluta voluptatibus! A\n            architecto autem consequatur error illo inventore minima nam odio quasi! Assumenda,\n            cupiditate enim eos expedita facilis ratione ut?</p>\n\n        <p>Aliquam consequatur cum dignissimos, dolore doloremque incidunt laborum molestias\n            nesciunt praesentium quae ratione reiciendis saepe voluptates? Dolorem dolorum modi\n            natus, nihil officia pariatur quibusdam tempora! Atque esse harum non sapiente.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam asperiores consequatur\n            corporis, dignissimos est explicabo, illo incidunt ipsum libero maxime praesentium\n            provident quam rem soluta tempora unde vel veniam voluptate!</p>\n\n        <p>Accusamus alias autem, deleniti eos et eum exercitationem odit omnis quasi reprehenderit.\n            A amet dolorem ducimus ea exercitationem fuga hic id molestias placeat possimus quod\n            repellat, repellendus repudiandae voluptas voluptates!</p>\n\n        <p>Accusamus cum dicta enim eos exercitationem illo, mollitia nihil nisi, nulla obcaecati\n            reiciendis, sequi sint totam? Aperiam beatae delectus et harum minus natus nisi nobis\n            optio porro, praesentium qui repellat!</p>\n\n        <p>Ab, aliquam commodi doloribus eligendi inventore nemo nihil nostrum perferendis provident\n            quia repellat repudiandae sapiente sequi suscipit tenetur veniam voluptas! Adipisci\n            aspernatur commodi dolorum earum hic pariatur porro, possimus voluptas.</p>\n\n        <p>Accusamus adipisci aliquam aut consectetur culpa deleniti deserunt dolor eius, error\n            explicabo id illo incidunt inventore iste libero mollitia officia officiis optio quod\n            quos reprehenderit sint tempora totam ullam voluptatem?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. A assumenda atque dolorum harum\n            id ipsum libero placeat reprehenderit sed totam! Consequatur cum deserunt eius illo\n            libero nostrum placeat sequi sunt?</p>\n\n        <p>Cum fuga ipsum iste iure modi nihil nobis perspiciatis praesentium saepe sed. Accusamus\n            amet dolores doloribus eum facere harum, in laborum molestias nulla quaerat, quas\n            recusandae, similique suscipit tempore tenetur!</p>\n\n        <p>Aperiam ea, earum et, hic libero neque nihil porro quae qui quidem quo quos repudiandae\n            rerum sed voluptatum. Alias asperiores distinctio earum fuga harum illum iusto\n            molestiae, obcaecati veritatis. Facilis.</p>\n\n        <p>Assumenda, commodi consequatur. Atque cumque perspiciatis rem similique ut! Accusamus ad\n            adipisci consectetur corporis dolore ea, eaque eum exercitationem impedit in, laudantium\n            neque non ratione sequi similique velit veritatis vitae.</p>\n\n        <p>Dolorem iste magni nam quas unde! Atque distinctio eum ex id labore nemo, omnis ratione\n            repudiandae temporibus voluptatum! Ad asperiores commodi dolorem eveniet laudantium nam\n            necessitatibus perspiciatis quo, reiciendis voluptas!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet aut cum iure laudantium\n            minima nihil quisquam rem temporibus? A architecto deserunt eveniet, fuga harum minima\n            minus optio temporibus vel voluptates?</p>\n\n        <p>Aliquid ea esse laudantium nemo nisi? Aperiam, cumque doloremque eius explicabo facere\n            fugit minus nemo totam veniam vero. Accusamus alias consequatur ducimus eos error et\n            excepturi expedita harum, neque quas.</p>\n\n        <p>Aliquid consectetur cumque illo laudantium natus nemo neque nostrum numquam, sequi\n            veritatis. Autem commodi, dolore laudantium nesciunt pariatur sed voluptatum!\n            Accusantium asperiores cumque doloremque exercitationem illum officia placeat sed\n            voluptatum?</p>\n\n        <p>Animi aspernatur beatae eveniet ex fuga illo voluptate voluptatum. Adipisci aliquid\n            asperiores blanditiis consequuntur deserunt eius eos fuga ipsa laudantium officiis rerum\n            sequi sint, tempora tempore totam vero voluptas voluptatem?</p>\n\n        <p>Commodi expedita quam qui quisquam repellat reprehenderit sequi! Ab aperiam corporis eius\n            ex illum incidunt ipsam ipsum iste necessitatibus, nihil nobis odit omnis, perferendis\n            possimus provident quaerat sint sunt tempora!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam cumque dicta facere,\n            illo porro totam! Aliquam asperiores deserunt eum itaque laborum officiis saepe? Alias\n            aliquid animi atque dolore, facere repellat.</p>\n\n        <p>Animi cum cupiditate distinctio dolores dolorum eaque, facere incidunt inventore labore\n            minus neque officia possimus, praesentium quae ratione sed, sit tempore. Accusamus\n            blanditiis facilis fugiat minus quam tenetur, velit voluptas.</p>\n\n        <p>Cum eius fugiat harum necessitatibus, neque nihil non praesentium rem soluta velit.\n            Accusantium assumenda atque dolorem eaque ipsa, nulla porro quam rem repellat soluta,\n            vero vitae. Cumque obcaecati pariatur similique.</p>\n\n        <p>Amet aspernatur, consectetur deleniti ducimus eius eligendi et excepturi hic illo, ipsa\n            nesciunt sequi! Dolor eligendi facilis nesciunt quia reiciendis! Accusamus atque\n            corporis iusto laudantium necessitatibus quaerat quo rem voluptate!</p>\n\n        <p>Ab, blanditiis eligendi et impedit, iste itaque modi nulla officia officiis perferendis\n            rem sequi veniam vero! Ad at, dolorum eveniet harum ipsa maxime omnis, provident\n            quibusdam repellendus sequi sint tempore?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad, asperiores consequatur\n            dolores dolorum exercitationem harum illo inventore libero? Asperiores labore laboriosam\n            maxime natus quam quas quia quod vero vitae voluptatum?</p>\n\n        <p>Aliquam dolorem dolorum earum eius fuga ipsam neque repudiandae rerum. Beatae distinctio\n            dolorem exercitationem expedita incidunt maxime, minima odio rem reprehenderit voluptas.\n            Alias animi in nemo quasi repudiandae, ut voluptatibus.</p>\n\n        <p>Aperiam facilis ipsam nam quidem recusandae ullam ut? Adipisci autem corporis distinctio\n            ipsum reprehenderit. Aspernatur autem consectetur consequatur delectus est illo ipsum\n            provident quia, sint sunt unde vero vitae voluptate!</p>\n\n        <p>Ab ad aliquid cum ducimus ea eos et facere iure, laboriosam magnam maiores non, officia\n            reiciendis? Ab assumenda beatae commodi ducimus itaque labore necessitatibus qui, quis,\n            quod repellendus totam ullam?</p>\n\n        <p>Ab aut blanditiis est fugit iusto laboriosam odio sint voluptate? Aliquam architecto\n            corporis doloremque harum in mollitia odio, quaerat quisquam rem sapiente sed, sequi sit\n            unde! Debitis delectus eaque officiis.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto aspernatur autem\n            blanditiis consequuntur dolorum molestiae perferendis qui. Ad consequatur consequuntur,\n            ipsa libero molestias optio pariatur placeat, quo rem repudiandae suscipit.</p>\n\n        <p>Aliquam aliquid culpa eum expedita laudantium minima natus, pariatur, quidem quos sed\n            soluta tempore ut vel. Ab accusamus asperiores autem beatae debitis ea est, eveniet\n            magni maiores omnis quae quasi?</p>\n\n        <p>Aperiam atque consectetur, corporis dolor ipsam nulla pariatur! Accusantium, blanditiis\n            deleniti est nemo odio repellendus rerum voluptatem voluptatum. Blanditiis consectetur\n            deleniti eveniet, hic laboriosam reiciendis saepe? Animi perspiciatis rem veritatis!</p>\n\n        <p>Asperiores aut cupiditate distinctio dolores impedit ipsum mollitia omnis placeat\n            possimus temporibus. A accusantium ad commodi culpa cum eveniet excepturi ipsam iste\n            odio, quas quia repellat tempore velit veniam voluptates.</p>\n\n        <p>Amet, architecto consequuntur dicta dolore dolorem eius enim est eveniet excepturi fugiat\n            iste iusto laborum libero minima natus nobis non officiis quae quibusdam quod sequi sit\n            temporibus unde ut, voluptatem?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Facilis quo tenetur veniam?\n            Aliquid blanditiis consequuntur corporis cumque ex fugit incidunt necessitatibus omnis\n            veniam voluptatum? Aliquam dicta iure obcaecati soluta tempora?</p>\n\n        <p>Dolor eos ex incidunt inventore, iure, labore libero minus obcaecati odit quas, sit\n            tempora veniam voluptate. Accusantium amet aut culpa doloribus illum, labore molestiae\n            nam non, nostrum quis quos tenetur?</p>\n\n        <p>Ab accusantium atque aut, autem, consequatur culpa cupiditate, ducimus earum explicabo\n            facere ipsa ipsum iusto laboriosam minima minus molestiae nulla officiis optio placeat\n            qui ratione sapiente sequi suscipit veniam voluptatibus!</p>\n\n        <p>A aliquam assumenda at cupiditate, deleniti dolorum eos error exercitationem facere\n            facilis ipsam labore maiores molestiae nihil nostrum officia officiis provident quae\n            quas reprehenderit repudiandae sed sint tenetur veniam vitae.</p>\n\n        <p>Cum deserunt dolore eum facilis ipsa maxime, officiis possimus ratione similique totam.\n            Aperiam aspernatur atque aut autem commodi debitis, deserunt eligendi exercitationem\n            nobis nostrum, officia placeat quas quia reiciendis sunt.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Autem consequatur cupiditate\n            debitis eius exercitationem illo ipsam numquam odio! Atque eum non pariatur quisquam ut?\n            Consectetur deleniti iste neque officiis sed.</p>\n\n        <p>At consequuntur debitis dolores eum, ipsum libero modi molestias nihil nulla officiis,\n            pariatur praesentium rerum saepe sed, totam vero voluptatibus? Debitis ea natus neque\n            perspiciatis quisquam, recusandae sequi sit. Optio?</p>\n\n        <p>Consequuntur, enim eum nobis optio perspiciatis tenetur voluptates. Adipisci at deserunt\n            ducimus et, facere fugiat fugit in, iusto molestias nisi rem temporibus? Accusantium\n            aliquam enim est eveniet illo velit voluptate!</p>\n\n        <p>Asperiores aspernatur consequatur corporis cumque doloremque eos ex iusto laboriosam\n            nobis non praesentium quam quasi rerum saepe sit soluta tempora voluptatibus,\n            voluptatum. Aperiam distinctio facilis ipsam nobis quaerat sint veritatis!</p>\n\n        <p>A adipisci aspernatur consequuntur doloremque excepturi explicabo iste laborum natus\n            necessitatibus pariatur. Dignissimos doloremque ea fugit inventore ipsam laboriosam\n            maiores necessitatibus nesciunt, numquam porro quam sapiente, sequi tempora tenetur\n            ullam.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium ad aliquam debitis\n            earum error et ex, facere, fugiat harum impedit magni neque nihil quaerat quasi\n            repudiandae similique tenetur totam veritatis.</p>\n\n        <p>A accusamus amet animi architecto, asperiores, autem consequatur debitis dolorum enim\n            harum ipsum laboriosam nihil optio praesentium, quasi quod recusandae reprehenderit\n            rerum sequi tenetur totam ullam unde voluptatum! Aspernatur, quos!</p>\n\n        <p>Ad adipisci aperiam aspernatur atque beatae culpa debitis delectus dignissimos ea enim\n            excepturi impedit laborum magnam molestias neque nostrum omnis quae quaerat quibusdam\n            recusandae rem saepe sunt, veniam veritatis voluptates?</p>\n\n        <p>Accusamus adipisci aspernatur aut consectetur corporis exercitationem fugit nisi omnis\n            provident totam. Corporis eum facere facilis fugit iure iusto libero maxime nulla optio,\n            pariatur possimus provident reiciendis rem sunt tempora?</p>\n\n        <p>Doloribus facilis fugiat incidunt ipsa iste natus, nemo perferendis quo recusandae? Amet\n            aut blanditiis consequatur cupiditate doloremque eum facere, laborum magnam natus odio\n            officia perspiciatis quidem quos soluta velit voluptate.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci aliquid dignissimos\n            doloremque eligendi eum facere, harum illum laborum molestiae, nobis odio placeat quas\n            quibusdam quidem quisquam sequi sint totam voluptate.</p>\n\n        <p>Commodi consequuntur, cum cumque dolores facilis fuga, libero nesciunt optio porro\n            reiciendis, saepe soluta velit voluptatibus. Accusantium corporis eaque in tenetur\n            ullam. At aut dicta impedit iure minus, sit tempore!</p>\n\n        <p>Architecto consectetur corporis cupiditate dicta distinctio dolores et in minus nam,\n            necessitatibus temporibus totam unde voluptates? Atque autem consequuntur corporis\n            doloremque, eum ex hic maiores maxime non quaerat suscipit tenetur?</p>\n\n        <p>Ducimus facilis fugit iusto, non odit qui repudiandae sed? Accusamus aperiam consequatur,\n            culpa cumque dicta dolore dolores ducimus earum fuga id incidunt iure maxime modi neque\n            porro praesentium quam! Nisi.</p>\n\n        <p>Dicta distinctio, dolore id incidunt modi obcaecati quis voluptatem! Ad, animi deserunt\n            ducimus eum expedita laborum, odit possimus quia, quisquam vel voluptatem voluptatum.\n            Deleniti dolorem minima quod ratione. Commodi, eius!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus adipisci animi\n            architecto at deserunt eaque earum fugiat fugit molestias, nam numquam placeat\n            repellendus tempore unde ut veniam vero! Asperiores, nihil.</p>\n\n        <p>Alias cum cupiditate delectus distinctio dolorem doloremque eos et expedita explicabo\n            facere fugit maxime molestias nemo non nostrum, odit omnis quae ratione repellat,\n            sapiente soluta suscipit tenetur totam ut voluptatum.</p>\n\n        <p>Adipisci beatae commodi corporis dolorem esse excepturi, ipsum magni modi nemo obcaecati,\n            odit pariatur quidem quos? Consectetur dicta facere incidunt, ipsum iure minima minus\n            molestiae natus odio perferendis quod veniam.</p>\n\n        <p>Amet at atque cupiditate, eaque eos et exercitationem illum, in magni odit optio\n            provident quae repellat, repellendus sint temporibus voluptas. Cumque enim eveniet harum\n            libero mollitia nesciunt qui tempore voluptate!</p>\n\n        <p>Animi, aperiam atque commodi consequatur cumque debitis dicta dolore dolorum eaque error\n            est ex hic illum ipsam libero minima nesciunt, nisi numquam omnis praesentium quas qui\n            reiciendis repellendus sequi suscipit.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate in laboriosam maxime\n            odio perspiciatis quia temporibus? Architecto cumque distinctio ea, hic id molestias\n            nesciunt repellat sapiente suscipit voluptate. Dolor, similique.</p>\n\n        <p>Asperiores aut dicta doloremque dolorum ea enim et ex explicabo ipsam laboriosam minus\n            nesciunt non officiis quasi qui quis ratione, repudiandae ullam ut voluptatum. Ab dicta\n            explicabo nam nihil obcaecati?</p>\n\n        <p>Ab, accusamus cumque dicta dolor esse est eum explicabo fugiat inventore iste labore,\n            mollitia neque numquam obcaecati odio optio placeat porro possimus quibusdam quisquam\n            saepe suscipit vel voluptas voluptate voluptatibus.</p>\n\n        <p>Amet consequuntur deleniti dolore, dolorum ea earum error fugiat ipsum laudantium magnam\n            molestias neque nobis nulla praesentium quaerat qui quis quos repellat repudiandae sint,\n            tempora ut velit voluptatibus! Maiores, saepe?</p>\n\n        <p>Aliquam, aperiam dolor exercitationem id in ullam voluptatum? Deserunt, eum laborum\n            laudantium nesciunt omnis possimus quas veritatis. Asperiores ducimus esse laudantium\n            quam quidem rem tempora velit? Ea hic neque non!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Asperiores consequuntur\n            doloribus et magni nostrum, quia recusandae, repellendus sint tenetur totam vero\n            voluptate. Hic impedit laborum modi necessitatibus nisi repellat unde.</p>\n\n        <p>Aliquid at aut autem, delectus dolore dolorem eaque earum incidunt ipsa, itaque laborum\n            laudantium molestiae molestias numquam officiis quasi qui quia quod recusandae repellat\n            sed sint vero vitae, voluptas voluptatum!</p>\n\n        <p>Earum labore laudantium quod ullam. Aliquam amet aperiam dolor error magni nam natus\n            numquam possimus quasi vero. Aliquam culpa distinctio inventore laudantium modi\n            molestiae nobis quia quo, repellat tempore, veniam?</p>\n\n        <p>Aliquam aliquid architecto assumenda autem dicta ducimus ea error et ex excepturi in\n            incidunt ipsam magnam nemo, odio officia quaerat qui quis quisquam ratione repudiandae\n            rerum, saepe, sapiente similique voluptatibus.</p>\n\n        <p>Debitis est maxime quaerat quod voluptatem. A ab aperiam autem blanditiis, consequatur\n            cumque delectus dolore dolorum fugit id minima necessitatibus, officiis quisquam ratione\n            recusandae sapiente sequi, sint temporibus ut veritatis.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque cupiditate dicta, eius\n            eligendi nulla possimus sit soluta tempora tempore ullam? Corporis laborum maiores neque\n            nostrum possimus, quo reiciendis unde vitae.</p>\n\n        <p>Alias aliquam assumenda, cumque deleniti expedita facilis fugit hic impedit ipsa itaque\n            libero minima nemo nihil non, numquam perspiciatis praesentium quis quod sed velit,\n            voluptate voluptatem voluptates? Dolor, quae, reprehenderit.</p>\n\n        <p>Commodi, molestiae, unde? Ea ex perspiciatis possimus suscipit. Ad adipisci aliquid\n            commodi consequuntur deleniti, doloremque doloribus eligendi eum in, itaque laborum\n            magni minus molestiae nisi nulla quas qui quis rerum?</p>\n\n        <p>Ad aliquam amet aspernatur atque aut consequatur distinctio fuga inventore, ipsum\n            laudantium magni necessitatibus nesciunt quaerat quasi, quia quod ratione ullam ut\n            veritatis vero. Consectetur corporis itaque natus quis sunt.</p>\n\n        <p>Ad autem commodi cumque dolore doloribus dolorum expedita, fugiat inventore omnis\n            temporibus! Amet blanditiis dolor eaque earum eligendi enim, error, ipsum mollitia\n            obcaecati quaerat quasi qui quia sint temporibus velit!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus ad alias animi,\n            aspernatur consectetur cupiditate debitis dignissimos fuga hic impedit minus nam natus\n            numquam, placeat quibusdam repellendus similique ullam vel!</p>\n\n        <p>Blanditiis deleniti, id impedit minima minus molestiae repellendus saepe veritatis! Autem\n            ea necessitatibus nemo obcaecati quisquam recusandae repellendus soluta voluptates! Ab\n            assumenda deleniti hic incidunt molestiae odit quasi, quidem tempore?</p>\n\n        <p>Aperiam, esse fugiat iusto nihil similique sunt ullam voluptate. At, commodi cum ea earum\n            eius eum excepturi fugit, libero minima modi odit quaerat quam quas rem sed sunt ullam\n            voluptatibus.</p>\n\n        <p>Cumque dignissimos hic iure laborum, neque pariatur praesentium. Accusamus amet\n            aspernatur molestias nulla ratione similique soluta, temporibus veritatis voluptatum?\n            Delectus dolor earum ipsum natus pariatur perspiciatis placeat tenetur velit vero.</p>\n\n        <p>Accusamus, adipisci aspernatur atque, autem dicta doloremque ea eius eos eveniet\n            exercitationem fuga hic impedit ipsam laboriosam minus necessitatibus placeat\n            praesentium quis quod quos ratione repudiandae sapiente sed sunt voluptatibus!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus ad aliquam architecto\n            commodi dignissimos eveniet expedita harum ipsam, nisi, officiis pariatur perferendis\n            praesentium quibusdam quo saepe tenetur ullam, vel voluptatibus!</p>\n\n        <p>Accusantium, aperiam ea enim esse illum voluptatem. Aperiam blanditiis culpa dolores\n            illum ipsam iste officia quasi, unde? Aperiam dicta, exercitationem, fugiat, ipsa\n            laboriosam libero maxime minima necessitatibus nihil unde vitae?</p>\n\n        <p>Blanditiis consectetur deleniti distinctio dolore earum fugit iure iusto, necessitatibus\n            officiis, omnis quod sunt unde vel? Blanditiis commodi, consequuntur cupiditate hic nemo\n            nisi nobis officiis quisquam quos. At delectus, quas.</p>\n\n        <p>Ipsam possimus quidem repellendus sunt. Asperiores atque consequatur debitis dolores\n            ducimus illo in, ipsam numquam possimus quibusdam, quidem ratione, saepe veritatis. At\n            corporis dolorem doloribus eligendi iusto natus pariatur praesentium!</p>\n\n        <p>Alias aspernatur distinctio dolorum ea id ipsa laboriosam modi natus necessitatibus\n            numquam, officia possimus reprehenderit? Distinctio ea eligendi obcaecati, perspiciatis\n            quas reprehenderit vel vero voluptatem? Illum ipsum libero minima non?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab ad, animi aperiam dolor\n            dolore illo itaque laborum minus nam necessitatibus nemo nihil nobis numquam odit\n            officia optio, tempore voluptate voluptatem?</p>\n\n        <p>Ad aliquid autem cum cumque, debitis ducimus eius eligendi enim facere facilis hic\n            inventore ipsam ipsum nesciunt nisi numquam obcaecati officia omnis, placeat reiciendis\n            suscipit vel voluptate? Dignissimos, eligendi tempora?</p>\n\n        <p>Architecto eius eum nobis quas reprehenderit sequi vel veniam voluptatem? Ab accusamus\n            assumenda aut cumque, ducimus eligendi facilis, inventore nesciunt non odit quam\n            recusandae unde, ut vel voluptas! Et, incidunt.</p>\n\n        <p>Aperiam assumenda, aut culpa cum dignissimos eius in nobis obcaecati odio optio possimus\n            provident, quae quaerat sapiente, sequi sint vitae. Earum iusto magnam similique tenetur\n            voluptatum? Nulla perferendis sunt vitae?</p>\n\n        <p>Ad, asperiores, consequuntur culpa cum cumque earum eligendi est eveniet excepturi\n            explicabo impedit itaque, laboriosam libero magnam molestias nam quae quis reprehenderit\n            sint sit tempora tempore unde veniam vero voluptas.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis deleniti distinctio,\n            eveniet facere inventore laborum minus natus odio possimus quaerat. At, deleniti\n            deserunt est ex laborum libero neque nihil rerum!</p>\n\n        <p>Animi distinctio, dolorum harum illo inventore mollitia quod recusandae vel? A eius hic\n            incidunt magnam nostrum perspiciatis rerum sapiente ut vitae! Architecto ea earum odit\n            perferendis quaerat quia voluptatem. Nulla.</p>\n\n        <p>Aliquid amet earum excepturi ipsum libero quibusdam reprehenderit suscipit. Architecto,\n            atque cumque dolore fugit hic iusto labore libero minus nesciunt pariatur porro qui\n            saepe sint tempora vitae. Adipisci, dolorem libero!</p>\n\n        <p>Corporis explicabo iste itaque non quae quis quod tenetur vel veniam voluptatibus. Autem\n            blanditiis, deleniti dignissimos modi mollitia perspiciatis veritatis. Ab aliquid\n            deserunt dicta dolores error eveniet nulla obcaecati sunt!</p>\n\n        <p>Aliquid hic itaque magnam minima nobis quo reprehenderit. A at corporis debitis\n            doloribus, ipsa laboriosam, laudantium libero magni natus omnis porro quas quod ratione\n            reiciendis repellat, ullam vel vitae voluptatum?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequatur delectus distinctio\n            dolor dolore earum eius eos eum id, in iure labore magnam mollitia numquam obcaecati\n            quisquam saepe voluptate voluptatem, voluptatibus!</p>\n\n        <p>A aspernatur dolor fugit illo impedit inventore laboriosam libero mollitia nesciunt nulla\n            quibusdam, recusandae rerum sapiente? Accusamus ad asperiores aut consectetur, culpa\n            doloribus error nulla officiis optio qui soluta temporibus.</p>\n\n        <p>Beatae commodi, dolor, dolorem enim et eveniet itaque iusto quibusdam rem saepe sed sunt\n            voluptate, voluptates? Debitis in pariatur perspiciatis provident quasi. Consectetur,\n            earum explicabo iure nihil reiciendis vel voluptate?</p>\n\n        <p>Architecto debitis eius eveniet? Ab accusantium aliquid, assumenda atque aut\n            consequuntur, cupiditate ea eius ex molestias, nihil quas quisquam ratione rerum sit\n            suscipit temporibus velit veritatis! Facere nam necessitatibus tempore!</p>\n\n        <p>Asperiores, aspernatur assumenda cum, dignissimos distinctio eius inventore iure minima\n            officia praesentium quaerat quas reprehenderit sapiente sequi, vel. Deleniti distinctio\n            dolorem ea explicabo iusto nobis officia perspiciatis quibusdam quos voluptatum.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae enim fugiat modi\n            repudiandae voluptate. Ab blanditiis, consequuntur, doloremque dolores dolorum eos et\n            facilis id magni possimus qui sapiente sint voluptas!</p>\n\n        <p>Accusantium aperiam beatae et, excepturi expedita harum iste molestias, nihil odit quae\n            quidem recusandae rerum suscipit? Ab accusantium illum minus mollitia nobis possimus\n            quaerat, quasi quod repellendus sed sit suscipit!</p>\n\n        <p>Ab accusantium aspernatur atque consequatur debitis dolor dolores eius esse\n            exercitationem expedita fuga ipsa ipsum laudantium natus officia perspiciatis placeat\n            porro quae quam quas, quia, quos saepe tenetur totam voluptatem.</p>\n\n        <p>Beatae distinctio libero modi mollitia, natus possimus quibusdam sequi ut! Aliquam\n            aspernatur deserunt doloremque exercitationem illum incidunt, laboriosam laborum magni\n            molestiae nobis, nostrum obcaecati officiis omnis sequi, unde ut veritatis.</p>\n\n        <p>A assumenda autem, commodi dicta expedita explicabo facere fuga fugit harum natus placeat\n            porro provident quidem rem, sequi soluta tempore tenetur voluptatem. A alias architecto\n            iusto necessitatibus numquam officiis perspiciatis?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus animi cupiditate\n            inventore quis quisquam sequi sunt? Ab alias autem est eum eveniet expedita ipsam nihil\n            officiis quisquam ratione, rerum veniam.</p>\n\n        <p>A accusantium aliquid at culpa dignissimos facere facilis harum id ipsam iste modi neque\n            nesciunt odio omnis, perferendis porro possimus quo repudiandae sunt tempora tenetur\n            veritatis voluptates voluptatum! Quos, sed.</p>\n\n        <p>At ducimus ipsum, maiores qui quo reiciendis? Cum doloremque eos impedit, minus\n            perspiciatis velit. Consectetur dolores eaque facere provident qui quo rerum. Adipisci\n            consequuntur cumque dolorem earum mollitia odio, quos.</p>\n\n        <p>Adipisci, animi atque commodi corporis dicta dignissimos dolores, doloribus eligendi\n            eveniet facere laboriosam modi mollitia nam nobis officia perferendis perspiciatis\n            possimus quas quidem quo quod rem repudiandae totam vero voluptatum!</p>\n\n        <p>Animi, blanditiis iusto laborum libero quasi reiciendis sed voluptatem voluptatum. Ab\n            alias corporis, cupiditate distinctio dolores ducimus eos excepturi harum illum itaque,\n            molestiae omnis quae repellendus sapiente, vero? Aliquid, odit.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Delectus doloremque doloribus\n            eligendi enim eveniet modi molestiae nihil reiciendis. Ab consequuntur doloribus laborum\n            magni perferendis sequi suscipit! Asperiores, distinctio, eligendi! Labore.</p>\n\n        <p>Amet asperiores, beatae commodi consequatur ducimus eaque eos esse, hic id natus possimus\n            quia rerum similique! Consectetur cum facere facilis soluta, tenetur ullam. Amet, fugit\n            minus mollitia quibusdam tenetur voluptate?</p>\n\n        <p>Animi blanditiis cumque, cupiditate dolorem doloremque earum, ipsam maiores officiis,\n            quidem reiciendis soluta temporibus velit! Commodi error ex facere, id in laboriosam\n            natus nemo porro quo repudiandae sint, suscipit voluptatem.</p>\n\n        <p>Deleniti, quibusdam, sed. Numquam, sint, tempore. Aliquam architecto, debitis illum\n            nesciunt quasi quibusdam quo sed totam? Adipisci at autem debitis eaque esse nemo\n            quibusdam, saepe similique sunt. Eaque, nobis, reprehenderit.</p>\n\n        <p>Deleniti eum pariatur quis rem vero! Consequuntur exercitationem pariatur quos unde.\n            Accusamus cumque dignissimos in molestias nobis porro quos sunt? Aperiam deleniti\n            dignissimos explicabo hic molestias nihil quidem reiciendis tempora.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto asperiores autem,\n            deleniti facere in, libero optio praesentium quae quaerat quam quos recusandae rerum\n            tempora totam vel. Asperiores fugit magni perspiciatis?</p>\n\n        <p>Aspernatur eius, facere itaque omnis possimus ut! Accusamus alias asperiores autem culpa\n            cupiditate harum minima neque obcaecati quibusdam soluta. Aspernatur assumenda\n            exercitationem fuga harum ipsa omnis optio, perferendis quod sunt.</p>\n\n        <p>Consequatur, ea quisquam. Aut corporis dignissimos eligendi eum expedita, explicabo\n            molestias non obcaecati odio quaerat quos repellat veniam! Alias aliquam aspernatur\n            deleniti dolore excepturi ipsa molestias nihil repellat saepe suscipit.</p>\n\n        <p>Aperiam delectus enim fugit inventore, modi mollitia repellat similique! Accusamus,\n            aperiam assumenda excepturi explicabo harum labore necessitatibus quisquam sed tenetur?\n            Deleniti dignissimos, iste laudantium odit officiis porro quae quia voluptatum?</p>\n\n        <p>Amet dolorum, earum fugit in ipsum magni nostrum quis! Accusantium aliquam blanditiis\n            deserunt dolor ea, illum impedit itaque iure mollitia necessitatibus nemo obcaecati\n            perspiciatis placeat quod, reprehenderit sapiente sint totam?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. A ad atque consectetur\n            consequuntur corporis dicta esse facilis id ipsa labore nihil odit, porro quod sequi\n            sunt temporibus vitae voluptatem voluptatum?</p>\n\n        <p>Asperiores, beatae commodi eligendi excepturi, fugiat impedit in necessitatibus qui quos,\n            reprehenderit saepe sapiente sunt vitae? Aperiam aut dolorem doloremque dolores est et\n            eum laborum, magni modi sed totam velit?</p>\n\n        <p>Aliquam consequatur culpa dolor dolorem excepturi expedita illum laboriosam officiis unde\n            voluptates! Assumenda atque beatae culpa dolorem illo, laborum quod! Consequuntur cum\n            esse molestias provident quos ratione voluptatum. Eaque, error.</p>\n\n        <p>Ab dolores iste molestias neque numquam odio officia veritatis! Asperiores dolores ea\n            iure omnis quam! Consectetur illo tempore velit. Amet et ex minima nemo odio placeat\n            quisquam quos repudiandae sapiente?</p>\n\n        <p>Ab blanditiis delectus, dicta est exercitationem explicabo laboriosam libero modi nam,\n            nihil obcaecati officia officiis optio placeat possimus, quisquam reiciendis repellat\n            sapiente sed sint sit tempora ullam vero voluptas voluptatum.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam aspernatur at commodi\n            debitis dignissimos dolores ea eaque, fuga iusto magni nesciunt nulla numquam obcaecati,\n            perferendis quisquam sit suscipit voluptates voluptatibus.</p>\n\n        <p>A blanditiis, consequatur deserunt dolores dolorum ea eveniet expedita, ipsa iste natus\n            neque non omnis pariatur porro provident quasi quia quidem reprehenderit rerum saepe\n            sequi sit sunt temporibus ut voluptatibus?</p>\n\n        <p>Amet commodi, dolorum earum ex reprehenderit saepe. Et exercitationem odio repellendus\n            unde ut? Aperiam libero nulla omnis quasi, repellendus repudiandae velit? Culpa enim eos\n            iste pariatur quasi quisquam sint ut!</p>\n\n        <p>Assumenda eius eveniet nihil officia quaerat rem vero. Assumenda culpa error ipsa libero\n            numquam placeat porro, quam similique unde? Ab adipisci, dolor dolorem doloribus eum\n            fugit incidunt praesentium quis rerum.</p>\n\n        <p>Ab assumenda aut beatae cum deleniti enim eveniet id impedit labore magni modi molestias\n            nostrum nulla numquam obcaecati officiis omnis optio, quod repellat, repudiandae sequi\n            sit veniam veritatis voluptas voluptatibus!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab accusamus accusantium\n            cupiditate deleniti dolore doloribus earum eius, minima modi molestiae, neque quas quod\n            rem, saepe sapiente unde veniam vitae voluptate.</p>\n\n        <p>Deleniti facere nihil porro similique? Ea itaque nulla obcaecati odit, quidem ratione!\n            Accusantium amet asperiores cupiditate, inventore minima odit quae quas, quibusdam\n            recusandae repellat sapiente suscipit temporibus. Impedit minus, saepe!</p>\n\n        <p>Animi atque blanditiis consequuntur distinctio eligendi error iusto libero minima modi\n            molestias nihil nobis obcaecati officiis placeat porro quaerat qui, quidem quo quod rem\n            repudiandae sequi similique voluptatibus. Adipisci, incidunt!</p>\n\n        <p>Aspernatur, dolores iure quidem repellendus voluptate voluptates. Accusamus, architecto\n            beatae deserunt eius error facere labore laborum, maxime molestias, sint veniam\n            veritatis. Eos magnam minus mollitia placeat, saepe tempora? Quae, tenetur.</p>\n\n        <p>Aspernatur dolores earum illo labore, mollitia natus odit omnis similique. Blanditiis\n            enim, eos facere ipsa magni nihil odio quod. Alias ducimus illum, iusto nobis nulla\n            optio provident qui repudiandae voluptatem!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus alias aspernatur\n            beatae cum cumque dolorem ducimus eligendi facilis iste laborum, natus omnis perferendis\n            qui reprehenderit, repudiandae sequi ullam vitae voluptatum?</p>\n\n        <p>Ad aspernatur assumenda, aut delectus dicta distinctio, dolorem enim error eveniet\n            exercitationem maiores minima molestiae necessitatibus nemo nesciunt praesentium quod\n            tenetur vero! Delectus eius enim ex minima perferendis praesentium provident!</p>\n\n        <p>Adipisci alias, aperiam assumenda autem consectetur debitis delectus dolore, dolores eius\n            eum, id minima minus molestias necessitatibus nemo neque nihil nisi odit optio\n            praesentium quos sapiente sit totam vitae voluptates.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus alias aspernatur\n            beatae cum cumque dolorem ducimus eligendi facilis iste laborum, natus omnis perferendis\n            qui reprehenderit, repudiandae sequi ullam vitae voluptatum?</p>\n\n        <p>Ad aspernatur assumenda, aut delectus dicta distinctio, dolorem enim error eveniet\n            exercitationem maiores minima molestiae necessitatibus nemo nesciunt praesentium quod\n            tenetur vero! Delectus eius enim ex minima perferendis praesentium provident!</p>\n\n        <p>Adipisci alias, aperiam assumenda autem consectetur debitis delectus dolore, dolores eius\n            eum, id minima minus molestias necessitatibus nemo neque nihil nisi odit optio\n            praesentium quos sapiente sit totam vitae voluptates.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus alias aspernatur\n            beatae cum cumque dolorem ducimus eligendi facilis iste laborum, natus omnis perferendis\n            qui reprehenderit, repudiandae sequi ullam vitae voluptatum?</p>\n\n        <p>Ad aspernatur assumenda, aut delectus dicta distinctio, dolorem enim error eveniet\n            exercitationem maiores minima molestiae necessitatibus nemo nesciunt praesentium quod\n            tenetur vero! Delectus eius enim ex minima perferendis praesentium provident!</p>\n\n        <p>Adipisci alias, aperiam assumenda autem consectetur debitis delectus dolore, dolores eius\n            eum, id minima minus molestias necessitatibus nemo neque nihil nisi odit optio\n            praesentium quos sapiente sit totam vitae voluptates.</p>\n    </div>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync/test/fixtures/index-urls.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\"/>\n    <link rel=\"stylesheet\" href=\"fonts/roboto/stylesheet.css\"/>\n</head>\n<body>\n\n    <h1 style=\"font-family: robotoregular, serif\">Hello from the test Page</h1>\n    <a href=\"forms.html\">Forms</a>\n    <a href=\"scrolling.html\">Scrolling Window</a>\n\n    <a href=\"http://0.0.0.0:3000/forms.html\">\n        <div>\n            <div>\n                <img src=\"http://placekitten.com/400/600\" alt=\"\"/>\n            </div>\n        </div>\n    </a>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync/test/fixtures/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" id=\"css-style\" href=\"assets/style.css\"/>\n    <link rel=\"stylesheet\" id=\"css-roboto\" href=\"fonts/roboto/stylesheet.css\"/>\n</head>\n<body ng-app=\"BrowserSync\">\n\n    <h1 style=\"font-family: robotoregular, serif\">Browsersync + Public URL</h1>\n    <a href=\"forms.html\">Forms</a>\n\n    <a href=\"scrolling.html\">Scrolling Window</a>\n\n    <p><a href=\"http://localhost/base.html\">Should rewrite</a></p>\n    <p><a href=\"http://localhost:65432/\">Should not rewrite</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/inputs.html",
    "content": "<form id=\"form01\">\n\n<label for=\"name\">Text Inputs: synced</label>\n<input type=\"text\" name=\"name\" value=\"name here\" id=\"name\"/>\n\n<label for=\"email\">Text Inputs: synced</label>\n<input type=\"text\" name=\"email\" value=\"email here\" id=\"email\"/>\n\n<p><label for=\"message\">Text Areas: synced</label></p>\n<textarea name=\"message\" id=\"message\" cols=\"30\" rows=\"10\">shane</textarea>\n\n<div>\n    <label for=\"option-1\">Option 1</label>\n    <input type=\"checkbox\" name=\"checkbox\" id=\"option-1\">\n    <label for=\"option-2\">Option 2</label>\n    <input type=\"checkbox\" name=\"checkbox\" id=\"option-2\">\n</div>\n\n<p>\n    <label for=\"confirm-0\">No</label>\n    <input type=\"radio\" name=\"confirm\" id=\"confirm-0\" value=\"1\"/>\n    <label for=\"confirm-1\">yes</label>\n    <input type=\"radio\" name=\"confirm\" id=\"confirm-1\" value=\"0\"/>\n    <label for=\"confirm-2\">Maybe</label>\n    <input type=\"radio\" name=\"confirm\" id=\"confirm-2\" value=\"0\"/>\n</p>\n\n<select name=\"country\" id=\"country\">\n    <option value=\"uk\">Uk</option>\n    <option value=\"spain\">Spain</option>\n    <option value=\"france\">France</option>\n</select>\n\n</form>"
  },
  {
    "path": "packages/browser-sync/test/fixtures/js/default.js",
    "content": "console.log('heelo');\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/js/main.js",
    "content": "define([], function () {\n    console.log('hey!');\n});"
  },
  {
    "path": "packages/browser-sync/test/fixtures/less/bootstrap.less",
    "content": "/*!\n * Bootstrap v3.0.3 (http://getbootstrap.com)\n * Copyright 2013 Twitter, Inc.\n * Licensed under http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/*! normalize.css v2.1.3 | MIT License | git.io/normalize */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n[hidden],\ntemplate {\n  display: none;\n}\n\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\nbody {\n  margin: 0;\n}\n\na {\n  background: transparent;\n}\n\na:focus {\n  outline: thin dotted;\n}\n\na:active,\na:hover {\n  outline: 0;\n}\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\nb,\nstrong {\n  font-weight: bold;\n}\n\ndfn {\n  font-style: italic;\n}\n\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n       box-sizing: content-box;\n}\n\nmark {\n  color: #000;\n  background: #ff0;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\npre {\n  white-space: pre-wrap;\n}\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  border: 0;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\nfigure {\n  margin: 0;\n}\n\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\n\nlegend {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\n\nbutton,\ninput {\n  line-height: normal;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-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^=\"javascript:\"]:after,\n  a[href^=\"#\"]: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  @page  {\n    margin: 2cm .5cm;\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  .table td,\n  .table th {\n    background-color: #fff !important;\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-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #ffffff;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\na {\n  color: #428bca;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\n\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\nimg {\n  vertical-align: middle;\n}\n\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\n.img-rounded {\n  border-radius: 6px;\n}\n\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.img-circle {\n  border-radius: 50%;\n}\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\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: #999999;\n}\n\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh1 .small,\nh2 .small,\nh3 .small {\n  font-size: 65%;\n}\n\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\nh4 small,\nh5 small,\nh6 small,\nh4 .small,\nh5 .small,\nh6 .small {\n  font-size: 75%;\n}\n\nh1,\n.h1 {\n  font-size: 36px;\n}\n\nh2,\n.h2 {\n  font-size: 30px;\n}\n\nh3,\n.h3 {\n  font-size: 24px;\n}\n\nh4,\n.h4 {\n  font-size: 18px;\n}\n\nh5,\n.h5 {\n  font-size: 14px;\n}\n\nh6,\n.h6 {\n  font-size: 12px;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\n\nsmall,\n.small {\n  font-size: 85%;\n}\n\ncite {\n  font-style: normal;\n}\n\n.text-muted {\n  color: #999999;\n}\n\n.text-primary {\n  color: #428bca;\n}\n\n.text-primary:hover {\n  color: #3071a9;\n}\n\n.text-warning {\n  color: #8a6d3b;\n}\n\n.text-warning:hover {\n  color: #66512c;\n}\n\n.text-danger {\n  color: #a94442;\n}\n\n.text-danger:hover {\n  color: #843534;\n}\n\n.text-success {\n  color: #3c763d;\n}\n\n.text-success:hover {\n  color: #2b542c;\n}\n\n.text-info {\n  color: #31708f;\n}\n\n.text-info:hover {\n  color: #245269;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-center {\n  text-align: center;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.list-inline > li:first-child {\n  padding-left: 0;\n}\n\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 1.428571429;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n\nblockquote p:last-child {\n  margin-bottom: 0;\n}\n\nblockquote small,\nblockquote .small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small,\nblockquote.pull-right .small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\n\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\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\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n  float: left;\n}\n\n.col-xs-12 {\n  width: 100%;\n}\n\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n\n.col-xs-9 {\n  width: 75%;\n}\n\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n\n.col-xs-6 {\n  width: 50%;\n}\n\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n\n.col-xs-3 {\n  width: 25%;\n}\n\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n\n.col-xs-pull-12 {\n  right: 100%;\n}\n\n.col-xs-pull-11 {\n  right: 91.66666666666666%;\n}\n\n.col-xs-pull-10 {\n  right: 83.33333333333334%;\n}\n\n.col-xs-pull-9 {\n  right: 75%;\n}\n\n.col-xs-pull-8 {\n  right: 66.66666666666666%;\n}\n\n.col-xs-pull-7 {\n  right: 58.333333333333336%;\n}\n\n.col-xs-pull-6 {\n  right: 50%;\n}\n\n.col-xs-pull-5 {\n  right: 41.66666666666667%;\n}\n\n.col-xs-pull-4 {\n  right: 33.33333333333333%;\n}\n\n.col-xs-pull-3 {\n  right: 25%;\n}\n\n.col-xs-pull-2 {\n  right: 16.666666666666664%;\n}\n\n.col-xs-pull-1 {\n  right: 8.333333333333332%;\n}\n\n.col-xs-pull-0 {\n  right: 0;\n}\n\n.col-xs-push-12 {\n  left: 100%;\n}\n\n.col-xs-push-11 {\n  left: 91.66666666666666%;\n}\n\n.col-xs-push-10 {\n  left: 83.33333333333334%;\n}\n\n.col-xs-push-9 {\n  left: 75%;\n}\n\n.col-xs-push-8 {\n  left: 66.66666666666666%;\n}\n\n.col-xs-push-7 {\n  left: 58.333333333333336%;\n}\n\n.col-xs-push-6 {\n  left: 50%;\n}\n\n.col-xs-push-5 {\n  left: 41.66666666666667%;\n}\n\n.col-xs-push-4 {\n  left: 33.33333333333333%;\n}\n\n.col-xs-push-3 {\n  left: 25%;\n}\n\n.col-xs-push-2 {\n  left: 16.666666666666664%;\n}\n\n.col-xs-push-1 {\n  left: 8.333333333333332%;\n}\n\n.col-xs-push-0 {\n  left: 0;\n}\n\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n\n.col-xs-offset-11 {\n  margin-left: 91.66666666666666%;\n}\n\n.col-xs-offset-10 {\n  margin-left: 83.33333333333334%;\n}\n\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n\n.col-xs-offset-8 {\n  margin-left: 66.66666666666666%;\n}\n\n.col-xs-offset-7 {\n  margin-left: 58.333333333333336%;\n}\n\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n\n.col-xs-offset-5 {\n  margin-left: 41.66666666666667%;\n}\n\n.col-xs-offset-4 {\n  margin-left: 33.33333333333333%;\n}\n\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n\n.col-xs-offset-2 {\n  margin-left: 16.666666666666664%;\n}\n\n.col-xs-offset-1 {\n  margin-left: 8.333333333333332%;\n}\n\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11,\n  .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-0 {\n    right: 0;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-0 {\n    left: 0;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11,\n  .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-0 {\n    right: 0;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-0 {\n    left: 0;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11,\n  .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-0 {\n    right: 0;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-0 {\n    left: 0;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\n\nth {\n  text-align: left;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\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.428571429;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\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\n.table > tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\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\n.table-bordered {\n  border: 1px solid #dddddd;\n}\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\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\n\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n\n.table > thead > tr > .active,\n.table > tbody > tr > .active,\n.table > tfoot > tr > .active,\n.table > thead > .active > td,\n.table > tbody > .active > td,\n.table > tfoot > .active > td,\n.table > thead > .active > th,\n.table > tbody > .active > th,\n.table > tfoot > .active > th {\n  background-color: #f5f5f5;\n}\n\n.table-hover > tbody > tr > .active:hover,\n.table-hover > tbody > .active:hover > td,\n.table-hover > tbody > .active:hover > th {\n  background-color: #e8e8e8;\n}\n\n.table > thead > tr > .success,\n.table > tbody > tr > .success,\n.table > tfoot > tr > .success,\n.table > thead > .success > td,\n.table > tbody > .success > td,\n.table > tfoot > .success > td,\n.table > thead > .success > th,\n.table > tbody > .success > th,\n.table > tfoot > .success > th {\n  background-color: #dff0d8;\n}\n\n.table-hover > tbody > tr > .success:hover,\n.table-hover > tbody > .success:hover > td,\n.table-hover > tbody > .success:hover > th {\n  background-color: #d0e9c6;\n}\n\n.table > thead > tr > .danger,\n.table > tbody > tr > .danger,\n.table > tfoot > tr > .danger,\n.table > thead > .danger > td,\n.table > tbody > .danger > td,\n.table > tfoot > .danger > td,\n.table > thead > .danger > th,\n.table > tbody > .danger > th,\n.table > tfoot > .danger > th {\n  background-color: #f2dede;\n}\n\n.table-hover > tbody > tr > .danger:hover,\n.table-hover > tbody > .danger:hover > td,\n.table-hover > tbody > .danger:hover > th {\n  background-color: #ebcccc;\n}\n\n.table > thead > tr > .warning,\n.table > tbody > tr > .warning,\n.table > tfoot > tr > .warning,\n.table > thead > .warning > td,\n.table > tbody > .warning > td,\n.table > tfoot > .warning > td,\n.table > thead > .warning > th,\n.table > tbody > .warning > th,\n.table > tfoot > .warning > th {\n  background-color: #fcf8e3;\n}\n\n.table-hover > tbody > tr > .warning:hover,\n.table-hover > tbody > .warning:hover > td,\n.table-hover > tbody > .warning:hover > th {\n  background-color: #faf2cc;\n}\n\n@media (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    -webkit-overflow-scrolling: touch;\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}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\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}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\n}\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}\n\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\n\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n}\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.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n          transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.form-control:-moz-placeholder {\n  color: #999999;\n}\n\n.form-control::-moz-placeholder {\n  color: #999999;\n  opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n\n.radio label,\n.checkbox label {\n  display: inline;\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  float: left;\n  margin-left: -20px;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-sm {\n  height: auto;\n}\n\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\n\ntextarea.input-lg {\n  height: auto;\n}\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  color: #8a6d3b;\n}\n\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\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  color: #a94442;\n}\n\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\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  color: #3c763d;\n}\n\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n\n.form-control-static {\n  margin-bottom: 0;\n}\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\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  }\n  .form-inline select.form-control {\n    width: auto;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-control-static {\n  padding-top: 7px;\n}\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n       -o-user-select: none;\n          user-select: none;\n}\n\n.btn:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\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: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\n.btn-default .badge {\n  color: #ffffff;\n  background-color: #fff;\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\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: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: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary .badge {\n  color: #428bca;\n  background-color: #fff;\n}\n\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\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: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\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\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: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\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\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: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\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\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: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\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-xs {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n          transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  display: none;\n}\n\n.collapse.in {\n  display: block;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n          transition: height 0.35s ease;\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\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.glyphicon:empty {\n  width: 1em;\n}\n\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n\n.glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\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\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle:focus {\n  outline: 0;\n}\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  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\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  background-color: #428bca;\n  outline: 0;\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.open > a {\n  outline: 0;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\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\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\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\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar .btn-group {\n  float: left;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\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\n.btn-group > .btn-group {\n  float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\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\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn .caret {\n  margin-left: 0;\n}\n\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\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\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\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\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\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\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  table-layout: fixed;\n}\n\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.input-group .form-control {\n  width: 100%;\n  margin-bottom: 0;\n}\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}\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}\n\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\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}\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}\n\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\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\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\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\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\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 > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group-addon:first-child {\n  border-right: 0;\n}\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 > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n\n.input-group-btn:first-child > .btn {\n  margin-right: -1px;\n}\n\n.input-group-btn:last-child > .btn {\n  margin-left: -1px;\n}\n\n.input-group-btn > .btn {\n  position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav > li {\n  position: relative;\n  display: block;\n}\n\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li.disabled > a {\n  color: #999999;\n}\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\n}\n\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.428571429;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\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  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n}\n\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\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\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\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\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\n.nav-pills > li {\n  float: left;\n}\n\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n\n.nav-pills > li + li {\n  margin-left: 2px;\n}\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: #428bca;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n\n.nav-justified {\n  width: 100%;\n}\n\n.nav-justified > li {\n  float: none;\n}\n\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\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\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\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\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\n.tab-content > .tab-pane {\n  display: none;\n}\n\n.tab-content > .active {\n  display: block;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\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\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse.in {\n  overflow-y: auto;\n}\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    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-right: 0;\n    padding-left: 0;\n  }\n}\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\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\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\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\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  .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\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  }\n  .navbar-form select.form-control {\n    width: auto;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-form.navbar-right:last-child {\n    margin-right: -15px;\n  }\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\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n  .navbar-text.navbar-right:last-child {\n    margin-right: 0;\n  }\n}\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-text {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\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\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\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\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #cccccc;\n}\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\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  color: #555555;\n  background-color: #e7e7e7;\n}\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\n.navbar-default .navbar-link {\n  color: #777777;\n}\n\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n\n.navbar-inverse .navbar-brand {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\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\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\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\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\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  color: #ffffff;\n  background-color: #080808;\n}\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: #999999;\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\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\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\n.breadcrumb > li {\n  display: inline-block;\n}\n\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n\n.breadcrumb > .active {\n  color: #999999;\n}\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n\n.pagination > li {\n  display: inline;\n}\n\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\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\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  background-color: #eeeeee;\n}\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  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\n}\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: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\n}\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\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\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\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\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\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\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\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: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n\n.label[href]:hover,\n.label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label:empty {\n  display: none;\n}\n\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n\n.label-default {\n  background-color: #999999;\n}\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n\n.label-primary {\n  background-color: #428bca;\n}\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n\n.label-success {\n  background-color: #5cb85c;\n}\n\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n\n.label-info {\n  background-color: #5bc0de;\n}\n\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n\n.label-warning {\n  background-color: #f0ad4e;\n}\n\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n\n.label-danger {\n  background-color: #d9534f;\n}\n\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px;\n}\n\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n\n.jumbotron h1,\n.jumbotron .h1 {\n  line-height: 1;\n  color: inherit;\n}\n\n.jumbotron p {\n  line-height: 1.4;\n}\n\n.container .jumbotron {\n  border-radius: 6px;\n}\n\n.jumbotron .container {\n  max-width: 100%;\n}\n\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.thumbnail > img,\n.thumbnail a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  margin-right: auto;\n  margin-left: auto;\n}\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #428bca;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n\n.alert .alert-link {\n  font-weight: bold;\n}\n\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n\n.alert > p + p {\n  margin-top: 5px;\n}\n\n.alert-dismissable {\n  padding-right: 35px;\n}\n\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n\n.alert-success .alert-link {\n  color: #2b542c;\n}\n\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n\n.alert-info .alert-link {\n  color: #245269;\n}\n\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n\n.alert-warning .alert-link {\n  color: #66512c;\n}\n\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n\n.alert-danger .alert-link {\n  color: #843534;\n}\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\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\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: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n          transition: width 0.6s ease;\n}\n\n.progress-striped .progress-bar {\n  background-image: -webkit-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-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\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n\n.progress-striped .progress-bar-success {\n  background-image: -webkit-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-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\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n\n.progress-striped .progress-bar-info {\n  background-image: -webkit-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-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\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-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-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\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-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-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\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media > .pull-left {\n  margin-right: 10px;\n}\n\n.media > .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\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\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.list-group-item > .badge {\n  float: right;\n}\n\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n\na.list-group-item {\n  color: #555555;\n}\n\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\n\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\na.list-group-item.active,\na.list-group-item.active:hover,\na.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\na.list-group-item.active .list-group-item-heading,\na.list-group-item.active:hover .list-group-item-heading,\na.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\n\na.list-group-item.active .list-group-item-text,\na.list-group-item.active:hover .list-group-item-text,\na.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.panel-body {\n  padding: 15px;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel > .list-group {\n  margin-bottom: 0;\n}\n\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n\n.panel > .table,\n.panel > .table-responsive > .table {\n  margin-bottom: 0;\n}\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive {\n  border-top: 1px solid #dddddd;\n}\n\n.panel > .table > tbody:first-child th,\n.panel > .table > tbody:first-child td {\n  border-top: 0;\n}\n\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\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\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\n.panel > .table-bordered > thead > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > th,\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.panel > .table-bordered > thead > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > td,\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  border-bottom: 0;\n}\n\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\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\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n\n.panel-title > a {\n  color: inherit;\n}\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\n.panel-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\n  border-radius: 4px;\n}\n\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-group .panel-footer {\n  border-top: 0;\n}\n\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n\n.panel-default {\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n\n.panel-primary {\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n\n.panel-success {\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n\n.panel-warning {\n  border-color: #faebcc;\n}\n\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #faebcc;\n}\n\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #faebcc;\n}\n\n.panel-danger {\n  border-color: #ebccd1;\n}\n\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #ebccd1;\n}\n\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #ebccd1;\n}\n\n.panel-info {\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\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\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}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n     -moz-transition: -moz-transform 0.3s ease-out;\n       -o-transition: -o-transform 0.3s ease-out;\n          transition: transform 0.3s ease-out;\n}\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\n.modal-dialog {\n  position: relative;\n  z-index: 1050;\n  width: auto;\n  margin: 10px;\n}\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  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.modal-header {\n  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.modal-header .close {\n  margin-top: -2px;\n}\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n@media screen and (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\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\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\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\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n          transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\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\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\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\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  outline: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\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\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n}\n\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\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\n.carousel-caption .btn {\n  text-shadow: none;\n}\n\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicons-chevron-left,\n  .carousel-control .glyphicons-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.pull-right {\n  float: right !important;\n}\n\n.pull-left {\n  float: left !important;\n}\n\n.hide {\n  display: none !important;\n}\n\n.show {\n  display: block !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\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\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n.affix {\n  position: fixed;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n.visible-xs,\ntr.visible-xs,\nth.visible-xs,\ntd.visible-xs {\n  display: none !important;\n}\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\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  table.visible-xs.visible-sm {\n    display: table;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  table.visible-xs.visible-md {\n    display: table;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  table.visible-xs.visible-lg {\n    display: table;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-sm,\ntr.visible-sm,\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  table.visible-sm.visible-xs {\n    display: table;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important;\n  }\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\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  table.visible-sm.visible-md {\n    display: table;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  table.visible-sm.visible-lg {\n    display: table;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-md,\ntr.visible-md,\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  table.visible-md.visible-xs {\n    display: table;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  table.visible-md.visible-sm {\n    display: table;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important;\n  }\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\n@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  table.visible-md.visible-lg {\n    display: table;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-lg,\ntr.visible-lg,\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  table.visible-lg.visible-xs {\n    display: table;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  table.visible-lg.visible-sm {\n    display: table;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  table.visible-lg.visible-md {\n    display: table;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important;\n  }\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\n.hidden-xs {\n  display: block !important;\n}\n\ntable.hidden-xs {\n  display: table;\n}\n\ntr.hidden-xs {\n  display: table-row !important;\n}\n\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-xs,\n  tr.hidden-xs,\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm,\n  tr.hidden-xs.hidden-sm,\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md,\n  tr.hidden-xs.hidden-md,\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg,\n  tr.hidden-xs.hidden-lg,\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-sm {\n  display: block !important;\n}\n\ntable.hidden-sm {\n  display: table;\n}\n\ntr.hidden-sm {\n  display: table-row !important;\n}\n\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs,\n  tr.hidden-sm.hidden-xs,\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm,\n  tr.hidden-sm,\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md,\n  tr.hidden-sm.hidden-md,\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg,\n  tr.hidden-sm.hidden-lg,\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-md {\n  display: block !important;\n}\n\ntable.hidden-md {\n  display: table;\n}\n\ntr.hidden-md {\n  display: table-row !important;\n}\n\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs,\n  tr.hidden-md.hidden-xs,\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm,\n  tr.hidden-md.hidden-sm,\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md,\n  tr.hidden-md,\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg,\n  tr.hidden-md.hidden-lg,\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-lg {\n  display: block !important;\n}\n\ntable.hidden-lg {\n  display: table;\n}\n\ntr.hidden-lg {\n  display: table-row !important;\n}\n\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs,\n  tr.hidden-lg.hidden-xs,\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm,\n  tr.hidden-lg.hidden-sm,\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md,\n  tr.hidden-lg.hidden-md,\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-lg,\n  tr.hidden-lg,\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n\n.visible-print,\ntr.visible-print,\nth.visible-print,\ntd.visible-print {\n  display: none !important;\n}\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  .hidden-print,\n  tr.hidden-print,\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/less.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" href=\"less/bootstrap.less\"/>\n</head>\n<body>\n\n    <h1>Hello from the test</h1>\n    <a href=\"forms.html\">Forms</a>\n    <a href=\"scrolling.html\">Scrolling Window</a>\n\n    <a href=\"forms.html\">\n        <div>\n            <div>\n                <img src=\"http://placekitten.com/400/600\" alt=\"\"/>\n            </div>\n        </div>\n    </a>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync/test/fixtures/links.html",
    "content": "<a href=\"#\" id=\"link\">Link</a>\n<a href=\"#\" id=\"img-link\">\n    <div>\n        <img src=\"\" alt=\"\"/>\n    </div>\n</a>"
  },
  {
    "path": "packages/browser-sync/test/fixtures/plugin.js",
    "content": "module.exports = {\n    \"plugin:name\": \"My Plugin\",\n    \"plugin\": function () {\n        console.log('running here');\n    }\n};\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/proxy-headers.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\"/>\n    <link rel=\"stylesheet\" href=\"fonts/roboto/stylesheet.css\"/>\n</head>\n<body>\n\n    <h1 style=\"font-family: robotoregular, serif\">Hello from the test Page</h1>\n    <a href=\"forms.html\">Forms</a>\n    <a href=\"scrolling.html\">Scrolling Window</a>\n\n    <p id=\"shower\">Click me</p>\n    <p id=\"toggle\"></p>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync/test/fixtures/proxy-ip.html",
    "content": "\n<!doctype html>\n<!--[if lt IE 7]>      <html class=\"no-js ie ie6 lt-ie10 lt-ie9 lt-ie8 lt-ie7\" lang=\"en\"> <![endif]-->\n<!--[if IE 7]>         <html class=\"no-js ie ie7 lt-ie10 lt-ie9 lt-ie8\" lang=\"en\"> <![endif]-->\n<!--[if IE 8]>         <html class=\"no-js ie ie8 lt-ie10 lt-ie9\" lang=\"en\"> <![endif]-->\n<!--[if IE 9]>         <html class=\"no-js ie ie9 lt-ie10\" lang=\"en\"> <![endif]-->\n<!--[if gt IE 9]><!--> <html class=\"no-js ffly\" lang=\"en\"> <!--<![endif]-->\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n    <title>Home -  Firecrest UK</title>\n\n    <link rel=\"shortcut icon\" href=\"favicon.ico\" />\n    <link rel=\"address bar icon\" href=\"favicon.ico\">\n\n    <link rel=\"stylesheet\" href=\"/css/style.css\"/>\n    <script src=\"/js/dist/modernizr.min.cd79908d.js\"></script>\n\n</head>\n\n<body id=\"bodyTop\">\n<div class=\"body-mask hidden animated fadeIn\"></div>\n\n<div class=\"wrapper header\">\n    <header class=\"container clearfix\" role=\"banner\">\n        <div class=\"logo\">\n            <a href=\"http://0.0.0.0:8001/home\" class=\"logo__img\" title=\"Firecrest UK LTD Home Page\">\n                Firecrest UK LTD\n            </a>\n        </div>\n        <nav role=\"navigation\" class=\"clearfix nav-container active\">\n            <div class=\"show-menu icon-link fast-click\">\n\n                <span class=\"not-palm menu-text\">MENU</span>\n                <span class=\"icon-menu\"></span>\n                <span class=\"icon-close hidden animated fadeInUp\"></span>\n            </div>\n            <ul class=\"nav main-nav\">\n\n\n                <li class=\"only-palm\">\n                    <a href=\"tel:0800 783 05 88\" tabindex=\"-1\" title=\"Call us on 0800 783 05 88\"><strong>Tel:</strong> 0800 783 05 88</a>\n                </li>\n\n\n\n                <li>\n                    <a href=\"/home\" title=\"Home\" class=\"\">Home</a>\n                </li>\n\n\n\n\n                <li class=\"has-dropdown\">\n\n                    <a href=\"http://0.0.0.0:8001/services\" class=\"with-caret\" title=\"Firecrest UK LTD Services\">\n                        Services <b class=\"caret\"></b>\n                    </a>\n\n                    <div class=\"drop-down\">\n                        <ul class=\"nav sub-nav notify\">\n\n                            <li><a href=\"http://0.0.0.0:8001/services\" tabindex=\"-1\" title=\"View All Services\">VIEW ALL</a></li>\n\n\n                            <li>\n                                <a href=\"http://0.0.0.0:8001/services/fire-extinguishers\" class=\"\" tabindex=\"-1\" title=\"Fire Extinguishers\">\n                                    Fire Extinguishers                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://0.0.0.0:8001/services/fire-alarms\" class=\"\" tabindex=\"-1\" title=\"Fire Alarms\">\n                                    Fire Alarms                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://0.0.0.0:8001/services/fire-risk-assessment\" class=\"\" tabindex=\"-1\" title=\"Fire Risk Assessment\">\n                                    Fire Risk Assessment                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://0.0.0.0:8001/services/staff-fire-safety-training\" class=\"\" tabindex=\"-1\" title=\"Staff Fire Safety Training\">\n                                    Staff Fire Safety Training                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://0.0.0.0:8001/services/emergency-lighting-maintenance\" class=\"\" tabindex=\"-1\" title=\"Emergency Lighting Maintenance\">\n                                    Emergency Lighting Maintenance                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://0.0.0.0:8001/services/portable-appliance-testing\" class=\"\" tabindex=\"-1\" title=\"Portable Appliance Testing\">\n                                    Portable Appliance Testing                    </a>\n                            </li>\n                        </ul>\n                    </div>\n\n                </li>\n\n\n\n\n                <li>\n                    <a href=\"/about\" title=\"About Us\" class=\"\">About Us</a>\n                </li>\n\n\n\n\n                <li>\n                    <a href=\"/contact\" title=\"Contact Us\" class=\"\">Contact Us</a>\n                </li>\n\n\n\n\n                <li>\n                    <a href=\"/testimonials\" title=\"Testimonials\" class=\"\">Testimonials</a>\n                </li>\n\n\n\n            </ul>        </nav>\n    </header>\n</div>    <main role=\"main\">\n    <!-- Hero -->\n    <div class=\"wrapper custom-bg--01-03\">\n        <div class=\"container palm--full-bleed\">\n            <article class=\"hero\">\n                <div class=\"hero-content hero--red\">\n\n                    <h1 class=\"hero-heading\">Firecrest UK LTD</h1>\n                    <h2 class=\"p-styles\">\n                        Welcome to <strong>Firecrest UK LTD</strong>, a midlands based supplier of <strong>fire safety equipment</strong> and solutions for protecting your business from fire.\n                        <a href=\"\" class=\"only-palm inverted trigger\" data-target=\"#hero-subtext\" data-remove=\"true\" data-remove-class=\"not-palm\">read more...</a>\n                    </h2>\n                    <h3 class=\"p-styles not-palm sub-text animated fadeInUp\" id=\"hero-subtext\">\n                        Whether you require fire risk assessments, fire alarm installation and maintenance, fire extinguisher supply and service, Staff fire training or a complete solution to protect your business from the devastation of fire, we can put together a plan to meet all your companies’ requirements.\n                    </h3>\n                    <p>\n                        <a href=\"http://0.0.0.0:8001/about\" class=\"text-bold text-white\">\n                            <span class=\"icon-youtube inline-icon push-right\"></span>Watch our video\n                        </a>\n                    </p>\n\n                    <footer class=\"palm--padding\">\n                        <a href=\"http://0.0.0.0:8001/contact\" class=\"button button--white palm--full-width with-caret\">\n                            Contact us <b class=\"caret caret--red\"></b>\n                        </a>\n                        <a href=\"http://0.0.0.0:8001/services\" class=\"button button--white palm--full-width with-caret\">\n                            Our Services <b class=\"caret caret--red\"></b>\n                        </a>\n                    </footer>\n                </div>\n            </article>\n        </div>\n    </div>\n\n    <!-- Banner -->\n    <div class=\"wrapper\">\n        <div class=\"container\">\n            <article class=\"portfolio text--center\">\n                <h2>People we've loved working with over the years</h2>\n                <div class=\"portfolio-logos\"></div>\n                <!--            <a href=\"--><?//= URL::route(\"testimonials\"); ?><!--\" title=\"\">-->\n                <!--                View More-->\n                <!--            </a>-->\n            </article>\n        </div>\n    </div>\n\n    <!-- Testimonials section -->\n    <div class=\"wrapper custom-bg--01\">\n        <div class=\"overlay--01\">\n            <div class=\"container\">\n                <article class=\"text--center testimonials\">\n                    <h2 class=\"heading-inverted\">Testimonials</h2>\n                    <div class=\"grid equal-heights\">\n                        <div class=\"grid__item one-third palm--full-width\">\n                            <div class=\"callout-box min-height\">\n                                <h3 class=\"callout-box__title\">Sally Pinder\n                                    <small>B & M Honda</small>\n                                </h3>\n                                <p>Great service, delivered on time with no hassle. Good Communication and knowledge, nothing more to say other than well done!</p>\n                            </div>\n                        </div><!--\n                    --><div class=\"grid__item one-third palm--full-width not-palm\">\n                        <div class=\"callout-box min-height\">\n                            <h3 class=\"callout-box__title\">Louise Colebourne\n                                <small>Liberty Hardware</small>\n                            </h3>\n                            <p>Firecrest provided prompt and informative service meeting all our requirements and I have no complaints</p>\n                            <p><strong>Thanks again</strong></p>\n                        </div>\n                    </div><!----><div class=\"grid__item one-third palm--full-width not-palm\">\n                        <div class=\"callout-box min-height\">\n                            <h3 class=\"callout-box__title\">Tony Steward\n                                <small>Balfour Beatty Rail</small>\n                            </h3>\n                            <p>Great service, delivered on time with no hassle. Good Communication and knowledge, nothing more to say other than well done!</p>\n                        </div>\n                    </div>\n                    </div>\n                    <a class=\"button button--red button--small with-caret\" href=\"http://0.0.0.0:8001/testimonials\">\n                        View All Testimonials\n                        <b class=\"caret caret--white\"></b>\n                    </a>\n                </article>\n            </div>\n        </div>\n    </div>\n\n    <div class=\"wrapper\">\n        <div class=\"container\">\n            <div class=\"grid push--top-bottom\">\n                <div class=\"grid__item one-third palm--full-width palm--push-bottom\">\n\n                    <div class=\"info-block\">\n                        <figure class=\"image-block\">\n                            <img src=\"/img/info-fire-safety.jpg\" alt=\"Fire Safety Training\" />\n                        </figure>\n                        <h4>Fire Safety Training</h4>\n                        <p>\n                            Firecrest UK LTD offer a full range of fire satefy training. We include a review of your fire precautions and procedures while conducting the training at your own facilities for total convenience.\n                            <a href=\"http://0.0.0.0:8001/services/staff-fire-safety-training\">Read more...</a>\n                        </p>\n                        <a href=\"http://0.0.0.0:8001/about\" class=\"text-bold\">\n                            <span class=\"icon-youtube inline-icon push-right\"></span>Watch our video\n                        </a>\n                    </div>\n\n                </div><!--\n            --><div class=\"grid__item one-third palm--full-width palm--push-bottom\">\n\n                <div class=\"info-block\">\n\n                    <figure class=\"image-block\">\n                        <img src=\"/img/info-vans.jpg\" alt=\"About Firecrest UK\" />\n                    </figure>\n\n                    <h4>About Us</h4>\n\n                    <p>\n                        Firecrest UK Ltd. are a family run business based in the East Midlands and provide a range of services designed helping businesses meet their legal obligations and protecting their employees and premises from the ravages of fire.\n                        <a href=\"http://0.0.0.0:8001/about\">Read more...</a>\n                    </p>\n\n                </div>\n\n            </div><!--\n            --><div class=\"grid__item one-third palm--full-width\">\n\n                <div class=\"info-block\">\n\n                    <figure class=\"image-block\">\n                        <div class=\"image-block__content outline\">\n                            <img src=\"/img/uk-assoc2.png\" alt=\"UK Fire Association Audited Member\" />\n                        </div>\n                    </figure>\n\n                    <h4>Our Services include</h4>\n                    <ul class=\"text-list list--flush-left\">\n\n\n                        <li>\n                            <a href=\"http://0.0.0.0:8001/services/fire-extinguishers\" class=\"\" title=\"Fire Extinguishers\">\n                                Fire Extinguishers                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://0.0.0.0:8001/services/fire-alarms\" class=\"\" title=\"Fire Alarms\">\n                                Fire Alarms                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://0.0.0.0:8001/services/fire-risk-assessment\" class=\"\" title=\"Fire Risk Assessment\">\n                                Fire Risk Assessment                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://0.0.0.0:8001/services/staff-fire-safety-training\" class=\"\" title=\"Staff Fire Safety Training\">\n                                Staff Fire Safety Training                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://0.0.0.0:8001/services/emergency-lighting-maintenance\" class=\"\" title=\"Emergency Lighting Maintenance\">\n                                Emergency Lighting Maintenance                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://0.0.0.0:8001/services/portable-appliance-testing\" class=\"\" title=\"Portable Appliance Testing\">\n                                Portable Appliance Testing                                        </a>\n                        </li>\n\n\n                    </ul>\n                </div>\n            </div>\n            </div>\n        </div>\n    </div>\n</main>\n\n<footer role=\"contentinfo\">\n    <div class=\"wrapper custom-bg--02\">\n        <div class=\"container\">\n            <footer class=\"text-white clearfix inverted-links footer-bar\">\n                <div class=\"grid\">\n                    <div class=\"grid__item one-half palm--full-width\">\n                        <p>For all enquires, call us on\n                            <a href=\"tel:0800 3456786543\" class=\"inverted\">0800 9874 3343</a>\n                        </p>\n                    </div><!--\n                --><div class=\"grid__item one-half palm--full-width not-palm\">\n                    <p class=\"not-ie7\">\n                        <a class=\"back-to-top with-caret offset-right\" href=\"#bodyTop\">\n                            Back to top\n                            <b class=\"caret caret--up\"></b>\n                        </a>\n                    </p>\n                </div>\n                </div>\n            </footer>\n        </div>\n    </div>\n    <div class=\"wrapper custom-bg--03\">\n        <div class=\"container palm--full-bleed\">\n            <ul class=\"nav nav-inline footer-nav\">\n                <li><a href=\"http://0.0.0.0:8001/home\">Home</a></li>\n                <li><a href=\"http://0.0.0.0:8001/services\">Services</a></li>\n                <li><a href=\"http://0.0.0.0:8001/about\">About Us</a></li>\n                <li><a href=\"http://0.0.0.0:8001/contact\">Contact Us</a></li>\n                <li><a href=\"http://0.0.0.0:8001/testimonials\">Testimonials</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"wrapper only-palm custom-bg--02\">\n        <div class=\"container\">\n            <div class=\"clearfix\">\n                <p>\n                    <a class=\"back-to-top with-caret\" href=\"#bodyTop\">\n                        Back to top\n                        <b class=\"caret caret--up\"></b>\n                    </a>\n                </p>\n            </div>\n        </div>\n    </div>    </footer>\n\n\n<script>\n    document.write('<script src=\"/js/vendor/' + ('__proto__' in {} ? 'zepto.min' : 'jquery-1.10.2.min') + '.js\"><\\/script>')\n</script>\n\n<script src=\"/js/vendor/jquery.magnific-popup.min.js\"></script>\n<script src=\"/js/scripts/public.js\"></script>\n<script src=\"/js/scripts/contact.js\"></script>\n\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync/test/fixtures/proxy-vhost.html",
    "content": "\n<!doctype html>\n<!--[if lt IE 7]>      <html class=\"no-js ie ie6 lt-ie10 lt-ie9 lt-ie8 lt-ie7\" lang=\"en\"> <![endif]-->\n<!--[if IE 7]>         <html class=\"no-js ie ie7 lt-ie10 lt-ie9 lt-ie8\" lang=\"en\"> <![endif]-->\n<!--[if IE 8]>         <html class=\"no-js ie ie8 lt-ie10 lt-ie9\" lang=\"en\"> <![endif]-->\n<!--[if IE 9]>         <html class=\"no-js ie ie9 lt-ie10\" lang=\"en\"> <![endif]-->\n<!--[if gt IE 9]><!--> <html class=\"no-js ffly\" lang=\"en\"> <!--<![endif]-->\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n    <title>Home -  Firecrest UK</title>\n\n    <link rel=\"shortcut icon\" href=\"favicon.ico\" />\n    <link rel=\"address bar icon\" href=\"favicon.ico\">\n\n    <link rel=\"stylesheet\" href=\"/css/style.css\"/>\n    <script src=\"/js/dist/modernizr.min.cd79908d.js\"></script>\n\n</head>\n\n<body id=\"bodyTop\">\n<div class=\"body-mask hidden animated fadeIn\"></div>\n\n<div class=\"wrapper header\">\n    <header class=\"container clearfix\" role=\"banner\">\n        <div class=\"logo\">\n            <a href=\"http://local.dev/home\" class=\"logo__img\" title=\"Firecrest UK LTD Home Page\">\n                Firecrest UK LTD\n            </a>\n        </div>\n        <nav role=\"navigation\" class=\"clearfix nav-container active\">\n            <div class=\"show-menu icon-link fast-click\">\n\n                <span class=\"not-palm menu-text\">MENU</span>\n                <span class=\"icon-menu\"></span>\n                <span class=\"icon-close hidden animated fadeInUp\"></span>\n            </div>\n            <ul class=\"nav main-nav\">\n\n\n                <li class=\"only-palm\">\n                    <a href=\"tel:0800 783 05 88\" tabindex=\"-1\" title=\"Call us on 0800 783 05 88\"><strong>Tel:</strong> 0800 783 05 88</a>\n                </li>\n\n\n\n                <li>\n                    <a href=\"/home\" title=\"Home\" class=\"\">Home</a>\n                </li>\n\n\n\n\n                <li class=\"has-dropdown\">\n\n                    <a href=\"http://local.dev/services\" class=\"with-caret\" title=\"Firecrest UK LTD Services\">\n                        Services <b class=\"caret\"></b>\n                    </a>\n\n                    <div class=\"drop-down\">\n                        <ul class=\"nav sub-nav notify\">\n\n                            <li><a href=\"http://local.dev/services\" tabindex=\"-1\" title=\"View All Services\">VIEW ALL</a></li>\n\n\n                            <li>\n                                <a href=\"http://local.dev/services/fire-extinguishers\" class=\"\" tabindex=\"-1\" title=\"Fire Extinguishers\">\n                                    Fire Extinguishers                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://local.dev/services/fire-alarms\" class=\"\" tabindex=\"-1\" title=\"Fire Alarms\">\n                                    Fire Alarms                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://local.dev/services/fire-risk-assessment\" class=\"\" tabindex=\"-1\" title=\"Fire Risk Assessment\">\n                                    Fire Risk Assessment                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://local.dev/services/staff-fire-safety-training\" class=\"\" tabindex=\"-1\" title=\"Staff Fire Safety Training\">\n                                    Staff Fire Safety Training                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://local.dev/services/emergency-lighting-maintenance\" class=\"\" tabindex=\"-1\" title=\"Emergency Lighting Maintenance\">\n                                    Emergency Lighting Maintenance                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://local.dev/services/portable-appliance-testing\" class=\"\" tabindex=\"-1\" title=\"Portable Appliance Testing\">\n                                    Portable Appliance Testing                    </a>\n                            </li>\n                        </ul>\n                    </div>\n\n                </li>\n\n\n\n\n                <li>\n                    <a href=\"/about\" title=\"About Us\" class=\"\">About Us</a>\n                </li>\n\n\n\n\n                <li>\n                    <a href=\"/contact\" title=\"Contact Us\" class=\"\">Contact Us</a>\n                </li>\n\n\n\n\n                <li>\n                    <a href=\"/testimonials\" title=\"Testimonials\" class=\"\">Testimonials</a>\n                </li>\n\n\n\n            </ul>        </nav>\n    </header>\n</div>    <main role=\"main\">\n    <!-- Hero -->\n    <div class=\"wrapper custom-bg--01-03\">\n        <div class=\"container palm--full-bleed\">\n            <article class=\"hero\">\n                <div class=\"hero-content hero--red\">\n\n                    <h1 class=\"hero-heading\">Firecrest UK LTD</h1>\n                    <h2 class=\"p-styles\">\n                        Welcome to <strong>Firecrest UK LTD</strong>, a midlands based supplier of <strong>fire safety equipment</strong> and solutions for protecting your business from fire.\n                        <a href=\"\" class=\"only-palm inverted trigger\" data-target=\"#hero-subtext\" data-remove=\"true\" data-remove-class=\"not-palm\">read more...</a>\n                    </h2>\n                    <h3 class=\"p-styles not-palm sub-text animated fadeInUp\" id=\"hero-subtext\">\n                        Whether you require fire risk assessments, fire alarm installation and maintenance, fire extinguisher supply and service, Staff fire training or a complete solution to protect your business from the devastation of fire, we can put together a plan to meet all your companies’ requirements.\n                    </h3>\n                    <p>\n                        <a href=\"http://local.dev/about\" class=\"text-bold text-white\">\n                            <span class=\"icon-youtube inline-icon push-right\"></span>Watch our video\n                        </a>\n                    </p>\n\n                    <footer class=\"palm--padding\">\n                        <a href=\"http://local.dev/contact\" class=\"button button--white palm--full-width with-caret\">\n                            Contact us <b class=\"caret caret--red\"></b>\n                        </a>\n                        <a href=\"http://local.dev/services\" class=\"button button--white palm--full-width with-caret\">\n                            Our Services <b class=\"caret caret--red\"></b>\n                        </a>\n                    </footer>\n                </div>\n            </article>\n        </div>\n    </div>\n\n    <!-- Banner -->\n    <div class=\"wrapper\">\n        <div class=\"container\">\n            <article class=\"portfolio text--center\">\n                <h2>People we've loved working with over the years</h2>\n                <div class=\"portfolio-logos\"></div>\n                <!--            <a href=\"--><?//= URL::route(\"testimonials\"); ?><!--\" title=\"\">-->\n                <!--                View More-->\n                <!--            </a>-->\n            </article>\n        </div>\n    </div>\n\n    <!-- Testimonials section -->\n    <div class=\"wrapper custom-bg--01\">\n        <div class=\"overlay--01\">\n            <div class=\"container\">\n                <article class=\"text--center testimonials\">\n                    <h2 class=\"heading-inverted\">Testimonials</h2>\n                    <div class=\"grid equal-heights\">\n                        <div class=\"grid__item one-third palm--full-width\">\n                            <div class=\"callout-box min-height\">\n                                <h3 class=\"callout-box__title\">Sally Pinder\n                                    <small>B & M Honda</small>\n                                </h3>\n                                <p>Great service, delivered on time with no hassle. Good Communication and knowledge, nothing more to say other than well done!</p>\n                            </div>\n                        </div><!--\n                    --><div class=\"grid__item one-third palm--full-width not-palm\">\n                        <div class=\"callout-box min-height\">\n                            <h3 class=\"callout-box__title\">Louise Colebourne\n                                <small>Liberty Hardware</small>\n                            </h3>\n                            <p>Firecrest provided prompt and informative service meeting all our requirements and I have no complaints</p>\n                            <p><strong>Thanks again</strong></p>\n                        </div>\n                    </div><!----><div class=\"grid__item one-third palm--full-width not-palm\">\n                        <div class=\"callout-box min-height\">\n                            <h3 class=\"callout-box__title\">Tony Steward\n                                <small>Balfour Beatty Rail</small>\n                            </h3>\n                            <p>Great service, delivered on time with no hassle. Good Communication and knowledge, nothing more to say other than well done!</p>\n                        </div>\n                    </div>\n                    </div>\n                    <a class=\"button button--red button--small with-caret\" href=\"http://local.dev/testimonials\">\n                        View All Testimonials\n                        <b class=\"caret caret--white\"></b>\n                    </a>\n                </article>\n            </div>\n        </div>\n    </div>\n\n    <div class=\"wrapper\">\n        <div class=\"container\">\n            <div class=\"grid push--top-bottom\">\n                <div class=\"grid__item one-third palm--full-width palm--push-bottom\">\n\n                    <div class=\"info-block\">\n                        <figure class=\"image-block\">\n                            <img src=\"/img/info-fire-safety.jpg\" alt=\"Fire Safety Training\" />\n                        </figure>\n                        <h4>Fire Safety Training</h4>\n                        <p>\n                            Firecrest UK LTD offer a full range of fire satefy training. We include a review of your fire precautions and procedures while conducting the training at your own facilities for total convenience.\n                            <a href=\"http://local.dev/services/staff-fire-safety-training\">Read more...</a>\n                        </p>\n                        <a href=\"http://local.dev/about\" class=\"text-bold\">\n                            <span class=\"icon-youtube inline-icon push-right\"></span>Watch our video\n                        </a>\n                    </div>\n\n                </div><!--\n            --><div class=\"grid__item one-third palm--full-width palm--push-bottom\">\n\n                <div class=\"info-block\">\n\n                    <figure class=\"image-block\">\n                        <img src=\"/img/info-vans.jpg\" alt=\"About Firecrest UK\" />\n                    </figure>\n\n                    <h4>About Us</h4>\n\n                    <p>\n                        Firecrest UK Ltd. are a family run business based in the East Midlands and provide a range of services designed helping businesses meet their legal obligations and protecting their employees and premises from the ravages of fire.\n                        <a href=\"http://local.dev/about\">Read more...</a>\n                    </p>\n\n                </div>\n\n            </div><!--\n            --><div class=\"grid__item one-third palm--full-width\">\n\n                <div class=\"info-block\">\n\n                    <figure class=\"image-block\">\n                        <div class=\"image-block__content outline\">\n                            <img src=\"/img/uk-assoc2.png\" alt=\"UK Fire Association Audited Member\" />\n                        </div>\n                    </figure>\n\n                    <h4>Our Services include</h4>\n                    <ul class=\"text-list list--flush-left\">\n\n\n                        <li>\n                            <a href=\"http://local.dev/services/fire-extinguishers\" class=\"\" title=\"Fire Extinguishers\">\n                                Fire Extinguishers                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://local.dev/services/fire-alarms\" class=\"\" title=\"Fire Alarms\">\n                                Fire Alarms                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://local.dev/services/fire-risk-assessment\" class=\"\" title=\"Fire Risk Assessment\">\n                                Fire Risk Assessment                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://local.dev/services/staff-fire-safety-training\" class=\"\" title=\"Staff Fire Safety Training\">\n                                Staff Fire Safety Training                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://local.dev/services/emergency-lighting-maintenance\" class=\"\" title=\"Emergency Lighting Maintenance\">\n                                Emergency Lighting Maintenance                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://local.dev/services/portable-appliance-testing\" class=\"\" title=\"Portable Appliance Testing\">\n                                Portable Appliance Testing                                        </a>\n                        </li>\n\n\n                    </ul>\n                </div>\n            </div>\n            </div>\n        </div>\n    </div>\n</main>\n\n<footer role=\"contentinfo\">\n    <div class=\"wrapper custom-bg--02\">\n        <div class=\"container\">\n            <footer class=\"text-white clearfix inverted-links footer-bar\">\n                <div class=\"grid\">\n                    <div class=\"grid__item one-half palm--full-width\">\n                        <p>For all enquires, call us on\n                            <a href=\"tel:0800 3456786543\" class=\"inverted\">0800 9874 3343</a>\n                        </p>\n                    </div><!--\n                --><div class=\"grid__item one-half palm--full-width not-palm\">\n                    <p class=\"not-ie7\">\n                        <a class=\"back-to-top with-caret offset-right\" href=\"#bodyTop\">\n                            Back to top\n                            <b class=\"caret caret--up\"></b>\n                        </a>\n                    </p>\n                </div>\n                </div>\n            </footer>\n        </div>\n    </div>\n    <div class=\"wrapper custom-bg--03\">\n        <div class=\"container palm--full-bleed\">\n            <ul class=\"nav nav-inline footer-nav\">\n                <li><a href=\"http://local.dev/home\">Home</a></li>\n                <li><a href=\"http://local.dev/services\">Services</a></li>\n                <li><a href=\"http://local.dev/about\">About Us</a></li>\n                <li><a href=\"http://local.dev/contact\">Contact Us</a></li>\n                <li><a href=\"http://local.dev/testimonials\">Testimonials</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"wrapper only-palm custom-bg--02\">\n        <div class=\"container\">\n            <div class=\"clearfix\">\n                <p>\n                    <a class=\"back-to-top with-caret\" href=\"#bodyTop\">\n                        Back to top\n                        <b class=\"caret caret--up\"></b>\n                    </a>\n                </p>\n            </div>\n        </div>\n    </div>    </footer>\n\n\n<script>\n    document.write('<script src=\"/js/vendor/' + ('__proto__' in {} ? 'zepto.min' : 'jquery-1.10.2.min') + '.js\"><\\/script>')\n</script>\n\n<script src=\"/js/vendor/jquery.magnific-popup.min.js\"></script>\n<script src=\"/js/scripts/public.js\"></script>\n<script src=\"/js/scripts/contact.js\"></script>\n\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync/test/fixtures/rewrites/comment.expected.html",
    "content": "<!doctype html>\n<html><body>\n<p>This is an experiment.dev</p>\n<p><img src=\"/images/experiment.dev/example.jpg\"></p>\n<!-- This experiment.dev should prove interesting -->\n<p><a href=\"//192.168.0.4:3002/example.html\">Link</a></p>\n</body></html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/rewrites/comment.html",
    "content": "<!doctype html>\n<html><body>\n<p>This is an experiment.dev</p>\n<p><img src=\"/images/experiment.dev/example.jpg\"></p>\n<!-- This experiment.dev should prove interesting -->\n<p><a href=\"http://experiment.dev/example.html\">Link</a></p>\n</body></html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/rewrites/escaped.1.expected.html",
    "content": "<a href=\"//192.168.0.4:3002\"></a>\nphpdebugbar.setOpenHandler(new PhpDebugBar.OpenHandler({\"url\":\"http:\\/\\/192.168.0.4:3002\\/_debugbar\\/open\"}));\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/rewrites/escaped.1.html",
    "content": "<a href=\"http://demo.l5\"></a>\nphpdebugbar.setOpenHandler(new PhpDebugBar.OpenHandler({\"url\":\"http:\\/\\/demo.l5\\/_debugbar\\/open\"}));\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/rewrites/hashes.expected.html",
    "content": "<ul class=\"navigation__items\">\n  <li class=\"navigation__items__page\">\n    <a href=\"//192.168.0.4:3002/careers/?number=4\">« Previous</a>\n  </li>\n  <li class=\"navigation__items__page\">\n    <a href=\"//192.168.0.4:3002/careers/#search\">1</a>\n  </li>\n  <li class=\"navigation__items__page\">\n    <a href=\"//192.168.0.4:3002/careers/?number=2#search\">2</a>\n  </li>\n  <li class=\"navigation__items__page\">\n    <a href=\"//192.168.0.4:3002/careers/?number=3#search\">3</a>\n  </li>\n  <li class=\"navigation__items__page\">\n    <a href=\"//192.168.0.4:3002/careers/?number=4#search\">4</a>\n  </li>\n  <li class=\"navigation__items__page navigation__items__page--active\">\n    <a href=\"//192.168.0.4:3002/careers/?number=5#search\">5</a>\n  </li>\n</ul>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/rewrites/hashes.input.html",
    "content": "<ul class=\"navigation__items\">\n  <li class=\"navigation__items__page\">\n    <a href=\"http://www.example.local.colinr.com/careers/?number=4\">« Previous</a>\n  </li>\n  <li class=\"navigation__items__page\">\n    <a href=\"http://www.example.local.colinr.com/careers/#search\">1</a>\n  </li>\n  <li class=\"navigation__items__page\">\n    <a href=\"http://www.example.local.colinr.com/careers/?number=2#search\">2</a>\n  </li>\n  <li class=\"navigation__items__page\">\n    <a href=\"http://www.example.local.colinr.com/careers/?number=3#search\">3</a>\n  </li>\n  <li class=\"navigation__items__page\">\n    <a href=\"http://www.example.local.colinr.com/careers/?number=4#search\">4</a>\n  </li>\n  <li class=\"navigation__items__page navigation__items__page--active\">\n    <a href=\"http://www.example.local.colinr.com/careers/?number=5#search\">5</a>\n  </li>\n</ul>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/sass.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" href=\"css/bootstrap-scss.css\"/>\n</head>\n<body>\n\n    <h1>Hello from the test</h1>\n    <a href=\"forms.html\">Forms</a>\n    <a href=\"scrolling.html\">Scrolling Window</a>\n\n    <a href=\"forms.html\">\n        <div>\n            <div>\n                <img src=\"http://placekitten.com/400/600\" alt=\"\"/>\n            </div>\n        </div>\n    </a>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync/test/fixtures/scrolling.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>About us</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\"/>\n    <style>\n      .test {\n        max-height: 300px;\n        overflow: scroll;\n      }\n    </style>\n</head>\n<body>\n<div class=\"container\">\n    <h1>Browsersync Ghost Mode: Scrolling</h1>\n    <a href=\"index.html\">Homepage</a>\n    <button onclick=\"scroll()\">Scroll</button>\n\n\n    <div class=\"test\">\n      <p>1</p>\n\n      <p>2</p>\n\n      <p>3</p>\n\n      <p>4</p>\n\n      <p>5</p>\n\n      <p>6</p>\n\n      <p>7</p>\n\n      <p>8</p>\n\n      <p>9</p>\n\n      <p>10</p>\n\n      <p>11</p>\n\n      <p>12</p>\n\n      <p>13</p>\n\n      <p>14</p>\n\n      <p>15</p>\n\n      <p>16</p>\n\n      <p>17</p>\n\n      <p>18</p>\n\n      <p>19</p>\n\n      <p>20</p>\n\n      <p>21</p>\n\n      <p>22</p>\n\n      <p>23</p>\n\n      <p>24</p>\n\n      <p>25</p>\n\n      <p>26</p>\n\n      <p>27</p>\n\n      <p>28</p>\n\n      <p>29</p>\n\n      <p>30</p>\n\n      <p>31</p>\n\n      <p>32</p>\n\n      <p>33</p>\n\n      <p>34</p>\n\n      <p>35</p>\n\n      <p>36</p>\n\n      <p>37</p>\n\n      <p>38</p>\n\n      <p>39</p>\n\n      <p>40</p>\n\n      <p>41</p>\n\n      <p>42</p>\n\n      <p>43</p>\n\n      <p>44</p>\n\n      <p>45</p>\n\n      <p>46</p>\n\n      <p>47</p>\n\n      <p>48</p>\n\n      <p>49</p>\n\n      <p>50</p>\n    </div>\n    <p>Element <code>.element1</code></p>\n    <div class=\"test element1\" style=\"max-height: 100px\">\n        <p>Element 1 1</p>\n        <p>Element 1 2</p>\n        <p>Element 1 3</p>\n        <p>Element 1 4</p>\n        <p>Element 1 5</p>\n        <p>Element 1 6</p>\n        <p>Element 1 7</p>\n        <p>Element 1 8</p>\n        <p>Element 1 9</p>\n        <p>Element 1 10</p>\n    </div>\n    <p>Element <code>.element2</code></p>\n    <div class=\"test element2\" style=\"max-height: 100px\">\n        <p>Element 2 1</p>\n        <p>Element 2 2</p>\n        <p>Element 2 3</p>\n        <p>Element 2 4</p>\n        <p>Element 2 5</p>\n        <p>Element 2 6</p>\n        <p>Element 2 7</p>\n        <p>Element 2 8</p>\n        <p>Element 2 9</p>\n        <p>Element 2 10</p>\n    </div>\n    <h1>1</h1>\n\n    <h1>2</h1>\n\n    <h1>3</h1>\n\n    <h1>4</h1>\n\n    <h1>5</h1>\n\n    <h1>6</h1>\n\n    <h1>7</h1>\n\n    <h1>8</h1>\n\n    <h1>9</h1>\n\n    <h1>10</h1>\n\n    <h1>11</h1>\n\n    <h1>12</h1>\n\n    <h1>13</h1>\n\n    <h1>14</h1>\n\n    <h1>15</h1>\n\n    <h1>16</h1>\n\n    <h1>17</h1>\n\n    <h1>18</h1>\n\n    <h1>19</h1>\n\n    <h1>20</h1>\n\n    <h1>21</h1>\n\n    <h1>22</h1>\n\n    <h1>23</h1>\n\n    <h1>24</h1>\n\n    <h1>25</h1>\n\n    <h1>26</h1>\n\n    <h1>27</h1>\n\n    <h1>28</h1>\n\n    <h1>29</h1>\n\n    <h1>30</h1>\n\n    <h1>31</h1>\n\n    <h1>32</h1>\n\n    <h1>33</h1>\n\n    <h1>34</h1>\n\n    <h1>35</h1>\n\n    <h1>36</h1>\n\n    <h1>37</h1>\n\n    <h1>38</h1>\n\n    <h1>39</h1>\n\n    <h1>40</h1>\n\n    <h1>41</h1>\n\n    <h1>42</h1>\n\n    <h1>43</h1>\n\n    <h1>44</h1>\n\n    <h1>45</h1>\n\n    <h1>46</h1>\n\n    <h1>47</h1>\n\n    <h1>48</h1>\n\n    <h1>49</h1>\n\n    <h1>50</h1>\n\n    <h1>51</h1>\n\n    <h1>52</h1>\n\n    <h1>53</h1>\n\n    <h1>54</h1>\n\n    <h1>55</h1>\n\n    <h1>56</h1>\n\n    <h1>57</h1>\n\n    <h1>58</h1>\n\n    <h1>59</h1>\n\n    <h1>60</h1>\n\n    <h1>61</h1>\n\n    <h1>62</h1>\n\n    <h1>63</h1>\n\n    <h1>64</h1>\n\n    <h1>65</h1>\n\n    <h1>66</h1>\n\n    <h1>67</h1>\n\n    <h1>68</h1>\n\n    <h1>69</h1>\n\n    <h1>70</h1>\n\n    <h1>71</h1>\n\n    <h1>72</h1>\n\n    <h1>73</h1>\n\n    <h1>74</h1>\n\n    <h1>75</h1>\n\n    <h1>76</h1>\n\n    <h1>77</h1>\n\n    <h1>78</h1>\n\n    <h1>79</h1>\n\n    <h1>80</h1>\n\n    <h1>81</h1>\n\n    <h1>82</h1>\n\n    <h1>83</h1>\n\n    <h1>84</h1>\n\n    <h1>85</h1>\n\n    <h1>86</h1>\n\n    <h1>87</h1>\n\n    <h1>88</h1>\n\n    <h1>89</h1>\n\n    <h1>90</h1>\n\n    <h1>91</h1>\n\n    <h1>92</h1>\n\n    <h1>93</h1>\n\n    <h1>94</h1>\n\n    <h1></h1>\n\n    <h1>96</h1>\n    <h1>97</h1>\n    <h1>98</h1>\n    <h1>99</h1>\n\n\n    <h1>100</h1>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/scss/bootstrap-scss.scss",
    "content": "/*!\n * Bootstrap v3.0.3 (http://getbootstrap.com)\n * Copyright 2013 Twitter, Inc.\n * Licensed under http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/*! normalize.css v2.1.3 | MIT License | git.io/normalize */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n[hidden],\ntemplate {\n  display: none;\n}\n\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n}\n\nbody {\n  margin: 0;\n}\n\na {\n  background: transparent;\n}\n\na:focus {\n  outline: thin dotted;\n}\n\na:active,\na:hover {\n  outline: 0;\n}\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\nb,\nstrong {\n  font-weight: bold;\n}\n\ndfn {\n  font-style: italic;\n}\n\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n\nmark {\n  color: #000;\n  background: #ff0;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\npre {\n  white-space: pre-wrap;\n}\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  border: 0;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\nfigure {\n  margin: 0;\n}\n\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\n\nlegend {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\n\nbutton,\ninput {\n  line-height: normal;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-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^=\"javascript:\"]:after,\n  a[href^=\"#\"]: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  @page  {\n    margin: 2cm .5cm;\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  .table td,\n  .table th {\n    background-color: #fff !important;\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-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #ffffff;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\na {\n  color: #428bca;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\n\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\nimg {\n  vertical-align: middle;\n}\n\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\n.img-rounded {\n  border-radius: 6px;\n}\n\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n}\n\n.img-circle {\n  border-radius: 50%;\n}\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\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: #999999;\n}\n\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh1 .small,\nh2 .small,\nh3 .small {\n  font-size: 65%;\n}\n\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\nh4 small,\nh5 small,\nh6 small,\nh4 .small,\nh5 .small,\nh6 .small {\n  font-size: 75%;\n}\n\nh1,\n.h1 {\n  font-size: 36px;\n}\n\nh2,\n.h2 {\n  font-size: 30px;\n}\n\nh3,\n.h3 {\n  font-size: 24px;\n}\n\nh4,\n.h4 {\n  font-size: 18px;\n}\n\nh5,\n.h5 {\n  font-size: 14px;\n}\n\nh6,\n.h6 {\n  font-size: 12px;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\n\nsmall,\n.small {\n  font-size: 85%;\n}\n\ncite {\n  font-style: normal;\n}\n\n.text-muted {\n  color: #999999;\n}\n\n.text-primary {\n  color: #428bca;\n}\n\n.text-primary:hover {\n  color: #3071a9;\n}\n\n.text-warning {\n  color: #8a6d3b;\n}\n\n.text-warning:hover {\n  color: #66512c;\n}\n\n.text-danger {\n  color: #a94442;\n}\n\n.text-danger:hover {\n  color: #843534;\n}\n\n.text-success {\n  color: #3c763d;\n}\n\n.text-success:hover {\n  color: #2b542c;\n}\n\n.text-info {\n  color: #31708f;\n}\n\n.text-info:hover {\n  color: #245269;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-center {\n  text-align: center;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.list-inline > li:first-child {\n  padding-left: 0;\n}\n\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 1.428571429;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n\nblockquote p:last-child {\n  margin-bottom: 0;\n}\n\nblockquote small,\nblockquote .small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small,\nblockquote.pull-right .small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\n\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\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\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n  float: left;\n}\n\n.col-xs-12 {\n  width: 100%;\n}\n\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n\n.col-xs-9 {\n  width: 75%;\n}\n\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n\n.col-xs-6 {\n  width: 50%;\n}\n\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n\n.col-xs-3 {\n  width: 25%;\n}\n\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n\n.col-xs-pull-12 {\n  right: 100%;\n}\n\n.col-xs-pull-11 {\n  right: 91.66666666666666%;\n}\n\n.col-xs-pull-10 {\n  right: 83.33333333333334%;\n}\n\n.col-xs-pull-9 {\n  right: 75%;\n}\n\n.col-xs-pull-8 {\n  right: 66.66666666666666%;\n}\n\n.col-xs-pull-7 {\n  right: 58.333333333333336%;\n}\n\n.col-xs-pull-6 {\n  right: 50%;\n}\n\n.col-xs-pull-5 {\n  right: 41.66666666666667%;\n}\n\n.col-xs-pull-4 {\n  right: 33.33333333333333%;\n}\n\n.col-xs-pull-3 {\n  right: 25%;\n}\n\n.col-xs-pull-2 {\n  right: 16.666666666666664%;\n}\n\n.col-xs-pull-1 {\n  right: 8.333333333333332%;\n}\n\n.col-xs-pull-0 {\n  right: 0;\n}\n\n.col-xs-push-12 {\n  left: 100%;\n}\n\n.col-xs-push-11 {\n  left: 91.66666666666666%;\n}\n\n.col-xs-push-10 {\n  left: 83.33333333333334%;\n}\n\n.col-xs-push-9 {\n  left: 75%;\n}\n\n.col-xs-push-8 {\n  left: 66.66666666666666%;\n}\n\n.col-xs-push-7 {\n  left: 58.333333333333336%;\n}\n\n.col-xs-push-6 {\n  left: 50%;\n}\n\n.col-xs-push-5 {\n  left: 41.66666666666667%;\n}\n\n.col-xs-push-4 {\n  left: 33.33333333333333%;\n}\n\n.col-xs-push-3 {\n  left: 25%;\n}\n\n.col-xs-push-2 {\n  left: 16.666666666666664%;\n}\n\n.col-xs-push-1 {\n  left: 8.333333333333332%;\n}\n\n.col-xs-push-0 {\n  left: 0;\n}\n\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n\n.col-xs-offset-11 {\n  margin-left: 91.66666666666666%;\n}\n\n.col-xs-offset-10 {\n  margin-left: 83.33333333333334%;\n}\n\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n\n.col-xs-offset-8 {\n  margin-left: 66.66666666666666%;\n}\n\n.col-xs-offset-7 {\n  margin-left: 58.333333333333336%;\n}\n\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n\n.col-xs-offset-5 {\n  margin-left: 41.66666666666667%;\n}\n\n.col-xs-offset-4 {\n  margin-left: 33.33333333333333%;\n}\n\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n\n.col-xs-offset-2 {\n  margin-left: 16.666666666666664%;\n}\n\n.col-xs-offset-1 {\n  margin-left: 8.333333333333332%;\n}\n\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11,\n  .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-0 {\n    right: 0;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-0 {\n    left: 0;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11,\n  .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-0 {\n    right: 0;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-0 {\n    left: 0;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11,\n  .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-0 {\n    right: 0;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-0 {\n    left: 0;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\n\nth {\n  text-align: left;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\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.428571429;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\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\n.table > tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\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\n.table-bordered {\n  border: 1px solid #dddddd;\n}\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\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\n\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n\n.table > thead > tr > .active,\n.table > tbody > tr > .active,\n.table > tfoot > tr > .active,\n.table > thead > .active > td,\n.table > tbody > .active > td,\n.table > tfoot > .active > td,\n.table > thead > .active > th,\n.table > tbody > .active > th,\n.table > tfoot > .active > th {\n  background-color: #f5f5f5;\n}\n\n.table-hover > tbody > tr > .active:hover,\n.table-hover > tbody > .active:hover > td,\n.table-hover > tbody > .active:hover > th {\n  background-color: #e8e8e8;\n}\n\n.table > thead > tr > .success,\n.table > tbody > tr > .success,\n.table > tfoot > tr > .success,\n.table > thead > .success > td,\n.table > tbody > .success > td,\n.table > tfoot > .success > td,\n.table > thead > .success > th,\n.table > tbody > .success > th,\n.table > tfoot > .success > th {\n  background-color: #dff0d8;\n}\n\n.table-hover > tbody > tr > .success:hover,\n.table-hover > tbody > .success:hover > td,\n.table-hover > tbody > .success:hover > th {\n  background-color: #d0e9c6;\n}\n\n.table > thead > tr > .danger,\n.table > tbody > tr > .danger,\n.table > tfoot > tr > .danger,\n.table > thead > .danger > td,\n.table > tbody > .danger > td,\n.table > tfoot > .danger > td,\n.table > thead > .danger > th,\n.table > tbody > .danger > th,\n.table > tfoot > .danger > th {\n  background-color: #f2dede;\n}\n\n.table-hover > tbody > tr > .danger:hover,\n.table-hover > tbody > .danger:hover > td,\n.table-hover > tbody > .danger:hover > th {\n  background-color: #ebcccc;\n}\n\n.table > thead > tr > .warning,\n.table > tbody > tr > .warning,\n.table > tfoot > tr > .warning,\n.table > thead > .warning > td,\n.table > tbody > .warning > td,\n.table > tfoot > .warning > td,\n.table > thead > .warning > th,\n.table > tbody > .warning > th,\n.table > tfoot > .warning > th {\n  background-color: #fcf8e3;\n}\n\n.table-hover > tbody > tr > .warning:hover,\n.table-hover > tbody > .warning:hover > td,\n.table-hover > tbody > .warning:hover > th {\n  background-color: #faf2cc;\n}\n\n@media (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    -webkit-overflow-scrolling: touch;\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}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\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}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\n}\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}\n\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\n\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n}\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.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.form-control:-moz-placeholder {\n  color: #999999;\n}\n\n.form-control::-moz-placeholder {\n  color: #999999;\n  opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n\n.radio label,\n.checkbox label {\n  display: inline;\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  float: left;\n  margin-left: -20px;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-sm {\n  height: auto;\n}\n\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\n\ntextarea.input-lg {\n  height: auto;\n}\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  color: #8a6d3b;\n}\n\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\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  color: #a94442;\n}\n\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\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  color: #3c763d;\n}\n\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n\n.form-control-static {\n  margin-bottom: 0;\n}\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\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  }\n  .form-inline select.form-control {\n    width: auto;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-control-static {\n  padding-top: 7px;\n}\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  -o-user-select: none;\n  user-select: none;\n}\n\n.btn:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\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: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\n.btn-default .badge {\n  color: #ffffff;\n  background-color: #fff;\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\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: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: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary .badge {\n  color: #428bca;\n  background-color: #fff;\n}\n\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\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: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\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\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: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\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\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: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\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\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: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\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-xs {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  display: none;\n}\n\n.collapse.in {\n  display: block;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n  transition: height 0.35s ease;\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\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.glyphicon:empty {\n  width: 1em;\n}\n\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n\n.glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\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\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle:focus {\n  outline: 0;\n}\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  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\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  background-color: #428bca;\n  outline: 0;\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.open > a {\n  outline: 0;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\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\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\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\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar .btn-group {\n  float: left;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\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\n.btn-group > .btn-group {\n  float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\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\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n\n.btn .caret {\n  margin-left: 0;\n}\n\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\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\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\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\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\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\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  table-layout: fixed;\n}\n\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.input-group .form-control {\n  width: 100%;\n  margin-bottom: 0;\n}\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}\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}\n\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\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}\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}\n\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\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\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\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\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\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 > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group-addon:first-child {\n  border-right: 0;\n}\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 > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n\n.input-group-btn:first-child > .btn {\n  margin-right: -1px;\n}\n\n.input-group-btn:last-child > .btn {\n  margin-left: -1px;\n}\n\n.input-group-btn > .btn {\n  position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav > li {\n  position: relative;\n  display: block;\n}\n\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li.disabled > a {\n  color: #999999;\n}\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\n}\n\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.428571429;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\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  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n}\n\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\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\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\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\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\n.nav-pills > li {\n  float: left;\n}\n\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n\n.nav-pills > li + li {\n  margin-left: 2px;\n}\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: #428bca;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n\n.nav-justified {\n  width: 100%;\n}\n\n.nav-justified > li {\n  float: none;\n}\n\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\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\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\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\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\n.tab-content > .tab-pane {\n  display: none;\n}\n\n.tab-content > .active {\n  display: block;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\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\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse.in {\n  overflow-y: auto;\n}\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    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-right: 0;\n    padding-left: 0;\n  }\n}\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\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\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\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\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  .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\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  }\n  .navbar-form select.form-control {\n    width: auto;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n  .navbar-form.navbar-right:last-child {\n    margin-right: -15px;\n  }\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\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n  .navbar-text.navbar-right:last-child {\n    margin-right: 0;\n  }\n}\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-text {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\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\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\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\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #cccccc;\n}\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\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  color: #555555;\n  background-color: #e7e7e7;\n}\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\n.navbar-default .navbar-link {\n  color: #777777;\n}\n\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n\n.navbar-inverse .navbar-brand {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\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\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\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\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\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  color: #ffffff;\n  background-color: #080808;\n}\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: #999999;\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\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\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\n.breadcrumb > li {\n  display: inline-block;\n}\n\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n\n.breadcrumb > .active {\n  color: #999999;\n}\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n\n.pagination > li {\n  display: inline;\n}\n\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\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\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  background-color: #eeeeee;\n}\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  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\n}\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: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\n}\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\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\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\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\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\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\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\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: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n\n.label[href]:hover,\n.label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label:empty {\n  display: none;\n}\n\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n\n.label-default {\n  background-color: #999999;\n}\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n\n.label-primary {\n  background-color: #428bca;\n}\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n\n.label-success {\n  background-color: #5cb85c;\n}\n\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n\n.label-info {\n  background-color: #5bc0de;\n}\n\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n\n.label-warning {\n  background-color: #f0ad4e;\n}\n\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n\n.label-danger {\n  background-color: #d9534f;\n}\n\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px;\n}\n\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n\n.jumbotron h1,\n.jumbotron .h1 {\n  line-height: 1;\n  color: inherit;\n}\n\n.jumbotron p {\n  line-height: 1.4;\n}\n\n.container .jumbotron {\n  border-radius: 6px;\n}\n\n.jumbotron .container {\n  max-width: 100%;\n}\n\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n}\n\n.thumbnail > img,\n.thumbnail a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  margin-right: auto;\n  margin-left: auto;\n}\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #428bca;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n\n.alert .alert-link {\n  font-weight: bold;\n}\n\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n\n.alert > p + p {\n  margin-top: 5px;\n}\n\n.alert-dismissable {\n  padding-right: 35px;\n}\n\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n\n.alert-success .alert-link {\n  color: #2b542c;\n}\n\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n\n.alert-info .alert-link {\n  color: #245269;\n}\n\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n\n.alert-warning .alert-link {\n  color: #66512c;\n}\n\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n\n.alert-danger .alert-link {\n  color: #843534;\n}\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\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\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: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n\n.progress-striped .progress-bar {\n  background-image: -webkit-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-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\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n\n.progress-striped .progress-bar-success {\n  background-image: -webkit-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-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\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n\n.progress-striped .progress-bar-info {\n  background-image: -webkit-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-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\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-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-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\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-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-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\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media > .pull-left {\n  margin-right: 10px;\n}\n\n.media > .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\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\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.list-group-item > .badge {\n  float: right;\n}\n\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n\na.list-group-item {\n  color: #555555;\n}\n\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\n\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\na.list-group-item.active,\na.list-group-item.active:hover,\na.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\na.list-group-item.active .list-group-item-heading,\na.list-group-item.active:hover .list-group-item-heading,\na.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\n\na.list-group-item.active .list-group-item-text,\na.list-group-item.active:hover .list-group-item-text,\na.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.panel-body {\n  padding: 15px;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel > .list-group {\n  margin-bottom: 0;\n}\n\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n\n.panel > .table,\n.panel > .table-responsive > .table {\n  margin-bottom: 0;\n}\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive {\n  border-top: 1px solid #dddddd;\n}\n\n.panel > .table > tbody:first-child th,\n.panel > .table > tbody:first-child td {\n  border-top: 0;\n}\n\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\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\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\n.panel > .table-bordered > thead > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > th,\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.panel > .table-bordered > thead > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > td,\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  border-bottom: 0;\n}\n\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\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\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n\n.panel-title > a {\n  color: inherit;\n}\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\n.panel-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\n  border-radius: 4px;\n}\n\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-group .panel-footer {\n  border-top: 0;\n}\n\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n\n.panel-default {\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n\n.panel-primary {\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n\n.panel-success {\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n\n.panel-warning {\n  border-color: #faebcc;\n}\n\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #faebcc;\n}\n\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #faebcc;\n}\n\n.panel-danger {\n  border-color: #ebccd1;\n}\n\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #ebccd1;\n}\n\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #ebccd1;\n}\n\n.panel-info {\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\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\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}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -moz-transition: -moz-transform 0.3s ease-out;\n  -o-transition: -o-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n}\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\n.modal-dialog {\n  position: relative;\n  z-index: 1050;\n  width: auto;\n  margin: 10px;\n}\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  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.modal-header {\n  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.modal-header .close {\n  margin-top: -2px;\n}\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n@media screen and (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\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\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\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\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\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\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\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\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  outline: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\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\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n}\n\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\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\n.carousel-caption .btn {\n  text-shadow: none;\n}\n\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicons-chevron-left,\n  .carousel-control .glyphicons-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.pull-right {\n  float: right !important;\n}\n\n.pull-left {\n  float: left !important;\n}\n\n.hide {\n  display: none !important;\n}\n\n.show {\n  display: block !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\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\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n.affix {\n  position: fixed;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n.visible-xs,\ntr.visible-xs,\nth.visible-xs,\ntd.visible-xs {\n  display: none !important;\n}\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\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  table.visible-xs.visible-sm {\n    display: table;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  table.visible-xs.visible-md {\n    display: table;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  table.visible-xs.visible-lg {\n    display: table;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-sm,\ntr.visible-sm,\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  table.visible-sm.visible-xs {\n    display: table;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important;\n  }\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\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  table.visible-sm.visible-md {\n    display: table;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  table.visible-sm.visible-lg {\n    display: table;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-md,\ntr.visible-md,\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  table.visible-md.visible-xs {\n    display: table;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  table.visible-md.visible-sm {\n    display: table;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important;\n  }\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\n@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  table.visible-md.visible-lg {\n    display: table;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-lg,\ntr.visible-lg,\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  table.visible-lg.visible-xs {\n    display: table;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  table.visible-lg.visible-sm {\n    display: table;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  table.visible-lg.visible-md {\n    display: table;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important;\n  }\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\n.hidden-xs {\n  display: block !important;\n}\n\ntable.hidden-xs {\n  display: table;\n}\n\ntr.hidden-xs {\n  display: table-row !important;\n}\n\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-xs,\n  tr.hidden-xs,\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm,\n  tr.hidden-xs.hidden-sm,\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md,\n  tr.hidden-xs.hidden-md,\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg,\n  tr.hidden-xs.hidden-lg,\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-sm {\n  display: block !important;\n}\n\ntable.hidden-sm {\n  display: table;\n}\n\ntr.hidden-sm {\n  display: table-row !important;\n}\n\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs,\n  tr.hidden-sm.hidden-xs,\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm,\n  tr.hidden-sm,\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md,\n  tr.hidden-sm.hidden-md,\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg,\n  tr.hidden-sm.hidden-lg,\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-md {\n  display: block !important;\n}\n\ntable.hidden-md {\n  display: table;\n}\n\ntr.hidden-md {\n  display: table-row !important;\n}\n\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs,\n  tr.hidden-md.hidden-xs,\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm,\n  tr.hidden-md.hidden-sm,\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md,\n  tr.hidden-md,\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg,\n  tr.hidden-md.hidden-lg,\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-lg {\n  display: block !important;\n}\n\ntable.hidden-lg {\n  display: table;\n}\n\ntr.hidden-lg {\n  display: table-row !important;\n}\n\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs,\n  tr.hidden-lg.hidden-xs,\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm,\n  tr.hidden-lg.hidden-sm,\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md,\n  tr.hidden-lg.hidden-md,\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-lg,\n  tr.hidden-lg,\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n\n.visible-print,\ntr.visible-print,\nth.visible-print,\ntd.visible-print {\n  display: none !important;\n}\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  .hidden-print,\n  tr.hidden-print,\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}\n\nbody {\n    background: orange;\n}\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/socket.io.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>About us</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\"/>\n</head>\n<body>\n<div class=\"container\">\n    <h1>Browsersync + Socket IO</h1>\n    <script src=\"/lib/public/socket.io.js\"></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/stylus/bootstrap.styl",
    "content": "/*!\n * Bootstrap v3.0.3 (http://getbootstrap.com)\n * Copyright 2013 Twitter, Inc.\n * Licensed under http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/*! normalize.css v2.1.3 | MIT License | git.io/normalize */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n[hidden],\ntemplate {\n  display: none;\n}\n\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\nbody {\n  margin: 0;\n}\n\na {\n  background: transparent;\n}\n\na:focus {\n  outline: thin dotted;\n}\n\na:active,\na:hover {\n  outline: 0;\n}\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\nb,\nstrong {\n  font-weight: bold;\n}\n\ndfn {\n  font-style: italic;\n}\n\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n       box-sizing: content-box;\n}\n\nmark {\n  color: #000;\n  background: #ff0;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\npre {\n  white-space: pre-wrap;\n}\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  border: 0;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\nfigure {\n  margin: 0;\n}\n\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\n\nlegend {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\n\nbutton,\ninput {\n  line-height: normal;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-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^=\"javascript:\"]:after,\n  a[href^=\"#\"]: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  @page  {\n    margin: 2cm .5cm;\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  .table td,\n  .table th {\n    background-color: #fff !important;\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-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #ffffff;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\na {\n  color: #428bca;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\n\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\nimg {\n  vertical-align: middle;\n}\n\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\n.img-rounded {\n  border-radius: 6px;\n}\n\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.img-circle {\n  border-radius: 50%;\n}\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\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: #999999;\n}\n\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh1 .small,\nh2 .small,\nh3 .small {\n  font-size: 65%;\n}\n\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\nh4 small,\nh5 small,\nh6 small,\nh4 .small,\nh5 .small,\nh6 .small {\n  font-size: 75%;\n}\n\nh1,\n.h1 {\n  font-size: 36px;\n}\n\nh2,\n.h2 {\n  font-size: 30px;\n}\n\nh3,\n.h3 {\n  font-size: 24px;\n}\n\nh4,\n.h4 {\n  font-size: 18px;\n}\n\nh5,\n.h5 {\n  font-size: 14px;\n}\n\nh6,\n.h6 {\n  font-size: 12px;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\n\nsmall,\n.small {\n  font-size: 85%;\n}\n\ncite {\n  font-style: normal;\n}\n\n.text-muted {\n  color: #999999;\n}\n\n.text-primary {\n  color: #428bca;\n}\n\n.text-primary:hover {\n  color: #3071a9;\n}\n\n.text-warning {\n  color: #8a6d3b;\n}\n\n.text-warning:hover {\n  color: #66512c;\n}\n\n.text-danger {\n  color: #a94442;\n}\n\n.text-danger:hover {\n  color: #843534;\n}\n\n.text-success {\n  color: #3c763d;\n}\n\n.text-success:hover {\n  color: #2b542c;\n}\n\n.text-info {\n  color: #31708f;\n}\n\n.text-info:hover {\n  color: #245269;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-center {\n  text-align: center;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.list-inline > li:first-child {\n  padding-left: 0;\n}\n\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 1.428571429;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n\nblockquote p:last-child {\n  margin-bottom: 0;\n}\n\nblockquote small,\nblockquote .small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small,\nblockquote.pull-right .small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\n\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\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\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n  float: left;\n}\n\n.col-xs-12 {\n  width: 100%;\n}\n\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n\n.col-xs-9 {\n  width: 75%;\n}\n\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n\n.col-xs-6 {\n  width: 50%;\n}\n\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n\n.col-xs-3 {\n  width: 25%;\n}\n\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n\n.col-xs-pull-12 {\n  right: 100%;\n}\n\n.col-xs-pull-11 {\n  right: 91.66666666666666%;\n}\n\n.col-xs-pull-10 {\n  right: 83.33333333333334%;\n}\n\n.col-xs-pull-9 {\n  right: 75%;\n}\n\n.col-xs-pull-8 {\n  right: 66.66666666666666%;\n}\n\n.col-xs-pull-7 {\n  right: 58.333333333333336%;\n}\n\n.col-xs-pull-6 {\n  right: 50%;\n}\n\n.col-xs-pull-5 {\n  right: 41.66666666666667%;\n}\n\n.col-xs-pull-4 {\n  right: 33.33333333333333%;\n}\n\n.col-xs-pull-3 {\n  right: 25%;\n}\n\n.col-xs-pull-2 {\n  right: 16.666666666666664%;\n}\n\n.col-xs-pull-1 {\n  right: 8.333333333333332%;\n}\n\n.col-xs-pull-0 {\n  right: 0;\n}\n\n.col-xs-push-12 {\n  left: 100%;\n}\n\n.col-xs-push-11 {\n  left: 91.66666666666666%;\n}\n\n.col-xs-push-10 {\n  left: 83.33333333333334%;\n}\n\n.col-xs-push-9 {\n  left: 75%;\n}\n\n.col-xs-push-8 {\n  left: 66.66666666666666%;\n}\n\n.col-xs-push-7 {\n  left: 58.333333333333336%;\n}\n\n.col-xs-push-6 {\n  left: 50%;\n}\n\n.col-xs-push-5 {\n  left: 41.66666666666667%;\n}\n\n.col-xs-push-4 {\n  left: 33.33333333333333%;\n}\n\n.col-xs-push-3 {\n  left: 25%;\n}\n\n.col-xs-push-2 {\n  left: 16.666666666666664%;\n}\n\n.col-xs-push-1 {\n  left: 8.333333333333332%;\n}\n\n.col-xs-push-0 {\n  left: 0;\n}\n\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n\n.col-xs-offset-11 {\n  margin-left: 91.66666666666666%;\n}\n\n.col-xs-offset-10 {\n  margin-left: 83.33333333333334%;\n}\n\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n\n.col-xs-offset-8 {\n  margin-left: 66.66666666666666%;\n}\n\n.col-xs-offset-7 {\n  margin-left: 58.333333333333336%;\n}\n\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n\n.col-xs-offset-5 {\n  margin-left: 41.66666666666667%;\n}\n\n.col-xs-offset-4 {\n  margin-left: 33.33333333333333%;\n}\n\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n\n.col-xs-offset-2 {\n  margin-left: 16.666666666666664%;\n}\n\n.col-xs-offset-1 {\n  margin-left: 8.333333333333332%;\n}\n\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11,\n  .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-0 {\n    right: 0;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-0 {\n    left: 0;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11,\n  .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-0 {\n    right: 0;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-0 {\n    left: 0;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11,\n  .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-0 {\n    right: 0;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-0 {\n    left: 0;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\n\nth {\n  text-align: left;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\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.428571429;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\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\n.table > tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\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\n.table-bordered {\n  border: 1px solid #dddddd;\n}\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\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\n\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n\n.table > thead > tr > .active,\n.table > tbody > tr > .active,\n.table > tfoot > tr > .active,\n.table > thead > .active > td,\n.table > tbody > .active > td,\n.table > tfoot > .active > td,\n.table > thead > .active > th,\n.table > tbody > .active > th,\n.table > tfoot > .active > th {\n  background-color: #f5f5f5;\n}\n\n.table-hover > tbody > tr > .active:hover,\n.table-hover > tbody > .active:hover > td,\n.table-hover > tbody > .active:hover > th {\n  background-color: #e8e8e8;\n}\n\n.table > thead > tr > .success,\n.table > tbody > tr > .success,\n.table > tfoot > tr > .success,\n.table > thead > .success > td,\n.table > tbody > .success > td,\n.table > tfoot > .success > td,\n.table > thead > .success > th,\n.table > tbody > .success > th,\n.table > tfoot > .success > th {\n  background-color: #dff0d8;\n}\n\n.table-hover > tbody > tr > .success:hover,\n.table-hover > tbody > .success:hover > td,\n.table-hover > tbody > .success:hover > th {\n  background-color: #d0e9c6;\n}\n\n.table > thead > tr > .danger,\n.table > tbody > tr > .danger,\n.table > tfoot > tr > .danger,\n.table > thead > .danger > td,\n.table > tbody > .danger > td,\n.table > tfoot > .danger > td,\n.table > thead > .danger > th,\n.table > tbody > .danger > th,\n.table > tfoot > .danger > th {\n  background-color: #f2dede;\n}\n\n.table-hover > tbody > tr > .danger:hover,\n.table-hover > tbody > .danger:hover > td,\n.table-hover > tbody > .danger:hover > th {\n  background-color: #ebcccc;\n}\n\n.table > thead > tr > .warning,\n.table > tbody > tr > .warning,\n.table > tfoot > tr > .warning,\n.table > thead > .warning > td,\n.table > tbody > .warning > td,\n.table > tfoot > .warning > td,\n.table > thead > .warning > th,\n.table > tbody > .warning > th,\n.table > tfoot > .warning > th {\n  background-color: #fcf8e3;\n}\n\n.table-hover > tbody > tr > .warning:hover,\n.table-hover > tbody > .warning:hover > td,\n.table-hover > tbody > .warning:hover > th {\n  background-color: #faf2cc;\n}\n\n@media (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    -webkit-overflow-scrolling: touch;\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}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\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}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\n}\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}\n\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\n\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n}\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.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n          transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.form-control:-moz-placeholder {\n  color: #999999;\n}\n\n.form-control::-moz-placeholder {\n  color: #999999;\n  opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n\n.radio label,\n.checkbox label {\n  display: inline;\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  float: left;\n  margin-left: -20px;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-sm {\n  height: auto;\n}\n\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\n\ntextarea.input-lg {\n  height: auto;\n}\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  color: #8a6d3b;\n}\n\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\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  color: #a94442;\n}\n\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\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  color: #3c763d;\n}\n\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n\n.form-control-static {\n  margin-bottom: 0;\n}\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\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  }\n  .form-inline select.form-control {\n    width: auto;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-control-static {\n  padding-top: 7px;\n}\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n       -o-user-select: none;\n          user-select: none;\n}\n\n.btn:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\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: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\n.btn-default .badge {\n  color: #ffffff;\n  background-color: #fff;\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\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: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: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary .badge {\n  color: #428bca;\n  background-color: #fff;\n}\n\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\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: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\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\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: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\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\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: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\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\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: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\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-xs {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n          transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  display: none;\n}\n\n.collapse.in {\n  display: block;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n          transition: height 0.35s ease;\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\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.glyphicon:empty {\n  width: 1em;\n}\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\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle:focus {\n  outline: 0;\n}\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  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\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  background-color: #428bca;\n  outline: 0;\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.open > a {\n  outline: 0;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\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\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\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\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar .btn-group {\n  float: left;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\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\n.btn-group > .btn-group {\n  float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\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\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn .caret {\n  margin-left: 0;\n}\n\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\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\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\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\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\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\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  table-layout: fixed;\n}\n\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.input-group .form-control {\n  width: 100%;\n  margin-bottom: 0;\n}\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}\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}\n\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\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}\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}\n\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\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\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\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\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\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 > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group-addon:first-child {\n  border-right: 0;\n}\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 > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n\n.input-group-btn:first-child > .btn {\n  margin-right: -1px;\n}\n\n.input-group-btn:last-child > .btn {\n  margin-left: -1px;\n}\n\n.input-group-btn > .btn {\n  position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav > li {\n  position: relative;\n  display: block;\n}\n\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li.disabled > a {\n  color: #999999;\n}\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\n}\n\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.428571429;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\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  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n}\n\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\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\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\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\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\n.nav-pills > li {\n  float: left;\n}\n\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n\n.nav-pills > li + li {\n  margin-left: 2px;\n}\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: #428bca;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n\n.nav-justified {\n  width: 100%;\n}\n\n.nav-justified > li {\n  float: none;\n}\n\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\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\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\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\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\n.tab-content > .tab-pane {\n  display: none;\n}\n\n.tab-content > .active {\n  display: block;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\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\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse.in {\n  overflow-y: auto;\n}\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    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-right: 0;\n    padding-left: 0;\n  }\n}\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\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\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\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\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  .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\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  }\n  .navbar-form select.form-control {\n    width: auto;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-form.navbar-right:last-child {\n    margin-right: -15px;\n  }\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\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n  .navbar-text.navbar-right:last-child {\n    margin-right: 0;\n  }\n}\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-text {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\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\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\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\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #cccccc;\n}\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\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  color: #555555;\n  background-color: #e7e7e7;\n}\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\n.navbar-default .navbar-link {\n  color: #777777;\n}\n\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n\n.navbar-inverse .navbar-brand {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\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\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\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\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\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  color: #ffffff;\n  background-color: #080808;\n}\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: #999999;\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\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\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\n.breadcrumb > li {\n  display: inline-block;\n}\n\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n\n.breadcrumb > .active {\n  color: #999999;\n}\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n\n.pagination > li {\n  display: inline;\n}\n\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\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\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  background-color: #eeeeee;\n}\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  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\n}\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: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\n}\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\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\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\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\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\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\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\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: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n\n.label[href]:hover,\n.label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label:empty {\n  display: none;\n}\n\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n\n.label-default {\n  background-color: #999999;\n}\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n\n.label-primary {\n  background-color: #428bca;\n}\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n\n.label-success {\n  background-color: #5cb85c;\n}\n\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n\n.label-info {\n  background-color: #5bc0de;\n}\n\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n\n.label-warning {\n  background-color: #f0ad4e;\n}\n\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n\n.label-danger {\n  background-color: #d9534f;\n}\n\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px;\n}\n\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n\n.jumbotron h1,\n.jumbotron .h1 {\n  line-height: 1;\n  color: inherit;\n}\n\n.jumbotron p {\n  line-height: 1.4;\n}\n\n.container .jumbotron {\n  border-radius: 6px;\n}\n\n.jumbotron .container {\n  max-width: 100%;\n}\n\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.thumbnail > img,\n.thumbnail a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  margin-right: auto;\n  margin-left: auto;\n}\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #428bca;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n\n.alert .alert-link {\n  font-weight: bold;\n}\n\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n\n.alert > p + p {\n  margin-top: 5px;\n}\n\n.alert-dismissable {\n  padding-right: 35px;\n}\n\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n\n.alert-success .alert-link {\n  color: #2b542c;\n}\n\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n\n.alert-info .alert-link {\n  color: #245269;\n}\n\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n\n.alert-warning .alert-link {\n  color: #66512c;\n}\n\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n\n.alert-danger .alert-link {\n  color: #843534;\n}\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\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\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: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n          transition: width 0.6s ease;\n}\n\n.progress-striped .progress-bar {\n  background-image: -webkit-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-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\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n\n.progress-striped .progress-bar-success {\n  background-image: -webkit-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-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\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n\n.progress-striped .progress-bar-info {\n  background-image: -webkit-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-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\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-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-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\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-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-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\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media > .pull-left {\n  margin-right: 10px;\n}\n\n.media > .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\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\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.list-group-item > .badge {\n  float: right;\n}\n\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n\na.list-group-item {\n  color: #555555;\n}\n\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\n\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\na.list-group-item.active,\na.list-group-item.active:hover,\na.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\na.list-group-item.active .list-group-item-heading,\na.list-group-item.active:hover .list-group-item-heading,\na.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\n\na.list-group-item.active .list-group-item-text,\na.list-group-item.active:hover .list-group-item-text,\na.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.panel-body {\n  padding: 15px;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel > .list-group {\n  margin-bottom: 0;\n}\n\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n\n.panel > .table,\n.panel > .table-responsive > .table {\n  margin-bottom: 0;\n}\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive {\n  border-top: 1px solid #dddddd;\n}\n\n.panel > .table > tbody:first-child th,\n.panel > .table > tbody:first-child td {\n  border-top: 0;\n}\n\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\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\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\n.panel > .table-bordered > thead > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > th,\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.panel > .table-bordered > thead > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > td,\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  border-bottom: 0;\n}\n\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\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\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n\n.panel-title > a {\n  color: inherit;\n}\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\n.panel-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\n  border-radius: 4px;\n}\n\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-group .panel-footer {\n  border-top: 0;\n}\n\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n\n.panel-default {\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n\n.panel-primary {\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n\n.panel-success {\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n\n.panel-warning {\n  border-color: #faebcc;\n}\n\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #faebcc;\n}\n\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #faebcc;\n}\n\n.panel-danger {\n  border-color: #ebccd1;\n}\n\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #ebccd1;\n}\n\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #ebccd1;\n}\n\n.panel-info {\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\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\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}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n     -moz-transition: -moz-transform 0.3s ease-out;\n       -o-transition: -o-transform 0.3s ease-out;\n          transition: transform 0.3s ease-out;\n}\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\n.modal-dialog {\n  position: relative;\n  z-index: 1050;\n  width: auto;\n  margin: 10px;\n}\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  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.modal-header {\n  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.modal-header .close {\n  margin-top: -2px;\n}\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n@media screen and (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\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\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\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\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n          transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\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\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\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\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  outline: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\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\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n}\n\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\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\n.carousel-caption .btn {\n  text-shadow: none;\n}\n\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicons-chevron-left,\n  .carousel-control .glyphicons-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.pull-right {\n  float: right !important;\n}\n\n.pull-left {\n  float: left !important;\n}\n\n.hide {\n  display: none !important;\n}\n\n.show {\n  display: block !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\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\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n.affix {\n  position: fixed;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n.visible-xs,\ntr.visible-xs,\nth.visible-xs,\ntd.visible-xs {\n  display: none !important;\n}\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\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  table.visible-xs.visible-sm {\n    display: table;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  table.visible-xs.visible-md {\n    display: table;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  table.visible-xs.visible-lg {\n    display: table;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-sm,\ntr.visible-sm,\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  table.visible-sm.visible-xs {\n    display: table;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important;\n  }\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\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  table.visible-sm.visible-md {\n    display: table;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  table.visible-sm.visible-lg {\n    display: table;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-md,\ntr.visible-md,\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  table.visible-md.visible-xs {\n    display: table;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  table.visible-md.visible-sm {\n    display: table;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important;\n  }\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\n@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  table.visible-md.visible-lg {\n    display: table;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-lg,\ntr.visible-lg,\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  table.visible-lg.visible-xs {\n    display: table;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  table.visible-lg.visible-sm {\n    display: table;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  table.visible-lg.visible-md {\n    display: table;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important;\n  }\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\n.hidden-xs {\n  display: block !important;\n}\n\ntable.hidden-xs {\n  display: table;\n}\n\ntr.hidden-xs {\n  display: table-row !important;\n}\n\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-xs,\n  tr.hidden-xs,\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm,\n  tr.hidden-xs.hidden-sm,\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md,\n  tr.hidden-xs.hidden-md,\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg,\n  tr.hidden-xs.hidden-lg,\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-sm {\n  display: block !important;\n}\n\ntable.hidden-sm {\n  display: table;\n}\n\ntr.hidden-sm {\n  display: table-row !important;\n}\n\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs,\n  tr.hidden-sm.hidden-xs,\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm,\n  tr.hidden-sm,\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md,\n  tr.hidden-sm.hidden-md,\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg,\n  tr.hidden-sm.hidden-lg,\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-md {\n  display: block !important;\n}\n\ntable.hidden-md {\n  display: table;\n}\n\ntr.hidden-md {\n  display: table-row !important;\n}\n\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs,\n  tr.hidden-md.hidden-xs,\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm,\n  tr.hidden-md.hidden-sm,\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md,\n  tr.hidden-md,\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg,\n  tr.hidden-md.hidden-lg,\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-lg {\n  display: block !important;\n}\n\ntable.hidden-lg {\n  display: table;\n}\n\ntr.hidden-lg {\n  display: table-row !important;\n}\n\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs,\n  tr.hidden-lg.hidden-xs,\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm,\n  tr.hidden-lg.hidden-sm,\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md,\n  tr.hidden-lg.hidden-md,\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-lg,\n  tr.hidden-lg,\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n\n.visible-print,\ntr.visible-print,\nth.visible-print,\ntd.visible-print {\n  display: none !important;\n}\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  .hidden-print,\n  tr.hidden-print,\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}"
  },
  {
    "path": "packages/browser-sync/test/fixtures/svg.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Included SVG reload test</title>\n</head>\n<body>\n\n<iframe src=\"svg/bin.svg\" frameborder=\"0\"></iframe>\n\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync/test/fixtures/tailwind/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>Document</title>\n    <link href=\"tailwind.min.css\" rel=\"stylesheet\">\n</head>\n<body>\n<div class=\"max-w-sm rounded overflow-hidden shadow-lg\">\n    <img class=\"w-full\" src=\"https://tailwindcss.com/img/card-top.jpg\" alt=\"Sunset in the mountains\">\n    <div class=\"px-6 py-4\">\n        <div class=\"font-bold text-xl mb-2\">The Coldest Sunset</div>\n        <p class=\"text-grey-darker text-base\">\n            Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptatibus quia, nulla! Maiores et perferendis eaque, exercitationem praesentium nihil.\n        </p>\n    </div>\n    <div class=\"px-6 py-4\">\n        <span class=\"inline-block bg-grey-lighter rounded-full px-3 py-1 text-sm font-semibold text-grey-darker mr-2\">#photography</span>\n        <span class=\"inline-block bg-grey-lighter rounded-full px-3 py-1 text-sm font-semibold text-grey-darker mr-2\">#travel</span>\n        <span class=\"inline-block bg-grey-lighter rounded-full px-3 py-1 text-sm font-semibold text-grey-darker\">#winter</span>\n    </div>\n</div>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync/test/fixtures/test.txt",
    "content": "writing to file"
  },
  {
    "path": "packages/browser-sync/test/fixtures/test2.txt",
    "content": "writing to file"
  },
  {
    "path": "packages/browser-sync/test/fixtures/username.github.io/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>Document</title>\n</head>\n<body>\n<h1></h1>\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync/test/fixtures/watch-func.txt",
    "content": "A test generated this file and it is safe to delete changed"
  },
  {
    "path": "packages/browser-sync/test/fixtures2/style-alt.css",
    "content": "body {\n\tbackground: green;\n}"
  },
  {
    "path": "packages/browser-sync/test/protractor/_run.js",
    "content": "\nvar browserSync = require(\"../../\");\nvar exec        = require(\"child_process\").exec;\n\nmodule.exports = function (logger) {\n\n    return function (config, configFile, cb) {\n        browserSync.reset();\n        var instance = browserSync(config.bsConfig, function (err, bs) {\n            var url   = bs.getOptionIn([\"urls\", \"local\"]);\n            var uiurl = bs.getOptionIn([\"urls\", \"ui\"]);\n            process.env[\"BS_BASE\"]        = url;\n            process.env[\"BS_UI\"]          = uiurl;\n            process.env[\"BS_SCRIPT_PATH\"] = bs.getOptionIn([\"scriptPaths\", \"path\"]);\n            logger.info(\"Testing BrowserSync at %s\", url);\n\n            if (config.before) {\n                config.before(bs, function () {\n                    runTests(config, configFile, bs, cb);\n                });\n            } else {\n                runTests(config, configFile, bs, cb);\n            }\n        });\n        return instance;\n    };\n};\n\nfunction runTests (config, configFile, bs, cb) {\n    var out = \"\";\n    exec(\"protractor \" + configFile, function (err, stdout) {\n        console.log(stdout);\n        if (err) {\n            doCallback({\n                code: 1,\n                message: err.message ? err.message : stdout\n            });\n            process.exit(1);\n        }\n        out += stdout;\n    }).on(\"close\", function (code) {\n        if (code !== 0) {\n            doCallback({\n                code: code,\n                message: \"Protractor tests failed, Details below\"\n            }, out);\n        } else {\n            doCallback(null, out);\n        }\n    });\n\n    function doCallback(err, out) {\n        if (config.after) {\n            config.after(bs, function () {\n                cb(err, out);\n            });\n        } else {\n            cb(err, out);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/bs.init.js",
    "content": "\nvar bs = require(\"../../\");\n\nmodule.exports = function (protractor, config) {\n    var flow = protractor.promise.controlFlow();\n    var deferred = protractor.promise.defer();\n    return flow.execute(function () {\n        bs.create().init(config, function (err, _bs) {\n            deferred.fulfill(_bs);\n        });\n        return deferred.promise;\n    });\n};\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/config.multi.js",
    "content": "\nexports.config = {\n    seleniumAddress: \"http://localhost:4444/wd/hub\",\n    baseUrl: process.env[\"BS_BASE\"],\n    specs: [\n        \"tests/snippet.injection.js\"\n    ]\n};\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/config.single.js",
    "content": "\nexports.config = {\n    seleniumAddress: \"http://localhost:4444/wd/hub\",\n    specs: [\n        //process.env[\"BS_TEST_FILE\"]\n        //\"tests/actions.clicks.js\",\n        \"tests/actions.scroll.js\",\n        \"tests/server.interactions.js\",\n        \"tests/proxy.interactions.js\",\n        \"tests/with.baseurl.js\",\n        \"tests/with.baseurl.https.js\"\n        //\"tests/with.socket.io.js\"\n    ]\n};\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/logger.js",
    "content": "var chalk       = require(\"chalk\");\nmodule.exports = require(\"eazy-logger\").Logger({\n    prefix: chalk.magenta(\"[BS E2E] \"),\n    useLevelPrefixes: true,\n    custom: {\n        \"i\": function (string) {\n            return chalk.cyan(string)\n        }\n    }\n});\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/runProtractor.js",
    "content": "\nvar exec = require(\"child_process\").exec;\n\nfunction runTests (config, configFile, cb) {\n    var out = \"\";\n    exec(\"protractor \" + configFile, function (err, stdout) {\n        if (err) {\n            doCallback({\n                code: 1,\n                message: err.message ? err.message : stdout,\n                stdout: stdout,\n                err: err\n            });\n            process.exit(1);\n        }\n        out += stdout;\n    }).on(\"close\", function (code) {\n        if (code !== 0) {\n            doCallback({\n                code: code,\n                message: \"Protractor tests failed, Details below\"\n            }, out);\n        } else {\n            doCallback(null, out);\n        }\n    });\n\n    function doCallback(err, out) {\n        if (config.after) {\n            config.after(function () {\n                cb(err, out);\n            });\n        } else {\n            cb(err, out);\n        }\n    }\n}\n\nmodule.exports = runTests;\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/setup.js",
    "content": "\nvar eachSeries  = require(\"async-each-series\");\nvar path        = require(\"path\");\nvar logger      = require(\"./logger\");\nvar run         = require(\"./_run\")(logger);\n\nvar tests       = require(\"./tests.multi\");\nvar configFile  = path.resolve(__dirname + \"/config.multi\");\n\neachSeries(Object.keys(tests), function (item, asyncCallback) {\n    logger.info(\"Running: {yellow:%s\", item);\n    process.env[\"BS_TEST_NAME\"] = item;\n    var bs = run(tests[item], configFile, function (err, out) {\n        bs.cleanup();\n        if (out) {\n            //console.log(out);\n        }\n        if (err) {\n            return asyncCallback(err);\n        }\n        asyncCallback();\n    });\n}, function (err) {\n    if (err) {\n        console.log(err.message);\n        logger.error(\"Tests failed\");\n        process.exit(1);\n    }\n    process.exit(0);\n});\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/setup.single.js",
    "content": "\nvar eachSeries  = require(\"async-each-series\");\nvar path        = require(\"path\");\nvar logger      = require(\"./logger\");\nvar ptor        = require(\"./runProtractor\");\nvar chalk       = require(\"chalk\");\n\nvar tests       = require(\"./tests.single\");\nvar configFile  = path.resolve(__dirname + \"/config.single\");\n\neachSeries(tests, function (testFile, asyncCallback) {\n    logger.info(\"Running: {yellow:%s\", testFile);\n    process.env[\"BS_TEST_FILE\"] = \"tests/\" + testFile;\n    ptor({}, configFile, function (err, out) {\n        if (out) {\n            // console.log(out) //debugging\n        }\n        if (!err) {\n            logger.info(\n                \"%s %s\",\n                chalk.green(\"Tests Passed:\"),\n                chalk.yellow(testFile)\n            )\n        }\n        if (err) {\n            return asyncCallback(err);\n        }\n\n        asyncCallback();\n    });\n}, function (err) {\n    if (err) {\n        logger.error(err.stdout || err.message);\n        process.exit(1);\n    }\n    process.exit(0);\n});\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/tests/actions.clicks.js",
    "content": "\nvar init = require(\"../bs.init\");\n\ndescribe(\"Scrolling around\", function () {\n    var instance;\n    var urls;\n    beforeEach(function () {\n        browser.ignoreSynchronization = true;\n        if (instance) {\n            return;\n        }\n        var config = {\n            server: \"test/fixtures\",\n            open: false,\n            logLevel: \"silent\"\n        };\n        init(protractor, config).then(function (bs) {\n            instance = bs;\n            urls = instance.getOption(\"urls\").toJS();\n        });\n    });\n    it(\"should mirror clicks on hrefs\", function () {\n\n        browser.get(urls.local + \"/scrolling.html\");\n\n        browser.executeScript(\"window.open('%s')\".replace(\"%s\", urls.local + \"/scrolling.html\"));\n\n        browser.getAllWindowHandles().then(function (handles) {\n\n            browser.switchTo().window(handles[0]).then(function () {\n\n                browser.sleep(500);\n                element(by.css(\"a\")).click(); // go to the link\n                browser.close();\n                browser.sleep(500);\n\n                browser.switchTo().window(handles[1]).then(function () {\n                    //browser.pause();\n                    expect(browser.getCurrentUrl()).toContain(\"index.html\");\n                    instance.cleanup();\n                });\n            });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/tests/actions.scroll.js",
    "content": "\nvar init = require(\"../bs.init\");\n\ndescribe(\"Scrolling around\", function () {\n    beforeEach(function () {\n        browser.ignoreSynchronization = true;\n    });\n    it(\"should know when a client scrolls\", function () {\n        var instance;\n        var urls;\n        var config = {\n            server: \"test/fixtures\",\n            open: false,\n            logLevel: \"silent\",\n            ui: false\n        };\n        //browser.pause();\n\n        init(protractor, config).then(function (bs) {\n\n            instance = bs;\n            urls = instance.getOption(\"urls\").toJS();\n\n        }).then(function () {\n\n            browser.get(urls.local + \"/scrolling.html\");\n            browser.executeScript(\"window.open('%s')\".replace(\"%s\", urls.local + \"/scrolling.html\"));\n\n            browser.getAllWindowHandles().then(function (handles) {\n                browser.switchTo().window(handles[1]).then(function () {\n                    browser.executeScript(\"window.scrollBy(0, 100);\");\n                    browser.close();\n                    browser.sleep(1000);\n                    browser.switchTo().window(handles[0]).then(function () {\n                        browser.executeScript(\"return window.scrollY\").then(function (y) {\n\n                            var flow = protractor.promise.controlFlow();\n\n                            flow.execute(function () {\n                                instance.cleanup();\n                            });\n\n                            expect(y < 110 && y > 90).toBe(true);\n                        });\n                    });\n                });\n            });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/tests/proxy.interactions.js",
    "content": "\nvar init    = require(\"../bs.init\");\nvar path    = require(\"path\");\nvar connect = require(\"connect\");\nvar serveStatic = require(\"serve-static\");\nvar http    = require(\"http\");\n\ndescribe(\"Interactions on proxy Pages\", function () {\n    var instance;\n    var urls;\n    var proxy;\n    var server;\n    beforeEach(function () {\n        browser.ignoreSynchronization = true;\n        if (instance) {\n            return;\n        }\n        var app   = connect();\n        app.use(serveStatic(path.resolve(\"test/fixtures\")));\n        server = http.createServer(app).listen();\n        proxy = server.address().port;\n        var config = {\n            proxy: \"http://localhost:\" + server.address().port,\n            open: false,\n            logLevel: \"silent\"\n        };\n        init(protractor, config).then(function (bs) {\n            instance = bs;\n            urls = instance.getOption(\"urls\").toJS();\n        });\n    });\n    it(\"should contain the BS script & notify element\", function () {\n        browser.get(urls.local);\n        [\n            \"scrolling.html\",\n            \"index-large.html\",\n            \"index-amd.html\"\n\n        ].forEach(function (url) {\n            browser.get(path.join(urls.local, url));\n            assertScripts();\n        });\n    });\n    it(\"should know when a client scrolls\", function () {\n\n        instance.io.sockets.on(\"connection\", function (client) {\n            client.on(\"scroll\", function (data) {\n                expect(data.position.raw.y).toBe(100);\n            });\n            client.on(\"click\", function (data) {\n                expect(data.tagName).toEqual(\"A\");\n                expect(data.index).toEqual(0);\n                expect(data.url).toEqual(\"/scrolling.html\");\n            });\n        });\n\n        browser.get(urls.local + \"/scrolling.html\");\n        browser.executeScript(\"window.scrollBy(0, 100);\");\n        var elem = element(by.css(\"a\"));\n        elem.click();\n    });\n\n    it(\"should know when a client is filling a form\", function () {\n\n        instance.io.sockets.on(\"connection\", function (client) {\n            var keyCount = 0;\n            client.on(\"input:text\", function (data) {\n                if (data.value === \"Hi there\") {\n                    expect(data.tagName).toEqual(\"INPUT\");\n                    expect(data.index).toEqual(0);\n                    expect(data.url).toEqual(\"/forms.html\");\n                    expect(keyCount).toEqual(8);\n                }\n                keyCount += 1;\n            });\n        });\n\n        browser.get(urls.local + \"/forms.html\");\n\n        var waitLoading = by.css(\"input[name=\\\"name\\\"\");\n\n        browser.wait(function () {\n            return browser.isElementPresent(waitLoading);\n        }, 8000);\n\n        element(by.css(\"input[name=\\\"name\\\"\")).sendKeys(\"Hi there\");\n\n        var flow = protractor.promise.controlFlow();\n\n        flow.execute(function () {\n            instance.cleanup();\n        });\n    });\n});\n\nfunction assertScripts () {\n    expect(element(by.id(\"__bs_script__\")).isPresent()).toBeTruthy();\n    expect(element(by.id(\"__bs_notify__\")).isPresent()).toBeTruthy();\n}\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/tests/proxy.rewrites.js",
    "content": "//var init    = require(\"../bs.init\");\n//var path    = require(\"path\");\n//var connect = require(\"connect\");\n//var serveStatic = require(\"serve-static\");\n//var http    = require(\"http\");\n//var assert  = require(\"chai\").assert;\n//\n//describe('Interactions on proxy Pages', function() {\n//    var ptor     = protractor.getInstance();\n//    var instance;\n//    var urls;\n//    var proxy;\n//    var server;\n//    beforeEach(function () {\n//\n//        browser.ignoreSynchronization = true;\n//\n//        if (!server) {\n//\n//            var app   = connect();\n//\n//            app.use(serveStatic(path.resolve(\"test/fixtures\")));\n//\n//            server = http.createServer(app).listen(function () {\n//                proxy = server.address().port;\n//                var config = {\n//                    proxy: \"http://localhost:\" + server.address().port,\n//                    open: false,\n//                    logLevel: \"silent\"\n//                };\n//                init(protractor, config).then(function (bs) {\n//                    instance = bs;\n//                    urls = instance.getOption(\"urls\");\n//                });\n//            });\n//        }\n//    });\n//    it(\"should contain the BS script & notify element\", function () {\n//        browser.get(urls.local);\n//        [\n//            \"scrolling.html\",\n//            \"index-large.html\",\n//            \"index-amd.html\"\n//        ].forEach(function (url) {\n//            browser.get(path.join(urls.local, url));\n//            assertScripts();\n//        });\n//    });\n//    it(\"should know when a client scrolls\", function () {\n//\n//        var flow = protractor.promise.controlFlow();\n//        var deferred = protractor.promise.defer();\n//\n//        instance.io.sockets.on(\"connection\", function (client) {\n//            client.on(\"scroll\", function (data) {\n//                expect(data.position.raw.y).toBe(100);\n//            });\n//            client.on(\"click\", function (data) {\n//                expect(data.tagName).toEqual(\"A\");\n//                expect(data.index).toEqual(0);\n//                expect(data.url).toEqual(\"/scrolling.html\");\n//            });\n//        });\n//\n//        browser.get(urls.local + \"/scrolling.html\");\n//        ptor.executeScript(\"window.scrollBy(0, 100);\");\n//        var elem = element(by.css('a'));\n//        elem.click();\n//    });\n//\n//    it(\"should know when a client is filling a form\", function () {\n//\n//        instance.io.sockets.on(\"connection\", function (client) {\n//            var keyCount = 0;\n//            client.on(\"input:text\", function (data) {\n//                if (data.value === \"Hi there\") {\n//                    expect(data.tagName).toEqual(\"INPUT\");\n//                    expect(data.index).toEqual(0);\n//                    expect(data.url).toEqual(\"/forms.html\");\n//                    expect(keyCount).toEqual(8);\n//                }\n//                keyCount += 1;\n//            });\n//        });\n//\n//        browser.get(urls.local + \"/forms.html\");\n//        element(by.id(\"name\")).sendKeys(\"Hi there\");\n//        instance.cleanup();\n//    });\n//});\n//\n//function assertScripts () {\n//    expect(element(by.id('__bs_script__')).isPresent()).toBeTruthy();\n//    expect(element(by.id('__bs_notify__')).isPresent()).toBeTruthy();\n//}\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/tests/server.interactions.js",
    "content": "\nvar init = require(\"../bs.init\");\nvar path = require(\"path\");\n\ndescribe(\"Interactions on Server Pages\", function () {\n    var instance;\n    var urls;\n    beforeEach(function () {\n        browser.ignoreSynchronization = true;\n        if (instance) {\n            return;\n        }\n        var config = {\n            server: \"test/fixtures\",\n            open: false,\n            logLevel: \"silent\"\n        };\n        init(protractor, config).then(function (bs) {\n            instance = bs;\n            urls = instance.getOption(\"urls\").toJS();\n        });\n    });\n    it(\"should contain the BS script & notify element\", function () {\n        browser.get(urls.local);\n        [\n            \"scrolling.html\",\n            \"index-large.html\",\n            \"index-amd.html\"\n        ].forEach(function (url) {\n            browser.get(path.join(urls.local, url));\n            browser.sleep(500);\n            assertScripts();\n        });\n    });\n    it(\"should know when a client scrolls\", function () {\n        instance.io.sockets.on(\"connection\", function (client) {\n            client.on(\"scroll\", function (data) {\n                expect(data.position.raw.y).toBe(100);\n            });\n            client.on(\"click\", function (data) {\n                expect(data.tagName).toEqual(\"A\");\n                expect(data.index).toEqual(0);\n                expect(data.url).toEqual(\"/scrolling.html\");\n            });\n        });\n\n        browser.get(urls.local + \"/scrolling.html\");\n        browser.executeScript(\"window.scrollBy(0, 100);\");\n        var elem = element(by.css(\"a\"));\n        elem.click();\n    });\n\n    it(\"should know when a client is filling a form\", function () {\n\n        instance.io.sockets.on(\"connection\", function (client) {\n            var keyCount = 0;\n            client.on(\"input:text\", function (data) {\n                if (data.value === \"Hi there\") {\n                    expect(data.tagName).toEqual(\"INPUT\");\n                    expect(data.index).toEqual(0);\n                    expect(data.url).toEqual(\"/forms.html\");\n                    expect(keyCount).toEqual(8);\n                }\n                keyCount += 1;\n            });\n        });\n\n        browser.get(urls.local + \"/forms.html\");\n        element(by.id(\"name\")).sendKeys(\"Hi there\");\n        instance.cleanup();\n\n    });\n});\n\nfunction assertScripts () {\n    expect(element(by.id(\"__bs_script__\")).isPresent()).toBeTruthy();\n    expect(element(by.id(\"__bs_notify__\")).isPresent()).toBeTruthy();\n}\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/tests/snippet.injection.js",
    "content": "\n/**\n *\n */\n// abstract writing screen shot to a file\n//var fs = require(\"fs\");\n//var slugify = require(\"slugify\");\n//function writeScreenShot(data, filename) {\n//    var stream = fs.createWriteStream(filename);\n//    stream.write(new Buffer(data, \"base64\"));\n//    stream.end();\n//}\n\n/**\n *\n */\ndescribe(\"Section Navigation\", function () {\n    beforeEach(function () {\n        browser.ignoreSynchronization = true;\n        browser.get(\"/\");\n    });\n    it(\"should contain the BS script element\", function () {\n        expect(element(by.id(\"__bs_script__\")).isPresent()).toBeTruthy();\n    });\n    it(\"should contain the BS NOTIFY ELEMENT\", function () {\n        //browser.pause();\n        expect(element(by.id(\"__bs_notify__\")).isPresent()).toBeTruthy();\n    });\n    it(\"should launch UI\", function () {\n        browser.ignoreSynchronization = false;\n        browser.get(process.env[\"BS_UI\"]);\n        expect(element.all(by.css(\"[bs-heading]\")).get(0).isPresent()).toBeTruthy();\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/tests/with.baseurl.https.js",
    "content": "\nvar init = require(\"../bs.init\");\n\ndescribe(\"works when base url set in HTML\", function () {\n    var instance;\n    var urls;\n    beforeEach(function () {\n        browser.ignoreSynchronization = true;\n        if (instance) {\n            return;\n        }\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\",\n                routes: {\n                    \"/lib\": \"./lib\"\n                }\n            },\n            https: true,\n            open: false,\n            logLevel: \"silent\",\n            scriptPath: function (path, port, options) {\n                return options.get(\"absolute\");\n            },\n            ui: false\n        };\n        init(protractor, config).then(function (bs) {\n            instance = bs;\n            urls = instance.getOption(\"urls\").toJS();\n        });\n    });\n    it(\"should \", function () {\n\n        browser.get(urls.local + \"/base.html\");\n\n        assertScripts();\n    });\n});\n\nfunction assertScripts () {\n    expect(element(by.id(\"__bs_script__\")).isPresent()).toBeTruthy();\n    expect(element(by.id(\"__bs_notify__\")).isPresent()).toBeTruthy();\n}\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/tests/with.baseurl.js",
    "content": "\nvar init = require(\"../bs.init\");\n\ndescribe(\"works when base url set in HTML\", function () {\n    var instance;\n    var urls;\n    beforeEach(function () {\n        browser.ignoreSynchronization = true;\n        if (instance) {\n            return;\n        }\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\",\n                routes: {\n                    \"/lib\": \"./lib\"\n                }\n            },\n            open: false,\n            logLevel: \"silent\",\n            scriptPath: function (path, port, options) {\n                return options.get(\"absolute\");\n            },\n            ui: false\n        };\n        init(protractor, config).then(function (bs) {\n            instance = bs;\n            urls = instance.getOption(\"urls\").toJS();\n        });\n    });\n    it(\"should have script tags\", function () {\n        browser.get(urls.local + \"/base.html\");\n        assertScripts();\n    });\n});\n\nfunction assertScripts () {\n    expect(element(by.id(\"__bs_script__\")).isPresent()).toBeTruthy();\n    expect(element(by.id(\"__bs_notify__\")).isPresent()).toBeTruthy();\n}\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/tests/with.socket.io.js",
    "content": "\nvar init = require(\"../bs.init\");\n\ndescribe(\"works with Socket IO on same page\", function () {\n    var instance;\n    var urls;\n    beforeEach(function () {\n        browser.ignoreSynchronization = true;\n        if (instance) {\n            return;\n        }\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\",\n                routes: {\n                    \"/lib\": \"./lib\"\n                }\n            },\n            open: false,\n            logLevel: \"silent\",\n            ui: false\n        };\n        init(protractor, config).then(function (bs) {\n            instance = bs;\n            urls = instance.getOption(\"urls\").toJS();\n        });\n    });\n    it(\"should leave window.io available to others people\", function () {\n\n        browser.get(urls.local + \"/socket.io.html\");\n\n        assertScripts();\n\n        browser.sleep(1000);\n\n        browser.executeScript(\"return typeof window.io;\").then(function (io) {\n\n            expect(io).toBe(\"function\");\n\n            var flow = protractor.promise.controlFlow();\n\n            flow.execute(function () {\n                instance.cleanup();\n            });\n        });\n    });\n});\n\nfunction assertScripts () {\n    expect(element(by.id(\"__bs_script__\")).isPresent()).toBeTruthy();\n    expect(element(by.id(\"__bs_notify__\")).isPresent()).toBeTruthy();\n}\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/tests.multi.js",
    "content": "\nvar connect = require(\"connect\");\nvar utils = require(\"../../dist/server/utils\");\nvar Immutable  = require(\"immutable\");\n\nfunction getApp (bs, options) {\n\n    var html = \"<!doctype html><html lang=\\\"en-US\\\"><head><meta charset=\\\"UTF-8\\\"><title>Browsersync</title></head><body>BS</body></html>\";\n    var app = connect();\n\n    app.use(\"/\", function (req, res) {\n        res.setHeader(\"content-type\", \"text/html\");\n        res.end(html.replace(\"BS\", bs.getOption(\"snippet\")));\n    });\n\n    var appserver = utils.getServer(app, options);\n\n    return appserver;\n}\n\nmodule.exports = {\n    \"Proxy Test Laravel App\": {\n        bsConfig: {\n            proxy: \"http://homestead.app:8000/\",\n            open: false,\n            logLevel: \"silent\"\n        }\n    },\n    \"Proxy Test Wordpress\": {\n        bsConfig: {\n            proxy: \"http://wordpress.dev\",\n            open: false,\n            logLevel: \"silent\"\n        }\n    },\n    \"Proxy Test Localhost\": {\n        bsConfig: {\n            proxy: \"localhost\",\n            open: false,\n            logLevel: \"silent\"\n        }\n    },\n    \"Secure Proxy\": {\n        bsConfig: {\n            proxy: \"https://grenade.static:8890\",\n            open: false,\n            logLevel: \"silent\"\n        }\n    },\n    \"Server\": {\n        bsConfig: {\n            server: \"./test/fixtures\",\n            open: false,\n            logLevel: \"silent\"\n        }\n    },\n    \"Secure Server\": {\n        bsConfig: {\n            server: \"./test/fixtures\",\n            open: false,\n            logLevel: \"silent\",\n            https: true\n        }\n    },\n    \"Snippet\": {\n        bsConfig: {\n            logLevel: \"silent\"\n        },\n        before: function (bs, cb) {\n            var app = getApp(bs, Immutable.Map({scheme: \"http\"}));\n            app.server.listen();\n            process.env[\"BS_BASE\"] = \"http://localhost:\" + app.server.address().port;\n            cb();\n        }\n    },\n    \"Secure Snippet on Insecure Website\": {\n        bsConfig: {\n            logLevel: \"silent\",\n            https: true\n        },\n        before: function (bs, cb) {\n\n            var app = getApp(bs, Immutable.Map({scheme: \"http\"}));\n            app.server.listen();\n            process.env[\"BS_BASE\"] = \"http://localhost:\" + app.server.address().port;\n            cb();\n        }\n    },\n    \"Secure Snippet on Secure Website\": {\n        bsConfig: {\n            logLevel: \"silent\",\n            https: true\n        },\n        before: function (bs, cb) {\n\n            var app = getApp(bs, Immutable.Map({scheme: \"https\"}));\n            app.server.listen();\n            process.env[\"BS_BASE\"] = \"https://localhost:\" + app.server.address().port;\n            cb();\n        }\n    }\n};\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/tests.single.js",
    "content": "\nmodule.exports = [\n    \"actions.clicks.js\",\n    \"actions.scroll.js\",\n    \"server.interactions.js\",\n    \"proxy.interactions.js\",\n    \"with.socket.io.js\" // PR coming\n];\n"
  },
  {
    "path": "packages/browser-sync/test/protractor/utils.js",
    "content": "\nvar utils = require(\"../../dist/server/utils\");\nvar connect = require(\"connect\");\n\nmodule.exports = {\n\n    getApp: function getApp (options) {\n\n        var html = \"<!doctype html><html lang=\\\"en-US\\\"><head><meta charset=\\\"UTF-8\\\"><title>Browsersync</title></head><body>BS</body></html>\";\n        var app = connect();\n\n        app.use(\"/\", function (req, res) {\n            res.setHeader(\"content-type\", \"text/html\");\n            res.end(html);\n        });\n\n        var appserver = utils.getServer(app, options);\n        appserver.html = html;\n\n        return appserver;\n    }\n};\n"
  },
  {
    "path": "packages/browser-sync/test/specs/api/init.active.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"API: .active - Retrieving the active state of browserSync\", function() {\n    before(function() {\n        browserSync.reset();\n    });\n\n    it(\"should know the inactive state of BrowserSync\", function() {\n        assert.equal(browserSync.active, false);\n    });\n\n    describe(\"Setting the active state\", function() {\n        var instance;\n\n        before(function(done) {\n            browserSync.reset();\n            var config = {\n                logLevel: \"silent\",\n                open: false\n            };\n\n            instance = browserSync(config, function() {\n                done();\n            });\n        });\n\n        after(function() {\n            instance.cleanup();\n        });\n\n        it(\"should know the active State of BrowserSync\", function() {\n            assert.equal(browserSync.active, true);\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/api/init.exit.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\n\ndescribe(\"API: .exit() - Using the public exit method\", function() {\n    describe(\"should exit when BrowserSync is running.\", function() {\n        var instance;\n\n        before(function(done) {\n            browserSync.reset();\n            var config = {\n                logLevel: \"silent\",\n                open: false\n            };\n\n            instance = browserSync(config, done);\n        });\n\n        after(function() {\n            instance.cleanup();\n        });\n\n        it(\"should know the active State of BrowserSync\", function() {\n            var stub = sinon.stub(process, \"exit\");\n\n            assert.equal(browserSync.active, true);\n\n            browserSync.exit();\n\n            assert.equal(browserSync.active, false);\n\n            stub.restore();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/api/init.js",
    "content": "var browserSync = require(\"../../../\");\nconst chalk = require(\"chalk\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"API: .init - don't not call init when already running.\", function() {\n    it(\"should know the active State of BrowserSync\", function(done) {\n        browserSync.reset();\n        browserSync(\n            {\n                logLevel: \"silent\",\n                open: false\n            },\n            function(err, bs) {\n                var spy = require(\"sinon\").spy(console, \"log\");\n                browserSync({ server: \"test/fixtures\" });\n                var arg = spy.getCall(0).args;\n                assert.include(arg[0], chalk.yellow(\"You tried to start Browsersync twice!\"));\n                assert.include(arg[1], \"To create multiple instances, use\");\n                assert.include(arg[2], chalk.cyan('browserSync.create().init()'));\n                console.log.restore();\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n    it(\"should init with null as second param\", function(done) {\n        browserSync.reset();\n        var bs = browserSync(\n            {\n                logLevel: \"silent\",\n                open: false\n            },\n            null\n        );\n        bs.emitter.on(\"service:running\", function() {\n            assert.ok(bs.instance.options.get(\"urls\"));\n            bs.cleanup();\n            done();\n        });\n    });\n    it(\"should init with undefined as second param\", function(done) {\n        browserSync.reset();\n        var bs = browserSync(\n            {\n                logLevel: \"silent\",\n                open: false\n            },\n            undefined\n        );\n        bs.emitter.on(\"service:running\", function() {\n            assert.ok(bs.instance.options.get(\"urls\"));\n            bs.cleanup();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/api/init.notify.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar sinon = require(\"sinon\");\n\ndescribe(\"API: .notify() - Public Notify Method\", function() {\n    var emitterStub, bs;\n\n    before(function(done) {\n        browserSync.reset();\n        bs = browserSync(\n            {\n                open: false,\n                online: false,\n                logLevel: \"silent\"\n            },\n            function() {\n                emitterStub = sinon.stub(bs.emitter, \"emit\");\n                done();\n            }\n        );\n    });\n\n    afterEach(function() {\n        emitterStub.reset();\n    });\n\n    after(function() {\n        emitterStub.restore();\n        bs.cleanup();\n    });\n\n    it(\"should emit the browser:notify event\", function() {\n        browserSync.notify(\"HI\");\n        sinon.assert.calledWithExactly(emitterStub, \"browser:notify\", {\n            message: \"HI\",\n            timeout: 2000,\n            override: true\n        });\n    });\n    it(\"should emit the browser:notify event (2)\", function() {\n        browserSync.notify(\"HI There\");\n        sinon.assert.calledWithExactly(emitterStub, \"browser:notify\", {\n            message: \"HI There\",\n            timeout: 2000,\n            override: true\n        });\n    });\n    it(\"should emit the browser:notify event with a timeout\", function() {\n        browserSync.notify(\"HI There\", 3000);\n        sinon.assert.calledWithExactly(emitterStub, \"browser:notify\", {\n            message: \"HI There\",\n            timeout: 3000,\n            override: true\n        });\n    });\n    it(\"should NOT emit the browser:notify event if a message was not provided\", function() {\n        browserSync.notify();\n        sinon.assert.notCalled(emitterStub);\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/api/init.pause.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"API: .pause() / .resume() file reloading - \", function() {\n    var bs;\n    before(function(done) {\n        browserSync.reset();\n        bs = browserSync(\n            {\n                logLevel: \"silent\"\n            },\n            done\n        );\n    });\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"should be unpaused\", function() {\n        assert.isFalse(browserSync.paused);\n    });\n\n    it(\"should pause file reload:\", function() {\n        browserSync.pause();\n        assert.isTrue(browserSync.paused);\n    });\n\n    it(\"should unpause file reload:\", function() {\n        browserSync.resume();\n        assert.isFalse(browserSync.paused);\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/api/init.reload.deprecated.js",
    "content": "var sinon = require(\"sinon\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"API: .reload() old signature\", function() {\n    delete require.cache[require.resolve(\"../../../\")];\n    var browserSync = require(\"../../../\");\n\n    var emitterStub, clock;\n\n    before(function() {\n        emitterStub = sinon.spy(browserSync.emitter, \"emit\");\n        clock = sinon.useFakeTimers();\n    });\n\n    afterEach(function() {\n        emitterStub.reset();\n        clock.now = 0;\n    });\n\n    after(function() {\n        clock.restore();\n        emitterStub.restore();\n    });\n\n    it(\"should handle a reload call without running instance\", function() {\n        assert.doesNotThrow(function() {\n            browserSync.reload({ stream: true });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/api/init.reload.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar sinon = require(\"sinon\");\nvar assert = require(\"chai\").assert;\nvar File = require(\"vinyl\");\n\ndescribe(\"API: .reload()\", function() {\n    it(\"should accept a file path as a string\", function(done) {\n        browserSync.reset();\n\n        var scheduler = require(\"../../utils\").getScheduler();\n\n        browserSync(\n            {\n                logLevel: \"silent\",\n                debug: {\n                    scheduler: scheduler\n                }\n            },\n            function(err, bs) {\n                var emitterStub = sinon.spy(bs.emitter, \"emit\");\n\n                browserSync.reload(\"css/core.css\");\n                scheduler.advanceTo(500);\n\n                sinon.assert.calledWithExactly(emitterStub, \"file:changed\", {\n                    path: \"css/core.css\",\n                    basename: \"core.css\",\n                    log: true,\n                    namespace: \"core\",\n                    event: \"change\",\n                    ext: \"css\"\n                });\n\n                bs.cleanup();\n\n                done();\n            }\n        );\n    });\n    it(\"only calls reload once if the array contains a filepath that will cause a reload\", function(done) {\n        browserSync.reset();\n\n        var scheduler = require(\"../../utils\").getScheduler();\n\n        browserSync(\n            {\n                logLevel: \"silent\",\n                debug: {\n                    scheduler: scheduler\n                }\n            },\n            function(err, bs) {\n                var emitterStub = sinon.spy(bs.emitter, \"emit\");\n\n                browserSync.reload([\"css/core.css\", \"index.html\"]);\n                scheduler.advanceTo(2000);\n\n                var calls = emitterStub.withArgs(\"browser:reload\");\n                assert.equal(calls.callCount, 1);\n                sinon.assert.calledWith(emitterStub, \"browser:reload\");\n\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n    it(\"calls reload multiple times if all items can be injected\", function(done) {\n        browserSync.reset();\n\n        var scheduler = require(\"../../utils\").getScheduler();\n\n        browserSync(\n            {\n                logLevel: \"silent\",\n                debug: {\n                    scheduler: scheduler\n                }\n            },\n            function(err, bs) {\n                var emitterStub = sinon.spy(bs.emitter, \"emit\");\n\n                browserSync.reload([\"css/core.css\", \"ie.css\"]);\n                scheduler.advanceTo(2000);\n\n                var calls = emitterStub.withArgs(\"file:changed\");\n                assert.equal(calls.callCount, 2);\n\n                sinon.assert.calledWithExactly(emitterStub, \"file:changed\", {\n                    path: \"css/core.css\",\n                    basename: \"core.css\",\n                    log: true,\n                    namespace: \"core\",\n                    event: \"change\",\n                    ext: \"css\"\n                });\n                sinon.assert.calledWithExactly(emitterStub, \"file:changed\", {\n                    path: \"ie.css\",\n                    basename: \"ie.css\",\n                    log: true,\n                    namespace: \"core\",\n                    event: \"change\",\n                    ext: \"css\"\n                });\n\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n    it(\"should accept wildcards for files extensions eg: *.css\", function(done) {\n        browserSync.reset();\n\n        var scheduler = require(\"../../utils\").getScheduler();\n\n        browserSync(\n            {\n                logLevel: \"silent\",\n                debug: {\n                    scheduler: scheduler\n                }\n            },\n            function(err, bs) {\n                var emitterStub = sinon.spy(bs.emitter, \"emit\");\n\n                browserSync.reload(\"*.css\");\n\n                scheduler.advanceTo(500);\n\n                sinon.assert.calledWithExactly(emitterStub, \"file:changed\", {\n                    path: \"*.css\",\n                    basename: \"*.css\",\n                    log: true,\n                    namespace: \"core\",\n                    event: \"change\",\n                    ext: \"css\"\n                });\n\n                bs.cleanup(done);\n            }\n        );\n    });\n    /**\n     * BACKWARDS COMPATIBILITY:\n     * This is an old signature that, whilst we must continue to support,\n     * is now deferred to the stream method.\n     */\n    it(\"should reload browser if once:true given as arg\", function(done) {\n        browserSync.reset();\n\n        var scheduler = require(\"../../utils\").getScheduler();\n\n        browserSync(\n            {\n                logLevel: \"silent\",\n                debug: {\n                    scheduler: scheduler\n                }\n            },\n            function(err, bs) {\n                var emitterStub = sinon.spy(bs.emitter, \"emit\");\n                var stream = browserSync.reload({ stream: true, once: true });\n                stream.write(new File({ path: \"styles.css\" }));\n                stream.write(new File({ path: \"styles2.css\" }));\n                stream.write(new File({ path: \"styles3.css\" }));\n                stream.end();\n                scheduler.advanceTo(600);\n                sinon.assert.calledWithExactly(emitterStub, \"_browser:reload\");\n                sinon.assert.calledWithExactly(emitterStub, \"browser:reload\");\n                bs.cleanup(done);\n            }\n        );\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/api/init.reload.multi.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar sinon = require(\"sinon\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"API: .reload() with multi instances\", function() {\n    var clock, bs1, bs2, emitter1, emitter2;\n\n    before(function(done) {\n        browserSync.reset();\n\n        browserSync\n            .create(\"Server 1\")\n            .init({ logLevel: \"silent\" }, function(err, bs) {\n                bs1 = bs;\n                emitter1 = sinon.spy(bs.events, \"emit\");\n                browserSync\n                    .create(\"Server 2\")\n                    .init({ logLevel: \"silent\" }, function(err, bs) {\n                        bs2 = bs;\n                        emitter2 = sinon.spy(bs.events, \"emit\");\n                        done();\n                    });\n            });\n\n        clock = sinon.useFakeTimers();\n    });\n\n    afterEach(function() {\n        clock.now = 0;\n    });\n\n    after(function() {\n        bs1.cleanup();\n        bs2.cleanup();\n        clock.restore();\n    });\n\n    it(\"should be callable with no args & perform a reload\", function() {\n        assert.doesNotThrow(function() {\n            browserSync.get(\"Server 1\").reload();\n            browserSync.get(\"Server 2\").reload();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/api/init.reload.stream.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar sinon = require(\"sinon\");\nvar assert = require(\"chai\").assert;\nvar File = require(\"vinyl\");\n\ndescribe(\"API: .stream()\", function() {\n    var emitterStub, bs, scheduler;\n\n    before(function(done) {\n        browserSync.reset();\n        scheduler = require(\"../../utils\").getScheduler();\n        bs = browserSync(\n            { logLevel: \"silent\", debug: { scheduler: scheduler } },\n            function() {\n                emitterStub = sinon.spy(bs.emitter, \"emit\");\n                done();\n            }\n        );\n    });\n\n    afterEach(function() {\n        emitterStub.reset();\n        scheduler.clock = 0;\n    });\n\n    after(function() {\n        bs.cleanup();\n        emitterStub.restore();\n    });\n\n    it(\"should handle a single file changed\", function() {\n        var stream = browserSync.stream();\n        stream.write(new File({ path: \"styles.css\" }));\n        stream.end();\n        scheduler.advanceTo(600);\n        sinon.assert.calledWithExactly(emitterStub, \"file:changed\", {\n            path: \"styles.css\",\n            basename: \"styles.css\",\n            log: false,\n            namespace: \"core\",\n            event: \"change\",\n            ext: \"css\"\n        });\n    });\n    it(\"should accept multiple files in stream\", function() {\n        var stream = browserSync.stream();\n        stream.write(new File({ path: \"styles.css\" }));\n        stream.write(new File({ path: \"styles2.css\" }));\n        stream.end();\n        scheduler.advanceTo(600);\n        sinon.assert.calledWithExactly(emitterStub, \"file:changed\", {\n            path: \"styles.css\",\n            basename: \"styles.css\",\n            log: false,\n            namespace: \"core\",\n            event: \"change\",\n            ext: \"css\"\n        });\n        sinon.assert.calledWithExactly(emitterStub, \"file:changed\", {\n            path: \"styles2.css\",\n            basename: \"styles2.css\",\n            log: false,\n            namespace: \"core\",\n            event: \"change\",\n            ext: \"css\"\n        });\n        sinon.assert.calledWithExactly(emitterStub, \"stream:changed\", {\n            changed: [\"styles.css\", \"styles2.css\"]\n        });\n    });\n    it(\"should reload browser if once:true given as arg\", function() {\n        var stream = browserSync.stream({ once: true });\n        stream.write(new File({ path: \"styles.css\" }));\n        stream.write(new File({ path: \"styles2.css\" }));\n        stream.write(new File({ path: \"styles3.css\" }));\n        scheduler.advanceTo(600);\n        stream.end();\n        sinon.assert.calledWithExactly(emitterStub, \"_browser:reload\");\n        sinon.assert.calledWithExactly(emitterStub, \"browser:reload\");\n    });\n    it(\"does not log file info if (once: true)\", function() {\n        var stream = browserSync.stream({ once: true });\n        stream.write(new File({ path: \"styles.js\" }));\n        stream.write(new File({ path: \"styles2.js\" }));\n        stream.write(new File({ path: \"styles3.js\" }));\n        stream.end();\n        scheduler.advanceTo(600);\n        sinon.assert.calledWithExactly(emitterStub, \"_browser:reload\");\n        sinon.assert.calledWithExactly(emitterStub, \"browser:reload\");\n    });\n    it(\"only emits file-changed event if filter matched\", function() {\n        var stream = browserSync.stream({ match: \"**/*.js\" });\n        stream.write(new File({ path: \"/users/shane/styles.js\" }));\n        stream.write(new File({ path: \"core.css\" }));\n        stream.end();\n        scheduler.advanceTo(8000);\n        sinon.assert.calledThrice(emitterStub);\n        sinon.assert.calledWithExactly(emitterStub, \"file:changed\", {\n            event: \"change\",\n            log: false,\n            namespace: \"core\",\n            path: \"/users/shane/styles.js\"\n        });\n        sinon.assert.calledWith(emitterStub, \"browser:reload\");\n        sinon.assert.calledWithExactly(emitterStub, \"stream:changed\", {\n            changed: [\"styles.js\"]\n        });\n    });\n    it(\"only emits file-changed event if filter returns no results\", function() {\n        var stream = browserSync.stream({ match: \"**/*.md\" });\n        stream.write(new File({ path: \"/users/shane/styles.js\" }));\n        stream.write(new File({ path: \"core.css\" }));\n        stream.write(new File({ path: \"index.html\" }));\n        stream.end();\n        scheduler.advanceTo(600);\n        sinon.assert.notCalled(emitterStub);\n    });\n    it(\"accepts file paths beginning with dots\", function() {\n        var stream = browserSync.stream({ match: \"**/*.css\" });\n        stream.write(new File({ path: \"/users/shakyshane/.tmp/css/core.css\" }));\n        stream.write(\n            new File({ path: \"/users/shakyshane/.tmp/css/core.css.map\" })\n        );\n        stream.end();\n        scheduler.advanceTo(600);\n        sinon.assert.calledWithExactly(emitterStub, \"file:changed\", {\n            path: \"/users/shakyshane/.tmp/css/core.css\",\n            basename: \"core.css\",\n            log: false,\n            namespace: \"core\",\n            event: \"change\",\n            ext: \"css\"\n        });\n        sinon.assert.calledWithExactly(emitterStub, \"file:reload\", {\n            ext: \"css\",\n            path: \"/users/shakyshane/.tmp/css/core.css\",\n            basename: \"core.css\",\n            type: \"inject\",\n            log: false,\n            event: \"change\"\n        });\n        sinon.assert.calledWithExactly(emitterStub, \"stream:changed\", {\n            changed: [\"core.css\"]\n        });\n    });\n    it(\"emits the stream:changed event with an array of changed files\", function() {\n        var stream = browserSync.stream();\n\n        stream.write(new File({ path: \"/users/shane/styles.js\" }));\n        stream.write(new File({ path: \"core.css\" }));\n        stream.write(new File({ path: \"index.html\" }));\n\n        stream.end();\n        scheduler.advanceTo(1000);\n\n        assert.equal(emitterStub.getCall(0).args[0], \"file:changed\");\n        assert.equal(emitterStub.getCall(1).args[0], \"file:changed\");\n        assert.equal(emitterStub.getCall(2).args[0], \"file:changed\");\n\n        assert.deepEqual(emitterStub.getCall(3).args, [\n            \"stream:changed\",\n            { changed: [\"styles.js\", \"core.css\", \"index.html\"] }\n        ]);\n\n        assert.equal(emitterStub.getCall(4).args[0], \"browser:reload\");\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/api/init.reload.stream.noop.js",
    "content": "var browserSync = require(\"../../../\");\nvar assert = require(\"chai\").assert;\nvar File = require(\"vinyl\");\nvar sinon = require(\"sinon\");\n\ndescribe(\"API: .stream() noop\", function() {\n    before(function() {\n        browserSync.reset();\n    });\n\n    it(\"should can handle a reload + stream call when there's no instance\", function() {\n        assert.doesNotThrow(function() {\n            var stream = browserSync.stream();\n            stream.write(new File({ path: \"styles.css\" }));\n            stream.end();\n        });\n    });\n    it(\"should can handle a reload + stream call after there IS an instance\", function(done) {\n        var emitterStub;\n        var scheduler = require(\"../../utils\").getScheduler();\n        var bs = browserSync({ debug: { scheduler: scheduler } }, function(\n            err,\n            _bs\n        ) {\n            var stream = bs.stream();\n\n            emitterStub = sinon.spy(_bs.emitter, \"emit\");\n\n            stream.write(new File({ path: \"styles.css\" }));\n            stream.end();\n\n            scheduler.advanceTo(600);\n\n            sinon.assert.calledWithExactly(emitterStub, \"file:changed\", {\n                path: \"styles.css\",\n                basename: \"styles.css\",\n                log: false,\n                namespace: \"core\",\n                event: \"change\",\n                ext: \"css\"\n            });\n            _bs.cleanup(done);\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/api/init.returns.js",
    "content": ""
  },
  {
    "path": "packages/browser-sync/test/specs/api/init.sockets.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"API: .sockets\", function() {\n    it(\"has access before Browsersync is running via stubs\", function(done) {\n        browserSync.reset();\n        var bs = browserSync.create();\n        bs.init(\n            {\n                logLevel: \"silent\"\n            },\n            function(err, bs) {\n                bs.cleanup();\n                done();\n            }\n        );\n        assert.isFunction(bs.sockets.on);\n        assert.isFunction(bs.sockets.emit);\n    });\n    it(\"has access after Browsersync is running\", function(done) {\n        browserSync.reset();\n        var bs = browserSync.create();\n        bs.init(\n            {\n                logLevel: \"silent\"\n            },\n            function(err, _bs) {\n                assert.isFunction(bs.sockets.emit);\n                assert.isFunction(bs.sockets.on);\n                _bs.cleanup();\n                done();\n            }\n        );\n    });\n    it(\"has access before Browsersync is running via main module export + stubs\", function(done) {\n        browserSync.reset();\n        var bs = browserSync(\n            {\n                logLevel: \"silent\"\n            },\n            function(err, bs) {\n                bs.cleanup();\n                done();\n            }\n        );\n        assert.isFunction(bs.sockets.on);\n        assert.isFunction(bs.sockets.emit);\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/api/watch.js",
    "content": "var browserSync = require(\"../../../\");\nvar path = require(\"path\");\nvar outpath = path.join(__dirname, \"../../fixtures\");\nvar fs = require(\"graceful-fs\");\n\nvar tempFileContent = \"A test generated this file and it is safe to delete\";\nvar writeTimeout = 150; // Wait for it to get to the filesystem\nvar assert = require(\"assert\");\n\nvar writeFileWait = function(name, content, cb) {\n    if (!cb) {\n        cb = function() {};\n    }\n    setTimeout(function() {\n        fs.writeFile(name, content, cb);\n    }, writeTimeout);\n};\n\ndescribe(\"API: .watch() - Public watch method\", function() {\n    it(\"Should allow arbitrary watchers with callback fn + no options when not connected to running instance\", function(done) {\n        browserSync.reset();\n\n        var tempFile = path.join(outpath, \"watch-func.txt\");\n        var bs = browserSync.create(\"test\");\n\n        fs.writeFile(tempFile, tempFileContent, function() {\n            var watcher = bs.watch(tempFile, function(event, file) {\n                assert.equal(event, \"add\");\n                assert.equal(file, tempFile);\n                watcher.close();\n                done();\n            });\n\n            writeFileWait(tempFile, tempFileContent + \" changed\");\n        });\n    });\n\n    it(\"Should allow arbitrary watchers with callback fn when not connected to running instance\", function(done) {\n        browserSync.reset();\n\n        var tempFile = path.join(outpath, \"watch-func.txt\");\n        var bs = browserSync.create(\"test\");\n\n        fs.writeFile(tempFile, tempFileContent, function() {\n            var watcher = bs.watch(tempFile, { ignoreInitial: true }, function(\n                event,\n                file\n            ) {\n                assert.equal(event, \"change\");\n                assert.equal(file, tempFile);\n                watcher.close();\n                done();\n            });\n\n            writeFileWait(tempFile, tempFileContent + \" changed\");\n        });\n    });\n\n    it(\"Should allow arbitrary watchers with event emitter fn when not connected to running instance\", function(done) {\n        browserSync.reset();\n\n        var tempFile = path.join(outpath, \"watch-func.txt\");\n        var bs = browserSync.create(\"test\");\n\n        fs.writeFile(tempFile, tempFileContent, function() {\n            var watcher = bs\n                .watch(tempFile, { ignoreInitial: true })\n                .on(\"change\", function(file) {\n                    assert.equal(file, tempFile);\n                    watcher.close();\n                    done();\n                });\n\n            writeFileWait(tempFile, tempFileContent + \" changed\");\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/cli/cli.exec.js",
    "content": "describe(\"CLI: exec\", function() {\n    this.timeout(10000);\n    it(\"Can launch from cli\", function(done) {\n        var strem = require(\"child_process\").spawn(\"node\", [\n            require.resolve(\"../../../dist/bin\"),\n            \"start\"\n        ]);\n        var chunks = [];\n        strem.stdout.on(\"data\", function(data) {\n            chunks.push(data.toString());\n            if (chunks.join(\"\").indexOf(\"Copy the following snippet\") > -1) {\n                strem.kill(\"SIGINT\");\n            } else {\n                done(new Error(\"missing output\"))\n            }\n        });\n        strem.on(\"close\", function() {\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/cli/cli.get.config.js",
    "content": "var info = require(\"../../../dist/cli/cli-info\");\nvar assert = require(\"chai\").assert;\nvar path = require(\"path\");\n\ndescribe(\"When reading a config file from the file system\", function() {\n    it(\"should throw if the file is not found\", function() {\n        assert.throws(function() {\n            info.getConfigFile(\"random/file/doesn'texist\");\n        });\n    });\n\n    it(\"should not throw if the file is found\", function() {\n        assert.isDefined(\n            info.getConfigFile(\"test/fixtures/config/si-config.js\")\n        );\n    });\n\n    it(\"should not throw if absolute path given\", function() {\n        var configPath = path.resolve(\"test/fixtures/config/si-config.js\");\n        assert.isDefined(info.getConfigFile(configPath));\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/cli/cli.help.js",
    "content": "const startOpts = require(\"../../../cli-options/opts.start\")\nconst initOpts = require(\"../../../cli-options/opts.init.json\")\nconst recipeOpts = require(\"../../../cli-options/opts.recipe.json\")\nconst reloadOpts = require(\"../../../cli-options/opts.reload.json\")\n\nfunction assertHelpOutput(args, cond, done) {\n    const stream = require(\"child_process\").spawn(\"node\", [\n        require.resolve(\"../../../dist/bin\"),\n    ].concat(args));\n    const chunks = [];\n    stream.stdout.on(\"data\", function (data) {\n        chunks.push(data.toString());\n        if (cond(chunks.join(\"\"))) {\n            stream.kill(\"SIGINT\");\n        } else {\n            done(new Error(`missing help output for args '${args.join(' ')}'`))\n        }\n    });\n    stream.on(\"close\", function () {\n        done();\n    });\n}\n\ndescribe(\"CLI: showing help\", function () {\n    this.timeout(10000);\n    it(\"--help\", function (done) {\n        assertHelpOutput([\"--help\"], text => text.includes(startOpts.serveStatic.desc), done)\n    });\n    it(\"start --help\", function (done) {\n        assertHelpOutput([\"start\", \"--help\"], text => text.includes(startOpts.serveStatic.desc), done)\n    });\n    it(\"init --help\", function (done) {\n        assertHelpOutput([\"init\", \"--help\"], text => text.includes('Usage: '), done)\n    });\n    it(\"reload --help\", function (done) {\n        assertHelpOutput([\"reload\", \"--help\"], text => text.includes(reloadOpts.url.desc), done)\n    });\n    it(\"recipe --help\", function (done) {\n        assertHelpOutput([\"recipe\", \"--help\"], text => text.includes(recipeOpts.output.desc), done)\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/cli/cli.info.js",
    "content": "var info = require(\"../../../dist/cli/cli-info\");\n\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\nvar fs = require(\"fs\");\n\ndescribe(\"CLI: Info Helpers:\", function() {\n    describe(\"When displaying the version number\", function() {\n        var consoleLogStub;\n        before(function() {\n            consoleLogStub = sinon.spy(console, \"log\");\n        });\n        after(function() {\n            console.log.restore();\n        });\n        it(\"should be a function\", function() {\n            assert.isDefined(info);\n        });\n        it(\"should have a getVersion method\", function() {\n            assert.isDefined(info.getVersion);\n        });\n        it(\"should return the correct version number (1)\", function() {\n            var pjson = {\n                version: \"2.0\"\n            };\n            var actual = info.getVersion(pjson);\n            assert.equal(actual, \"2.0\");\n        });\n        it(\"should return the correct version number (2)\", function() {\n            var pjson = {\n                version: \"3.0\"\n            };\n            var actual = info.getVersion(pjson);\n            assert.equal(actual, \"3.0\");\n        });\n        it(\"should log the version to the console\", function() {\n            var pjson = {\n                version: \"3.0\"\n            };\n            info.getVersion(pjson);\n            sinon.assert.calledWithExactly(consoleLogStub, \"3.0\");\n        });\n    });\n\n    describe(\"When creating the config file:\", function() {\n        var readStub;\n        var writeStub;\n        var consoleStub;\n\n        before(function() {\n            readStub = sinon.stub(fs, \"readFileSync\").returns(\"DATA\");\n            writeStub = sinon.stub(fs, \"writeFile\").yields(null);\n            consoleStub = sinon.spy(console, \"log\");\n        });\n        after(function() {\n            fs.writeFile.restore();\n            fs.readFileSync.restore();\n            console.log.restore();\n        });\n        it(\"should call the readFileSync method\", function(done) {\n            info.makeConfig(\"/Users/shakyshane\", function() {\n                sinon.assert.called(readStub);\n                done();\n            });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/cli/cli.options.files.js",
    "content": "var cli = require(\"../../../dist/cli/cli-options\");\nvar merge = cli.merge;\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"CLI: Options: Merging Options: Files\", function() {\n    it(\"should return the files property from string given\", function() {\n        var [imm] = merge({ files: \"css/*.css\" });\n        assert.deepEqual(\n            imm\n                .get(\"files\")\n                .get(\"core\")\n                .toJS(),\n            {\n                globs: [\"css/*.css\"],\n                objs: []\n            }\n        );\n    });\n    it(\"should return the files property from array given\", function() {\n        var [imm] = merge({ files: [\"css/*.css\", \"*.html\"] });\n        assert.deepEqual(\n            imm\n                .get(\"files\")\n                .get(\"core\")\n                .toJS(),\n            {\n                globs: [\"css/*.css\", \"*.html\"],\n                objs: []\n            }\n        );\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/cli/cli.options.ghost.js",
    "content": "var cli = require(\"../../../dist/cli/cli-options\");\nvar merge = cli.merge;\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"CLI: Options: Merging Ghostmode options\", function() {\n    it(\"should merge ghost mode set to false from cli\", function() {\n        var [imm] = merge({\n            ghostMode: {\n                clicks: false\n            }\n        });\n        assert.isFalse(imm.getIn([\"ghostMode\", \"clicks\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"scroll\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"location\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"forms\", \"submit\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"forms\", \"inputs\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"forms\", \"toggles\"]));\n    });\n    it(\"should merge nested ghost mode prop\", function() {\n        var [imm] = merge({\n            ghostMode: {\n                forms: {\n                    submit: false\n                }\n            }\n        });\n        assert.isTrue(imm.getIn([\"ghostMode\", \"clicks\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"scroll\"]));\n        assert.isFalse(imm.getIn([\"ghostMode\", \"forms\", \"submit\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"forms\", \"inputs\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"forms\", \"toggles\"]));\n    });\n    it(\"should merge ghost mode set to false\", function() {\n        var [imm] = merge({\n            ghostMode: false\n        });\n        assert.isFalse(imm.getIn([\"ghostMode\", \"clicks\"]));\n        assert.isFalse(imm.getIn([\"ghostMode\", \"scroll\"]));\n        assert.isFalse(imm.getIn([\"ghostMode\", \"forms\", \"submit\"]));\n        assert.isFalse(imm.getIn([\"ghostMode\", \"forms\", \"inputs\"]));\n        assert.isFalse(imm.getIn([\"ghostMode\", \"forms\", \"toggles\"]));\n    });\n    it(\"should merge ghost mode set to true\", function() {\n        var [imm] = merge({\n            ghostMode: true\n        });\n        assert.isTrue(imm.getIn([\"ghostMode\", \"clicks\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"scroll\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"forms\", \"submit\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"forms\", \"inputs\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"forms\", \"toggles\"]));\n    });\n    it(\"should merge ghost mode forms set to false\", function() {\n        var [imm] = merge({\n            ghostMode: {\n                forms: false\n            }\n        });\n        assert.isTrue(imm.getIn([\"ghostMode\", \"clicks\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"scroll\"]));\n        assert.isFalse(imm.getIn([\"ghostMode\", \"forms\", \"submit\"]));\n        assert.isFalse(imm.getIn([\"ghostMode\", \"forms\", \"inputs\"]));\n        assert.isFalse(imm.getIn([\"ghostMode\", \"forms\", \"toggles\"]));\n    });\n    it(\"should merge ghost mode forms set to true\", function() {\n        var [imm] = merge({\n            ghostMode: {\n                forms: true\n            }\n        });\n        assert.isTrue(imm.getIn([\"ghostMode\", \"clicks\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"scroll\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"forms\", \"submit\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"forms\", \"inputs\"]));\n        assert.isTrue(imm.getIn([\"ghostMode\", \"forms\", \"toggles\"]));\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/cli/cli.options.ignore.js",
    "content": "var cli = require(\"../../../dist/cli/cli-options\");\nvar merge = cli.merge;\nvar assert = require(\"chai\").assert;\n\ndescribe(\"CLI: Options: dealing with 'ignore' option\", function() {\n    it(\"watches in server mode (no files given)\", function() {\n        var cwd = \"/Users/shakyshane/app\";\n        var input = {\n            server: true,\n            files: [\"**/*\"],\n            ignore: [\"**/*.php\"],\n            cwd: cwd\n        };\n        var config = merge(input)[0].toJS();\n        assert.deepEqual(config.files, { core: { globs: [\"**/*\"], objs: [] } });\n        assert.ok(config.watchOptions.ignored.indexOf(\"**/*.php\") > -1);\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/cli/cli.options.ports.js",
    "content": "var options = require(\"../../../dist/cli/cli-options\");\nvar merge = options.merge;\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"CLI: Options: Merging Ports option\", function() {\n    it(\"should return the ports object with given ports\", function() {\n        var [imm] = merge({\n            ports: \"3001,3005\"\n        });\n        assert.deepEqual(imm.get(\"ports\").toJS(), {\n            min: 3001,\n            max: 3005\n        });\n    });\n    it(\"should return the ports object with single port given\", function() {\n        var [imm] = merge({\n            ports: \"3001\"\n        });\n        assert.deepEqual(imm.get(\"ports\").toJS(), {\n            min: 3001,\n            max: null\n        });\n    });\n    it(\"should return the ports object with given object\", function() {\n        var [imm] = merge({\n            ports: {\n                min: 4000\n            }\n        });\n        assert.deepEqual(imm.get(\"ports\").toJS(), {\n            min: 4000,\n            max: null\n        });\n    });\n    it(\"should return the ports object with given object\", function() {\n        var [imm] = merge({\n            ports: {\n                min: 4000,\n                max: 5000\n            }\n        });\n        assert.deepEqual(imm.get(\"ports\").toJS(), {\n            min: 4000,\n            max: 5000\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/cli/cli.options.proxy.js",
    "content": "var cli = require(\"../../../dist/cli/cli-options\");\nvar merge = cli.merge;\nvar assert = require(\"chai\").assert;\n\ndescribe(\"CLI: Options: Merging Proxy Options\", function() {\n    var defaultValue;\n\n    beforeEach(function() {\n        defaultValue = false;\n    });\n\n    it(\"should merge a url with HTTP\", function() {\n        var [imm] = merge({\n            proxy: \"http://localhost:8000\"\n        });\n        var out = imm.get(\"proxy\").toJS();\n        assert.equal(out.target, \"http://localhost:8000\");\n    });\n    it(\"should merge a url with HTTPS\", function() {\n        var [imm] = merge({\n            proxy: \"https://localhost:8010\"\n        });\n        var out = imm.get(\"proxy\").toJS();\n        assert.equal(out.target, \"https://localhost:8010\");\n    });\n    it(\"should merge a url with no protocol\", function() {\n        var [imm] = merge({\n            proxy: \"localhost:8010\"\n        });\n        var out = imm.get(\"proxy\").toJS();\n        assert.equal(out.target, \"http://localhost:8010\");\n    });\n    it(\"should merge IP hostname\", function() {\n        var [imm] = merge({\n            proxy: \"192.168.0.4\"\n        });\n        var out = imm.get(\"proxy\").toJS();\n        assert.equal(out.target, \"http://192.168.0.4\");\n    });\n    it(\"should merge IP hostname with port\", function() {\n        var [imm] = merge({\n            proxy: \"192.168.0.4:9001\"\n        });\n        assert.equal(imm.getIn([\"proxy\", \"target\"]), \"http://192.168.0.4:9001\");\n        assert.equal(imm.getIn([\"proxy\", \"url\", \"port\"]), 9001);\n    });\n    it(\"should merge a url with no protocol & no port\", function() {\n        var [imm] = merge({\n            proxy: \"localhost\"\n        });\n        assert.equal(imm.getIn([\"proxy\", \"url\", \"port\"]), 80);\n    });\n    it(\"should merge a url with no protocol & no port\", function() {\n        var [imm] = merge({\n            proxy: \"local.dev\"\n        });\n        assert.equal(imm.getIn([\"proxy\", \"target\"]), \"http://local.dev\");\n    });\n    describe(\"Setting the start path\", function() {\n        it(\"should merge a url with path\", function() {\n            var [imm] = merge({\n                proxy: \"http://local.dev/subdir\"\n            });\n            assert.equal(imm.getIn([\"proxy\", \"target\"]), \"http://local.dev\");\n        });\n        it(\"should merge a url with path & query params\", function() {\n            var [imm] = merge({\n                proxy: \"http://local.dev/subdir/another/path?rel=123\"\n            });\n            assert.equal(imm.getIn([\"proxy\", \"target\"]), \"http://local.dev\");\n            assert.equal(imm.getIn([\"proxy\", \"url\", \"port\"]), 80);\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/cli/cli.options.server.js",
    "content": "var cli = require(\"../../../dist/cli/cli-options\");\nvar merge = cli.merge;\nvar assert = require(\"chai\").assert;\n\ndescribe(\"CLI: Options: Merging Server Options\", function() {\n    it(\"doesn't touch server option if not given in user config\", function() {\n        var [imm] = merge({});\n        assert.deepEqual(imm.get(\"server\"), false);\n    });\n    it(\"should merge when only basedir given\", function() {\n        var [imm] = merge({ server: \"base\" });\n        assert.deepEqual(imm.get(\"server\").toJS(), {\n            baseDir: [\"base\"],\n            serveStaticOptions: {\n                index: \"index.html\"\n            }\n        });\n    });\n    it(\"should merge when only `true` given`\", function() {\n        var [imm] = merge({ server: true });\n        assert.deepEqual(imm.get(\"server\").toJS(), {\n            baseDir: [\"./\"],\n            serveStaticOptions: {\n                index: \"index.html\"\n            }\n        });\n    });\n    it(\"should merge when only an array` given`\", function() {\n        var [imm] = merge({ server: [\"./dist\", \".tmp\"] });\n        assert.deepEqual(imm.get(\"server\").toJS(), {\n            baseDir: [\"./dist\", \".tmp\"],\n            serveStaticOptions: {\n                index: \"index.html\"\n            }\n        });\n    });\n    it(\"should merge when nested props given\", function() {\n        var [imm] = merge({\n            server: {\n                baseDir: \"./app\"\n            }\n        });\n        assert.deepEqual(imm.get(\"server\").toJS(), {\n            baseDir: [\"./app\"],\n            serveStaticOptions: {\n                index: \"index.html\"\n            }\n        });\n    });\n    it(\"should merge when multiple nested props given\", function() {\n        var [imm] = merge({\n            server: {\n                index: \"index.htm\",\n                baseDir: \"./app\",\n                middleware: function() {\n                    console.log(\"from fn\");\n                }\n            }\n        });\n        assert.equal(imm.getIn([\"server\", \"baseDir\", 0]), \"./app\");\n        assert.equal(imm.getIn([\"server\", \"index\"]), \"index.htm\");\n        assert.isFunction(imm.getIn([\"server\", \"middleware\"]));\n    });\n    it(\"can merge cli flags into object (1)\", function() {\n        var argv = {\n            server: true,\n            index: \"index.htm\"\n        };\n        var [imm] = merge(argv);\n        assert.deepEqual(imm.get(\"server\").toJS(), {\n            baseDir: [\"./\"],\n            index: \"index.htm\",\n            serveStaticOptions: {\n                index: \"index.htm\"\n            }\n        });\n    });\n    it(\"can merge cli flags into object (2)\", function() {\n        var argv = {\n            server: true,\n            directory: true\n        };\n        var [imm] = merge(argv);\n        assert.deepEqual(imm.get(\"server\").toJS(), {\n            baseDir: [\"./\"],\n            directory: true,\n            serveStaticOptions: {\n                index: \"index.html\"\n            }\n        });\n    });\n    it(\"can merge cli flags into object (3)\", function() {\n        var argv = {\n            server: true,\n            directory: true\n        };\n        var [imm] = merge(argv);\n        assert.deepEqual(imm.get(\"server\").toJS(), {\n            baseDir: [\"./\"],\n            directory: true,\n            serveStaticOptions: {\n                index: \"index.html\"\n            }\n        });\n    });\n    it(\"can merge cli flags into object (4)\", function() {\n        var [imm] = merge({\n            server: \"app\",\n            directory: true,\n            index: \"file.html\"\n        });\n        assert.deepEqual(imm.get(\"server\").toJS(), {\n            baseDir: [\"app\"],\n            directory: true,\n            index: \"file.html\",\n            serveStaticOptions: {\n                index: \"file.html\"\n            }\n        });\n    });\n    it(\"can set baseDir when only routes are provided\", function() {\n        var [imm] = merge({\n            server: {\n                routes: {\n                    \"/node_modules\": \"node_modules\"\n                }\n            }\n        });\n        assert.deepEqual(imm.get(\"server\").toJS(), {\n            routes: { \"/node_modules\": \"node_modules\" },\n            baseDir: [\"./\"],\n            serveStaticOptions: { index: \"index.html\" }\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/cli/cli.options.watch.js",
    "content": "var cli = require(\"../../../dist/cli/cli-options\");\nvar merge = cli.merge;\nvar assert = require(\"chai\").assert;\n\ndescribe(\"CLI: Options: Merging Watch Option\", function() {\n    it(\"watches in server mode (no files given)\", function() {\n        var input = { server: true, watch: true };\n        var config = merge(input)[0].toJS();\n        assert.deepEqual(config.files, { core: { globs: [\".\"], objs: [] } });\n        assert.ok(config.watchOptions.ignored.length);\n    });\n    it(\"watches in server mode (files given also)\", function() {\n        var input = { server: true, watch: true, files: [\"/shane\"] };\n        var config = merge(input)[0].toJS();\n        assert.deepEqual(config.files, {\n            core: { globs: [\"/shane\", \".\"], objs: [] }\n        });\n    });\n    it(\"does not add default ignore paths if watch option is absent\", function() {\n        var input = { server: true, files: [\"/shane\"] };\n        var config = merge(input)[0].toJS();\n        assert.isUndefined(config.watchOptions.ignored);\n    });\n    it(\"does not add 'default' ignore options if 'ignore' provided in config\", function() {\n        var input = {\n            server: true,\n            files: [\"/shane\"],\n            ignore: [\"/shane/*.css\"]\n        };\n        var config = merge(input)[0].toJS();\n        assert.deepEqual(config.watchOptions.ignored, [\"/shane/*.css\"]);\n    });\n    it(\"watches from serveStatic option (no files given also)\", function() {\n        var input = { serveStatic: [\"./test\"], watch: true };\n        var config = merge(input)[0].toJS();\n        assert.deepEqual(config.files, {\n            core: { globs: [\"./test\"], objs: [] }\n        });\n    });\n    it(\"watches from serveStatic option (files given also)\", function() {\n        var input = {\n            serveStatic: [\"./test\"],\n            watch: true,\n            files: [\"/some-path\"]\n        };\n        var config = merge(input)[0].toJS();\n        assert.deepEqual(config.files, {\n            core: { globs: [\"/some-path\", \"./test\"], objs: [] }\n        });\n    });\n    it(\"watches from server as string option\", function() {\n        var input = { server: \"./test\", watch: true };\n        var config = merge(input)[0].toJS();\n        assert.deepEqual(config.files, {\n            core: { globs: [\"./test\"], objs: [] }\n        });\n    });\n    it(\"watches from server as Array<string> option\", function() {\n        var input = { server: [\"./test\", \".tmp\"], watch: true };\n        var config = merge(input)[0].toJS();\n        assert.deepEqual(config.files, {\n            core: { globs: [\"./test\", \".tmp\"], objs: [] }\n        });\n    });\n    it(\"watches from server.baseDir as string\", function() {\n        var input = { server: { baseDir: \"./test\" }, watch: true };\n        var config = merge(input)[0].toJS();\n        assert.deepEqual(config.files, {\n            core: { globs: [\"./test\"], objs: [] }\n        });\n    });\n    it(\"watches from server.baseDir as Array<string>\", function() {\n        var input = { server: { baseDir: [\"./test\", \".tmp\"] }, watch: true };\n        var config = merge(input)[0].toJS();\n        assert.deepEqual(config.files, {\n            core: { globs: [\"./test\", \".tmp\"], objs: [] }\n        });\n    });\n    it(\"merges from ignore path (string)\", function() {\n        var input = { server: [\".\"], watch: true, ignore: \"*.json\" };\n        var [config] = merge(input);\n        assert.ok(config.getIn([\"watchOptions\", \"ignored\"]).contains(\"*.json\"));\n    });\n    it(\"merges from ignore path + watchOptions (string)\", function() {\n        var input = {\n            server: [\".\"],\n            watch: true,\n            ignore: \"*.json\",\n            watchOptions: { ignored: \"*.txt\" }\n        };\n        var [config] = merge(input);\n        assert.ok(config.getIn([\"watchOptions\", \"ignored\"]).contains(\"*.txt\"));\n        assert.ok(config.getIn([\"watchOptions\", \"ignored\"]).contains(\"*.json\"));\n    });\n    it(\"merges from ignore path + watchOptions (Array<string>)\", function() {\n        var input = {\n            server: [\".\"],\n            watch: true,\n            ignore: [\"*.json\", \"*.json2\"],\n            watchOptions: { ignored: [\"*.txt\", \"*.txt2\"] }\n        };\n        var [config] = merge(input);\n        assert.ok(config.getIn([\"watchOptions\", \"ignored\"]).contains(\"*.txt\"));\n        assert.ok(config.getIn([\"watchOptions\", \"ignored\"]).contains(\"*.txt2\"));\n        assert.ok(config.getIn([\"watchOptions\", \"ignored\"]).contains(\"*.json\"));\n        assert.ok(\n            config.getIn([\"watchOptions\", \"ignored\"]).contains(\"*.json2\")\n        );\n    });\n    it(\"merges from server, serveStatic + ignore path + watchOptions (Array<string>)\", function() {\n        var input = {\n            server: [\".\"],\n            watch: true,\n            ignore: [\"*.json\", \"*.json2\"],\n            watchOptions: { ignored: [\"*.txt\", \"*.txt2\"] }\n        };\n        var [config] = merge(input);\n        assert.ok(config.getIn([\"watchOptions\", \"ignored\"]).contains(\"*.txt\"));\n        assert.ok(config.getIn([\"watchOptions\", \"ignored\"]).contains(\"*.txt2\"));\n        assert.ok(config.getIn([\"watchOptions\", \"ignored\"]).contains(\"*.json\"));\n        assert.ok(\n            config.getIn([\"watchOptions\", \"ignored\"]).contains(\"*.json2\")\n        );\n    });\n    it(\"merges from server, serveStatic + ignore path + watchOptions.ignore (string)\", function() {\n        var input = {\n            server: [\".\"],\n            watch: true,\n            ignore: [\"*.json\", \"*.json2\"],\n            watchOptions: { ignored: \"*.txt\" }\n        };\n        var [config] = merge(input);\n\n        assert.ok(config.getIn([\"watchOptions\", \"ignored\"]).contains(\"*.json\"));\n        assert.ok(\n            config.getIn([\"watchOptions\", \"ignored\"]).contains(\"*.json2\")\n        );\n        assert.ok(config.getIn([\"watchOptions\", \"ignored\"]).contains(\"*.txt\"));\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/cli/cli.options.watchOptions.cwd.js",
    "content": "var cli = require(\"../../../dist/cli/cli-options\");\nvar merge = cli.merge;\nvar assert = require(\"chai\").assert;\n\ndescribe(\"ensures the CWD is transferred to the watchOptions.cwd \", function() {\n    it(\"add cwd with files option\", function() {\n        var cwd = \"/Users/shakyshane/app\";\n        var input = { server: true, files: \"**/*.html\", cwd: cwd };\n        var config = merge(input)[0].toJS();\n        assert.deepEqual(config.watchOptions.cwd, \"/Users/shakyshane/app\");\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/commands/recipes.js",
    "content": "require(\"source-map-support\").install();\n\nvar path = require(\"path\");\n\nvar pkg = require(path.resolve(\"package.json\"));\nvar sinon = require(\"sinon\");\nvar logger = require(\"../../../dist/logger\").logger;\nvar assert = require(\"chai\").assert;\nvar cli = require(path.resolve(pkg.bin)).default;\nvar fs = require(\"fs\");\nvar rim = require(\"rimraf\").sync;\nvar chalk       = require(\"chalk\");\n\ndescribe(\"E2E CLI `recipes` command\", function() {\n    it(\"works with no output flag\", function(done) {\n        rim(\"./server\");\n        cli({\n            cli: {\n                input: [\"recipe\", \"server\"],\n                flags: {}\n            },\n            cb: function() {\n                assert.isTrue(fs.existsSync(\"./server\"));\n                rim(\"./server\");\n                done();\n            }\n        });\n    });\n    it(\"lists all available when no second arg given\", function(done) {\n        var stub1 = sinon.stub(logger, \"info\");\n        var stub2 = sinon.stub(console, \"log\");\n\n        cli({\n            cli: {\n                input: [\"recipe\"],\n                flags: {}\n            },\n            cb: function() {\n                sinon.assert.calledWith(stub1, \"No recipe name provided!\");\n                sinon.assert.calledWith(\n                    stub1,\n                    \"Install one of the following with %s\\n\",\n                    chalk.cyan('browser-sync recipe <name>')\n                );\n\n                logger.info.restore();\n                console.log.restore();\n\n                var calls = stub2.getCalls().map(function(call) {\n                    return call.args[0].trim();\n                });\n\n                assert.include(calls, \"gulp.pug\");\n                assert.include(calls, \"server\");\n                assert.include(calls, \"html.injection\");\n                done();\n            }\n        });\n    });\n    it(\"Does not overwrite existing dir\", function(done) {\n        cli({\n            cli: {\n                input: [\"recipe\", \"server\"],\n                flags: {\n                    output: \"test/fixtures\"\n                }\n            },\n            cb: function(err) {\n                assert.equal(\n                    err.message,\n                    \"Target folder exists remove it first and then try again\"\n                );\n                done();\n            }\n        });\n    });\n    it(\"accepts --output flag\", function(done) {\n        var stub1 = sinon.stub(logger, \"info\");\n        cli({\n            cli: {\n                input: [\"recipe\", \"server\"],\n                flags: {\n                    output: \"test/recipes/server1\"\n                }\n            },\n            cb: function() {\n                var dir = path.resolve(\"./test/recipes/server1\");\n                assert.isTrue(fs.existsSync(\"test/recipes/server1\"));\n                rim(\"test/recipes/server1\");\n                var call1 = stub1.getCall(0).args;\n                assert.equal(call1[0], \"Recipe copied into %s\");\n                assert.equal(call1[1], chalk.cyan(dir));\n                sinon.assert.calledWith(\n                    stub1,\n                    \"Next, inside that folder, run %s\",\n                    chalk.cyan(\"npm i && npm start\")\n                );\n                logger.info.restore();\n                done();\n            }\n        });\n    });\n    it(\"Loges recipes when not found\", function(done) {\n        var stub1 = sinon.stub(logger, \"info\");\n        var stub2 = sinon.stub(console, \"log\");\n\n        cli({\n            cli: {\n                input: [\"recipe\", \"beepboop\"],\n                flags: {}\n            },\n            cb: function(err) {\n                var call1 = stub1.getCall(0).args;\n                sinon.assert.calledWith(stub1,\n                    \"Recipe %s not found. The following are available though\",\n                    chalk.cyan(\"beepboop\")\n                )\n\n                var calls = stub2.getCalls().map(function(call) {\n                    return call.args[0].trim();\n                });\n\n                assert.include(calls, \"gulp.pug\");\n                assert.include(calls, \"server\");\n                assert.include(calls, \"html.injection\");\n\n                logger.info.restore();\n                console.log.restore();\n\n                done();\n            }\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/commands/reload.js",
    "content": "var path = require(\"path\");\nvar browserSync = require(path.resolve(\"./\"));\n\nvar pkg = require(path.resolve(\"package.json\"));\nvar sinon = require(\"sinon\");\nvar assert = require(\"chai\").assert;\nvar cli = require(path.resolve(pkg.bin)).default;\n\ndescribe(\"E2E CLI `reload` with no files arg\", function() {\n    it(\"should make a http request to the protocol with no files arg\", function(done) {\n        browserSync.reset();\n        var scheduler = require(\"../../utils\").getScheduler();\n        browserSync.create().init(\n            {\n                server: \"test/fixtures\",\n                open: false,\n                debug: { scheduler: scheduler }\n            },\n            function(err, bs) {\n                var spy = sinon.spy(bs.events, \"emit\");\n\n                cli({\n                    cli: {\n                        input: [\"reload\"],\n                        flags: {\n                            port: bs.options.get(\"port\")\n                        }\n                    },\n                    cb: function() {\n                        scheduler.advanceTo(600);\n                        sinon.assert.calledWithExactly(spy, \"browser:reload\");\n                        bs.cleanup();\n                        done();\n                    }\n                });\n            }\n        );\n    });\n\n    it(\"should make a http request with files arg\", function(done) {\n        browserSync.reset();\n        var scheduler = require(\"../../utils\").getScheduler();\n        browserSync.create().init(\n            {\n                server: \"test/fixtures\",\n                open: false,\n                debug: { scheduler: scheduler }\n            },\n            function(err, bs) {\n                var spy = sinon.spy(bs.events, \"emit\");\n\n                cli({\n                    cli: {\n                        input: [\"reload\"],\n                        flags: {\n                            port: bs.options.get(\"port\"),\n                            files: \"core.css\"\n                        }\n                    },\n                    cb: function() {\n                        scheduler.advanceTo(600);\n                        sinon.assert.calledWithExactly(spy, \"file:changed\", {\n                            path: \"core.css\",\n                            basename: \"core.css\",\n                            log: true,\n                            namespace: \"core\",\n                            event: \"change\",\n                            ext: \"css\"\n                        });\n                        bs.cleanup();\n                        done();\n                    }\n                });\n            }\n        );\n    });\n    it(\"should make a http request with files arg over HTTPS\", function(done) {\n        browserSync.reset();\n        var scheduler = require(\"../../utils\").getScheduler();\n        browserSync.create().init(\n            {\n                server: \"test/fixtures\",\n                open: false,\n                https: true,\n                debug: { scheduler: scheduler }\n            },\n            function(err, bs) {\n                var spy = sinon.spy(bs.events, \"emit\");\n\n                cli({\n                    cli: {\n                        input: [\"reload\"],\n                        flags: {\n                            url: bs.options.getIn([\"urls\", \"local\"]),\n                            files: \"core.css\"\n                        }\n                    },\n                    cb: function() {\n                        scheduler.advanceTo(600);\n                        sinon.assert.calledWithExactly(spy, \"file:changed\", {\n                            path: \"core.css\",\n                            basename: \"core.css\",\n                            ext: \"css\",\n                            log: true,\n                            namespace: \"core\",\n                            event: \"change\"\n                        });\n                        bs.cleanup();\n                        done();\n                    }\n                });\n            }\n        );\n    });\n    it.skip(\"should handle ECONNREFUSED errors nicely\", function(done) {\n        cli({\n            cli: {\n                input: [\"reload\"],\n                flags: {}\n            },\n            cb: function(err) {\n                assert.equal(err.code, \"ECONNREFUSED\");\n                assert.equal(\n                    err.message,\n                    \"Browsersync not running at http://localhost:3000\"\n                );\n                done();\n            }\n        });\n    });\n    it.skip(\"should handle non 200 code results\", function(done) {\n        cli({\n            cli: {\n                input: [\"reload\"],\n                flags: {}\n            },\n            cb: function(err) {\n                assert.equal(err.code, \"ECONNREFUSED\");\n                assert.equal(\n                    err.message,\n                    \"Browsersync not running at http://localhost:3000\"\n                );\n                done();\n            }\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/cli/e2e.cli.conf.js",
    "content": "var path = require(\"path\");\nvar browserSync = require(path.resolve(\"./\"));\nvar pkg = require(path.resolve(\"package.json\"));\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\nvar fs = require(\"fs\");\nvar cli = require(path.resolve(pkg.bin)).default;\nvar utils = require(\"../../../../dist/utils\");\n\ndescribe(\"CLI: reading config file from disk\", function() {\n    it(\"reads a config file\", function(done) {\n        browserSync.reset();\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    logLevel: \"silent\",\n                    config: \"test/fixtures/config/si-config.js\",\n                    open: false\n                }\n            },\n            cb: function(err, bs) {\n                assert.equal(\n                    bs.options.getIn([\"server\", \"baseDir\", 0]),\n                    \"test/fixtures\"\n                );\n                bs.cleanup();\n                done();\n            }\n        });\n    });\n    it(\"returns an error if a config file does not exist\", function(done) {\n        var stub = require(\"sinon\").stub(utils, \"fail\");\n        browserSync.reset();\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    logLevel: \"silent\",\n                    config: \"test/fixtures/config/sioops.js\",\n                    open: false\n                }\n            },\n            cb: function(err, bs) {\n                var err = stub.getCall(0).args[1];\n                assert.equal(\n                    err.message,\n                    \"Configuration file 'test/fixtures/config/sioops.js' not found\"\n                );\n                utils.fail.restore();\n                bs.cleanup();\n                done();\n            }\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/cli/e2e.cli.error.js",
    "content": "var path = require(\"path\");\nvar assert = require(\"chai\").assert;\nvar browserSync = require(path.resolve(\"./\"));\n\nvar pkg = require(path.resolve(\"package.json\"));\nvar cli = require(path.resolve(pkg.bin)).default;\n\ndescribe.skip(\"E2E CLI - fail on invalid config\", function() {\n    var stub;\n\n    before(function(done) {\n        browserSync.reset();\n        stub = require(\"sinon\").stub(process, \"exit\");\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    logLevel: \"silent\",\n                    server: true,\n                    proxy: \"http://bbc.co.uk\"\n                }\n            },\n            cb: function() {\n                done();\n            }\n        });\n    });\n    it(\"should fail with exit code 1 when both proxy & server config given\", function(done) {\n        require(\"sinon\").assert.called(stub);\n        assert.equal(stub.getCall(0).args[0], 1);\n        process.exit.restore();\n        done();\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/cli/e2e.cli.files.js",
    "content": "var path = require(\"path\");\nvar assert = require(\"chai\").assert;\nvar browserSync = require(path.resolve(\"./\"));\n\nvar pkg = require(path.resolve(\"package.json\"));\nvar cli = require(path.resolve(pkg.bin)).default;\n\ndescribe(\"E2E CLI `files` arg - multi globs\", function() {\n    it(\"Converts cli files arg to correct namespaced watchers\", function(done) {\n        browserSync.reset();\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    logLevel: \"silent\",\n                    open: false,\n                    files: [\"*.html, css/*.css\"]\n                }\n            },\n            cb: function(err, bs) {\n                assert.equal(\n                    bs.options.getIn([\"files\", \"core\", \"globs\"]).size,\n                    2\n                );\n                assert.isTrue(Array.isArray(bs.watchers.core.watchers));\n                bs.cleanup();\n                done();\n            }\n        });\n    });\n});\n\ndescribe(\"E2E CLI `files` arg, single glob\", function() {\n    it(\"Converts cli files arg to correct namespaced watchers\", function(done) {\n        browserSync.reset();\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    logLevel: \"silent\",\n                    open: false,\n                    files: [\"*.html\"]\n                }\n            },\n            cb: function(err, bs) {\n                assert.equal(\n                    bs.options.getIn([\"files\", \"core\", \"globs\"]).size,\n                    1\n                );\n                assert.isTrue(Array.isArray(bs.watchers.core.watchers));\n                bs.cleanup();\n                done();\n            }\n        });\n    });\n});\n\ndescribe(\"E2E CLI `files` arg, with commas\", function() {\n    it(\"Converts cli files arg\", function(done) {\n        browserSync.reset();\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    logLevel: \"silent\",\n                    open: false,\n                    files: [\"*.css,*.html\"]\n                }\n            },\n            cb: function(err, bs) {\n                assert.equal(\n                    bs.options.getIn([\"files\", \"core\", \"globs\"]).size,\n                    2\n                );\n                assert.isTrue(Array.isArray(bs.watchers.core.watchers));\n                bs.cleanup();\n                done();\n            }\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/cli/e2e.cli.init.js",
    "content": "var assert = require(\"chai\").assert;\nvar fs = require(\"fs\");\nvar path = require(\"path\");\n\nvar pkg = require(path.resolve(\"package.json\"));\nvar cli = require(path.resolve(pkg.bin)).default;\n\ndescribe(\"E2E CLI init test\", function() {\n    before(function(done) {\n        cli({\n            cli: {\n                input: [\"init\"],\n                flags: {}\n            },\n            cb: done\n        });\n    });\n\n    after(function(done) {\n        fs.unlink(\"bs-config.js\", done);\n    });\n\n    it(\"creates a config file in cwd\", function() {\n        assert.equal(fs.existsSync(\"bs-config.js\"), true);\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/cli/e2e.cli.plugins.js",
    "content": "var path = require(\"path\");\nvar assert = require(\"chai\").assert;\nvar browserSync = require(path.resolve(\"./\"));\n\nvar pkg = require(path.resolve(\"package.json\"));\nvar cli = require(path.resolve(pkg.bin)).default;\n\ndescribe(\"E2E CLI `plugins` arg\", function() {\n    it(\"allows plugins to be registered by 'require' name only\", function(done) {\n        browserSync.reset();\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    logLevel: \"silent\",\n                    open: false,\n                    plugins: [\"bs-snippet-injector\"]\n                }\n            },\n            cb: function(err, bs) {\n                if (err) return done(err);\n                var plugin = bs.getUserPlugin(\"Snippet Injector\");\n                assert.equal(plugin.name, \"Snippet Injector\");\n                assert.equal(plugin.active, true);\n                bs.cleanup();\n                done();\n            }\n        });\n    });\n    it(\"allows plugins to be registered by 'require' name + opts\", function(done) {\n        browserSync.reset();\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    logLevel: \"silent\",\n                    open: false,\n                    plugins: [\"bs-snippet-injector?files[]=*.html\"]\n                }\n            },\n            cb: function(err, bs) {\n                var plugin = bs.getUserPlugin(\"Snippet Injector\");\n                assert.equal(plugin.name, \"Snippet Injector\");\n                assert.equal(plugin.active, true);\n                assert.deepEqual(plugin.opts.files, [\"*.html\"]);\n                bs.cleanup();\n                done();\n            }\n        });\n    });\n    it(\"allows plugins to be registered by 'path'\", function(done) {\n        browserSync.reset();\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    logLevel: \"silent\",\n                    open: false,\n                    plugins: [\"./test/fixtures/plugin.js\"]\n                }\n            },\n            cb: function(err, bs) {\n                bs.cleanup();\n                done();\n            }\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/cli/e2e.cli.proxy.js",
    "content": "var path = require(\"path\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\nvar connect = require(\"connect\");\nvar browserSync = require(path.resolve(\"./\"));\nvar serveStatic = require(\"serve-static\");\n\nvar pkg = require(path.resolve(\"package.json\"));\nvar cli = require(path.resolve(pkg.bin)).default;\n\ndescribe(\"E2E CLI proxy test\", function() {\n    var instance, server;\n\n    before(function(done) {\n        browserSync.reset();\n        var app = connect();\n        app.use(serveStatic(\"./test/fixtures\"));\n        server = app.listen();\n        var proxytarget = \"http://localhost:\" + server.address().port;\n\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    proxy: proxytarget,\n                    open: false,\n                    online: false,\n                    logLevel: \"silent\"\n                }\n            },\n            cb: function(err, bs) {\n                instance = bs;\n                done();\n            }\n        });\n    });\n    after(function() {\n        server.close();\n        instance.cleanup();\n    });\n    it(\"serves index.html + snippet injected\", function(done) {\n        request(instance.server)\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, instance.options.get(\"snippet\"));\n                done();\n            });\n    });\n    it(\"serves browser-sync client js\", function(done) {\n        request(instance.server)\n            .get(instance.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                // console.log(res.text.indexOf(\"1\"));\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n\ndescribe(\"E2E CLI proxy test (2)\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    proxy: \"localhost:8000/path/is/here\", // this is: `browser-sync start --proxy localhost:8000/path/is/here`\n                    logLevel: \"silent\",\n                    open: false\n                }\n            },\n            cb: function(err, bs) {\n                instance = bs;\n                done();\n            }\n        });\n    });\n    after(function(done) {\n        instance.cleanup(done);\n    });\n    it(\"promote paths in the proxy to startPath option\", function() {\n        assert.equal(instance.options.get(\"startPath\"), \"/path/is/here\");\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/cli/e2e.cli.proxy.ws.js",
    "content": "var path = require(\"path\");\nvar assert = require(\"chai\").assert;\nvar connect = require(\"connect\");\nvar browserSync = require(path.resolve(\"./\"));\nvar socket = require(\"socket.io\");\nvar client = require(\"socket.io-client\");\n\nvar pkg = require(path.resolve(\"package.json\"));\nvar cli = require(path.resolve(pkg.bin)).default;\n\ndescribe.skip(\"E2E CLI proxy + websockets test\", function() {\n    var instance, server;\n\n    before(function(done) {\n        browserSync.reset();\n        var app = connect();\n        server = app.listen();\n\n        var proxytarget = \"http://localhost:\" + server.address().port;\n\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    proxy: proxytarget,\n                    open: false,\n                    online: false,\n                    logLevel: \"silent\",\n                    ws: true\n                }\n            },\n            cb: function(err, bs) {\n                instance = bs;\n                done();\n            }\n        });\n    });\n    after(function() {\n        server.close();\n        instance.cleanup();\n    });\n    it(\"can proxy websocket upgrades\", function(done) {\n        assert.equal(instance.options.getIn([\"proxy\", \"ws\"]), true);\n\n        socket(server);\n\n        server.on(\"upgrade\", function() {\n            done();\n        });\n\n        client.connect(instance.options.getIn([\"urls\", \"local\"]), {\n            forceNew: true\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/cli/e2e.cli.server.js",
    "content": "var path = require(\"path\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\nvar browserSync = require(path.resolve(\"./\"));\n\nvar pkg = require(path.resolve(\"package.json\"));\nvar cli = require(path.resolve(pkg.bin)).default;\n\ndescribe(\"E2E CLI server test\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    server: \"test/fixtures\",\n                    open: false,\n                    online: false,\n                    logLevel: \"silent\"\n                }\n            },\n            cb: function(err, bs) {\n                instance = bs;\n                done();\n            }\n        });\n    });\n    after(function() {\n        instance.cleanup();\n    });\n    it(\"serves index.html + snippet injected\", function(done) {\n        request(instance.server)\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, instance.options.get(\"snippet\"));\n                done();\n            });\n    });\n    it(\"serves browser-sync client js\", function(done) {\n        request(instance.server)\n            .get(instance.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n\ndescribe(\"E2E CLI server test with directory listing/index \", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    server: \"test/fixtures\",\n                    open: false,\n                    online: false,\n                    logLevel: \"silent\",\n                    directory: true,\n                    index: \"index.htm\"\n                }\n            },\n            cb: function(err, bs) {\n                instance = bs;\n                done();\n            }\n        });\n    });\n    after(function() {\n        instance.cleanup();\n    });\n    it(\"Sets the correct server options\", function() {\n        assert.equal(instance.options.getIn([\"server\", \"directory\"]), true);\n        assert.equal(\n            instance.options.getIn([\"server\", \"serveStaticOptions\", \"index\"]),\n            \"index.htm\"\n        );\n    });\n});\n\ndescribe(\"E2E CLI server test with extensions option - single\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    server: \"test/fixtures\",\n                    open: false,\n                    online: false,\n                    logLevel: \"silent\",\n                    extensions: \"html\"\n                }\n            },\n            cb: function(err, bs) {\n                instance = bs;\n                done();\n            }\n        });\n    });\n    after(function() {\n        instance.cleanup();\n    });\n    it(\"Sets the extensions option (array) for serve static\", function() {\n        assert.equal(\n            instance.options.getIn([\"server\", \"serveStaticOptions\", \"index\"]),\n            \"index.html\"\n        );\n        assert.deepEqual(\n            instance.options\n                .getIn([\"server\", \"serveStaticOptions\", \"extensions\"])\n                .toJS(),\n            [\"html\"]\n        );\n    });\n});\n\ndescribe(\"E2E CLI server test with extensions option - multiple\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    server: \"test/fixtures\",\n                    open: false,\n                    online: false,\n                    logLevel: \"silent\",\n                    extensions: \"html,css\"\n                }\n            },\n            cb: function(err, bs) {\n                instance = bs;\n                done();\n            }\n        });\n    });\n    after(function() {\n        instance.cleanup();\n    });\n    it(\"Sets the extensions option (array) for serve static\", function() {\n        assert.equal(\n            instance.options.getIn([\"server\", \"serveStaticOptions\", \"index\"]),\n            \"index.html\"\n        );\n        assert.deepEqual(\n            instance.options\n                .getIn([\"server\", \"serveStaticOptions\", \"extensions\"])\n                .toJS(),\n            [\"html\", \"css\"]\n        );\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/cli/e2e.cli.snippet.js",
    "content": "var path = require(\"path\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\nvar browserSync = require(path.resolve(\"./\"));\n\nvar pkg = require(path.resolve(\"package.json\"));\nvar cli = require(path.resolve(pkg.bin)).default;\n\ndescribe(\"E2E CLI Snippet test\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    logLevel: \"silent\"\n                }\n            },\n            cb: function(err, bs) {\n                instance = bs;\n                done();\n            }\n        });\n    });\n    after(function() {\n        instance.cleanup();\n    });\n    it(\"serves versioned browser-sync client js\", function(done) {\n        request(instance.server)\n            .get(instance.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n    it(\"serves browser-sync client js\", function(done) {\n        request(instance.server)\n            .get(instance.options.getIn([\"scriptPaths\", \"path\"]))\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/cli/e2e.cli.ui.js",
    "content": "var path = require(\"path\");\nvar assert = require(\"chai\").assert;\nvar browserSync = require(path.resolve(\"./\"));\n\nvar pkg = require(path.resolve(\"package.json\"));\nvar cli = require(path.resolve(pkg.bin)).default;\n\ndescribe(\"E2E CLI UI test\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    logLevel: \"silent\",\n                    server: true,\n                    open: false,\n                    uiPort: 2000\n                }\n            },\n            cb: function(err, bs) {\n                if (err) {\n                    return done(err);\n                }\n                instance = bs;\n                done();\n            }\n        });\n    });\n    after(function() {\n        instance.cleanup();\n    });\n    it(\"serves versioned browser-sync client js\", function() {\n        assert.equal(instance.options.getIn([\"ui\", \"port\"]), 2000);\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/commands.server.json",
    "content": "{\n    \"commands\": [\n        {\n            \"desc\": \"Static file server using test/fixtures as the base\",\n            \"args\": [\n                \"start\",\n                \"--server=test/fixtures\",\n                \"--no-open\",\n                \"--logLevel=silent\",\n                \"--no-online\"\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.events.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar sinon = require(\"sinon\");\n\ndescribe(\"E2E Events test\", function() {\n    var instance, clock;\n\n    before(function(done) {\n        browserSync.reset();\n        instance = browserSync(\n            {\n                open: false,\n                logLevel: \"silent\",\n                logSnippet: false\n            },\n            done\n        ).instance;\n        clock = sinon.useFakeTimers();\n    });\n\n    after(function() {\n        instance.cleanup();\n        clock.restore();\n    });\n\n    it(\"Should register internal events\", function() {\n        var spy = sinon.spy(instance.io.sockets, \"emit\");\n\n        instance.events.emit(\"file:reload\", {\n            path: \"somepath.css\",\n            fileExtension: \"css\"\n        });\n\n        clock.tick();\n\n        sinon.assert.calledWithExactly(spy, \"file:reload\", {\n            path: \"somepath.css\",\n            fileExtension: \"css\"\n        });\n\n        spy.restore();\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.fail.js",
    "content": "////\n//var browserSync = require(\"../../../\");\n//var snippetUtils       = require(\"../../../dist/snippetUtils\");\n//\n//var assert      = require(\"chai\").assert;\n//var sinon       = require(\"sinon\");\n//\n//describe(\"E2E Fail tests\", function () {\n//    var stub;\n//    before(function () {\n//        stub  = sinon.stub(process, \"exit\");\n//    });\n//    beforeEach(function () {\n//        browserSync.reset();\n//    });\n//    after(function () {\n//        stub.restore();\n//    });\n//    it(\"Should fail if server + proxy config given\", function (done) {\n//        browserSync({\n//            open: false,\n//            server: true,\n//            proxy: \"localhost:8080\"\n//        }, function (err, bs) {\n//            bs.cleanup();\n//            assert.include(err.message, \"Invalid config. You cannot specify both server & proxy options.\");\n//            done();\n//        });\n//    });\n//    it(\"should fail if empty port cannot be found\", function (done) {\n//\n//        var stub = sinon.stub(snippetUtils, \"getPorts\").yields(new Error(\"NOPE\"));\n//\n//        browserSync({\n//            open: false\n//        }, function (err, bs) {\n//            assert.include(err.message, \"NOPE\");\n//            bs.cleanup();\n//            stub.restore();\n//            done();\n//        });\n//    });\n//});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.online.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\nvar dns = require(\"dns\");\n\ndescribe(\"E2E online test\", function() {\n    it(\"Sets `online: false` if google.com lookup fails\", function(done) {\n        browserSync.reset();\n        var stub = sinon.stub(dns, \"resolve\").yields(\"ERR\");\n        delete process.env.TESTING;\n        var instance = browserSync(\n            {\n                open: false,\n                logLevel: \"silent\"\n            },\n            function(err, bs) {\n                assert.isFalse(bs.options.get(\"online\"));\n                instance.cleanup();\n                stub.restore();\n                process.env.TESTING = true;\n                done();\n            }\n        );\n    });\n    it(\"Sets `online: true` if google.com lookup succeeds\", function(done) {\n        browserSync.reset();\n        var stub = sinon.stub(dns, \"resolve\").yields(null);\n        delete process.env.TESTING;\n        var instance = browserSync(\n            {\n                open: false,\n                logLevel: \"silent\"\n            },\n            function(err, bs) {\n                assert.isTrue(bs.options.get(\"online\"));\n                instance.cleanup();\n                stub.restore();\n                process.env.TESTING = true;\n                done();\n            }\n        );\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.callbacks.js",
    "content": "var browserSync = require(\"../../../\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E options test - ready callback as option\", function() {\n    it(\"Calls the ready callback when read\", function(done) {\n        browserSync.reset();\n        browserSync({\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            logLevel: \"silent\",\n            callbacks: {\n                ready: function(err, bs) {\n                    bs.cleanup();\n                    done();\n                }\n            }\n        });\n    });\n    it(\"It has public instance bound to `this`\", function(done) {\n        browserSync.reset();\n        browserSync({\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            logLevel: \"silent\",\n            callbacks: {\n                ready: function() {\n                    var bs = this;\n                    assert.isFunction(bs.reload);\n                    assert.isFunction(bs.notify);\n                    assert.isFunction(bs.watch);\n                    bs.cleanup();\n                    done();\n                }\n            }\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.cors.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\nvar request = require(\"supertest\");\n\ndescribe(\"e2e options test (cors)\", function() {\n    it(\"Adds cors middleware\", function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            logLevel: \"silent\",\n            cors: true\n        };\n        browserSync(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/index.html\")\n                .expect(200)\n                .end(function(err, res) {\n                    assert.equal(\n                        res.headers[\"access-control-allow-origin\"],\n                        \"*\"\n                    );\n                    assert.equal(\n                        res.headers[\"access-control-allow-methods\"],\n                        \"GET, POST, OPTIONS, PUT, PATCH, DELETE\"\n                    );\n                    assert.equal(\n                        res.headers[\"access-control-allow-headers\"],\n                        \"X-Requested-With,content-type\"\n                    );\n                    assert.equal(\n                        res.headers[\"access-control-allow-credentials\"],\n                        \"true\"\n                    );\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\n\ndescribe(\"e2e options test\", function() {\n    it(\"Sets the available port\", function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            logLevel: \"silent\"\n        };\n        browserSync(config, function(err, bs) {\n            var match = /\\d{2,5}/.exec(bs.options.get(\"port\"))[0];\n            assert.isNotNull(match);\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Sets the available port\", function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            files: [\"*.html\"],\n            ports: {\n                min: 3500\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n        browserSync(config, function(err, bs) {\n            var match = /\\d{2,5}/.exec(bs.options.get(\"port\"))[0];\n            assert.isNotNull(match);\n            assert.equal(match, 3500, \"Uses the given port the available port\");\n            assert.deepEqual(\n                bs.options.get(\"files\").toJS(),\n                {\n                    core: {\n                        globs: [\"*.html\"],\n                        objs: []\n                    }\n                },\n                \"set's the files option\"\n            );\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Sets the available port\", function(done) {\n        browserSync.reset();\n        sinon.spy(console, \"log\");\n        browserSync([], null, function(err, bs) {\n            var match = /\\d{2,5}/.exec(bs.options.get(\"port\"))[0];\n            assert.isNotNull(match);\n            assert.deepEqual(bs.options.get(\"open\"), false);\n            console.log.restore();\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Sets the ghostMode options\", function(done) {\n        browserSync.reset();\n        browserSync([], { logLevel: \"silent\" }, function(err, bs) {\n            var ghostMode = bs.options.get(\"ghostMode\").toJS();\n\n            assert.deepEqual(ghostMode.clicks, true);\n            assert.deepEqual(ghostMode.scroll, true);\n            assert.deepEqual(ghostMode.forms.submit, true);\n            assert.deepEqual(ghostMode.forms.inputs, true);\n            assert.deepEqual(ghostMode.forms.toggles, true);\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Sets the ghostMode options\", function(done) {\n        browserSync.reset();\n        var config = {\n            ghostMode: {\n                links: true,\n                forms: {\n                    submit: false\n                }\n            },\n            logLevel: \"silent\"\n        };\n        browserSync([], config, function(err, bs) {\n            var ghostMode = bs.options.get(\"ghostMode\").toJS();\n\n            assert.deepEqual(ghostMode.links, true);\n            assert.deepEqual(ghostMode.clicks, true);\n            assert.deepEqual(ghostMode.scroll, true);\n            assert.deepEqual(ghostMode.forms.submit, false);\n            assert.deepEqual(ghostMode.forms.inputs, true);\n            assert.deepEqual(ghostMode.forms.toggles, true);\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Sets the ghostMode options in shorthand\", function(done) {\n        browserSync.reset();\n        var config = {\n            ghostMode: false,\n            logLevel: \"silent\"\n        };\n        browserSync(config, function(err, bs) {\n            var ghostMode = bs.options.get(\"ghostMode\").toJS();\n            assert.deepEqual(ghostMode.forms.submit, false);\n            assert.deepEqual(ghostMode.forms.inputs, false);\n            assert.deepEqual(ghostMode.forms.toggles, false);\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Sets the ghostMode options in shorthand\", function(done) {\n        browserSync.reset();\n        var config = {\n            ghostMode: true,\n            logLevel: \"silent\"\n        };\n        browserSync(config, function(err, bs) {\n            var ghostMode = bs.options.get(\"ghostMode\").toJS();\n            assert.deepEqual(ghostMode.clicks, true);\n            assert.deepEqual(ghostMode.scroll, true);\n            assert.deepEqual(ghostMode.forms.submit, true);\n            assert.deepEqual(ghostMode.forms.inputs, true);\n            assert.deepEqual(ghostMode.forms.toggles, true);\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Sets the ghostMode options in shorthand\", function(done) {\n        browserSync.reset();\n        var config = {\n            ghostMode: {\n                forms: false\n            },\n            logLevel: \"silent\"\n        };\n        browserSync(config, function(err, bs) {\n            var ghostMode = bs.options.get(\"ghostMode\").toJS();\n            assert.deepEqual(ghostMode.forms.submit, false);\n            assert.deepEqual(ghostMode.forms.inputs, false);\n            assert.deepEqual(ghostMode.forms.toggles, false);\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Sets the ghostMode options in shorthand\", function(done) {\n        browserSync.reset();\n        var config = {\n            ghostMode: {\n                forms: true\n            },\n            logLevel: \"silent\"\n        };\n        browserSync(config, function(err, bs) {\n            var ghostMode = bs.options.get(\"ghostMode\").toJS();\n            assert.deepEqual(ghostMode.forms.submit, true);\n            assert.deepEqual(ghostMode.forms.inputs, true);\n            assert.deepEqual(ghostMode.forms.toggles, true);\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Sets the ghostMode options\", function(done) {\n        browserSync.reset();\n        var config = {\n            host: \"localhost\",\n            logLevel: \"silent\"\n        };\n        browserSync(config, function(err, bs) {\n            assert.ok(\n                bs.options\n                    .get(\"port\")\n                    .toString()\n                    .match(/\\d\\d\\d\\d/)\n            );\n            assert.ok(bs.options.getIn([\"urls\", \"local\"]).match(/\\d{4,5}$/));\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Sets the files option with the old API\", function(done) {\n        browserSync.reset();\n        var config = {\n            host: \"localhost\",\n            online: false,\n            logLevel: \"silent\"\n        };\n\n        browserSync.init([\"*.html\"], config, function(err, bs) {\n            assert.deepEqual(bs.options.get(\"files\").toJS(), {\n                core: {\n                    globs: [\"*.html\"],\n                    objs: []\n                }\n            });\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Sets the files option with the old API\", function(done) {\n        browserSync.reset();\n        browserSync.emitter.on(\"init\", function() {\n            assert.deepEqual(bs.options.get(\"files\").toJS(), {\n                core: {\n                    globs: [\"*.html\"],\n                    objs: []\n                }\n            });\n            bs.cleanup();\n            done();\n        });\n        var bs = browserSync.init([\"*.html\"]).instance;\n    });\n\n    it(\"Sets the files option with the old API\", function(done) {\n        browserSync.reset();\n        browserSync.emitter.on(\"init\", function() {\n            assert.deepEqual(bs.options.get(\"files\").toJS(), {\n                core: {\n                    globs: [\"*.html\"],\n                    objs: []\n                }\n            });\n            bs.cleanup();\n            done();\n        });\n        var bs = browserSync.init([\"*.html\"], {}).instance;\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.logPrefix.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\nvar stripColor = require(\"chalk\").stripColor;\nvar logger = require(\"../../../dist/logger\").logger;\nvar chalk  = require(\"chalk\");\n\ndescribe(\"E2E `logPrefix` option\", function() {\n    it(\"Can set the log prefix when given in options\", function(done) {\n        browserSync.reset();\n        var config = {\n            open: false,\n            logPrefix: \"BS2\",\n            logLevel: \"info\",\n            ui: false\n        };\n        logger.mute(false);\n        var spy = sinon.spy(console, \"log\");\n        browserSync(config, function(err, bs) {\n            var arg = spy.getCall(0).args[0];\n            assert.include(arg, \"[\" + chalk.blue(config.logPrefix) + \"]\");\n            console.log.restore();\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Can set the log prefix with a function when given in options\", function(done) {\n        browserSync.reset();\n        var config = {\n            open: false,\n            logPrefix: function() {\n                return \"AWESOME\"\n            },\n            logLevel: \"info\",\n            online: false,\n            ui: false\n        };\n        logger.mute(false);\n        var spy = sinon.spy(console, \"log\");\n        browserSync(config, function(err, bs) {\n            var arg = spy.getCall(0).args[0];\n            assert.include(arg, \"AWESOME\");\n            console.log.restore();\n            bs.cleanup();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.logSnippet.js",
    "content": "var browserSync = require(\"../../../\");\nvar sinon = require(\"sinon\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E `logSnippet` option\", function() {\n    var instance;\n    var spy;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            online: false,\n            open: false,\n            logSnippet: false\n        };\n\n        spy = sinon.spy(console, \"log\");\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        console.log.restore();\n    });\n\n    it(\"Can set the log snippet when given in options\", function() {\n        var calls = spy.getCalls();\n        var snippet = testString(\n            \"Copy the following snippet into your website\"\n        );\n        var urls = testString(\"Access URLs\");\n\n        function testString(match) {\n            return calls.filter(function(call) {\n                return call.args.filter(function(arg) {\n                    return arg.indexOf(match) > -1;\n                }).length;\n            });\n        }\n\n        assert.equal(snippet.length, 0);\n        assert.equal(urls.length, 1);\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.open.browsers.js",
    "content": "var utils = require(\"../../../dist/utils\");\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\nvar browserSync = require(\"../../../\");\n\ndescribe(\"E2E OPEN Browsers options (1)\", function() {\n    var instance;\n    var stub;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            browser: \"google chrome\"\n        };\n        stub = sinon.stub(utils, \"opnWrapper\");\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        stub.restore();\n    });\n\n    it(\"Opens the localhost address as default\", function() {\n        var args = stub.getCall(0).args;\n        sinon.assert.called(stub);\n\n        assert.equal(args[0], instance.options.getIn([\"urls\", \"local\"]));\n        assert.equal(args[1], \"google chrome\");\n    });\n});\n\ndescribe(\"E2E OPEN Browsers options (multiple)\", function() {\n    var instance;\n    var stub;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            browser: [\"google chrome\", \"safari\"]\n        };\n        stub = sinon.stub(utils, \"opnWrapper\");\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        stub.restore();\n    });\n\n    it(\"Opens the localhost address as default\", function() {\n        sinon.assert.called(stub);\n        var local = instance.options.getIn([\"urls\", \"local\"]);\n\n        var args = stub.getCall(0).args;\n        assert.equal(args[0], local);\n        assert.equal(args[1], \"google chrome\");\n\n        args = stub.getCall(1).args;\n        assert.equal(args[0], local);\n        assert.equal(args[1], \"safari\");\n    });\n});\n\ndescribe(\"E2E browser option with app args\", function() {\n    it(\"opens with object literal\", function(done) {\n        browserSync.reset();\n        var appArg = {\n            app: [\n                \"chromium-browser\",\n                \"--app=http://localhost:8080\",\n                \"--proxy-server=localhost:8080\",\n                \"--user-data-dir=.tmp/chomium\"\n            ]\n        };\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            online: false,\n            browser: appArg\n        };\n\n        var stub = sinon.spy(utils, \"opnWrapper\");\n        var opnPath = require.resolve(\"opn\");\n        require(opnPath);\n        var opnStub = require(\"sinon\")\n            .stub(require.cache[opnPath], \"exports\")\n            .returns({ catch: function() {} });\n\n        browserSync(config, function(err, bs) {\n            bs.cleanup();\n            stub.restore();\n            var args = opnStub.getCall(0).args;\n            assert.equal(args[0], bs.options.getIn([\"urls\", \"local\"]));\n            assert.deepEqual(args[1], appArg);\n            require.cache[opnPath].exports.restore();\n            done();\n        });\n    });\n    it(\"opens with mix of string + objects\", function(done) {\n        browserSync.reset();\n        var appArg = {\n            app: [\n                \"chromium-browser\",\n                \"--app=http://localhost:8080\",\n                \"--proxy-server=localhost:8080\",\n                \"--user-data-dir=.tmp/chomium\"\n            ]\n        };\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            online: false,\n            browser: [appArg, \"safari\", \"firefox\"]\n        };\n\n        var stub = sinon.spy(utils, \"opnWrapper\");\n        var opnPath = require.resolve(\"opn\");\n        require(opnPath);\n        var opnStub = require(\"sinon\")\n            .stub(require.cache[opnPath], \"exports\")\n            .returns({ catch: function() {} });\n\n        browserSync(config, function(err, bs) {\n            bs.cleanup();\n            stub.restore();\n            var args1 = opnStub.getCall(0).args;\n            assert.equal(args1[0], bs.options.getIn([\"urls\", \"local\"]));\n            assert.deepEqual(args1[1], appArg);\n\n            var args2 = opnStub.getCall(1).args;\n            assert.deepEqual(args2[1], { app: \"safari\" });\n\n            var args3 = opnStub.getCall(2).args;\n            assert.deepEqual(args3[1], { app: \"firefox\" });\n\n            require.cache[opnPath].exports.restore();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.open.js",
    "content": "var browserSync = require(\"../../../\");\nvar utils = require(\"../../../dist/utils\");\n\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\n\ndescribe(\"E2E OPEN options\", function() {\n    var instance;\n    var stub;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\"\n        };\n        stub = sinon.stub(utils, \"opnWrapper\");\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        stub.restore();\n    });\n\n    it(\"Opens the localhost address as default\", function() {\n        var args = stub.getCall(0).args;\n        sinon.assert.called(stub);\n        assert.equal(args[0], instance.options.getIn([\"urls\", \"local\"]));\n    });\n});\n\ndescribe(\"E2E OPEN options with external\", function() {\n    var bs;\n    var stub;\n    var opnPath;\n    var opnStub;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            open: \"local\"\n        };\n        stub = sinon.spy(utils, \"opnWrapper\");\n        opnPath = require.resolve(\"opn\");\n        require(opnPath);\n        opnStub = require(\"sinon\")\n            .stub(require.cache[opnPath], \"exports\")\n            .returns({ catch: function() {} });\n        bs = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n        stub.restore();\n    });\n\n    it(\"Opens the external address when specified in options\", function() {\n        sinon.assert.calledWith(opnStub, bs.options.getIn([\"urls\", \"local\"]));\n        require.cache[opnPath].exports.restore();\n    });\n});\n\ndescribe(\"E2E OPEN options with UI + snippet\", function() {\n    var bs;\n    var stub;\n    var opnPath;\n    var opnStub;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            open: \"ui\"\n        };\n        stub = sinon.spy(utils, \"opnWrapper\");\n        opnPath = require.resolve(\"opn\");\n        require(opnPath);\n        opnStub = require(\"sinon\")\n            .stub(require.cache[opnPath], \"exports\")\n            .returns({ catch: function() {} });\n        bs = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n        stub.restore();\n    });\n\n    it(\"Opens the external address when specified in options\", function() {\n        sinon.assert.calledWith(opnStub, bs.options.getIn([\"urls\", \"ui\"]));\n        require.cache[opnPath].exports.restore();\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.port.js",
    "content": "var browserSync = require(\"../../../\");\nvar utils = require(\"../../../dist/utils\");\n\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\n\ndescribe(\"E2E `port` option\", function() {\n    it(\"Calls cb with Error if port detection errors\", function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            online: false,\n            open: false\n        };\n        sinon\n            .stub(utils, \"getPorts\")\n            .yields(new Error(\"Some error about a port\"));\n        sinon.stub(utils, \"fail\", function(override, errMessage, cb) {\n            assert.instanceOf(errMessage, Error);\n            utils.getPorts.restore();\n            utils.fail.restore();\n            cb();\n        });\n        browserSync(config, function() {\n            done();\n        });\n    });\n    it(\"gets a port with host:localhost (legacy support)\", function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            online: false,\n            open: false\n        };\n        var stub = sinon.stub(utils, \"getPort\");\n        stub.onCall(0).yields(null, 3000);\n\n        browserSync(config, function(err, bs) {\n            utils.getPort.restore();\n            bs.cleanup();\n            assert.equal(stub.getCall(0).args[0], \"localhost\");\n            done();\n        });\n    });\n    it(\"gets a port with host: localhost when set via 'listen'\", function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            online: false,\n            open: false,\n            listen: \"127.0.0.1\",\n            ui: {\n                port: 4000\n            }\n        };\n        var stub = sinon.stub(utils, \"getPort\");\n        stub.onCall(0).yields(null, 3000);\n\n        browserSync(config, function(err, bs) {\n            const urls = bs.options.get(\"urls\").toJS();\n            utils.getPort.restore();\n            bs.cleanup();\n            assert.equal(urls.local, \"http://127.0.0.1:3000\");\n            assert.equal(urls.ui, \"http://127.0.0.1:4000\");\n            assert.equal(stub.getCall(0).args[0], \"127.0.0.1\");\n            done();\n        });\n    });\n    it(\"sets extra port option for socket in proxy mode (handle error)\", function(done) {\n        browserSync.reset();\n\n        var stub = sinon.stub(utils, \"getPort\");\n\n        stub.onCall(0).yields(null, 3000);\n        stub.onCall(1).yields(new Error(\"Some error about ports\"));\n\n        var config = {\n            logLevel: \"silent\",\n            proxy: {\n                target: \"localhost\",\n                ws: true\n            },\n            online: false,\n            open: false\n        };\n\n        sinon.stub(utils, \"fail\", function(override, errMessage, cb) {\n            assert.instanceOf(errMessage, Error);\n            utils.getPort.restore();\n            utils.fail.restore();\n            cb();\n        });\n\n        browserSync(config, function() {\n            done();\n        });\n    });\n    it(\"sets extra port option for socket in proxy mode\", function(done) {\n        browserSync.reset();\n\n        var stub = sinon.stub(utils, \"getPort\");\n\n        stub.onCall(0).yields(null, 3000);\n        stub.onCall(1).yields(null, 3001);\n\n        var config = {\n            logLevel: \"silent\",\n            proxy: {\n                target: \"localhost\",\n                ws: true\n            },\n            online: false,\n            open: false\n        };\n\n        browserSync(config, function(err, bs) {\n            bs.cleanup();\n            assert.equal(bs.options.get(\"port\"), 3000);\n            assert.equal(stub.getCall(1).args[0], \"localhost\");\n            assert.equal(stub.getCall(1).args[1], 3001);\n            assert.equal(bs.options.getIn([\"socket\", \"port\"]), 3001);\n            utils.getPort.restore();\n            done();\n        });\n    });\n    it(\"uses user-given extra port option for socket in proxy mode\", function(done) {\n        browserSync.reset();\n\n        var stub = sinon.stub(utils, \"getPort\");\n\n        stub.onCall(0).yields(null, 3000);\n        stub.onCall(1).yields(null, 8001);\n\n        var config = {\n            logLevel: \"silent\",\n            proxy: {\n                target: \"localhost\",\n                ws: true\n            },\n            socket: {\n                port: 8001\n            },\n            online: false,\n            open: false\n        };\n\n        browserSync(config, function(err, bs) {\n            bs.cleanup();\n            assert.equal(bs.options.get(\"port\"), 3000);\n            assert.equal(stub.getCall(1).args[1], 8001);\n            assert.equal(bs.options.getIn([\"socket\", \"port\"]), 8001);\n            utils.getPort.restore();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.script.async.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E script with/without async attribute\", function() {\n    it(\"serves with async\", function(done) {\n        browserSync.reset();\n        var config = { open: false };\n        browserSync(config, function(err, bs) {\n            assert.include(bs.options.get(\"snippet\"), \"async\");\n            bs.cleanup();\n            done();\n        });\n    });\n    it(\"serves without async\", function(done) {\n        browserSync.reset();\n        var config = {\n            open: false,\n            snippetOptions: {\n                async: false\n            }\n        };\n        browserSync(config, function(err, bs) {\n            assert.notInclude(bs.options.get(\"snippet\"), \"'async'\");\n            bs.cleanup();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.scriptpath.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\nvar request = require(\"supertest\");\n\ndescribe(\"E2E script path test - given a callback\", function() {\n    it(\"Sets the script path\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            scriptPath: function(scriptPath) {\n                return \"localhost:PORT\" + scriptPath;\n            }\n        };\n        browserSync(config, function(err, bs) {\n            assert.include(\n                bs.options.get(\"snippet\"),\n                \"localhost:PORT/browser-sync/browser-sync-client.\"\n            );\n            bs.cleanup();\n            done();\n        });\n    });\n});\n\ndescribe(\"E2E Socket namespace test - given a string\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            socket: {\n                namespace: \"TEST\"\n            }\n        };\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"sets the socket namespace\", function(done) {\n        request(instance.server)\n            .get(instance.options.getIn([\"scriptPaths\", \"path\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(\n                    res.text,\n                    \"___browserSync___.socketUrl = '' + location.host + '/TEST';\"\n                );\n                done();\n            });\n    });\n});\n\ndescribe(\"E2E script path test - Using absolute path\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            scriptPath: function(scriptPath, port, options) {\n                return options.get(\"absolute\");\n            }\n        };\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"Sets the script path\", function() {\n        assert.include(\n            instance.options.get(\"snippet\"),\n            \"http://HOST:3000/browser-sync/browser-sync-client.\"\n        );\n    });\n});\n\ndescribe(\"E2E script path test - Using absolute path + secure server\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            https: true,\n            open: false,\n            scriptPath: function(scriptPath, port, options) {\n                return options.get(\"absolute\");\n            }\n        };\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"Sets the script path\", function() {\n        assert.include(\n            instance.options.get(\"snippet\"),\n            \"https://HOST:3000/browser-sync/browser-sync-client.\"\n        );\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.serveStatic.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar request = require(\"supertest\");\nvar page = require(\"fs\").readFileSync(\"test/fixtures/index.html\", \"utf-8\");\nvar css = require(\"fs\").readFileSync(\"test/fixtures/assets/style.css\", \"utf-8\");\nvar Rx = require(\"rx\");\n\nfunction getRequests(reqs, server) {\n    return reqs.map(function(req) {\n        return Rx.Observable.create(function(obs) {\n            request(server)\n                .get(req[0])\n                .end(function(err, res) {\n                    if (err) {\n                        return obs.onError(err);\n                    }\n                    if (res.text === req[1]) {\n                        obs.onNext(true);\n                        obs.onCompleted();\n                        return;\n                    }\n\n                    obs.onError(\n                        new Error(req[0] + \" did not match the response body\")\n                    );\n                });\n        });\n    });\n}\n\ndescribe(\"E2E `serveStatic` option\", function() {\n    it(\"can serve static files with string only\", function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            online: false,\n            serveStatic: [\"test/fixtures\"]\n        };\n        browserSync(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/index.html\")\n                .expect(200, page, function() {\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n    it(\"can serve static files with string multiple string\", function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            online: false,\n            serveStatic: [\"test/fixtures\", \"test/fixtures/assets\"]\n        };\n        browserSync(config, function(err, bs) {\n            var reqs = getRequests(\n                [[\"/index.html\", page], [\"/style.css\", css]],\n                bs.server\n            );\n            var obs = Rx.Observable.merge(reqs);\n            obs.subscribeOnCompleted(function() {\n                bs.cleanup();\n                done();\n            });\n        });\n    });\n    it(\"can serve static files with multiple objects\", function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            online: false,\n            serveStatic: [\n                { route: \"\", dir: \"test/fixtures\" },\n                { route: [\"\"], dir: \"test/fixtures/assets\" }\n            ]\n        };\n        browserSync(config, function(err, bs) {\n            var reqs = getRequests(\n                [[\"/index.html\", page], [\"/style.css\", css]],\n                bs.server\n            );\n            var obs = Rx.Observable.merge(reqs);\n            obs.subscribeOnCompleted(function() {\n                bs.cleanup();\n                done();\n            });\n        });\n    });\n    it(\"can serve static files with multiple roots\", function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            online: false,\n            serveStatic: [\n                { route: \"\", dir: \"test/fixtures\" },\n                { route: [\"/shane\", \"/kittie\"], dir: \"test/fixtures/assets\" },\n                { route: \"\", dir: \"test/fixtures/assets\" }\n            ]\n        };\n        browserSync(config, function(err, bs) {\n            var reqs = getRequests(\n                [\n                    [\"/index.html\", page],\n                    [\"/shane/style.css\", css],\n                    [\"/kittie/style.css\", css]\n                ],\n                bs.server\n            );\n            var obs = Rx.Observable.merge(reqs);\n            obs.subscribeOnCompleted(function() {\n                bs.cleanup();\n                done();\n            });\n        });\n    });\n    it(\"can serve static files with multiple dirs\", function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            online: false,\n            serveStatic: [\n                { route: \"\", dir: [\"test/fixtures\", \"test/fixtures/assets\"] }\n            ]\n        };\n        browserSync(config, function(err, bs) {\n            var reqs = getRequests(\n                [[\"/index.html\", page], [\"/style.css\", css]],\n                bs.server\n            );\n            var obs = Rx.Observable.merge(reqs);\n            obs.subscribeOnCompleted(function() {\n                bs.cleanup();\n                done();\n            });\n        });\n    });\n    it(\"can serve static files with dir + NO route\", function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            online: false,\n            serveStatic: [{ dir: [\"test/fixtures\", \"test/fixtures/assets\"] }]\n        };\n        browserSync(config, function(err, bs) {\n            var reqs = getRequests(\n                [[\"/index.html\", page], [\"/style.css\", css]],\n                bs.server\n            );\n            var obs = Rx.Observable.merge(reqs);\n            obs.subscribeOnCompleted(function() {\n                bs.cleanup();\n                done();\n            });\n        });\n    });\n    it(\"can serve static files with mix of inputs\", function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            online: false,\n            serveStatic: [\n                \"test/fixtures\",\n                { dir: [\"test/fixtures/assets\"] },\n                { route: \"shane\", dir: [\"test/fixtures\"] },\n                { route: [\"shane\", \"kittie\"], dir: [\"test/fixtures\"] }\n            ]\n        };\n        browserSync(config, function(err, bs) {\n            var reqs = getRequests(\n                [\n                    [\"/index.html\", page],\n                    [\"/style.css\", css],\n                    [\"/shane/index.html\", page],\n                    [\"/kittie/assets/style.css\", css]\n                ],\n                bs.server\n            );\n            var obs = Rx.Observable.merge(reqs);\n            obs.subscribeOnCompleted(function() {\n                bs.cleanup();\n                done();\n            });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.single.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\nvar fs = require(\"fs\");\nvar request = require(\"supertest\");\n\ndescribe(\"e2e options test (single)\", function() {\n    it(\"returns index.html content for a non-existing path\", function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            logLevel: \"silent\",\n            cors: true,\n            single: true\n        };\n        browserSync(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/a-path-that-deffo-doesnot-exist\")\n                .set(\"accept\", \"*/*\")\n                .expect(200)\n                .end(function(err, res) {\n                    const expected = fs.readFileSync(\n                        \"test/fixtures/index.html\",\n                        \"utf8\"\n                    );\n                    assert.equal(res.text, expected);\n                    bs.cleanup(done);\n                });\n        });\n    });\n    it(\"returns regular content for matching file path\", function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            logLevel: \"silent\",\n            cors: true,\n            single: true\n        };\n        browserSync(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/assets/style.css\")\n                .expect(200)\n                .end(function(err, res) {\n                    const expected = fs.readFileSync(\n                        \"test/fixtures/assets/style.css\",\n                        \"utf8\"\n                    );\n                    assert.equal(res.text, expected);\n                    bs.cleanup(done);\n                });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.snippet.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\nvar request = require(\"supertest\");\n\ndescribe(\"E2E snippet ignore paths test (1)\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            logLevel: \"silent\",\n            snippetOptions: {\n                ignorePaths: \"iframe.html\" //back-compat\n            }\n        };\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"does not inject the snippet when excluded path hit\", function(done) {\n        request(instance.server)\n            .get(\"/iframe.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.notInclude(res.text, instance.options.get(\"snippet\"));\n                done();\n            });\n    });\n});\ndescribe(\"E2E snippet blacklist paths test (1)\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            logLevel: \"silent\",\n            snippetOptions: {\n                blacklist: [\"/iframe.html\"] // correct syntax\n            }\n        };\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"does not inject the snippet when excluded path hit\", function(done) {\n        request(instance.server)\n            .get(\"/iframe.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.notInclude(res.text, instance.options.get(\"snippet\"));\n                done();\n            });\n    });\n});\ndescribe(\"E2E snippet blacklist paths test (1)\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            logLevel: \"silent\",\n            snippetOptions: {\n                whitelist: [\"/iframe.html\"] // correct syntax\n            }\n        };\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"Always injects snippet when path matches in whitelist\", function(done) {\n        request(instance.server)\n            .get(\"/iframe.html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, instance.options.get(\"snippet\"));\n                done();\n            });\n    });\n});\ndescribe(\"E2E snippet custom regex\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            snippetOptions: {\n                rule: {\n                    match: /<head[^>]*>/i,\n                    fn: function(snippet, match) {\n                        return match + snippet;\n                    }\n                }\n            }\n        };\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"uses a user-provided regex\", function(done) {\n        request(instance.server)\n            .get(\"/iframe.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(\n                    res.text,\n                    \"<head>\" + instance.options.get(\"snippet\")\n                );\n                done();\n            });\n    });\n});\ndescribe(\"E2E snippet: false\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            snippet: false,\n        };\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"does not add the snippet when snippet: false\", function(done) {\n        request(instance.server)\n            .get(\"/iframe.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                if (res.text.indexOf(\"__bs_script__\") > -1) {\n                    return done(new Error(\"snippet present when it shouldn't be\"));\n                }\n                done();\n            });\n    });\n});\n\ndescribe(\"E2E snippet: true\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            snippet: true,\n        };\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"does not add the snippet when snippet: false\", function(done) {\n        request(instance.server)\n            .get(\"/iframe.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                if (res.text.indexOf(\"__bs_script__\") === -1) {\n                    return done(new Error(\"snippet absent when it shouldn't be\"));\n                }\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.sockets.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\nvar request = require(\"supertest\");\n\ndescribe(\"E2E `socket` options\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            online: false,\n            open: false,\n            socket: {\n                namespace: function() {\n                    return \"/shane\";\n                }\n            }\n        };\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"calls namespace fn when given in socket options\", function(done) {\n        request(instance.server)\n            .get(instance.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"location.host + '/shane'\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.options.startPath.js",
    "content": "var browserSync = require(\"../../../\");\nvar utils = require(\"../../../dist/utils\");\n\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\n\ndescribe(\"E2E `startPath` option\", function() {\n    var instance;\n    var stub;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            startPath: \"forms.html\",\n            online: true\n        };\n        stub = sinon.stub(utils, \"opnWrapper\");\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        stub.restore();\n    });\n\n    it(\"Opens the page with the startPath appended when online\", function() {\n        var args = stub.getCall(0).args;\n        assert.include(args[0], \"forms.html\");\n    });\n});\n\ndescribe(\"E2E `startPath` option\", function() {\n    var instance;\n    var stub;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            startPath: \"forms.html\",\n            online: false\n        };\n        stub = sinon.stub(utils, \"opnWrapper\");\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        stub.restore();\n    });\n\n    it(\"Opens the page with the startPath appended when OFFLINE\", function() {\n        var args = stub.getCall(0).args;\n        assert.include(args[0], \"forms.html\");\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/e2e.snippet.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E snippet tests\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\"\n        };\n\n        instance = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"returns the snippet URL\", function(done) {\n        request(instance.server)\n            .get(instance.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n\ndescribe(\"E2E TLS snippet tests\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            https: true\n        };\n\n        instance = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"returns the snippet URL over HTTPS\", function(done) {\n        var options = instance.options.toJS();\n\n        request(options.urls.local)\n            .get(options.scriptPaths.versioned)\n            .expect(200)\n            .end(function(err, res) {\n                if (err) {\n                    return done(err);\n                }\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/files/e2e.file.changed.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar path = require(\"path\");\nvar sinon = require(\"sinon\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E Responding to events\", function() {\n    var instance, socketsStub, scheduler;\n\n    before(function(done) {\n        browserSync.reset();\n        scheduler = require(\"../../../utils\").getScheduler();\n\n        var config = {\n            server: {\n                baseDir: path.join(__dirname, \"../../fixtures\")\n            },\n            files: [\"test/fixtures/assets/*.css\"],\n            logLevel: \"silent\",\n            open: false,\n            debug: { scheduler: scheduler }\n        };\n\n        instance = browserSync(config, function(err, bs) {\n            socketsStub = sinon.stub(bs.io.sockets, \"emit\");\n            done();\n        }).instance;\n    });\n\n    afterEach(function() {\n        socketsStub.reset();\n        scheduler.clock = 0;\n    });\n\n    after(function() {\n        instance.io.sockets.emit.restore();\n        instance.cleanup();\n    });\n\n    it(\"fires the file:reload event to the browser\", function() {\n        // Emit the event as it comes from the file-watcher\n        instance.events.emit(\"file:changed\", {\n            path: \"styles.css\",\n            event: \"change\",\n            log: true,\n            namespace: \"core\"\n        });\n\n        scheduler.advanceTo(1000);\n\n        var eventName = socketsStub.getCall(0).args[0];\n        var args = socketsStub.getCall(0).args[1];\n\n        assert.equal(eventName, \"file:reload\"); // check correct event sent to client\n        assert.equal(args.basename, \"styles.css\"); // Check the asset name is sent\n        assert.isFalse(instance.paused);\n    });\n\n    it(\"fires the file:reload event to the browser when wildcard given\", function() {\n        // Emit the event as it comes from the file-watcher\n        instance.events.emit(\"file:changed\", {\n            path: \"*.css\",\n            event: \"change\",\n            log: true,\n            namespace: \"core\"\n        });\n\n        scheduler.advanceTo(1000);\n\n        var eventName = socketsStub.getCall(0).args[0];\n        var args = socketsStub.getCall(0).args[1];\n\n        assert.equal(eventName, \"file:reload\"); // check correct event sent to client\n        assert.equal(args.path, \"*.css\"); // Check the asset name is sent\n        assert.equal(args.basename, \"*.css\"); // Check the asset name is sent\n        assert.equal(args.ext, \"css\"); // Check the asset name is sent\n        assert.isFalse(instance.paused);\n    });\n\n    it(\"doesn't fire the file:reload event to the browser when paused\", function() {\n        instance.paused = true;\n\n        // Emit the event as it comes from the file-watcher\n        instance.events.emit(\"file:changed\", {\n            path: \"styles.css\",\n            log: true,\n            event: \"change\",\n            namespace: \"core\"\n        });\n\n        scheduler.advanceTo(500);\n\n        assert.isTrue(socketsStub.withArgs(\"file:reload\").notCalled); // should not be called\n        assert.isTrue(instance.paused);\n\n        instance.paused = false;\n\n        //// Emit the event as it comes from the file-watcher\n        instance.events.emit(\"file:changed\", {\n            path: \"styles.css\",\n            log: true,\n            event: \"change\",\n            namespace: \"core\"\n        });\n\n        scheduler.advanceTo(1000);\n\n        assert.isTrue(socketsStub.withArgs(\"file:reload\").called);\n        assert.isFalse(instance.paused);\n    });\n\n    it(\"fires the browser:reload event to the browser\", function() {\n        // Emit the event as it comes from the file-watcher\n        instance.events.emit(\"browser:reload\");\n\n        scheduler.advanceTo(1000);\n\n        var eventName = socketsStub.getCall(0).args[0];\n\n        assert.equal(eventName, \"browser:reload\"); // check correct event sent to client\n    });\n\n    it(\"fires the browser:notify event to the browser\", function() {\n        // Emit the event as it comes from the file-watcher\n        instance.events.emit(\"browser:notify\", \"DATA\");\n\n        sinon.assert.calledWithExactly(socketsStub, \"browser:notify\", \"DATA\");\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/files/e2e.file.options.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar path = require(\"path\");\nvar assert = require(\"chai\").assert;\n\nvar outpath = path.join(__dirname, \"../../fixtures\");\n\ndescribe(\"file-watching\", function() {\n    it(\"Watches files with no namespace\", function(done) {\n        browserSync.reset();\n\n        browserSync(\n            {\n                files: path.join(outpath, \"watch-func.txt\"),\n                logLevel: \"silent\"\n            },\n            function(err, bs) {\n                assert.ok(bs.watchers.core.watchers);\n                assert.equal(bs.watchers.core.watchers.length, 1);\n                bs.cleanup(done);\n            }\n        );\n    });\n\n    it(\"Watches files when multi given\", function(done) {\n        browserSync.reset();\n\n        browserSync(\n            {\n                files: \"*.html\",\n                logLevel: \"silent\"\n            },\n            function(err, bs) {\n                assert.ok(bs.watchers.core.watchers);\n                assert.ok(bs.watchers.core.watchers[0]);\n                bs.cleanup(done);\n            }\n        );\n    });\n\n    it(\"Watches files when multi given + objs\", function(done) {\n        browserSync.reset();\n\n        browserSync(\n            {\n                files: [\n                    \"*.html\",\n                    {\n                        match: \"*.css\",\n                        fn: function(event, file) {\n                            console.log(file);\n                        }\n                    }\n                ]\n            },\n            function(err, bs) {\n                assert.ok(bs.watchers.core.watchers);\n                assert.equal(bs.watchers.core.watchers.length, 2);\n                bs.cleanup(done);\n            }\n        );\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/files/e2e.file.watching.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar path = require(\"path\");\nvar assert = require(\"chai\").assert;\nvar outpath = path.join(__dirname, \"../../fixtures\");\n\ndescribe(\"file-watching (2)\", function() {\n    it(\"Watches files with no namespace\", function(done) {\n        browserSync.reset();\n\n        var file = path.join(outpath, \"watch-func.txt\");\n\n        var config = {\n            files: file,\n            logLevel: \"silent\"\n        };\n\n        browserSync(config, function(err, bs) {\n            assert.ok(bs.watchers.core.watchers);\n            assert.equal(bs.watchers.core.watchers.length, 1);\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Watches files when multi given\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            files: \"*.html\",\n            logLevel: \"silent\"\n        };\n\n        browserSync(config, function(err, bs) {\n            assert.ok(bs.watchers.core.watchers);\n            assert.ok(bs.watchers.core.watchers[0]);\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Watches files when multi given + objs\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            files: [\n                \"*.html\",\n                {\n                    match: \"*.css\",\n                    fn: function(event, file) {\n                        console.log(file);\n                    }\n                }\n            ],\n            logLevel: \"silent\"\n        };\n\n        browserSync(config, function(err, bs) {\n            assert.ok(bs.watchers.core.watchers);\n            assert.equal(bs.watchers.core.watchers.length, 2);\n            bs.cleanup();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/middleware/middleware.option.js",
    "content": "var browserSync = require(\"../../../../\");\nvar assert = require(\"chai\").assert;\nvar request = require(\"supertest\");\n\ndescribe(\"Accepting middleware as an option (1)\", function() {\n    var bs;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var mw = function(req, res) {\n            res.end(\"<html><body></body></html>\");\n        };\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            middleware: mw, // single function given\n            logLevel: \"silent\",\n            open: false\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"should accept middlewares when given as top-level\", function() {\n        assert.equal(\n            bs.options.get(\"middleware\").size,\n            2,\n            \"1 custom + 1 serve static\"\n        );\n    });\n});\n\ndescribe(\"Accepting middleware as an option (2)\", function() {\n    var bs;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var mw1 = function(req, res) {\n            res.end(\"<html><body></body></html>\");\n        };\n        var mw2 = function(req, res) {\n            res.end(\"<html><body></body></html>\");\n        };\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            middleware: [mw1, mw2], // single function given\n            logLevel: \"silent\",\n            open: false\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"should accept middlewares when given as top-level\", function() {\n        assert.equal(\n            bs.options.get(\"middleware\").size,\n            3,\n            \"2 custom + 1 serve static\"\n        );\n    });\n});\n\ndescribe(\"Accepting middleware as a plain object\", function() {\n    it(\"should accept middlewares with routes\", function(done) {\n        browserSync.reset();\n\n        var called = 0;\n        var mw1 = function myMiddleware(req, res, next) {\n            called += 1;\n            next();\n        };\n        var mw2 = function bodyResp(req, res) {\n            called += 1;\n            res.end(\"<html><body>MW2</body></html>\");\n        };\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            middleware: [\n                mw1,\n                {\n                    route: \"/shane\",\n                    handle: mw2\n                }\n            ],\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.init(config, function(err, bs) {\n            request(bs.options.getIn([\"urls\", \"local\"]))\n                .get(\"/\")\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function() {\n                    assert.equal(called, 1, \"should call the first middleware\");\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/middleware/middleware.proxy.option.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\nvar connect = require(\"connect\");\nvar request = require(\"supertest\");\n\ndescribe(\"Accepting single middleware as a proxy option\", function() {\n    it(\"should call the middleware\", function(done) {\n        var path = \"/forms.html\";\n\n        browserSync.reset();\n\n        var app = connect();\n        app.use(require(\"serve-static\")(\"./test/fixtures\"));\n\n        var server = app.listen();\n        var spy = sinon.spy();\n\n        var fn = function(req, res, next) {\n            spy(req.url);\n            next();\n        };\n\n        var config = {\n            proxy: {\n                target: \"http://localhost:\" + server.address().port,\n                middleware: fn // Back compat\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.init(config, function(err, bs) {\n            assert.equal(bs.options.get(\"middleware\").size, 2);\n\n            request(bs.server)\n                .get(path)\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function(err, res) {\n                    sinon.assert.calledWithExactly(spy, path);\n                    assert.include(res.text, bs.options.get(\"snippet\"));\n\n                    bs.cleanup(function() {\n                        server.close();\n                        done();\n                    });\n                });\n        });\n    });\n    it(\"can add middleware at run-time\", function(done) {\n        var path = \"/forms.html\";\n\n        browserSync.reset();\n\n        var app = connect();\n        app.use(require(\"serve-static\")(\"./test/fixtures\"));\n\n        var server = app.listen();\n        var spy = sinon.spy();\n\n        var fn = function(req, res, next) {\n            spy(req.url);\n            next();\n        };\n\n        var config = {\n            proxy: \"http://localhost:\" + server.address().port,\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.init(config, function(err, bs) {\n            bs.addMiddleware(\"*\", fn);\n\n            request(bs.server)\n                .get(path)\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function() {\n                    sinon.assert.calledWithExactly(spy, path);\n\n                    bs.cleanup(function() {\n                        server.close();\n                        done();\n                    });\n                });\n        });\n    });\n});\n\ndescribe(\"Accepting single middleware as a top-level proxy option\", function() {\n    var bs, spy, server;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        app.use(require(\"serve-static\")(\"./test/fixtures\"));\n\n        server = app.listen();\n\n        spy = sinon.spy();\n\n        var fn = function(req, res, next) {\n            spy(req.url);\n            next();\n        };\n\n        var config = {\n            proxy: {\n                target: \"http://localhost:\" + server.address().port\n            },\n            middleware: fn, // Back compat\n            logLevel: \"silent\",\n            open: false\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n        server.close();\n    });\n\n    it(\"serves files from the middleware with snippet added\", function() {\n        assert.equal(bs.options.get(\"middleware\").size, 2);\n    });\n    it(\"should call the middlewares\", function(done) {\n        var path = \"/forms.html\";\n        request(bs.server)\n            .get(path)\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                sinon.assert.calledWithExactly(spy, path);\n                assert.include(res.text, bs.options.get(\"snippet\"));\n                done();\n            });\n    });\n});\n\ndescribe(\"Accepting multiple middlewares as a proxy option\", function() {\n    var bs, spy, spy2, server;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        app.use(require(\"serve-static\")(\"./test/fixtures\"));\n\n        server = app.listen();\n\n        spy = sinon.spy();\n        spy2 = sinon.spy();\n\n        var fn = function(req, res, next) {\n            spy(req.url);\n            next();\n        };\n        var fn2 = function(req, res, next) {\n            spy2(req.url);\n            next();\n        };\n\n        var config = {\n            proxy: {\n                target: \"http://localhost:\" + server.address().port,\n                middleware: [fn, fn2] // Back compat\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n        server.close();\n    });\n\n    it(\"serves files from the middleware with snippet added\", function() {\n        assert.equal(bs.options.get(\"middleware\").size, 3);\n    });\n    it(\"should call the middlewares\", function(done) {\n        var path = \"/forms.html\";\n        request(bs.server)\n            .get(path)\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                sinon.assert.calledWithExactly(spy, path);\n                sinon.assert.calledWithExactly(spy2, path);\n                assert.include(res.text, bs.options.get(\"snippet\"));\n                done();\n            });\n    });\n});\n\ndescribe(\"Accepting multiple middlewares as a proxy option\", function() {\n    var bs, spy, spy2, server;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        app.use(require(\"serve-static\")(\"./test/fixtures\"));\n\n        server = app.listen();\n\n        spy = sinon.spy();\n        spy2 = sinon.spy();\n\n        var fn = function(req, res, next) {\n            spy(req.url);\n            next();\n        };\n        var fn2 = function(req, res, next) {\n            spy2(req.url);\n            next();\n        };\n\n        var config = {\n            proxy: {\n                target: \"http://localhost:\" + server.address().port\n            },\n            middleware: [fn, fn2], // Back compat\n            logLevel: \"silent\",\n            open: false\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n        server.close();\n    });\n\n    it(\"serves files from the middleware with snippet added\", function() {\n        assert.equal(bs.options.get(\"middleware\").size, 3);\n    });\n    it(\"should call the middlewares\", function(done) {\n        var path = \"/forms.html\";\n        request(bs.server)\n            .get(path)\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                sinon.assert.calledWithExactly(spy, path);\n                sinon.assert.calledWithExactly(spy2, path);\n                assert.include(res.text, bs.options.get(\"snippet\"));\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/middleware/middleware.server.option.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\nvar request = require(\"supertest\");\n\ndescribe(\"Accepting single middleware as a server option\", function() {\n    var bs, spy;\n\n    before(function(done) {\n        browserSync.reset();\n        spy = sinon.spy();\n\n        var fn = function(req, res, next) {\n            spy(req.url);\n            next();\n        };\n\n        var config = {\n            server: {\n                baseDir: \"./test/fixtures\",\n                middleware: fn // Back compat\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"serves files from the middleware with snippet added\", function() {\n        assert.equal(bs.options.get(\"middleware\").size, 2);\n    });\n    it(\"should call the middlewares\", function(done) {\n        request(bs.server)\n            .get(\"/\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                sinon.assert.calledWithExactly(spy, \"/\");\n                assert.include(res.text, bs.options.get(\"snippet\"));\n                done();\n            });\n    });\n});\n\ndescribe(\"Accepting single middleware as a top-level option\", function() {\n    var bs, spy;\n\n    before(function(done) {\n        browserSync.reset();\n        spy = sinon.spy();\n\n        var fn = function(req, res, next) {\n            spy(req.url);\n            next();\n        };\n\n        var config = {\n            server: {\n                baseDir: \"./test/fixtures\"\n            },\n            middleware: fn,\n            logLevel: \"silent\",\n            open: false\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"serves files from the middleware with snippet added\", function() {\n        assert.equal(bs.options.get(\"middleware\").size, 2);\n    });\n    it(\"should call the middlewares\", function(done) {\n        request(bs.server)\n            .get(\"/\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                sinon.assert.calledWithExactly(spy, \"/\");\n                assert.include(res.text, bs.options.get(\"snippet\"));\n                done();\n            });\n    });\n});\n\ndescribe(\"Accepting multiple middleware as a server option\", function() {\n    var bs, spy, spy2;\n\n    before(function(done) {\n        browserSync.reset();\n        spy = sinon.spy();\n        spy2 = sinon.spy();\n\n        var fn = function(req, res, next) {\n            spy(req.url);\n            next();\n        };\n        var fn2 = function(req, res, next) {\n            spy2(req.url);\n            next();\n        };\n\n        var config = {\n            server: {\n                baseDir: \"./test/fixtures\",\n                middleware: [fn, fn2] // Back compat\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"serves files from the middleware with snippet added\", function() {\n        assert.equal(bs.options.get(\"middleware\").size, 3);\n    });\n    it(\"should call the middlewares\", function(done) {\n        request(bs.server)\n            .get(\"/\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                sinon.assert.calledWithExactly(spy, \"/\");\n                sinon.assert.calledWithExactly(spy2, \"/\");\n                assert.include(res.text, bs.options.get(\"snippet\"));\n                done();\n            });\n    });\n});\n\ndescribe(\"Accepting multiple server middlewares as top-level option\", function() {\n    var bs, spy, spy2;\n\n    before(function(done) {\n        browserSync.reset();\n        spy = sinon.spy();\n        spy2 = sinon.spy();\n\n        var fn = function(req, res, next) {\n            spy(req.url);\n            next();\n        };\n        var fn2 = function(req, res, next) {\n            spy2(req.url);\n            next();\n        };\n\n        var config = {\n            server: \"test/fixtures\",\n            logLevel: \"silent\",\n            open: false,\n            middleware: [fn, fn2]\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"serves files from the middleware with snippet added\", function() {\n        assert.equal(bs.options.get(\"middleware\").size, 3);\n    });\n    it(\"should call the middlewares\", function(done) {\n        request(bs.server)\n            .get(\"/\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                sinon.assert.calledWithExactly(spy, \"/\");\n                sinon.assert.calledWithExactly(spy2, \"/\");\n                assert.include(res.text, bs.options.get(\"snippet\"));\n                done();\n            });\n    });\n});\n\ndescribe(\"Allow middlewares to call next() after res.end if no server provided\", function() {\n    var bs;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var fn = function(req, res, next) {\n            res.write(\"bs\");\n            res.end();\n            next();\n        };\n\n        var config = {\n            logLevel: \"silent\",\n            open: false,\n            middleware: fn\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"should call the middlewares\", function(done) {\n        request(bs.server)\n            .get(\"/\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"bs\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/proxy/e2e.proxy.cookies.js",
    "content": "var browserSync = require(\"../../../../\");\nvar testUtils = require(\"../../../protractor/utils\");\nvar Immutable = require(\"immutable\");\nvar request = require(\"supertest\");\n\ndescribe.skip(\"E2E proxy test with custom cookies options passed to foxy\", function() {\n    this.timeout(15000);\n\n    var bs, app;\n\n    before(function(done) {\n        browserSync.reset();\n\n        app = testUtils.getApp(Immutable.Map({ scheme: \"https\" }));\n\n        app.server.listen();\n\n        var config = {\n            proxy: {\n                target: \"https://localhost:\" + app.server.address().port,\n                cookies: {\n                    stripDomain: false\n                }\n            },\n            open: false,\n            logLevel: \"silent\"\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n        app.server.close();\n    });\n\n    it(\"sets cookie stripDomain: false\", function(done) {\n        var expected = app.html.replace(\"BS\", bs.options.get(\"snippet\") + \"BS\");\n\n        request(bs.options.getIn([\"urls\", \"local\"]))\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200, expected, done);\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/proxy/e2e.proxy.error.js",
    "content": "var browserSync = require(\"../../../../\");\nvar testUtils = require(\"../../../protractor/utils\");\nvar Immutable = require(\"immutable\");\nvar assert = require(\"chai\").assert;\n\ndescribe.skip(\"E2E proxy test with custom proxy error handler\", function() {\n    this.timeout(15000);\n\n    var bs, app;\n\n    before(function(done) {\n        browserSync.reset();\n\n        app = testUtils.getApp(Immutable.Map({ scheme: \"https\" }));\n\n        app.server.listen();\n\n        var config = {\n            proxy: {\n                target: \"http://iuiu:4444\"\n            },\n            open: false,\n            logLevel: \"silent\"\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n        app.server.close();\n    });\n\n    it(\"logs proxy errors with debug logger\", function(done) {\n        var obj = {\n            hostname: \"localhost\",\n            port: bs.options.get(\"port\"),\n            path: \"/\"\n        };\n\n        var spy = require(\"sinon\").spy(bs.logger, \"debug\");\n\n        var req = require(\"http\").request(obj, function() {\n            /* noop */\n        });\n        req.on(\"error\", function(err) {\n            var int = setInterval(function() {\n                if (spy.getCall(0)) {\n                    clearInterval(int);\n                    assert.equal(spy.getCall(0).args[1], err.message);\n                    done();\n                }\n            }, 100);\n        });\n        req.write(\"sup\");\n        req.end();\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/proxy/e2e.proxy.external.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe.skip(\"E2E proxy test external\", function() {\n    var instance;\n\n    before(function(done) {\n        instance = browserSync(\n            {\n                proxy: \"homestead.app:8000\",\n                open: false\n            },\n            done\n        );\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"can init proxy & serve a page\", function(done) {\n        assert.isString(instance.options.get(\"snippet\"));\n        assert.isDefined(instance.server);\n\n        request(instance.server)\n            .get(\"/\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"browser-sync-client\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/proxy/e2e.proxy.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar connect = require(\"connect\");\nvar serveStatic = require(\"serve-static\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\nvar client = require(\"socket.io-client\");\n\ndescribe(\"E2E proxy test\", function() {\n    var instance, server, options;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        app.use(serveStatic(\"./test/fixtures\"));\n        server = app.listen();\n        var proxytarget = \"http://localhost:\" + server.address().port;\n\n        var config = {\n            proxy: proxytarget,\n            logLevel: \"silent\",\n            open: false\n        };\n\n        instance = browserSync.init([], config, function(err, bs) {\n            options = bs.options;\n            done();\n        }).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        server.close();\n    });\n\n    it(\"can init proxy & serve a page\", function(done) {\n        assert.isDefined(instance.server);\n\n        request(instance.server)\n            .get(\"/index-large.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, options.get(\"snippet\"));\n                done();\n            });\n    });\n\n    it.skip(\"Can proxy websockets\", function(done) {\n        var called;\n        instance.io.sockets.on(\"connection\", function() {\n            if (!called) {\n                called = true;\n                done();\n            }\n        });\n\n        var options = instance.options.toJS();\n        var connectionUrl = options.urls.local + options.socket.namespace;\n        var clientSockets = client(connectionUrl, {\n            path: options.socket.path\n        });\n\n        clientSockets.emit(\"shane\", { name: \"shane\" });\n    });\n\n    it(\"Can serve the script\", function(done) {\n        request(instance.server)\n            .get(options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n\n    it(\"Can serve files with snippet added\", function(done) {\n        request(options.getIn([\"urls\", \"local\"]))\n            .get(\"/\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, instance.options.get(\"snippet\"));\n                done();\n            });\n    });\n});\n\ndescribe(\"E2E proxy test (2)\", function() {\n    var instance, server, options;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        app.use(serveStatic(\"./test/fixtures\"));\n        server = app.listen();\n        var proxytarget = \"http://localhost:\" + server.address().port;\n\n        var config = {\n            proxy: proxytarget + \"/forms.html\",\n            logLevel: \"silent\",\n            open: false\n        };\n\n        instance = browserSync.init([], config, function(err, bs) {\n            options = bs.options;\n            done();\n        }).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        server.close();\n    });\n\n    it(\"Can serve the script\", function() {\n        assert.equal(instance.options.get(\"startPath\"), \"/forms.html\");\n    });\n});\n\ndescribe(\"E2E proxy test with proxyRes option\", function() {\n    var instance, server, options;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        app.use(serveStatic(\"./test/fixtures\"));\n        server = app.listen();\n        var proxytarget = \"http://localhost:\" + server.address().port;\n\n        var config = {\n            proxy: {\n                target: proxytarget,\n                proxyRes: [\n                    function(res) {\n                        res.headers[\"cache-control\"] = \"private\"; // default is 'public, max-age=0'\n                    }\n                ]\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        instance = browserSync.init([], config, function(err, bs) {\n            options = bs.options;\n            done();\n        }).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        server.close();\n    });\n\n    it(\"Can override the cache-control header\", function(done) {\n        request(instance.server)\n            .get(\"/\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.headers[\"cache-control\"], \"private\");\n                done();\n            });\n    });\n});\n\ndescribe(\"E2E proxy test with object option\", function() {\n    var instance, server, options;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        app.use(serveStatic(\"./test/fixtures\"));\n        server = app.listen();\n        var proxytarget = \"http://localhost:\" + server.address().port;\n\n        var config = {\n            proxy: {\n                target: proxytarget\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        instance = browserSync.init([], config, function(err, bs) {\n            options = bs.options;\n            done();\n        }).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        server.close();\n    });\n\n    it(\"Can serve the script\", function(done) {\n        request(instance.server)\n            .get(\"/index-large.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, options.get(\"snippet\"));\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/proxy/e2e.proxy.proxy.options.js",
    "content": "var browserSync = require(\"../../../../\");\nvar testUtils = require(\"../../../protractor/utils\");\nvar Immutable = require(\"immutable\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E proxy test with `proxyOptions`\", function() {\n    this.timeout(15000);\n\n    var bs, app;\n\n    before(function(done) {\n        browserSync.reset();\n\n        app = testUtils.getApp(Immutable.Map({ scheme: \"https\" }));\n\n        app.server.listen();\n\n        var config = {\n            proxy: {\n                target: \"https://localhost:\" + app.server.address().port,\n                proxyOptions: {\n                    xfwd: true\n                }\n            },\n            open: false,\n            logLevel: \"silent\"\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n        app.server.close();\n    });\n\n    it(\"sets options for node-http-proxy\", function(done) {\n        var expected = app.html.replace(\"BS\", bs.options.get(\"snippet\") + \"BS\");\n        var headers;\n\n        app.app.stack.unshift({\n            route: \"/index.html\",\n            handle: function(req, res, next) {\n                headers = req.headers;\n                next();\n            }\n        });\n\n        request(bs.options.getIn([\"urls\", \"local\"]))\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.ok(headers[\"x-forwarded-for\"]);\n                assert.ok(headers[\"x-forwarded-port\"]);\n                assert.equal(res.text, expected);\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/proxy/e2e.proxy.req.headers.js",
    "content": "var browserSync = require(\"../../../../\");\nvar testUtils = require(\"../../../protractor/utils\");\nvar Immutable = require(\"immutable\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E proxy test with custom req headers\", function() {\n    this.timeout(15000);\n\n    var bs, app;\n\n    before(function(done) {\n        browserSync.reset();\n\n        app = testUtils.getApp(Immutable.Map({ scheme: \"https\" }));\n\n        app.server.listen();\n\n        var config = {\n            proxy: {\n                target: \"https://localhost:\" + app.server.address().port,\n                proxyOptions: {\n                    xfwd: true\n                },\n                reqHeaders: function() {\n                    return {\n                        \"is-dev\": \"yeah\"\n                    };\n                }\n            },\n            open: false,\n            logLevel: \"silent\"\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n        app.server.close();\n    });\n\n    it(\"sets custom headers on proxy reqs\", function(done) {\n        var expected = app.html.replace(\"BS\", bs.options.get(\"snippet\") + \"BS\");\n        var headers;\n\n        app.app.stack.unshift({\n            route: \"/index.html\",\n            handle: function(req, res, next) {\n                headers = req.headers;\n                next();\n            }\n        });\n\n        request(bs.options.getIn([\"urls\", \"local\"]))\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.equal(res.text, expected);\n                assert.ok(headers[\"is-dev\"]);\n                assert.ok(headers[\"x-forwarded-port\"]);\n                assert.ok(headers[\"x-forwarded-proto\"]);\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/proxy/e2e.proxy.req.headers.obj.js",
    "content": "var browserSync = require(\"../../../../\");\nvar testUtils = require(\"../../../protractor/utils\");\nvar Immutable = require(\"immutable\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E proxy test with custom req headers as object\", function() {\n    this.timeout(15000);\n\n    var bs, app;\n\n    before(function(done) {\n        browserSync.reset();\n\n        app = testUtils.getApp(Immutable.Map({ scheme: \"https\" }));\n\n        app.server.listen();\n\n        var config = {\n            proxy: {\n                target: \"https://localhost:\" + app.server.address().port,\n                proxyOptions: {\n                    xfwd: true\n                },\n                reqHeaders: {\n                    \"is-dev\": \"true\"\n                }\n            },\n            open: false,\n            logLevel: \"silent\"\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n        app.server.close();\n    });\n\n    it(\"sets custom headers on proxy reqs from an object\", function(done) {\n        var expected = app.html.replace(\"BS\", bs.options.get(\"snippet\") + \"BS\");\n        var headers;\n\n        app.app.stack.unshift({\n            route: \"/index.html\",\n            handle: function(req, res, next) {\n                headers = req.headers;\n                next();\n            }\n        });\n\n        request(bs.options.getIn([\"urls\", \"local\"]))\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.equal(res.text, expected);\n                assert.ok(headers[\"is-dev\"]);\n                assert.ok(headers[\"x-forwarded-port\"]);\n                assert.ok(headers[\"x-forwarded-proto\"]);\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/proxy/e2e.proxy.rewrite.rules.add.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar connect = require(\"connect\");\nvar serveStatic = require(\"serve-static\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\nvar Rx = require(\"rx\");\nvar utils = require(\"../../../utils\");\n\ndescribe(\"E2E proxy test with adding rewrite rules dynamically\", function() {\n    it(\"can accepts rules from options\", function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        var server = app.listen();\n        var proxytarget = \"http://localhost:\" + server.address().port;\n\n        app.use(\"/index.html\", function(req, res) {\n            res.setHeader(\"content-type\", \"text/html\");\n            res.end('<a href=\"' + proxytarget + '/my-link\">Browsersync</a>');\n        });\n\n        var config = {\n            proxy: proxytarget,\n            logLevel: \"silent\",\n            open: false,\n            rewriteRules: [\n                {\n                    match: /Browsersync/g,\n                    fn: function() {\n                        return \"BROWSERSYNC\";\n                    }\n                }\n            ]\n        };\n\n        browserSync.init([], config, function(err, bs) {\n            var reqs = utils.getRequests(\n                [\n                    [\n                        \"/index.html\",\n                        '<a href=\"//127.0.0.1:3000/my-link\">BROWSERSYNC</a>'\n                    ]\n                ],\n                bs.server\n            );\n\n            var obs = Rx.Observable.concat(reqs);\n\n            obs.subscribeOnCompleted(function() {\n                server.close();\n                bs.cleanup();\n                done();\n            });\n        });\n    });\n\n    it(\"can accepts rules from options + add on the fly\", function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        var server = app.listen();\n        var proxytarget = \"http://localhost:\" + server.address().port;\n\n        app.use(\"/index.html\", function(req, res) {\n            res.setHeader(\"content-type\", \"text/html\");\n            res.end('<a href=\"' + proxytarget + '/my-link\">Browsersync</a>');\n        });\n\n        var config = {\n            proxy: proxytarget,\n            logLevel: \"silent\",\n            open: false,\n            rewriteRules: [\n                {\n                    match: /Browsersync/g,\n                    fn: function() {\n                        return \"BROWSERSYNC\";\n                    }\n                }\n            ]\n        };\n\n        browserSync.init([], config, function(err, bs) {\n            var reqs = utils.getRequests(\n                [\n                    [\n                        \"/index.html\",\n                        '<a href=\"//127.0.0.1:3000/my-link\">BROWSERSYNC</a>'\n                    ],\n                    function() {\n                        bs.addRewriteRule({\n                            match: /BROWSERSYNC/,\n                            replace: \"shane\",\n                            id: \"my-rewrite-rule\"\n                        });\n                    },\n                    [\n                        \"/index.html\",\n                        '<a href=\"//127.0.0.1:3000/my-link\">shane</a>'\n                    ],\n                    function() {\n                        bs.removeRewriteRule(\"my-rewrite-rule\");\n                    },\n                    [\n                        \"/index.html\",\n                        '<a href=\"//127.0.0.1:3000/my-link\">BROWSERSYNC</a>'\n                    ]\n                ],\n                bs.server\n            );\n\n            var obs = Rx.Observable.concat(reqs);\n\n            obs.subscribeOnCompleted(function() {\n                server.close();\n                bs.cleanup();\n                done();\n            });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/proxy/e2e.proxy.rewrite.rules.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar connect = require(\"connect\");\nvar serveStatic = require(\"serve-static\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E proxy test with rewrite rules\", function() {\n    var bs, server, options;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        app.use(serveStatic(\"test/fixtures\"));\n        server = app.listen();\n        var proxytarget = \"http://localhost:\" + server.address().port;\n\n        var config = {\n            proxy: proxytarget,\n            logLevel: \"silent\",\n            open: false,\n            rewriteRules: [\n                {\n                    match: /BrowserSync/g,\n                    fn: function() {\n                        return \"BROWSERSYNC\";\n                    }\n                }\n            ]\n        };\n\n        bs = browserSync.init([], config, function(err, bs) {\n            options = bs.options;\n            done();\n        }).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n        server.close();\n    });\n\n    it(\"can add rules on the fly\", function(done) {\n        request(bs.server)\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"BROWSERSYNC\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/proxy/e2e.proxy.rewrite.rules.remove.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar connect = require(\"connect\");\nvar serveStatic = require(\"serve-static\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E proxy test with adding and removing rewrite rules dynamically\", function() {\n    var bs, server, options;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        app.use(serveStatic(\"test/fixtures\"));\n        server = app.listen();\n        var proxytarget = \"http://localhost:\" + server.address().port;\n\n        var config = {\n            proxy: proxytarget,\n            logLevel: \"silent\",\n            open: false,\n            online: false\n        };\n\n        bs = browserSync.init([], config, function(err, bs) {\n            options = bs.options;\n            done();\n        }).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n        server.close();\n    });\n\n    it(\"can add rules on the fly\", function(done) {\n        bs.addRewriteRule({\n            match: \"BrowserSync\",\n            replace: \"BROWSERSYNC\",\n            id: \"myrule\"\n        });\n\n        request(bs.server)\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"BROWSERSYNC\");\n\n                bs.removeRewriteRule(\"myrule\");\n\n                request(bs.server)\n                    .get(\"/index.html\")\n                    .set(\"accept\", \"text/html\")\n                    .expect(200)\n                    .end(function(err, res) {\n                        assert.include(res.text, \"BrowserSync\");\n                        assert.notInclude(res.text, \"BROWSERSYNC\");\n                        done();\n                    });\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/proxy/e2e.proxy.rewrite.rules.replace.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar connect = require(\"connect\");\nvar serveStatic = require(\"serve-static\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E proxy test with replacing rewrite rules dynamically\", function() {\n    var bs, server, options;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        app.use(serveStatic(\"test/fixtures\"));\n        server = app.listen();\n        var proxytarget = \"http://localhost:\" + server.address().port;\n\n        var config = {\n            proxy: proxytarget,\n            logLevel: \"silent\",\n            open: false,\n            rewriteRules: [\n                {\n                    match: /BrowserSync/g,\n                    fn: function() {\n                        return \"BROWSERSYNC\";\n                    }\n                }\n            ]\n        };\n\n        bs = browserSync.init([], config, function(err, bs) {\n            options = bs.options;\n            done();\n        }).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n        server.close();\n    });\n\n    it(\"can add rules on the fly\", function(done) {\n        request(bs.server)\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"BROWSERSYNC\");\n\n                bs.options = bs.options.update(\"rewriteRules\", function() {\n                    return require(\"immutable\").List([]);\n                });\n\n                bs.resetMiddlewareStack();\n\n                request(bs.server)\n                    .get(\"/index.html\")\n                    .set(\"accept\", \"text/html\")\n                    .expect(200)\n                    .end(function(err, res) {\n                        assert.include(res.text, \"BrowserSync\");\n                        done();\n                    });\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/proxy/e2e.proxy.secure.js",
    "content": "var browserSync = require(\"../../../../\");\nvar testUtils = require(\"../../../protractor/utils\");\nvar Immutable = require(\"immutable\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\nprocess.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;\n\ndescribe(\"E2E TLS proxy test\", function() {\n    this.timeout(15000);\n\n    it(\"Set's a HTTPS url\", function(done) {\n        browserSync.reset();\n\n        var app = testUtils.getApp(Immutable.Map({ scheme: \"https\" }));\n\n        app.server.listen();\n\n        var config = {\n            proxy: \"https://localhost:\" + app.server.address().port,\n            open: false,\n            logLevel: \"silent\"\n        };\n\n        browserSync.init(config, function(err, bs) {\n            bs.cleanup();\n            app.server.close();\n\n            var local = bs.options.getIn([\"urls\", \"local\"]);\n            assert.equal(\"https://localhost:\" + bs.options.get(\"port\"), local);\n\n            done();\n        });\n    });\n\n    it(\"Set's a HTTPS url with none-https proxy target\", function(done) {\n        browserSync.reset();\n\n        var app = testUtils.getApp(Immutable.Map({ scheme: \"http\" }));\n\n        app.server.listen();\n\n        var config = {\n            proxy: \"http://localhost:\" + app.server.address().port,\n            open: false,\n            logLevel: \"silent\",\n            https: true\n        };\n\n        browserSync.init(config, function(err, bs) {\n            if (err) {\n                throw err;\n            }\n\n            var local = bs.options.getIn([\"urls\", \"local\"]);\n            var expected = app.html.replace(\n                \"BS\",\n                bs.options.get(\"snippet\") + \"BS\"\n            );\n\n            assert.equal(\"https://localhost:\" + bs.options.get(\"port\"), local);\n\n            request(bs.options.getIn([\"urls\", \"local\"]))\n                .get(\"/index.html\")\n                .set(\"accept\", \"text/html\")\n                .expect(200, function(err, res) {\n                    assert.equal(res.text, expected);\n                    bs.cleanup();\n                    app.server.close();\n                    done();\n                });\n        });\n    });\n\n    it(\"proxies over https and injects snippet\", function(done) {\n        browserSync.reset();\n\n        var app = testUtils.getApp(Immutable.Map({ scheme: \"https\" }));\n\n        app.server.listen();\n\n        var config = {\n            proxy: \"https://localhost:\" + app.server.address().port,\n            open: false,\n            logLevel: \"silent\"\n        };\n\n        browserSync.init(config, function(err, bs) {\n            assert.isString(bs.options.get(\"snippet\"));\n\n            var expected = app.html.replace(\n                \"BS\",\n                bs.options.get(\"snippet\") + \"BS\"\n            );\n\n            request(bs.options.getIn([\"urls\", \"local\"]))\n                .get(\"/index.html\")\n                .set(\"accept\", \"text/html\")\n                .expect(200, expected, function() {\n                    bs.cleanup();\n                    app.server.close();\n                    done();\n                });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/proxy/e2e.proxy.snippet.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar connect = require(\"connect\");\nvar serveStatic = require(\"serve-static\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E proxy test with snippet options: Whitelist\", function() {\n    var instance, server, options;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        app.use(serveStatic(\"./test/fixtures\"));\n        server = app.listen();\n        var proxytarget = \"http://localhost:\" + server.address().port;\n\n        var config = {\n            proxy: proxytarget,\n            logLevel: \"silent\",\n            open: false,\n            snippetOptions: {\n                whitelist: [\"/index-large.html\"]\n            }\n        };\n\n        instance = browserSync.init([], config, function(err, bs) {\n            options = bs.options;\n            done();\n        }).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        server.close();\n    });\n\n    it(\"can init proxy & serve a page with whitelist option (injects snippet even without html headers)\", function(done) {\n        assert.isDefined(instance.server);\n\n        request(instance.server)\n            .get(\"/index-large.html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, options.get(\"snippet\"));\n                done();\n            });\n    });\n});\n\ndescribe(\"E2E proxy test with snippet options: blacklist\", function() {\n    var instance, server, options;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        app.use(serveStatic(\"./test/fixtures\"));\n        server = app.listen();\n        var proxytarget = \"http://localhost:\" + server.address().port;\n\n        var config = {\n            proxy: proxytarget,\n            logLevel: \"silent\",\n            open: false,\n            snippetOptions: {\n                blacklist: [\"/index-large.html\"]\n            }\n        };\n\n        instance = browserSync.init([], config, function(err, bs) {\n            options = bs.options;\n            done();\n        }).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        server.close();\n    });\n\n    it(\"can init proxy & serve a page with whitelist option\", function(done) {\n        assert.isDefined(instance.server);\n\n        request(instance.server)\n            .get(\"/index-large.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.notInclude(res.text, options.get(\"snippet\"));\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/proxy/e2e.proxy.ws.js",
    "content": "var browserSync = require(\"../../../../\");\nvar connect = require(\"connect\");\nvar assert = require(\"chai\").assert;\nvar socket = require(\"socket.io\");\nvar client = require(\"socket.io-client\");\n\n// this is going to be replaced with a full e2e test in the browser\ndescribe.skip(\"E2E proxy + Web sockets test\", function() {\n    var instance, server, options;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var app = connect();\n        server = app.listen();\n        var proxytarget = \"http://localhost:\" + server.address().port;\n\n        var config = {\n            proxy: {\n                target: proxytarget,\n                ws: true\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        instance = browserSync.init([], config, function(err, bs) {\n            options = bs.options;\n            done();\n        }).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        server.close();\n    });\n\n    it(\"can init proxy & serve a page\", function(done) {\n        assert.equal(instance.options.getIn([\"proxy\", \"ws\"]), true);\n\n        socket(server);\n\n        server.on(\"upgrade\", function() {\n            done();\n        });\n\n        client.connect(instance.options.getIn([\"urls\", \"local\"]), {\n            forceNew: true\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.404.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe.skip(\"E2E server test - 404 pages\", function() {\n    this.timeout(5000);\n\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"serves files with the snippet added\", function(done) {\n        request(instance.server)\n            .get(\"/erthert-404wewefq\")\n            .set(\"accept\", \"text/html\")\n            .expect(404)\n            .end(function(err, res) {\n                //console.log(res.statusCode);\n                assert.notInclude(res.text, \"Cannot GET /erthert-404.html\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.dirs.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E server test with directory listings\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: [\"test/fixtures/alt\", \"test/fixtures\"],\n                index: \"index.htm\"\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        instance = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"serves files from index.htm with multiple base dirs\", function(done) {\n        request(instance.server)\n            .get(\"/\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"Hello from the test\");\n                done();\n            });\n    });\n});\ndescribe(\"E2E server test with base dir option\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"./test/fixtures\"\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        instance = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"Serves files when baseDir given with leading dot.\", function(done) {\n        request(instance.server)\n            .get(\"/\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"<title>Test HTML Page</title>\");\n                done();\n            });\n    });\n});\n\ndescribe(\"E2E server test with base dir array option\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: [\"./test/fixtures\", \"./test/fixtures/alt\"],\n            logLevel: \"silent\",\n            open: false\n        };\n\n        instance = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"Serves files when baseDir given with leading dot.\", function(done) {\n        request(instance.server)\n            .get(\"/\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"<title>Test HTML Page</title>\");\n                done();\n            });\n    });\n});\n\ndescribe(\"E2E server test with base dir array option + directory\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: [\"test\", \"app\"],\n                directory: true\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        instance = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"Serves files when baseDir given with leading dot.\", function(done) {\n        request(instance.server)\n            .get(\"/\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"listing directory /\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.httpModule.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar assert = require(\"chai\").assert;\nvar request = require(\"supertest\");\n\ndescribe(\"E2E httpModule options test\", function() {\n    it.skip(\"creates server using provided httpModule\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            https: true,\n            httpModule: \"http2\",\n            open: false,\n            logLevel: \"silent\"\n        };\n\n        browserSync.init(config, function(err, bs) {\n            request(bs.options.getIn([\"urls\", \"local\"]))\n                .get(\"/index.html\")\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function(err, res) {\n                    if (err) {\n                        console.log(err);\n                        return done(err);\n                    }\n                    assert.include(res.text, bs.options.get(\"snippet\"));\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E server test\", function() {\n    this.timeout(5000);\n\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\",\n                index: \"index.htm\"\n            },\n            ghostMode: {\n                clicks: false,\n                scroll: false\n            },\n            logLevel: \"silent\",\n            open: false,\n            files: [\"*.html\"]\n        };\n\n        instance = browserSync(config, function(err) {\n            if (err) {\n                throw err;\n            }\n            done();\n        }).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"serves files with the snippet added\", function(done) {\n        assert.isString(instance.options.get(\"snippet\"));\n\n        request(instance.server)\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, instance.options.get(\"snippet\"));\n                done();\n            });\n    });\n\n    it(\"serves the client script\", function(done) {\n        request(instance.server)\n            .get(instance.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.middleware.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar connect = require(\"connect\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E server test with middleware\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var middleware = connect();\n\n        middleware.use(\"/custom/middleware\", function(req, res) {\n            res.end(\"<html><body></body></html>\");\n        });\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\",\n                middleware: middleware\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        instance = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"serves files from the middleware with snippet added\", function(done) {\n        assert.isString(instance.options.get(\"snippet\"));\n\n        request(instance.server)\n            .get(\"/custom/middleware\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, instance.options.get(\"snippet\"));\n                done();\n            });\n    });\n\n    it(\"serves the client script\", function(done) {\n        request(instance.server)\n            .get(instance.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.newapi.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar sinon = require(\"sinon\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E server test with only a callback\", function() {\n    var instance;\n    var stub;\n\n    before(function(done) {\n        browserSync.reset();\n        stub = sinon.spy(console, \"log\");\n        instance = browserSync(done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        console.log.restore();\n    });\n\n    it(\"Can return the script\", function(done) {\n        request(instance.server)\n            .get(instance.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n\ndescribe(\"E2E server test with only a config option\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        var called;\n\n        instance = browserSync({\n            open: false,\n            logLevel: \"silent\",\n            server: {\n                baseDir: \"test/fixtures\"\n            }\n        }).instance;\n\n        instance.events.on(\"init\", function() {\n            if (!called) {\n                done();\n                called = true;\n            }\n        });\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"Can return the script\", function(done) {\n        request(instance.server)\n            .get(instance.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.newapi2.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar sinon = require(\"sinon\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E server test with only a callback\", function() {\n    var instance;\n    var stub;\n\n    before(function(done) {\n        browserSync.reset();\n        stub = sinon.spy(console, \"log\");\n        instance = browserSync(done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n        console.log.restore();\n    });\n\n    it(\"returns the script\", function(done) {\n        request(instance.server)\n            .get(instance.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n\ndescribe(\"E2E server test with config & callback\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            logLevel: \"silent\"\n        };\n\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"Can return the script\", function(done) {\n        request(instance.server)\n            .get(instance.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.rewrite.rules.add.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E server test with rewrite rules added on the fly\", function() {\n    var bs;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"serves files with HTML rewritten\", function(done) {\n        bs.addRewriteRule({\n            match: /Forms/g,\n            fn: function() {\n                return \"Shane's forms\";\n            }\n        });\n\n        request(bs.server)\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"Shane's forms\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.rewrite.rules.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E server test with rewrite rules\", function() {\n    it(\"serves files with HTML rewritten\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            rewriteRules: [\n                {\n                    match: /Forms/g,\n                    fn: function() {\n                        return \"Shane's forms\";\n                    }\n                }\n            ],\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.init(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/index.html\")\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function(err, res) {\n                    if (err) return done(err);\n                    assert.include(res.text, \"Shane's forms\");\n                    bs.cleanup(done);\n                });\n        });\n    });\n    it(\"supports legacy boolean for rewriteRules\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            rewriteRules: false,\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.init(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/index.html\")\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function(err) {\n                    if (err) return done(err);\n                    bs.cleanup(done);\n                });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.rewrite.rules.remove.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E server test with rewrite rules removed on the fly\", function() {\n    it(\"serves files with HTML rewritten\", function(done) {\n        browserSync.reset();\n        browserSync.init(\n            {\n                server: {\n                    baseDir: \"test/fixtures\"\n                },\n                rewriteRules: [{ match: \"kittie\", replace: \"shane\" }],\n                logLevel: \"silent\",\n                open: false\n            },\n            function(err, bs) {\n                bs.addRewriteRule({\n                    id: \"myrule\",\n                    match: /Forms/g,\n                    fn: function() {\n                        return \"Shane's forms\";\n                    }\n                });\n\n                request(bs.server)\n                    .get(\"/index.html\")\n                    .set(\"accept\", \"text/html\")\n                    .expect(200)\n                    .end(function(err, res) {\n                        assert.include(res.text, \"Shane's forms\");\n\n                        bs.removeRewriteRule(\"myrule\");\n\n                        request(bs.server)\n                            .get(\"/index.html\")\n                            .set(\"accept\", \"text/html\")\n                            .expect(200)\n                            .end(function(err, res) {\n                                assert.notInclude(res.text, \"Shane's forms\");\n                                done();\n                            });\n                    });\n            }\n        );\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.rewrite.rules.replace.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E server test with rewrite rules replaced on the fly\", function() {\n    var bs;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"serves files with HTML rewritten\", function(done) {\n        bs.addRewriteRule({\n            match: /Forms/g,\n            fn: function() {\n                return \"Shane's forms\";\n            }\n        });\n\n        request(bs.server)\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"Shane's forms\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.routes.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E server test with routes\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\",\n                routes: {\n                    \"/shane\": \"test/fixtures\",\n                    \"/kittie\": \"test/fixtures\",\n                    \"/node_modules/\": \"node_modules\"\n                }\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        instance = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"serves files from the route with snippet added\", function(done) {\n        assert.isString(instance.options.get(\"snippet\"));\n\n        request(instance.server)\n            .get(\"/shane/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, instance.options.get(\"snippet\"));\n                done();\n            });\n    });\n\n    it(\"serves files from the route with snippet added\", function(done) {\n        assert.isString(instance.options.get(\"snippet\"));\n\n        request(instance.server)\n            .get(\"/kittie/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, instance.options.get(\"snippet\"));\n                done();\n            });\n    });\n\n    it(\"serves the client script\", function(done) {\n        request(instance.server)\n            .get(instance.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.secure.custom.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar request = require(\"supertest\");\nvar path = require(\"path\");\nvar assert = require(\"chai\").assert;\n\nprocess.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;\n\ndescribe(\"E2E TLS server with custom certs test\", function() {\n    this.timeout(15000);\n\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        this.timeout(15000);\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            https: {\n                key: path.resolve(\"./certs/server.key\"),\n                cert: path.resolve(\"./certs/server.crt\")\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        instance = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"serves files with the snippet added\", function(done) {\n        request(instance.options.getIn([\"urls\", \"local\"]))\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                console.log(res.text);\n                assert.include(res.text, instance.options.get(\"snippet\"));\n                done();\n            });\n    });\n\n    it(\"serves the client script\", function(done) {\n        request(instance.options.getIn([\"urls\", \"local\"]))\n            .get(instance.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.secure.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\nprocess.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;\n\ndescribe(\"E2E TLS server options test\", function() {\n    this.timeout(15000);\n\n    var bs;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            https: true,\n            open: false,\n            logLevel: \"silent\"\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"serves files with the snippet added\", function() {\n        assert.include(bs.options.getIn([\"urls\", \"local\"]), \"https\");\n    });\n\n    it(\"serves files with the snippet added\", function(done) {\n        assert.isString(bs.options.get(\"snippet\"));\n\n        request(bs.options.getIn([\"urls\", \"local\"]))\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, bs.options.get(\"snippet\"));\n                done();\n            });\n    });\n});\n\ndescribe(\"E2E TLS server test (1)\", function() {\n    this.timeout(15000);\n\n    var bs;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\",\n                https: true\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        bs = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"serves files with the snippet added\", function(done) {\n        assert.isString(bs.options.get(\"snippet\"));\n\n        request(bs.options.getIn([\"urls\", \"local\"]))\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, bs.options.get(\"snippet\"));\n                done();\n            });\n    });\n\n    it(\"serves the client script\", function(done) {\n        request(bs.options.getIn([\"urls\", \"local\"]))\n            .get(bs.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n\ndescribe(\"E2E TLS server test (2)\", function() {\n    this.timeout(15000);\n\n    it(\"Does not use HTTPS if false\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            https: false,\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync(config, function(err, bs) {\n            assert.notInclude(bs.options.getIn([\"urls\", \"local\"]), \"https\");\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.secure.pfx.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar request = require(\"supertest\");\nvar path = require(\"path\");\nvar assert = require(\"chai\").assert;\n\nprocess.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;\n\ndescribe.skip(\"E2E TLS server with PFX certs test\", function() {\n    this.timeout(15000);\n\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        this.timeout(15000);\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            https: {\n                pfx: path.resolve(\"./certs/browsersync.pfx\")\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        instance = browserSync.init(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"serves files with the snippet added\", function(done) {\n        assert.isString(instance.options.get(\"snippet\"));\n\n        request(instance.options.getIn([\"urls\", \"local\"]))\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, instance.options.get(\"snippet\"));\n                done();\n            });\n    });\n\n    it(\"serves the client script\", function(done) {\n        request(instance.options.getIn([\"urls\", \"local\"]))\n            .get(instance.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.serveStatic.extensions.js",
    "content": "var browserSync = require(\"../../../../\");\nvar assert = require(\"chai\").assert;\nvar utils = require(\"../../../utils\");\nvar Rx = require(\"rx\");\n\ndescribe(\"E2E server test with extension option\", function() {\n    it(\"serves using 'extensions'\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            extensions: [\"html\"],\n            snippetOptions: {\n                blacklist: [\"/forms\"]\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.create().init(config, function(err, bs) {\n            assert.equal(\n                bs.options.getIn([\n                    \"server\",\n                    \"serveStaticOptions\",\n                    \"extensions\",\n                    0\n                ]),\n                \"html\"\n            );\n            var reqs = utils.getRequests(\n                [\n                    [\n                        \"/forms\",\n                        require(\"fs\").readFileSync(\n                            \"test/fixtures/forms.html\",\n                            \"utf-8\"\n                        )\n                    ]\n                ],\n                bs.server\n            );\n            Rx.Observable.concat(reqs).subscribeOnCompleted(function() {\n                bs.cleanup();\n                done();\n            });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.serveStatic.js",
    "content": "var browserSync = require(\"../../../../\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E server test with serve static options\", function() {\n    it(\"sets the index of serve-static\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\",\n                serveStaticOptions: {\n                    index: \"inputs.html\"\n                }\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.create().init(config, function(err, bs) {\n            assert.equal(\n                bs.options.getIn([\"server\", \"serveStaticOptions\", \"index\"]),\n                \"inputs.html\"\n            );\n            request(bs.server)\n                .get(\"/\")\n                .expect(200)\n                .end(function(err, res) {\n                    assert.deepEqual(\n                        require(\"fs\").readFileSync(\n                            \"test/fixtures/inputs.html\",\n                            \"utf-8\"\n                        ),\n                        res.text\n                    );\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n    it(\"sets uses the default for serve static index\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\",\n                serveStaticOptions: {}\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.create().init(config, function(err, bs) {\n            assert.equal(\n                bs.options.getIn([\"server\", \"serveStaticOptions\", \"index\"]),\n                \"index.html\"\n            );\n            request(bs.server)\n                .get(\"/\")\n                .expect(200)\n                .end(function(err, res) {\n                    assert.deepEqual(\n                        require(\"fs\").readFileSync(\n                            \"test/fixtures/index.html\",\n                            \"utf-8\"\n                        ),\n                        res.text\n                    );\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/e2e/server/e2e.server.tunnel.js",
    "content": "var browserSync = require(\"../../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe.skip(\"Tunnel e2e tests\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            logLevel: \"silent\",\n            open: false,\n            tunnel: true,\n            online: true\n        };\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"should call init on the tunnel\", function() {\n        assert.include(\n            instance.options.getIn([\"urls\", \"tunnel\"]),\n            \"localtunnel.me\"\n        );\n    });\n});\n\ndescribe.skip(\"Tunnel e2e tests with subdomain\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            logLevel: \"silent\",\n            open: false,\n            tunnel: String(Math.floor(Math.random() * 2e10)),\n            online: true\n        };\n        instance = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"should call init on the tunnel\", function() {\n        assert.include(\n            instance.options.getIn([\"urls\", \"tunnel\"]),\n            \"localtunnel.me\"\n        );\n    });\n});\n\ndescribe(\"Tunnel e2e tests with Error\", function() {\n    it.skip(\"does not blow up if tunnel unavailable\", function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            logLevel: \"silent\",\n            open: false,\n            tunnel: true,\n            online: true\n        };\n\n        var tunnelPath = require.resolve(\"localtunnel\");\n\n        require(\"localtunnel\");\n\n        require(\"sinon\")\n            .stub(require.cache[tunnelPath], \"exports\")\n            .yields(new Error(\"Some error from localtunnel.me\"));\n\n        browserSync(config, function(err, bs) {\n            assert.isUndefined(bs.options.getIn([\"urls\", \"tunnel\"]));\n            delete require.cache[tunnelPath];\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it.skip(\"does not crash if tunnel restarts\", function(done) {\n        browserSync.reset();\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            open: false,\n            tunnel: true,\n            online: true\n        };\n\n        browserSync(config, function(err, bs) {\n            bs.tunnel.emit(\n                \"error\",\n                new Error(\"connection refused: (check your firewall settings)\")\n            );\n            bs.cleanup();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/files/files.event-handler.js",
    "content": "var Rx = require(\"rx\");\nvar onNext = Rx.ReactiveTest.onNext;\nvar Immutable = require(\"immutable\");\nvar fromJS = Immutable.fromJS;\nvar assert = require(\"chai\").assert;\nvar injectFileTypes = require(\"../../../dist/default-config\").injectFileTypes;\nvar handler = require(\"../../../dist/file-event-handler\").fileChanges;\n\ndescribe(\"globally handling fle:changed events\", function() {\n    it(\"takes an observable + options\", function() {\n        var s = new Rx.TestScheduler();\n        var options = fromJS({\n            watchEvents: [\"add\", \"change\"],\n            reloadDebounce: 100,\n            debug: { scheduler: s },\n            injectFileTypes: injectFileTypes\n        });\n        var obs = s.createHotObservable(\n            onNext(200, { event: \"change\", path: \"core.css\" }),\n            onNext(201, { event: \"change\", path: \"other.css\" }),\n            onNext(203, { event: \"change\", path: \"core.css\" }),\n\n            onNext(403, { event: \"change\", path: \"core3.php\" }),\n            onNext(404, { event: \"change\", path: \"core4.php\" }),\n            onNext(405, { event: \"change\", path: \"core5.php\" }),\n\n            onNext(1003, { event: \"change\", path: \"core6.css\" }),\n            onNext(1004, { event: \"add\", path: \"core7.css\" }),\n            onNext(1005, { event: \"change\", path: \"core8.php\" })\n        );\n        var res = s.startScheduler(\n            function() {\n                return handler(obs, options);\n            },\n            { created: 0, subscribed: 0, disposed: 3000 }\n        );\n\n        assert.equal(res.messages[0].time, 303);\n        assert.equal(res.messages[1].time, 505);\n        assert.equal(res.messages[2].time, 1105);\n    });\n    it(\"takes an observable + options with delay\", function() {\n        var s = new Rx.TestScheduler();\n        var options = fromJS({\n            watchEvents: [\"add\", \"change\"],\n            reloadDebounce: 100,\n            reloadDelay: 1000,\n            debug: { scheduler: s },\n            injectFileTypes: injectFileTypes\n        });\n        var obs = s.createHotObservable(\n            onNext(200, { event: \"change\", path: \"core.css\" }),\n            onNext(201, { event: \"change\", path: \"other.css\" }),\n            onNext(203, { event: \"change\", path: \"core.css\" })\n        );\n        var res = s.startScheduler(\n            function() {\n                return handler(obs, options);\n            },\n            { created: 0, subscribed: 0, disposed: 3000 }\n        );\n\n        assert.equal(res.messages[0].time, 1303);\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/files/files.watching.debounce.js",
    "content": "var browserSync = require(\"../../../\");\nvar sinon = require(\"sinon\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"File Watcher Module - reloadDebounce\", function() {\n    it(\"only calls file:reload once within the time window\", function(done) {\n        browserSync.reset();\n        var scheduler = require(\"../../utils\").getScheduler();\n        var config = {\n            server: \"test/fixtures\",\n            open: false,\n            logLevel: \"silent\",\n            reloadDebounce: 1000,\n            online: false,\n            files: \"test/fixtures/*.html\",\n            debug: {\n                scheduler: scheduler\n            }\n        };\n        browserSync(config, function(err, bs) {\n            var fn = bs.watchers.core.watchers[0]._events.all;\n            var stub = sinon.stub(bs.io.sockets, \"emit\");\n\n            fn(\"change\", \"index.html\");\n\n            // debounced by 1000, so shouldn't fire right away\n            sinon.assert.notCalled(stub);\n\n            // now we advance the clock\n            scheduler.advanceBy(1000);\n\n            // And now we should see that the method was called\n            sinon.assert.called(stub);\n\n            bs.cleanup();\n            done();\n        });\n    });\n    it(\"waits for 1000 event silence before reloading\", function(done) {\n        browserSync.reset();\n        var scheduler = require(\"../../utils\").getScheduler();\n        var config = {\n            server: \"test/fixtures\",\n            files: \"test/fixtures/*.html\",\n            open: false,\n            logLevel: \"silent\",\n            reloadDebounce: 1000,\n            online: false,\n            debug: {\n                scheduler: scheduler\n            }\n        };\n        browserSync(config, function(err, bs) {\n            var fn = bs.watchers.core.watchers[0]._events.all;\n            var stub = sinon.stub(bs.io.sockets, \"emit\");\n\n            fn(\"change\", \"index.html\");\n\n            scheduler.advanceTo(900);\n\n            // Should not be called yet\n            sinon.assert.notCalled(stub.withArgs(\"browser:reload\"));\n\n            // Should now be called as we're over the debounce\n            scheduler.advanceTo(1001);\n\n            assert.equal(stub.withArgs(\"browser:reload\").getCalls().length, 1);\n\n            bs.cleanup();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/files/files.watching.delay.js",
    "content": "var browserSync = require(\"../../../\");\nvar sinon = require(\"sinon\");\n\ndescribe(\"File Watcher Module - reloadDelay\", function() {\n    it(\"emits reload event with 2000 delay\", function(done) {\n        browserSync.reset();\n        var scheduler = require(\"../../utils\").getScheduler();\n        var config = {\n            server: \"test/fixtures\",\n            open: false,\n            logLevel: \"silent\",\n            reloadDelay: 1000,\n            online: false,\n            files: \"test/fixtures/*.html\",\n            debug: {\n                scheduler: scheduler\n            }\n        };\n        browserSync(config, function(err, bs) {\n            var stub = sinon.stub(bs.io.sockets, \"emit\");\n            var fn = bs.watchers.core.watchers[0]._events.all;\n\n            fn(\"change\", \"core.css\");\n\n            sinon.assert.notCalled(stub.withArgs(\"file:reload\"));\n\n            // Advance virtual time beyond the delay\n            scheduler.advanceTo(1501);\n\n            sinon.assert.calledOnce(stub.withArgs(\"file:reload\"));\n\n            bs.cleanup();\n            done();\n        });\n    });\n    it(\"calls browser:reload with a delay\", function(done) {\n        browserSync.reset();\n        var scheduler = require(\"../../utils\").getScheduler();\n        var config = {\n            server: \"test/fixtures\",\n            open: false,\n            logLevel: \"silent\",\n            reloadDelay: 500,\n            online: false,\n            files: \"test/fixtures/*.html\",\n            debug: {\n                scheduler: scheduler\n            }\n        };\n        browserSync(config, function(err, bs) {\n            var stub = sinon.stub(bs.io.sockets, \"emit\");\n            var fn = bs.watchers.core.watchers[0]._events.all;\n\n            fn(\"change\", \"index.html\");\n\n            // before delay\n            scheduler.advanceTo(999);\n\n            sinon.assert.notCalled(stub.withArgs(\"browser:reload\"));\n\n            // Advance virtual time beyond the delay\n            scheduler.advanceTo(1000);\n\n            sinon.assert.calledOnce(stub.withArgs(\"browser:reload\"));\n\n            bs.cleanup();\n\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/files/files.watching.js",
    "content": "var browserSync = require(\"../../../\");\nvar hooks = require(\"../../../dist/hooks\");\nvar events = require(\"events\");\nvar path = require(\"path\");\nvar sinon = require(\"sinon\");\nvar assert = require(\"chai\").assert;\n\nvar outpath = path.join(__dirname, \"../../fixtures\");\n\ndescribe(\"File Watcher Module\", function() {\n    it(\"Passes options for chokidar\", function(done) {\n        browserSync.reset();\n        browserSync.create().init(\n            {\n                logLevel: \"silent\",\n                online: false,\n                files: \"css/*.css\",\n                watchOptions: {\n                    debounceDelay: 4000\n                }\n            },\n            function(err, bs) {\n                assert.equal(bs.watchers.core.watchers.length, 1);\n                assert.equal(\n                    bs.watchers.core.watchers[0].options.debounceDelay,\n                    4000\n                );\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n    it(\"Passes separate options for chokidar when multi given\", function(done) {\n        browserSync.reset();\n        browserSync.create().init(\n            {\n                logLevel: \"silent\",\n                online: false,\n                files: [\n                    \"css/*.css\",\n                    {\n                        match: \"*.html\",\n                        fn: function(event) {\n                            console.log(event);\n                        },\n                        options: {\n                            interval: 100\n                        }\n                    }\n                ],\n                watchOptions: {\n                    interval: 200\n                }\n            },\n            function(err, bs) {\n                assert.equal(bs.watchers.core.watchers.length, 2);\n                assert.equal(\n                    bs.watchers.core.watchers[0].options.interval,\n                    200\n                );\n                assert.equal(\n                    bs.watchers.core.watchers[1].options.interval,\n                    100\n                );\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n    it(\"should emit events about changed files in core namespace\", function(done) {\n        var tempFile = path.join(outpath, \"watch-func.txt\");\n        var called = false;\n\n        browserSync.reset();\n\n        // assert: it works if it calls done\n        var bs = browserSync.create();\n\n        bs.init(\n            {\n                files: [\n                    {\n                        options: {\n                            ignoreInitial: true\n                        },\n                        match: tempFile,\n                        fn: function(event, file) {\n                            assert.equal(event, \"change\");\n                            assert.equal(file, tempFile);\n                            assert.isFunction(this.reload);\n                            assert.isFunction(this.notify);\n                            bs.cleanup();\n                            if (!called) {\n                                done();\n                                called = true;\n                            }\n                        }\n                    }\n                ],\n                ui: false,\n                online: false,\n                logSnippet: false,\n                logLevel: \"silent\"\n            },\n            function(err, bs) {\n                bs.watchers.core.watchers[0]._events.all(\"change\", tempFile);\n            }\n        );\n    });\n    it(\"should emit events about added files when watchEvents added\", function(done) {\n        var tempFile = path.join(outpath, \"watch-func.txt\");\n        var called = false;\n\n        browserSync.reset();\n\n        // assert: it works if it calls done\n        var bs = browserSync.create();\n\n        bs.init(\n            {\n                watchEvents: [\"add\"],\n                files: [\n                    {\n                        options: {\n                            ignoreInitial: true\n                        },\n                        match: tempFile,\n                        fn: function(event, file) {\n                            assert.equal(event, \"add\");\n                            assert.equal(file, tempFile);\n                            assert.isFunction(this.reload);\n                            assert.isFunction(this.notify);\n                            bs.cleanup();\n                            if (!called) {\n                                done();\n                                called = true;\n                            }\n                        }\n                    }\n                ],\n                ui: false,\n                online: false,\n                logSnippet: false,\n                logLevel: \"silent\"\n            },\n            function(err, bs) {\n                bs.watchers.core.watchers[0]._events.all(\"add\", tempFile);\n            }\n        );\n    });\n    it(\"should allow obj literal with match & options, but without callback fn\", function(done) {\n        browserSync.reset();\n\n        var tempFile = path.join(outpath, \"watch-func.txt\");\n\n        // assert: it works if it calls done\n        var bs = browserSync.create();\n\n        bs.init(\n            {\n                files: [\n                    {\n                        options: {\n                            ignoreInitial: true\n                        },\n                        match: tempFile\n                    }\n                ],\n                ui: false,\n                online: false,\n                logSnippet: false,\n                logLevel: \"silent\"\n            },\n            function(err, bs) {\n                var spy = sinon.spy(bs.events, \"emit\");\n\n                bs.watchers.core.watchers[0]._events.all(\"change\", tempFile);\n\n                var callArgs = spy.getCall(0).args;\n\n                assert.equal(callArgs[0], \"file:changed\");\n                assert.equal(callArgs[1].event, \"change\");\n                assert.equal(callArgs[1].namespace, \"core\");\n\n                bs.cleanup();\n\n                done();\n            }\n        );\n    });\n    it(\"should allow arrays with , in API mode\", function(done) {\n        browserSync.reset();\n        var bs = browserSync.create();\n\n        bs.init(\n            {\n                files: [\"test/fixtures/**/*.{css,html}\"],\n                ui: false,\n                online: false,\n                logSnippet: false,\n                logLevel: \"silent\"\n            },\n            function(err, bs) {\n                assert.equal(\n                    bs.options.getIn([\"files\", \"core\", \"globs\"]).size,\n                    1\n                );\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/hooks/files.watch.hook.js",
    "content": "var assert = require(\"chai\").assert;\nvar hook = require(\"../../../dist/hooks\")[\"files:watch\"];\nvar merge = require(\"../../../dist/cli/cli-options\").merge;\nvar browserSync = require(\"../../../\");\n\ndescribe(\"files:watch hook\", function() {\n    it(\"should accept initial as List\", function() {\n        var [imm] = merge({\n            files: \"*.html\"\n        });\n        assert.deepEqual(hook([], imm.get(\"files\")).toJS(), {\n            core: {\n                globs: [\"*.html\"],\n                objs: []\n            }\n        });\n    });\n    it(\"should accept initial as List\", function() {\n        var [imm] = merge({\n            files: [\"*.html\"]\n        });\n\n        assert.deepEqual(hook([], imm.get(\"files\")).toJS(), {\n            core: {\n                globs: [\"*.html\"],\n                objs: []\n            }\n        });\n    });\n    it(\"should accept & merge initial as List + Plugin options\", function() {\n        var [imm] = merge({\n            files: \"*.html\"\n        });\n\n        var pluginOptions = {\n            plugin1: {\n                files: \"*.hbs\"\n            }\n        };\n\n        var files = imm.get(\"files\");\n\n        assert.deepEqual(hook([], files, pluginOptions).toJS(), {\n            core: {\n                globs: [\"*.html\"],\n                objs: []\n            },\n            plugin1: {\n                globs: [\"*.hbs\"],\n                objs: []\n            }\n        });\n    });\n    it(\"should accept both string globs + objects as file watching patterns\", function() {\n        var cb = function(event, file) {\n            console.log(file);\n        };\n\n        var [imm] = merge({\n            files: [\n                \"*.html\",\n                {\n                    match: \"*.css\",\n                    fn: cb\n                }\n            ]\n        });\n\n        assert.equal(imm.get(\"files\").toJS().core.globs[0], \"*.html\");\n        assert.equal(imm.get(\"files\").toJS().core.objs[0].match, \"*.css\");\n    });\n    it(\"should string globs + objects as file watching patterns 1\", function() {\n        var cb = function(event, file) {\n            console.log(file);\n        };\n\n        var [imm] = merge({\n            files: [\n                \"*.html\",\n                {\n                    match: \"*.css\",\n                    fn: cb\n                }\n            ]\n        });\n\n        var pluginOptions = {\n            plugin1: {\n                files: \"*.hbs\"\n            }\n        };\n\n        var out = hook([], imm.get(\"files\"), pluginOptions).toJS();\n\n        assert.equal(out.core.globs.length, 1);\n        assert.equal(out.core.objs.length, 1);\n        assert.equal(out.plugin1.globs.length, 1);\n        assert.equal(out.plugin1.objs.length, 0);\n\n        assert.equal(out.core.globs[0], \"*.html\");\n        assert.equal(out.core.objs[0].match, \"*.css\");\n\n        assert.equal(out.plugin1.globs[0], \"*.hbs\");\n    });\n    it(\"should string globs + objects as file watching patterns 2\", function() {\n        var cb = function(event, file) {\n            console.log(file);\n        };\n\n        var [imm] = merge({\n            files: [\n                \"*.html\",\n                {\n                    match: \"*.css\",\n                    fn: cb\n                }\n            ]\n        });\n\n        var pluginOptions = {\n            plugin1: {\n                files: [\n                    \"*.hbs\",\n                    {\n                        match: \"*.css\",\n                        fn: cb\n                    }\n                ]\n            }\n        };\n\n        var out = hook([], imm.get(\"files\"), pluginOptions).toJS();\n\n        assert.equal(out.core.globs.length, 1);\n        assert.equal(out.core.objs.length, 1);\n        assert.equal(out.plugin1.globs.length, 1);\n        assert.equal(out.plugin1.objs.length, 1);\n\n        assert.equal(out.core.globs[0], \"*.html\");\n        assert.equal(out.core.objs[0].match, \"*.css\");\n\n        assert.equal(out.plugin1.globs[0], \"*.hbs\");\n        assert.equal(out.plugin1.objs[0].fn, cb);\n    });\n\n    it(\"should string globs + objects as file watching patterns 3\", function(done) {\n        browserSync.reset();\n        browserSync.create().init(\n            {\n                online: false,\n                logLevel: \"silent\",\n                files: [\n                    \"*.html\",\n                    {\n                        match: \"*.css\",\n                        fn: function() {}\n                    }\n                ],\n                plugins: [\n                    {\n                        module: {\n                            plugin: function() {},\n                            \"plugin:name\": \"plugin1\"\n                        },\n                        options: {\n                            files: [\n                                \"*.hbs\",\n                                {\n                                    match: \"*.less\",\n                                    fn: function() {}\n                                }\n                            ]\n                        }\n                    }\n                ]\n            },\n            function(err, bs) {\n                if (err) {\n                    console.log(err);\n                    return done(err);\n                }\n                assert.equal(bs.watchers.core.watchers.length, 2);\n                assert.equal(bs.watchers.plugin1.watchers.length, 2);\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n    it(\"should string multi globs + objects as file watching patterns\", function(done) {\n        var cb = function() {};\n        browserSync.reset();\n        browserSync.create().init(\n            {\n                online: false,\n                logLevel: \"silent\",\n                files: [\n                    \"*.hbs\",\n                    \"*.jade\",\n                    {\n                        match: [\"*.html\"],\n                        fn: cb\n                    },\n                    {\n                        match: [\"*.css\"],\n                        fn: cb\n                    }\n                ],\n                plugins: [\n                    {\n                        module: {\n                            plugin: function() {},\n                            \"plugin:name\": \"plugin1\"\n                        },\n                        options: {\n                            files: [\n                                \"*.hbs\",\n                                {\n                                    match: \"!*.less\",\n                                    fn: cb\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        module: {\n                            plugin: function() {},\n                            \"plugin:name\": \"plugin2\"\n                        },\n                        options: {\n                            files: [\n                                \"*.hbs\",\n                                {\n                                    match: \"*.less\",\n                                    fn: cb\n                                }\n                            ]\n                        }\n                    }\n                ]\n            },\n            function(err, bs) {\n                if (err) {\n                    console.log(err);\n                    return done(err);\n                }\n                assert.equal(3, bs.watchers.core.watchers.length);\n                assert.equal(2, bs.watchers.plugin1.watchers.length);\n                assert.equal(2, bs.watchers.plugin2.watchers.length);\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n\n    it(\"should accept objs only as main option\", function(done) {\n        var cb = function() {};\n        browserSync.reset();\n        browserSync.create().init(\n            {\n                online: false,\n                logLevel: \"silent\",\n                files: [\n                    {\n                        match: [\"*.html\"],\n                        fn: cb\n                    }\n                ]\n            },\n            function(err, bs) {\n                assert.equal(1, bs.watchers.core.watchers.length);\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n\n    it(\"should accept objs only as plugin options only\", function(done) {\n        var cb = function() {};\n        browserSync.reset();\n        browserSync.create().init(\n            {\n                online: false,\n                logLevel: \"silent\",\n                plugins: [\n                    {\n                        module: {\n                            plugin: function() {},\n                            \"plugin:name\": \"plugin1\"\n                        },\n                        options: {\n                            files: [\n                                {\n                                    match: \"!*.less\",\n                                    fn: cb\n                                }\n                            ]\n                        }\n                    }\n                ]\n            },\n            function(err, bs) {\n                assert.equal(1, bs.watchers.plugin1.watchers.length);\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n\n    it(\"should accept globs only as plugin options only\", function(done) {\n        var cb = function() {};\n        browserSync.reset();\n        browserSync.create().init(\n            {\n                online: false,\n                logLevel: \"silent\",\n                files: \"*.html\",\n                plugins: [\n                    {\n                        module: {\n                            plugin: function() {},\n                            \"plugin:name\": \"plugin1\"\n                        },\n                        options: {\n                            files: [\n                                \"*.html\",\n                                \"*.css\",\n                                {\n                                    match: \"*.jade\",\n                                    fn: cb\n                                }\n                            ]\n                        }\n                    }\n                ]\n            },\n            function(err, bs) {\n                assert.equal(2, bs.watchers.plugin1.watchers.length);\n                assert.equal(1, bs.watchers.core.watchers.length);\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/http-protocol/http.reload.js",
    "content": "var browserSync = require(\"../../../\");\nvar request = require(\"request\");\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\nvar proto = require(\"../../../dist/http-protocol\");\n\ndescribe(\"HTTP protocol\", function() {\n    var bs, spy, scheduler;\n\n    before(function(done) {\n        browserSync.reset();\n\n        scheduler = require(\"../../utils\").getScheduler();\n\n        var config = {\n            server: \"test/fixtures\",\n            logLevel: \"info\",\n            open: false,\n            online: false,\n            debug: { scheduler: scheduler }\n        };\n\n        bs = browserSync.init(config, done).instance;\n\n        spy = sinon.spy(bs.events, \"emit\");\n    });\n\n    afterEach(function() {\n        spy.reset();\n        scheduler.clock = 0;\n    });\n\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"responds to reload event with no args\", function(done) {\n        var url = proto.getUrl(\n            { method: \"reload\" },\n            bs.options.getIn([\"urls\", \"local\"])\n        );\n\n        request(url, function(e, r, body) {\n            scheduler.advanceTo(500);\n            sinon.assert.calledWith(spy, \"browser:reload\");\n            assert.include(body, \"Called public API method `.reload()`\");\n            assert.include(body, \"With args: undefined\");\n            done();\n        });\n    });\n    it(\"responds to reload event with multi file paths\", function(done) {\n        var url = proto.getUrl(\n            { method: \"reload\", args: [\"a.css\", \"b.css\"] },\n            bs.options.getIn([\"urls\", \"local\"])\n        );\n\n        request(url, function(e, r, body) {\n            scheduler.advanceTo(500);\n            sinon.assert.calledWith(spy, \"file:changed\");\n            sinon.assert.calledWithExactly(spy, \"file:changed\", {\n                path: \"a.css\",\n                basename: \"a.css\",\n                ext: \"css\",\n                log: true,\n                namespace: \"core\",\n                event: \"change\"\n            });\n            assert.include(body, \"Called public API method `.reload()`\");\n            assert.include(body, 'With args: [\"a.css\",\"b.css\"]');\n            done();\n        });\n    });\n    it(\"responds to reload event with single file path\", function(done) {\n        var url = proto.getUrl(\n            { method: \"reload\", args: \"somefile.php\" },\n            bs.options.getIn([\"urls\", \"local\"])\n        );\n\n        request(url, function(e, r, body) {\n            scheduler.advanceTo(500);\n            sinon.assert.calledWith(spy, \"file:changed\", {\n                path: \"somefile.php\",\n                log: true,\n                namespace: \"core\",\n                event: \"change\"\n            });\n            sinon.assert.calledWith(spy, \"browser:reload\");\n            assert.include(body, \"Called public API method `.reload()`\");\n            assert.include(body, 'With args: \"somefile.php\"');\n            done();\n        });\n    });\n    it(\"Gives a nice error when method not found\", function(done) {\n        var url = proto.getUrl(\n            { method: \"relzoad\", args: \"somefile.php\" },\n            bs.options.getIn([\"urls\", \"local\"])\n        );\n\n        request(url, function(e, r, body) {\n            assert.equal(r.statusCode, 404);\n            assert.equal(body, \"Public API method `relzoad` not found.\");\n            done();\n        });\n    });\n\n    it(\"Gives a nice error when no params are given\", function(done) {\n        var url = proto.getUrl(undefined, bs.options.getIn([\"urls\", \"local\"]));\n\n        request(url, function(e, r, body) {\n            assert.equal(r.statusCode, 500);\n            assert.include(body, \"Error: No Parameters were provided.\");\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/instances/multi.emitter.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E multi instance emitter access\", function() {\n    it(\"has access to the singleton emitter\", function(done) {\n        browserSync.reset();\n\n        browserSync({ logLevel: \"silent\" }, function() {\n            assert.doesNotThrow(function() {\n                browserSync.emitter.emit(\"some:event\");\n                done();\n            });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/instances/multi.get.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E multi instance get\", function() {\n    it(\"throws an error when the instance does not exist\", function() {\n        browserSync.reset();\n        assert.throws(function() {\n            browserSync.get(\"first\").init();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/instances/multi.has.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E multi instance has\", function() {\n    it(\"returns true if an instance exists\", function() {\n        browserSync.reset();\n        browserSync.create(\"ts\");\n        assert.isTrue(browserSync.has(\"ts\"));\n    });\n    it(\"returns false if an instance does not exist\", function() {\n        browserSync.reset();\n        assert.isFalse(browserSync.has(\"ts\"));\n        browserSync.create(\"ts2\");\n        assert.isTrue(browserSync.has(\"ts2\"));\n        assert.isFalse(browserSync.has(\"ts\"));\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/instances/multi.init.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E multi instance init\", function() {\n    this.timeout(5000);\n\n    var bs, config;\n\n    before(function(done) {\n        browserSync.reset();\n\n        config = {\n            online: false,\n            logLevel: \"silent\",\n            open: false,\n            server: \"test/fixtures\"\n        };\n\n        bs = browserSync.create(\"first\").init(config, done);\n    });\n\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"returns an error when attempting to init same instance twice\", function(done) {\n        browserSync.get(\"first\").init(config, function(err) {\n            assert.isTrue(err instanceof Error);\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/instances/multi.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E server test\", function() {\n    this.timeout(5000);\n\n    var bs, bs2;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            online: false,\n            logLevel: \"silent\",\n            open: false,\n            server: \"test/fixtures\"\n        };\n\n        bs = browserSync.create(\"first\").init(config, function() {\n            bs2 = browserSync.create(\"second\").init(config, done);\n        });\n    });\n\n    after(function() {\n        bs.cleanup();\n        bs2.cleanup();\n    });\n\n    it(\"serves files with the snippet added\", function(done) {\n        var snippet = bs.getOption(\"snippet\");\n\n        assert.isString(snippet);\n\n        request(bs.server)\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, snippet);\n            });\n\n        var snippet2 = bs2.getOption(\"snippet\");\n\n        assert.isString(snippet2);\n\n        request(bs2.server)\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.isTrue(res.text.indexOf(snippet2) > -1);\n                done();\n            });\n    });\n\n    it(\"serves the client script\", function(done) {\n        request(bs.server)\n            .get(bs.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n            });\n\n        request(bs2.server)\n            .get(bs2.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/instances/multi.plugins.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar sinon = require(\"sinon\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E server test with multiple instances\", function() {\n    this.timeout(5000);\n\n    var bs, bs2, plugin1spy, plugin2spy;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            online: false,\n            logLevel: \"silent\",\n            open: false,\n            server: \"test/fixtures\"\n        };\n\n        plugin1spy = sinon.spy();\n        plugin2spy = sinon.spy();\n\n        bs = browserSync.create(\"first\");\n        bs.use(\n            {\n                plugin: function(opts) {\n                    assert.equal(opts.plugin, \"1\");\n                    plugin1spy();\n                }\n            },\n            { plugin: \"1\" }\n        );\n\n        bs2 = browserSync.create(\"second\");\n        bs2.use(\n            {\n                plugin: function(opts) {\n                    assert.equal(opts.plugin, \"2\");\n                    plugin2spy();\n                }\n            },\n            { plugin: \"2\" }\n        );\n\n        bs.init(config, function() {\n            bs2.init(config, done);\n        });\n    });\n\n    after(function() {\n        browserSync.get(\"first\").cleanup();\n        browserSync.get(\"second\").cleanup();\n    });\n\n    it(\"uses only plugins registered to each instance\", function() {\n        sinon.assert.calledOnce(plugin1spy);\n        sinon.assert.calledOnce(plugin2spy);\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/instances/multi.proxy.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E multi instance with proxy + server\", function() {\n    this.timeout(5000);\n\n    var bs, bs2;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            online: false,\n            logLevel: \"silent\",\n            open: false,\n            server: \"test/fixtures\"\n        };\n\n        bs = browserSync.create(\"server\");\n        bs2 = browserSync.create(\"proxy\");\n\n        bs.init(config, function(err, bs) {\n            bs2.init(\n                {\n                    proxy: bs.options.getIn([\"urls\", \"local\"]),\n                    open: false\n                },\n                done\n            );\n        });\n    });\n\n    after(function() {\n        browserSync.get(\"server\").cleanup();\n        browserSync.get(\"proxy\").cleanup();\n    });\n\n    it(\"can serve from built in server & when proxied (inception)\", function(done) {\n        var instance1 = browserSync.get(\"server\");\n        var instance2 = browserSync.get(\"proxy\");\n\n        request(instance1.instance.server)\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, instance1.getOption(\"snippet\"));\n            });\n\n        request(instance2.instance.server)\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, instance2.getOption(\"snippet\"));\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/instances/single.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"E2E server test\", function() {\n    this.timeout(5000);\n\n    var bs;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            online: false,\n            logLevel: \"silent\",\n            open: false,\n            server: \"test/fixtures\"\n        };\n\n        bs = browserSync(config, done).instance;\n    });\n\n    after(function() {\n        bs.cleanup();\n    });\n\n    it(\"serves files with the snippet added\", function(done) {\n        var snippet = bs.getOption(\"snippet\");\n\n        assert.isString(snippet);\n\n        request(bs.server)\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, snippet);\n                done();\n            });\n    });\n\n    it(\"serves the client script\", function(done) {\n        request(bs.server)\n            .get(bs.options.getIn([\"scriptPaths\", \"versioned\"]))\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"window.___browserSync___ = {}\");\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/logger/logger.baseDir.js",
    "content": "var browserSync = require(\"../../../\");\nvar logger = require(\"../../../dist/logger\").logger;\nvar sinon = require(\"sinon\");\nvar chalk       = require(\"chalk\");\n\ndescribe(\"Logging\", function() {\n    var spy;\n    before(function() {\n        spy = sinon.stub(logger, \"info\");\n        browserSync.reset();\n    });\n    afterEach(function() {\n        spy.reset();\n    });\n    after(function() {\n        logger.info.restore();\n    });\n    it(\"should log multiple base directories\", function(done) {\n        browserSync(\n            {\n                server: [\"./test\", \"./app\"],\n                open: false\n            },\n            function(err, bs) {\n                sinon.assert.calledWith(\n                    spy,\n                    \"Serving files from: %s\",\n                    chalk.magenta(\"./test\")\n                )\n                sinon.assert.calledWith(\n                    spy,\n                    \"Serving files from: %s\",\n                    chalk.magenta(\"./app\")\n                )\n                bs.cleanup(done);\n            }\n        );\n    });\n});\n\ndescribe(\"Logging\", function() {\n    var spy;\n    before(function() {\n        spy = sinon.stub(logger, \"info\");\n        browserSync.reset();\n    });\n    afterEach(function() {\n        spy.reset();\n    });\n    after(function() {\n        logger.info.restore();\n    });\n    it(\"should log single base directories\", function(done) {\n        browserSync(\n            {\n                server: \"./app\",\n                files: \"*.html\",\n                open: false\n            },\n            function(err, bs) {\n                sinon.assert.calledWith(\n                    spy,\n                    \"Serving files from: %s\",\n                    chalk.magenta(\"./app\")\n                )\n                sinon.assert.calledWith(\n                    spy,\n                    \"Watching files...\"\n                )\n                bs.cleanup(done);\n            }\n        );\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/logger/logger.files.changed.js",
    "content": "var browserSync = require(\"../../../\");\nvar logger = require(\"../../../dist/logger\").logger;\nvar callbacks = require(\"../../../dist/logger\").callbacks;\nvar sinon = require(\"sinon\");\n\ndescribe(\"Logs file change events following stream:changed\", function() {\n    var spy;\n    before(function() {\n        spy = sinon.stub(logger, \"info\");\n    });\n    afterEach(function() {\n        spy.reset();\n    });\n    after(function() {\n        logger.info.restore();\n    });\n    it(\"should log when straem:changed\", function(done) {\n        browserSync.reset();\n        browserSync(\n            {\n                server: \"./app\",\n                files: \"*.html\",\n                open: false\n            },\n            function(err, bs) {\n                spy.reset();\n                callbacks[\"stream:changed\"](bs, { changed: [\"core.css\"] });\n                sinon.assert.called(spy);\n                bs.cleanup(done);\n            }\n        );\n    });\n    it(\"should NOT log when stream:changed but logFileChanges = false\", function(done) {\n        browserSync.reset();\n        browserSync(\n            {\n                server: \"./app\",\n                files: \"*.html\",\n                logFileChanges: false,\n                open: false\n            },\n            function(err, bs) {\n                spy.reset();\n                callbacks[\"stream:changed\"](bs, { changed: [\"core.css\"] });\n                sinon.assert.notCalled(spy);\n                bs.cleanup(done);\n            }\n        );\n    });\n    it(\"should log when file:reload\", function(done) {\n        browserSync.reset();\n        browserSync(\n            {\n                server: \"./app\",\n                files: \"*.html\",\n                open: false\n            },\n            function(err, bs) {\n                spy.reset();\n                callbacks[\"file:reload\"](bs, {\n                    log: true,\n                    path: \"style.css\",\n                    cwd: \"/users/shane\"\n                });\n                sinon.assert.called(spy);\n                bs.cleanup(done);\n            }\n        );\n    });\n    it(\"should NOT log when file:reload but log:false\", function(done) {\n        browserSync.reset();\n        browserSync(\n            {\n                server: \"./app\",\n                files: \"*.html\",\n                open: false\n            },\n            function(err, bs) {\n                spy.reset();\n                callbacks[\"file:reload\"](bs, {\n                    log: false,\n                    path: \"style.css\",\n                    cwd: \"/users/shane\"\n                });\n                sinon.assert.notCalled(spy);\n                bs.cleanup(done);\n            }\n        );\n    });\n    it(\"should NOT log when options logFileChanges = false\", function(done) {\n        browserSync.reset();\n        browserSync(\n            {\n                server: \"./app\",\n                files: \"*.html\",\n                logFileChanges: false,\n                open: false\n            },\n            function(err, bs) {\n                spy.reset();\n                callbacks[\"file:reload\"](bs, {\n                    log: true,\n                    path: \"style.css\",\n                    cwd: \"/users/shane\"\n                });\n                sinon.assert.notCalled(spy);\n                bs.cleanup(done);\n            }\n        );\n    });\n    it(\"should log when browser:reload\", function(done) {\n        browserSync.reset();\n        browserSync(\n            {\n                server: \"./app\",\n                files: \"*.html\",\n                open: false\n            },\n            function(err, bs) {\n                spy.reset();\n                callbacks[\"browser:reload\"](bs);\n                sinon.assert.called(spy);\n                bs.cleanup(done);\n            }\n        );\n    });\n    it(\"should NOT log when browser:reload but logFileChanges = false\", function(done) {\n        browserSync.reset();\n        browserSync(\n            {\n                server: \"./app\",\n                files: \"*.html\",\n                logFileChanges: false,\n                open: false\n            },\n            function(err, bs) {\n                spy.reset();\n                callbacks[\"browser:reload\"](bs);\n                sinon.assert.notCalled(spy);\n                bs.cleanup(done);\n            }\n        );\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/options/options.set.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Setting options during runtime\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        instance = browserSync({ logLevel: \"silent\" }, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"should update options with event\", function(done) {\n        instance.events.on(\"options:set\", function(data) {\n            assert.deepEqual(\n                instance.options.getIn([\"ghostMode\", \"clicks\"]),\n                false\n            );\n            assert.deepEqual(data.path, [\"ghostMode\", \"clicks\"]);\n            assert.deepEqual(data.value, false);\n            assert.deepEqual(\n                data.options.getIn([\"ghostMode\", \"clicks\"]),\n                false\n            );\n            done();\n        });\n\n        instance.setOptionIn([\"ghostMode\", \"clicks\"], false);\n    });\n});\n\ndescribe(\"Setting Multi options during runtime\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        instance = browserSync({ logLevel: \"silent\" }, done).instance;\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n\n    it(\"should update options with event\", function(done) {\n        instance.events.on(\"options:set\", function() {\n            assert.deepEqual(\n                instance.options.getIn([\"ghostMode\", \"clicks\"]),\n                false\n            );\n            assert.deepEqual(instance.options.getIn([\"shane\"]), \"awesome\");\n            done();\n        });\n\n        instance.setMany(function(item) {\n            item.setIn([\"ghostMode\", \"clicks\"], false);\n            item.setIn([\"shane\"], \"awesome\");\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/bs.options.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Plugins: Retrieving options via API\", function() {\n    it(\"has access to options\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.use(\n            {\n                plugin: function(opts, bs) {\n                    assert.equal(opts.files, \"*.css\");\n                    assert.ok(require(\"immutable\").Map.isMap(bs.getOptions()));\n                },\n                \"plugin:name\": \"test\"\n            },\n            { files: \"*.css\" }\n        );\n\n        browserSync(config, function(err, bs) {\n            assert.equal(bs.watchers.test.watchers.length, 1);\n            bs.cleanup();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/connector.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar request = require(\"supertest\");\nvar http = require(\"http\");\nvar connect = require(\"connect\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Plugins: Using the connector middleware:\", function() {\n    it(\"returns middleware for the connector script\", function(done) {\n        browserSync.reset();\n\n        var instance;\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.use({\n            plugin: function(opts, bs) {\n                var connectorMw = bs.getMiddleware(\"connector\");\n\n                var app = connect();\n\n                app.use(\"/shane\", connectorMw);\n\n                var server = http.createServer(app);\n\n                request(server)\n                    .get(\"/shane\")\n                    .expect(200)\n                    .end(function(err, res) {\n                        assert.include(\n                            res.text,\n                            \"window.___browserSync___ = {};\"\n                        );\n                        instance.cleanup(done);\n                    });\n            }\n        });\n\n        instance = browserSync(config);\n    });\n});\n\ndescribe(\"Plugins: Using the connector middleware:\", function() {\n    it(\"returns middleware for the connector script using custom Namespace\", function(done) {\n        browserSync.reset();\n\n        var instance;\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.use({\n            plugin: function(opts, bs) {\n                var connectorMw = bs.getSocketConnector({\n                    path: bs.options.getIn([\"socket\", \"path\"]),\n                    namespace: \"/browser-sync-cp\"\n                });\n\n                var app = connect();\n\n                app.use(\"/shane\", connectorMw);\n\n                var server = http.createServer(app);\n\n                request(server)\n                    .get(\"/shane\")\n                    .expect(200)\n                    .end(function(err, res) {\n                        assert.include(res.text, \"/browser-sync-cp\");\n                        instance.cleanup(done);\n                    });\n            }\n        });\n\n        instance = browserSync(config);\n    });\n});\n\ndescribe(\"Plugins: Using the connector as a string\", function() {\n    it(\"returns middleware for the connector script as a string\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.use({\n            plugin: function(opts, bs) {\n                var connectorString = bs.getExternalSocketConnector({\n                    namespace: \"/browser-sync-cp\"\n                });\n\n                assert.include(connectorString, \"/browser-sync-cp\");\n            }\n        });\n\n        browserSync(config, function(err, bs) {\n            bs.cleanup();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/files.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Plugins: Watching Files:\", function() {\n    it(\"should add a namespaced watcher when given as plugin config\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            open: false,\n            files: \"test.html\"\n        };\n\n        var PLUGIN_NAME = \"KITTENZ\";\n\n        browserSync.use(\n            {\n                plugin: function(opts, bs) {\n                    bs.events.on(\"file:changed\", function(data) {\n                        assert.equal(data.namespace, PLUGIN_NAME);\n                        instance.cleanup();\n                        done();\n                    });\n                },\n                \"plugin:name\": PLUGIN_NAME\n            },\n            { files: \"test.html\" }\n        );\n\n        var instance = browserSync(config, function(err, bs) {\n            assert.equal(Object.keys(bs.watchers).length, 2);\n            assert.ok(bs.watchers[PLUGIN_NAME]);\n            bs.events.emit(\"file:changed\", {\n                namespace: PLUGIN_NAME,\n                path: \"test.html\"\n            });\n        });\n    });\n\n    it(\"should only add watchers if globs given\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.use(\n            {\n                plugin: function() {}\n            },\n            { files: \"test.html\" }\n        );\n\n        browserSync(config, function(err, bs) {\n            assert.equal(Object.keys(bs.watchers).length, 1);\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"should only add watchers if globs given\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.use({\n            plugin: function() {}\n        });\n\n        browserSync(config, function(err, bs) {\n            assert.equal(Object.keys(bs.watchers).length, 0);\n            bs.cleanup();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/hooks.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar sinon = require(\"sinon\");\nvar request = require(\"supertest\");\nvar assert = require(\"chai\").assert;\n\nvar config = {\n    server: {\n        baseDir: \"test/fixtures\"\n    },\n    logLevel: \"silent\",\n    open: false\n};\n\ndescribe(\"Plugins: Registering Hooks:\", function() {\n    var instance;\n    var initSpy;\n    var mwSpy1;\n    var mwSpy2;\n\n    before(function(done) {\n        browserSync.reset();\n        initSpy = sinon.spy();\n        mwSpy2 = sinon.spy(function(res, req, next) {\n            next();\n        });\n        mwSpy1 = sinon.spy(function(res, req, next) {\n            next();\n        });\n\n        browserSync.use({\n            plugin: initSpy,\n            hooks: {\n                \"client:events\": function() {\n                    return \"cp:goto\";\n                },\n                \"client:js\": function() {\n                    return \"SHANE123456\";\n                },\n                \"server:middleware\": function() {\n                    return [mwSpy2, mwSpy1];\n                }\n            }\n        });\n\n        instance = browserSync.init(config, done).instance;\n    });\n\n    afterEach(function() {\n        initSpy.reset();\n    });\n\n    after(function() {\n        instance.cleanup();\n    });\n    it(\"calls the function returned from the plugin method\", function() {\n        sinon.assert.calledOnce(initSpy); // the plugin init method\n    });\n    it(\"adds an item to the clientEvents array\", function() {\n        assert.include(instance.options.get(\"clientEvents\").toJS(), \"cp:goto\");\n    });\n    it(\"adds an item to the Server Middleware array (2)\", function(done) {\n        request(instance.server)\n            .get(\"/\")\n            .expect(200)\n            .end(function() {\n                sinon.assert.calledOnce(mwSpy1);\n                sinon.assert.calledOnce(mwSpy2);\n                done();\n            });\n    });\n});\n\ndescribe(\"Plugins: Registering hooks - client events:\", function() {\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        browserSync.use({\n            plugin: function() {},\n            hooks: {\n                \"client:events\": function() {\n                    return [\"cp:goto\", \"custom:event\"];\n                }\n            }\n        });\n\n        instance = browserSync.init(config, function() {\n            done();\n        }).instance;\n    });\n    after(function() {\n        instance.cleanup();\n    });\n    it(\"adds multiple items to the clientEvents array\", function() {\n        assert.include(instance.options.get(\"clientEvents\").toJS(), \"cp:goto\");\n        assert.include(\n            instance.options.get(\"clientEvents\").toJS(),\n            \"custom:event\"\n        );\n    });\n});\n\ndescribe(\"Plugins: Registering hooks - server middleware\", function() {\n    var instance, mwSpy1;\n\n    before(function(done) {\n        browserSync.reset();\n\n        mwSpy1 = sinon.spy(function(res, req, next) {\n            next();\n        });\n\n        browserSync.use({\n            plugin: function() {},\n            hooks: {\n                \"server:middleware\": function() {\n                    return mwSpy1;\n                }\n            }\n        });\n\n        instance = browserSync(config, done).instance;\n    });\n    after(function() {\n        instance.cleanup();\n    });\n    it(\"Calls the middleware function\", function(done) {\n        request(instance.server)\n            .get(\"/\")\n            .expect(200)\n            .end(function() {\n                sinon.assert.called(mwSpy1);\n                done();\n            });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/logger.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\nvar stripAnsi = require(\"strip-ansi\");\n\ndescribe(\"Plugins: Getting a logger\", function() {\n    var stub;\n    before(function() {\n        stub = sinon.spy(console, \"log\");\n    });\n    after(function() {\n        console.log.restore();\n    });\n    it(\"Can use a plugin-specific logger\", function(done) {\n        browserSync.reset();\n\n        var instance;\n        var PLUGIN_NAME = \"HTML\";\n\n        var config = {\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.use(\n            {\n                \"plugin:name\": PLUGIN_NAME,\n                plugin: function(opts, bs) {\n                    var logger = bs.getLogger(PLUGIN_NAME);\n                    logger\n                        .setLevel(\"info\")\n                        .setLevelPrefixes(false)\n                        .info(\"Connected!\");\n                        var msg = stripAnsi(stub.getCall(0).args[0]);\n                    assert.equal(msg, \"[Browsersync] [HTML] Connected!\");\n                    instance.cleanup();\n                    done();\n                }\n            },\n            { name: \"shane\" }\n        );\n\n        instance = browserSync(config).instance;\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/options.js",
    "content": "var browserSync = require(\"../../../\");\nvar BrowserSync = require(\"../../../dist/browser-sync\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Plugins: Adding options:\", function() {\n    it(\"allows plugins to have access to options passed in '.use()'\", function(done) {\n        browserSync.reset();\n\n        var instance;\n\n        var config = {\n            server: {\n                baseDir: \"test/fixtures\"\n            },\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.use(\n            {\n                plugin: function(opts, bs) {\n                    assert.equal(opts.name, \"shane\");\n                    assert.isTrue(bs instanceof BrowserSync);\n                    instance.cleanup();\n                    done();\n                },\n                \"plugin:name\": \"test\"\n            },\n            { name: \"shane\" }\n        );\n\n        instance = browserSync(config).instance;\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/ui.error.js",
    "content": "var browserSync = require(\"../../../\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Plugins: User interface with error on init\", function() {\n    it(\"Should start even when UI errors\", function(done) {\n        browserSync.reset();\n        browserSync.use({\n            \"plugin:name\": \"UI\",\n            plugin: function(opts, bs, cb) {\n                cb(new Error(\"Could not start\"));\n            }\n        });\n\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            open: false\n        };\n\n        browserSync(config, function(err, bs) {\n            assert.isUndefined(bs.ui);\n            bs.cleanup();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/ui.js",
    "content": "var browserSync = require(\"../../../\");\nvar request = require(\"supertest\");\nvar Immutable = require(\"immutable\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Plugins: User interface\", function() {\n    it(\"Should start the UI\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            open: false\n        };\n\n        browserSync(config, function(err, bs) {\n            request(bs.ui.server)\n                .get(\"/\")\n                .expect(200)\n                .end(function() {\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n});\n\ndescribe(\"Plugins: User interface\", function() {\n    it(\"Should ignore the UI if false given in options\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            open: false,\n            ui: false\n        };\n\n        browserSync(config, function(err, bs) {\n            assert.isUndefined(bs.ui);\n            assert.isFalse(bs.options.get(\"ui\"));\n            bs.cleanup();\n            done();\n        });\n    });\n});\n\ndescribe(\"Plugins: User interface - providing an override\", function() {\n    it(\"Should use the user-provided plugin\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            open: false\n        };\n\n        browserSync.use(\n            {\n                \"plugin:name\": \"UI\",\n                plugin: function(opts, bs, cb) {\n                    opts = Immutable.fromJS(opts).mergeDeep(\n                        Immutable.fromJS({\n                            urls: {\n                                ui: \"http://localhost:3001\"\n                            }\n                        })\n                    );\n                    cb(null, {\n                        options: opts\n                    });\n                }\n            },\n            { port: 3333 }\n        );\n\n        browserSync(config, function(err, bs) {\n            assert.deepEqual(bs.ui.options.get(\"port\"), 3333);\n            bs.cleanup();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/user.plugins.add.middleware.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\nvar path = require(\"path\");\nvar request = require(\"supertest\");\nvar http = require(\"http\");\nvar connect = require(\"connect\");\nvar serveStatic = require(\"serve-static\");\n\ndescribe(\"Plugins: Should be able to add Middlewares with paths on the fly\", function() {\n    var PLUGIN_NAME = \"KITTENZ\";\n    it(\"should serve the file\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            open: false,\n            server: \"test/fixtures\"\n        };\n\n        browserSync.use({\n            plugin: function(opts, bs) {\n                bs.addMiddleware(\"/shane\", function(req, res) {\n                    res.end(\"shane is dev\");\n                });\n            },\n            \"plugin:name\": PLUGIN_NAME\n        });\n\n        browserSync(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/shane\")\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function(err, res) {\n                    assert.include(res.text, \"shane is dev\");\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n});\n\ndescribe(\"Plugins: Should be able to add Middlewares with no paths on the fly\", function() {\n    var PLUGIN_NAME = \"KITTENZ\";\n\n    it(\"should serve the file\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            open: false,\n            server: \"test/fixtures\"\n        };\n\n        browserSync.use({\n            plugin: function(opts, bs) {\n                bs.addMiddleware(\"*\", function(req, res) {\n                    res.end(\"shane is dev\");\n                });\n            },\n            \"plugin:name\": PLUGIN_NAME\n        });\n\n        browserSync(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/shane\") // this matches no static files, so will call through to middleware\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function(err, res) {\n                    assert.include(res.text, \"shane is dev\");\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n});\n\ndescribe(\"Plugins: Should be able to add overriding middlewares on the fly\", function() {\n    var PLUGIN_NAME = \"KITTENZ\";\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            open: false,\n            server: \"test/fixtures\"\n        };\n\n        browserSync.use({\n            plugin: function(opts, bs) {\n                bs.addMiddleware(\n                    \"*\",\n                    function testMiddlewareAdditions(req, res) {\n                        res.end(\"shane is dev\");\n                    },\n                    { override: true, id: \"bs-mw\" }\n                );\n            },\n            \"plugin:name\": PLUGIN_NAME\n        });\n\n        instance = browserSync(config, function() {\n            done();\n        }).instance;\n    });\n    after(function() {\n        instance.cleanup();\n    });\n    it(\"should serve the overriding mw file\", function(done) {\n        assert.equal(instance.app.stack[0].id, \"bs-mw\");\n        request(instance.server)\n            .get(\"/index.html\") // should normally match index.html and return it\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"shane is dev\");\n                done();\n            });\n    });\n    it(\"should remove the overrriding mw\", function(done) {\n        var countBefore = instance.app.stack.length;\n        instance.removeMiddleware(\"bs-mw\");\n        assert.equal(countBefore - 1, instance.app.stack.length);\n\n        request(instance.server)\n            .get(\"/index.html\") // should normally match index.html and return it\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.notInclude(res.text, \"shane is dev\");\n                done();\n            });\n    });\n});\n\ndescribe(\"Plugins: Should be able to add Middlewares with paths on the fly in snippet mode\", function() {\n    var PLUGIN_NAME = \"KITTENZ\";\n\n    it(\"should serve the file\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.use({\n            plugin: function(opts, bs) {\n                bs.addMiddleware(\"/shane\", function(req, res) {\n                    res.end(\"shane is dev\");\n                });\n            },\n            \"plugin:name\": PLUGIN_NAME\n        });\n\n        browserSync(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/shane\")\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function(err, res) {\n                    assert.include(res.text, \"shane is dev\");\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n});\n\ndescribe(\"Plugins: Should be able to add Middlewares with no path on the fly in snippet mode\", function() {\n    var PLUGIN_NAME = \"KITTENZ\";\n    it(\"should serve the file\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.use({\n            plugin: function(opts, bs) {\n                bs.addMiddleware(\"*\", function(req, res) {\n                    res.end(\"shane is dev\");\n                });\n            },\n            \"plugin:name\": PLUGIN_NAME\n        });\n\n        browserSync(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/shane\")\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function(err, res) {\n                    assert.include(res.text, \"shane is dev\");\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n});\n\ndescribe(\"Plugins: Should be able to add middleware with paths on the fly in proxy mode\", function() {\n    var PLUGIN_NAME = \"KITTENZ\";\n\n    it(\"should serve the file + browserSync file\", function(done) {\n        browserSync.reset();\n\n        var testApp = connect().use(\n            serveStatic(path.join(__dirname, \"../../fixtures\"))\n        );\n\n        // server to proxy\n        var stubServer = http.createServer(testApp).listen();\n        var port = stubServer.address().port;\n\n        var config = {\n            logLevel: \"silent\",\n            open: false,\n            proxy: \"http://localhost:\" + port\n        };\n\n        browserSync.use({\n            plugin: function(opts, bs) {\n                bs.addMiddleware(\"/shane\", function(req, res) {\n                    res.end(\"shane\");\n                });\n            },\n            \"plugin:name\": PLUGIN_NAME\n        });\n\n        browserSync(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/shane\")\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function(err, res) {\n                    assert.include(res.text, \"shane\");\n                    bs.cleanup();\n                    stubServer.close();\n                    done();\n                });\n        });\n    });\n});\n\ndescribe(\"Plugins: Should be able to add middleware with no paths on the fly in proxy mode\", function() {\n    var PLUGIN_NAME = \"KITTENZ\";\n    var instance;\n    var stubServer;\n\n    before(function(done) {\n        browserSync.reset();\n\n        var testApp = connect().use(\n            serveStatic(path.join(__dirname, \"/../../fixtures\"))\n        );\n\n        // server to proxy\n        stubServer = http.createServer(testApp).listen();\n        var port = stubServer.address().port;\n\n        var config = {\n            logLevel: \"silent\",\n            open: false,\n            proxy: \"http://localhost:\" + port,\n            online: false\n        };\n\n        browserSync.use({\n            plugin: function(opts, bs) {\n                bs.addMiddleware(\"/shane\", function(req, res) {\n                    res.end(\"shane\");\n                });\n                done();\n            },\n            \"plugin:name\": PLUGIN_NAME\n        });\n\n        instance = browserSync(config).instance;\n    });\n    after(function() {\n        instance.cleanup();\n        stubServer.close();\n    });\n    it(\"should serve the file + browserSync file\", function(done) {\n        request(instance.server)\n            .get(\"/shane\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"shane\");\n                done();\n            });\n    });\n    it(\"should still proxy after middleware added\", function(done) {\n        request(instance.server)\n            .get(\"/index.html\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function(err, res) {\n                assert.include(res.text, \"<title>Test HTML Page</title>\");\n                done();\n            });\n    });\n});\n\ndescribe(\"Plugins: does not blow up if middleware added before app ready\", function() {\n    it(\"returns early if not active\", function() {\n        browserSync.reset();\n        var first = browserSync.create(\"1\");\n        assert.doesNotThrow(function() {\n            first.instance.addMiddleware();\n        });\n    });\n    it(\"returns early if not active\", function() {\n        browserSync.reset();\n        var first = browserSync.create(\"1\");\n        assert.doesNotThrow(function() {\n            first.instance.removeMiddleware();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/user.plugins.cleanup.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar sinon = require(\"sinon\");\n\ndescribe(\"Plugins: Allowing plugins to register cleanup tasks\", function() {\n    it(\"Should access to only the user-specified plugins\", function(done) {\n        var PLUGIN_NAME = \"KITTENZ\";\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            open: false\n        };\n        var spy = sinon.spy();\n\n        browserSync.use({\n            plugin: function(opts, bs) {\n                bs.registerCleanupTask(spy);\n            },\n            \"plugin:name\": PLUGIN_NAME\n        });\n\n        browserSync(config, function(err, bs) {\n            bs.cleanup();\n            sinon.assert.calledOnce(spy);\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/user.plugins.error.js",
    "content": "var browserSync = require(\"../../../\");\nvar utils = require(\"../../../dist/utils\");\nvar path = require(\"path\");\nvar pkg = require(path.resolve(\"package.json\"));\nvar cli = require(path.resolve(pkg.bin)).default;\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Plugins: Exit when plugin not found\", function() {\n    it(\"returns an error if a plugin cannot be located\", function(done) {\n        var stub = require(\"sinon\").stub(utils, \"fail\");\n        browserSync.reset();\n\n        cli({\n            cli: {\n                input: [\"start\"],\n                flags: {\n                    logLevel: \"silent\",\n                    plugins: [\"bs-oops-typos\"],\n                    open: false\n                }\n            },\n            cb: function(err, bs) {\n                var err = stub.getCall(0).args[1];\n                assert.include(err.message, \"bs-oops-typos\");\n                utils.fail.restore();\n                bs.cleanup();\n                done();\n            }\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/user.plugins.inline.enabled.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Plugins: Setting the default state (false) if given in options\", function() {\n    it(\"Should auto disable a plugin when options given (1)\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            plugins: [\n                {\n                    module: \"bs-snippet-injector\",\n                    options: {\n                        enabled: false,\n                        file: \"\"\n                    }\n                }\n            ]\n        };\n\n        browserSync(config, function(err, bs) {\n            assert.equal(bs.getUserPlugins().length, 1);\n            assert.isFalse(bs.getUserPlugins()[0].active);\n            bs.cleanup();\n            done();\n        });\n    });\n});\n\ndescribe(\"Plugins: Setting the default state (true) if given in options\", function() {\n    it(\"Should auto disable a plugin when options given (2)\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            plugins: [\n                {\n                    module: \"bs-snippet-injector\",\n                    options: {\n                        enabled: true\n                    }\n                }\n            ]\n        };\n\n        browserSync(config, function(err, bs) {\n            assert.equal(bs.getUserPlugins().length, 1);\n            assert.isTrue(bs.getUserPlugins()[0].active);\n            bs.cleanup();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/user.plugins.inline.error.js",
    "content": "var browserSync = require(\"../../../\");\nvar utils = require(\"../../../dist/utils\");\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\n\ndescribe(\"Plugins: Retrieving user plugins when given inline, but with error\", function() {\n    it(\"Should fail if a plugin error occurred\", function(done) {\n        browserSync.reset();\n        sinon.stub(utils, \"fail\", function(kill, errMessage) {\n            assert.instanceOf(errMessage, Error);\n            assert.equal(\n                errMessage.message,\n                \"Plugin not supported in this format\"\n            );\n            utils.fail.restore();\n        });\n\n        browserSync(\n            {\n                plugins: {\n                    module: {\n                        plugin: function() {}\n                    }\n                },\n                open: false,\n                logLevel: \"silent\"\n            },\n            function(err, bs) {\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n    it(\"Should fail if a plugin is missing both module & plugin properties\", function(done) {\n        browserSync.reset();\n        sinon.stub(utils, \"fail\", function(kill, errMessage) {\n            assert.instanceOf(errMessage, Error);\n            assert.equal(\n                errMessage.message,\n                \"Plugin was not configured correctly\"\n            );\n            utils.fail.restore();\n        });\n\n        browserSync(\n            {\n                plugins: [\n                    {\n                        name: \"shane\"\n                    }\n                ],\n                open: false,\n                logLevel: \"silent\"\n            },\n            function(err, bs) {\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/user.plugins.inline.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Plugins: Retrieving user plugins when given inline\", function() {\n    var instance;\n    var PLUGIN_REQUIRE = \"bs-snippet-injector\";\n    var PLUGIN_NAME = \"Snippet Injector\";\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            plugins: [PLUGIN_REQUIRE]\n        };\n\n        instance = browserSync(config, done).instance;\n    });\n    after(function() {\n        instance.cleanup();\n    });\n    it(\"Should access to only the user-specified plugins (1)\", function(done) {\n        assert.equal(instance.getUserPlugins().length, 1);\n        done();\n    });\n    it(\"Should access to only the user-specified plugins (2)\", function(done) {\n        var plugin = instance.getUserPlugins()[0];\n        assert.equal(plugin.name, PLUGIN_NAME);\n        done();\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/user.plugins.inline.obj.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Plugins: Retrieving user plugins when given inline as object\", function() {\n    var instance;\n    var PLUGIN_NAME = \"Test Plugin\";\n\n    it(\"has access to user options\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            plugins: [\n                {\n                    module: {\n                        plugin: function() {},\n                        \"plugin:name\": PLUGIN_NAME\n                    },\n                    options: {\n                        files: \"*.html\"\n                    }\n                }\n            ]\n        };\n\n        browserSync(config, function(err, bs) {\n            assert.equal(bs.getUserPlugins().length, 1);\n            var plugin = bs.getUserPlugins()[0];\n            assert.equal(plugin.name, PLUGIN_NAME);\n            assert.equal(plugin.opts.files, \"*.html\");\n            bs.cleanup();\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/user.plugins.inline.obj.reference.js",
    "content": "var assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\nvar browserSync = require(\"../../../\");\n\ndescribe(\"Plugins: Retrieving user plugins when given inline as object reference\", function() {\n    var instance;\n    var PLUGIN_NAME_1 = \"Test Plugin 1\";\n    var PLUGIN_NAME_2 = \"Test Plugin 2\";\n    var spy1, spy2;\n\n    before(function(done) {\n        spy1 = sinon.spy();\n        spy2 = sinon.spy();\n        browserSync.reset();\n\n        var bs = browserSync.create();\n\n        var fake1 = {\n            plugin: spy1,\n            \"plugin:name\": PLUGIN_NAME_1\n        };\n        var fake2 = {\n            plugin: spy1,\n            \"plugin:name\": PLUGIN_NAME_2\n        };\n\n        var config = {\n            logLevel: \"silent\",\n            plugins: [fake1, fake2]\n        };\n\n        instance = bs.init(config, done);\n    });\n    after(function() {\n        instance.cleanup();\n    });\n    it(\"Should access to only the user-specified plugins\", function() {\n        assert.equal(instance.getUserPlugins().length, 2);\n    });\n    it(\"Should have access to only the user-specified plugins\", function() {\n        assert.equal(instance.getUserPlugins()[0].name, PLUGIN_NAME_1);\n        assert.equal(instance.getUserPlugins()[1].name, PLUGIN_NAME_2);\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/user.plugins.inline.options.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe.skip(\"Plugins: Retrieving user plugins when given inline with options\", function() {\n    var instance;\n    var PLUGIN_NAME = \"Snippet Injector\";\n\n    before(function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            plugins: [\n                {\n                    module: \"bs-snippet-injector\",\n                    options: {\n                        files: \"*.html\"\n                    }\n                }\n            ]\n        };\n\n        instance = browserSync(config, done).instance;\n    });\n    after(function() {\n        instance.cleanup();\n    });\n    it(\"Should access to only the user-specified plugins\", function() {\n        assert.equal(instance.getUserPlugins().length, 1);\n    });\n    it(\"Should have access to only the user-specified plugins\", function() {\n        var plugin = instance.getUserPlugins()[0];\n        assert.equal(plugin.name, PLUGIN_NAME);\n    });\n    it(\"should have access to user provided opts\", function() {\n        var plugin = instance.getUserPlugins()[0];\n        assert.equal(plugin.opts.files, \"*.html\");\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/user.plugins.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Plugins: Retrieving user plugins\", function() {\n    var PLUGIN_NAME = \"KITTENZ\";\n    var instance;\n\n    before(function(done) {\n        browserSync.reset();\n        var config = {\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.use(\n            {\n                plugin: function() {\n                    /* noop */\n                },\n                \"plugin:name\": PLUGIN_NAME\n            },\n            { human: \"Shane\" }\n        );\n\n        instance = browserSync(config, done).instance;\n    });\n    after(function() {\n        instance.cleanup();\n    });\n    it(\"Should access to only the user-specified plugins\", function(done) {\n        assert.equal(instance.getUserPlugins().length, 1);\n        done();\n    });\n    it(\"Should access a single user-specified plugin by name\", function(done) {\n        assert.equal(instance.getUserPlugin(PLUGIN_NAME).name, PLUGIN_NAME);\n        done();\n    });\n    it(\"Should return false when single user-specified plugin by name is requested, but does not exist\", function(done) {\n        assert.isFalse(instance.getUserPlugin(\"random-name\"));\n        done();\n    });\n    it(\"Should access to only the user-specified plugins\", function(done) {\n        var plugin = instance.getUserPlugins()[0];\n        assert.equal(plugin.name, PLUGIN_NAME);\n        done();\n    });\n    it(\"Disable/re-enable a plugin from event\", function(done) {\n        assert.isTrue(instance.pluginManager.getPlugin(PLUGIN_NAME)._enabled);\n        instance.events.emit(\"plugins:configure\", {\n            name: PLUGIN_NAME,\n            active: false\n        });\n        assert.isFalse(instance.options.get(\"userPlugins\")[0].active);\n        assert.isFalse(instance.pluginManager.getPlugin(PLUGIN_NAME)._enabled);\n\n        instance.events.emit(\"plugins:configure\", {\n            name: PLUGIN_NAME,\n            active: true\n        });\n        assert.isTrue(instance.options.get(\"userPlugins\")[0].active);\n        assert.isTrue(instance.pluginManager.getPlugin(PLUGIN_NAME)._enabled);\n        done();\n    });\n    it(\"can set options on user plugins\", function() {\n        var plugin = instance.getUserPlugin(PLUGIN_NAME);\n\n        assert.equal(plugin.opts.human, \"Shane\");\n\n        instance.events.emit(\"plugins:opts\", {\n            name: PLUGIN_NAME,\n            opts: {\n                human: \"kittie\"\n            }\n        });\n\n        assert.equal(instance.getUserPlugin(PLUGIN_NAME).opts.human, \"kittie\");\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/user.plugins.proxy.js",
    "content": "var browserSync = require(\"../../../\");\nvar testUtils = require(\"../../protractor/utils\");\nvar Immutable = require(\"immutable\");\nvar sinon = require(\"sinon\");\nvar request = require(\"supertest\");\n\ndescribe(\"Plugins: Should be able to register middleware when in proxy mode\", function() {\n    var app;\n    var spy;\n\n    it(\"should serve the file\", function(done) {\n        browserSync.reset();\n\n        app = testUtils.getApp(Immutable.Map({ scheme: \"http\" }));\n        app.server.listen();\n\n        spy = sinon.spy();\n\n        var config = {\n            proxy: \"http://localhost:\" + app.server.address().port,\n            open: false,\n            logLevel: \"silent\"\n        };\n\n        browserSync.use({\n            plugin: function() {\n                /* noop */\n            },\n            hooks: {\n                \"server:middleware\": function() {\n                    return function(req, res, next) {\n                        spy();\n                        next();\n                    };\n                }\n            },\n            \"plugin:name\": \"KITTENZ\"\n        });\n\n        browserSync(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/\")\n                .set(\"accept\", \"text/html\")\n                .end(function() {\n                    sinon.assert.called(spy);\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/plugins/user.plugins.serve.files.js",
    "content": "var browserSync = require(\"../../../\");\n\nvar assert = require(\"chai\").assert;\nvar request = require(\"supertest\");\nvar http = require(\"http\");\nvar path = require(\"path\");\nvar connect = require(\"connect\");\nvar serveStatic = require(\"serve-static\");\n\ndescribe(\"Plugins: Should be able to call `serveFile` on the instance when in server mode\", function() {\n    var PLUGIN_NAME = \"KITTENZ\";\n    it(\"should serve the file\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            open: false,\n            server: \"test/fixtures\"\n        };\n\n        browserSync.use({\n            plugin: function(opts, bs) {\n                bs.serveFile(\"/shane\", {\n                    type: \"text/css\",\n                    content: \"Hi there\"\n                });\n            },\n            \"plugin:name\": PLUGIN_NAME\n        });\n\n        browserSync(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/shane\")\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function(err, res) {\n                    assert.include(res.text, \"Hi there\");\n                    assert.equal(res.headers[\"content-type\"], \"text/css\");\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n});\n\ndescribe(\"Plugins: Should be able to call `serveFile` on the instance when in snippet mode\", function() {\n    var PLUGIN_NAME = \"KITTENZ\";\n    it(\"should serve the file\", function(done) {\n        browserSync.reset();\n\n        var config = {\n            logLevel: \"silent\",\n            open: false\n        };\n\n        browserSync.use({\n            plugin: function(opts, bs) {\n                bs.serveFile(\"/shane\", {\n                    type: \"text/css\",\n                    content: \"Hi there\"\n                });\n            },\n            \"plugin:name\": PLUGIN_NAME\n        });\n\n        browserSync(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/shane\")\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function(err, res) {\n                    assert.include(res.text, \"Hi there\");\n                    assert.equal(res.headers[\"content-type\"], \"text/css\");\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n});\n\ndescribe(\"Plugins: Should be able to call `serveFile` on the instance when in proxy mode\", function() {\n    var PLUGIN_NAME = \"KITTENZ\";\n\n    it(\"should serve the file + browserSync file\", function(done) {\n        browserSync.reset();\n\n        var testApp = connect().use(\n            serveStatic(path.join(__dirname, \"../../fixtures\"))\n        );\n\n        // server to proxy\n        var stubServer = http.createServer(testApp).listen();\n        var port = stubServer.address().port;\n\n        var config = {\n            logLevel: \"silent\",\n            open: false,\n            proxy: \"http://localhost:\" + port\n        };\n\n        browserSync.use({\n            plugin: function(opts, bs) {\n                bs.serveFile(\"/shane\", {\n                    type: \"text/css\",\n                    content: \"Hi there\"\n                });\n            },\n            \"plugin:name\": PLUGIN_NAME\n        });\n\n        browserSync(config, function(err, bs) {\n            request(bs.server)\n                .get(\"/shane\")\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function(err, res) {\n                    assert.include(res.text, \"Hi there\");\n                    assert.equal(res.headers[\"content-type\"], \"text/css\");\n                    stubServer.close();\n                    bs.cleanup();\n                    done();\n                });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/resp-mod/rewrite-links.js",
    "content": "var utils = require(\"../../../dist/server/proxy-utils\");\nvar assert = require(\"chai\").assert;\nvar fs = require(\"fs\");\n\ndescribe(\"Rewriting Domains\", function() {\n    var proxyUrl = \"192.168.0.4:3002\";\n\n    describe(\"when rewriting 'example.com' links\", function() {\n        var regex, fn;\n        var testRegex;\n        before(function() {\n            var host = \"192.168.0.4:3002\";\n            var rewrite = utils.rewriteLinks(\n                { hostname: \"example.com\", port: 80 },\n                proxyUrl\n            );\n            var bound = rewrite.fn.bind(null, { headers: { host: host } }, {});\n            regex = rewrite.match;\n            fn = rewrite.fn;\n            testRegex = function(string) {\n                return string.replace(rewrite.match, bound);\n            };\n        });\n\n        it(\"should not replace domains that are not inside attribute\", function() {\n            var actual = testRegex(\"<h1>example.com</h1>\");\n            var expected = \"<h1>example.com</h1>\";\n            assert.equal(expected, actual);\n        });\n        it(\"should replace CSS LINK\", function() {\n            var actual = testRegex(\n                \"<link href='http://example.com/css/styles'>example.com</link>\"\n            );\n            var expected =\n                \"<link href='//192.168.0.4:3002/css/styles'>example.com</link>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links (2)\", function() {\n            var actual = testRegex(\"<a href='http://example.com'></a>\");\n            var expected = \"<a href='//192.168.0.4:3002'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links (23)\", function() {\n            var actual = testRegex(\"<a href='http://example.com/sub/dir'></a>\");\n            var expected = \"<a href='//192.168.0.4:3002/sub/dir'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links (3)\", function() {\n            var actual = testRegex(\"<a href='http://example.com/sub/dir'></a>\");\n            var expected = \"<a href='//192.168.0.4:3002/sub/dir'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links (4)\", function() {\n            var actual = testRegex(\n                \"<a href='https://example.com/sub/dir'></a>\"\n            );\n            var expected = \"<a href='//192.168.0.4:3002/sub/dir'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links (5)\", function() {\n            var actual = testRegex(\"<a href='/example.com/sub/dir'></a>\");\n            var expected = \"<a href='/192.168.0.4:3002/sub/dir'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links (6)\", function() {\n            var actual = testRegex(\"<a href='example.com/sub/dir'></a>\");\n            var expected = \"<a href='192.168.0.4:3002/sub/dir'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links (6)\", function() {\n            /*jshint ignore:start*/\n            var actual = testRegex(\n                '<a href=\"http://example.com\" class=\"active\" title=\"Home\">Home</a><a href=\"http://example.com/information\" class=\"\" title=\"Info\">Info</a>'\n            );\n            var expected =\n                '<a href=\"//192.168.0.4:3002\" class=\"active\" title=\"Home\">Home</a><a href=\"//192.168.0.4:3002/information\" class=\"\" title=\"Info\">Info</a>';\n            assert.equal(actual, expected);\n            /*jshint ignore:end*/\n        });\n        it(\"should use the regex to replace links (7)\", function() {\n            var actual = testRegex(\n                \"<a href='http://example.com/sub/dir/example.com/css/styles.css'></a><a href='http://example.com/sub/dir/example.com/css/styles.css'></a>\"\n            );\n            var expected =\n                \"<a href='//192.168.0.4:3002/sub/dir/example.com/css/styles.css'></a><a href='//192.168.0.4:3002/sub/dir/example.com/css/styles.css'></a>\";\n            assert.equal(actual, expected);\n        });\n    });\n    describe(\"when rewriting 'localhost:8000' links\", function() {\n        var regex, fn;\n        var testRegex;\n        before(function() {\n            var host = \"192.168.0.4:3002\";\n            var rewrite = utils.rewriteLinks(\n                { hostname: \"localhost:8000\", port: 80 },\n                proxyUrl\n            );\n            var bound = rewrite.fn.bind(null, { headers: { host: host } }, {});\n            regex = rewrite.match;\n            fn = rewrite.fn;\n            testRegex = function(string) {\n                return string.replace(rewrite.match, bound);\n            };\n        });\n        it(\"should use the regex to replace links (1)\", function() {\n            var actual = testRegex(\"<a href='http://localhost:8000'></a>\");\n            var expected = \"<a href='//192.168.0.4:3002'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links (1)\", function() {\n            var actual = testRegex(\"<a href='http://localhost:8000'></a>\");\n            var expected = \"<a href='//192.168.0.4:3002'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links (2)\", function() {\n            var actual = testRegex(\n                \"<a href='http://localhost:8000/sub/dir'></a>\"\n            );\n            var expected = \"<a href='//192.168.0.4:3002/sub/dir'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links (3)\", function() {\n            var actual = testRegex(\n                \"<a href='http://localhost:8000/sub/dir'></a>\"\n            );\n            var expected = \"<a href='//192.168.0.4:3002/sub/dir'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links (4)\", function() {\n            var actual = testRegex(\n                \"<a href='https://localhost:8000/sub/dir'></a>\"\n            );\n            var expected = \"<a href='//192.168.0.4:3002/sub/dir'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links (5)\", function() {\n            var actual = testRegex(\"<a href='/localhost:8000/sub/dir'></a>\");\n            var expected = \"<a href='/192.168.0.4:3002/sub/dir'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links (6)\", function() {\n            var actual = testRegex(\"<a href='localhost:8000/sub/dir'></a>\");\n            var expected = \"<a href='//192.168.0.4:3002/sub/dir'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links that contain hashes (1)\", function() {\n            var actual = testRegex(\n                \"<a href='http://localhost:8000/sub/dir/?search=some#shane'></a>\"\n            );\n            var expected =\n                \"<a href='//192.168.0.4:3002/sub/dir/?search=some#shane'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links that contain hashes (2)\", function() {\n            var actual = testRegex(\n                \"<a href='http://localhost:8000/sub/dir/#search'></a>\"\n            );\n            var expected = \"<a href='//192.168.0.4:3002/sub/dir/#search'></a>\";\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links that contain hashes (2)\", function() {\n            var input = fs.readFileSync(\n                \"test/fixtures/rewrites/hashes.input.html\",\n                \"utf8\"\n            );\n            var expected = fs.readFileSync(\n                \"test/fixtures/rewrites/hashes.expected.html\",\n                \"utf8\"\n            );\n            var rewrite = utils.rewriteLinks(\n                { hostname: \"www.example.local.colinr.com\", port: 80 },\n                proxyUrl\n            );\n            var bound = rewrite.fn.bind(\n                null,\n                { headers: { host: proxyUrl } },\n                {}\n            );\n            var actual = input.replace(rewrite.match, bound);\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links that contain port + \", function() {\n            var input =\n                '<!--//<a href=\"http://example.com:1234/foo\">Link 1</a>--><a href=\"http://example.com.gov/foo\">Link 1</a>';\n            var expected =\n                '<!--//<a href=\"//192.168.0.4:3002/foo\">Link 1</a>--><a href=\"http://example.com.gov/foo\">Link 1</a>';\n\n            var rewrite = utils.rewriteLinks(\n                { hostname: \"example.com\", port: 1234 },\n                proxyUrl\n            );\n            var bound = rewrite.fn.bind(\n                null,\n                { headers: { host: proxyUrl } },\n                {}\n            );\n            var actual = input.replace(rewrite.match, bound);\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links + comments\", function() {\n            var input = fs.readFileSync(\n                \"test/fixtures/rewrites/comment.html\",\n                \"utf8\"\n            );\n            var expected = fs.readFileSync(\n                \"test/fixtures/rewrites/comment.expected.html\",\n                \"utf8\"\n            );\n            var rewrite = utils.rewriteLinks(\n                { hostname: \"experiment.dev\" },\n                proxyUrl\n            );\n            var bound = rewrite.fn.bind(\n                null,\n                { headers: { host: proxyUrl } },\n                {}\n            );\n            var actual = input.replace(rewrite.match, bound);\n            assert.equal(actual, expected);\n        });\n        it(\"should use the regex to replace links that contain port + \", function() {\n            var input =\n                '<link href=\"/sites/default/themes/mclinic/css/styles.css\" media=\"screen\" rel=\"stylesheet\">';\n            var rewrite = utils.rewriteLinks({ hostname: \"mclinic\" }, proxyUrl);\n            var bound = rewrite.fn.bind(\n                null,\n                { headers: { host: proxyUrl } },\n                {}\n            );\n            var actual = input.replace(rewrite.match, bound);\n            assert.equal(actual, input);\n        });\n        it(\"should use the regex to replace links that have protocol relative URLS\", function() {\n            var input =\n                '<script type=\"text/javascript\" src=\"//test.dev/file.js\">';\n            var expected =\n                '<script type=\"text/javascript\" src=\"//' +\n                proxyUrl +\n                '/file.js\">';\n            var rewrite = utils.rewriteLinks(\n                { hostname: \"test.dev\" },\n                proxyUrl\n            );\n            var bound = rewrite.fn.bind(\n                null,\n                { headers: { host: proxyUrl } },\n                {}\n            );\n            var actual = input.replace(rewrite.match, bound);\n            assert.equal(actual, expected);\n        });\n        it(\"should not replace when host + subdomain \", function() {\n            var input =\n                '<a href=\"http://assets.cdn.example.com:1234/foo\">Link 1</a>';\n            var rewrite = utils.rewriteLinks(\n                { hostname: \"example.com\", port: 1234 },\n                proxyUrl\n            );\n            var actual = input.replace(rewrite.match, rewrite.fn);\n            assert.equal(actual, input);\n        });\n        it(\"should not remove trailing slash\", function() {\n            var input = '<a href=\"http://example.com:1234/foo/\">Link 1</a>';\n            var expected = '<a href=\"//' + proxyUrl + '/foo/\">Link 1</a>';\n            var rewrite = utils.rewriteLinks(\n                { hostname: \"example.com\", port: 1234 },\n                proxyUrl\n            );\n            var bound = rewrite.fn.bind(\n                null,\n                { headers: { host: proxyUrl } },\n                {}\n            );\n            var actual = input.replace(rewrite.match, bound);\n            assert.equal(actual, expected);\n        });\n        it(\"should not greedy match when not inside attr - with paths\", function() {\n            var input =\n                '<a href=\"https://example.com/calendar/2015/06/24/20471/\">https://example.com/calendar/2015/06/24/20471/</a></p></div></li></ol></td><td  class=\"cal-current-month\">';\n            var expected =\n                '<a href=\"//' +\n                proxyUrl +\n                '/calendar/2015/06/24/20471/\">//' +\n                proxyUrl +\n                '/calendar/2015/06/24/20471/</a></p></div></li></ol></td><td  class=\"cal-current-month\">';\n            var rewrite = utils.rewriteLinks(\n                { hostname: \"example.com\" },\n                proxyUrl\n            );\n            var bound = rewrite.fn.bind(\n                null,\n                { headers: { host: proxyUrl } },\n                {}\n            );\n            var actual = input.replace(rewrite.match, bound);\n            assert.equal(actual, expected);\n        });\n        it(\"should not greedy match when not inside attr\", function() {\n            var input =\n                '<a href=\"https://example.com/\">https://example.com/</a></p></div></li></ol></td><td  class=\"cal-current-month\">';\n            var expected =\n                '<a href=\"//192.168.0.4:3002/\">//192.168.0.4:3002/</a></p></div></li></ol></td><td  class=\"cal-current-month\">';\n            var rewrite = utils.rewriteLinks(\n                { hostname: \"example.com\" },\n                proxyUrl\n            );\n            var bound = rewrite.fn.bind(\n                null,\n                { headers: { host: proxyUrl } },\n                {}\n            );\n            var actual = input.replace(rewrite.match, bound);\n            assert.equal(actual, expected);\n        });\n        it(\"handles escaped urls correctly\", function() {\n            var input = fs.readFileSync(\n                \"test/fixtures/rewrites/escaped.1.html\",\n                \"utf8\"\n            );\n            var expected = fs.readFileSync(\n                \"test/fixtures/rewrites/escaped.1.expected.html\",\n                \"utf8\"\n            );\n            var rewrite = utils.rewriteLinks({ hostname: \"demo.l5\" }, proxyUrl);\n            var bound = rewrite.fn.bind(\n                null,\n                { headers: { host: proxyUrl } },\n                {}\n            );\n            var actual = input.replace(rewrite.match, bound);\n            assert.equal(actual, expected);\n        });\n        it(\"should support proxy: localhost\", function() {\n            var input = `\n                <a href=\"http://localhost:6426\">should skip</a>\n                <a href=\"http://localhost\">should hit</a>\n                <a href=\"http://localhost/base.html\">should hit (2)</a>\n            `;\n            var expected = `\n                <a href=\"http://localhost:6426\">should skip</a>\n                <a href=\"//${proxyUrl}\">should hit</a>\n                <a href=\"//${proxyUrl}/base.html\">should hit (2)</a>\n            `;\n            var rewrite = utils.rewriteLinks(\n                { hostname: \"localhost\" },\n                proxyUrl\n            );\n            var bound = rewrite.fn.bind(\n                null,\n                { headers: { host: proxyUrl } },\n                {}\n            );\n            var actual = input.replace(rewrite.match, bound);\n            assert.equal(actual, expected);\n        });\n        it(\"should support localhost + port\", function() {\n            var input = `\n                <a href=\"http://localhost:6426\">should skip</a>\n                <a href=\"http://localhost:8080\">should hit</a>\n                <a href=\"http://localhost:8080/base.html\">should hit (2)</a>\n            `;\n            var expected = `\n                <a href=\"http://localhost:6426\">should skip</a>\n                <a href=\"//${proxyUrl}\">should hit</a>\n                <a href=\"//${proxyUrl}/base.html\">should hit (2)</a>\n            `;\n            var rewrite = utils.rewriteLinks(\n                { hostname: \"localhost\", port: \"8080\" },\n                proxyUrl\n            );\n            var bound = rewrite.fn.bind(\n                null,\n                { headers: { host: proxyUrl } },\n                {}\n            );\n            var actual = input.replace(rewrite.match, bound);\n            assert.equal(actual, expected);\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/server/server.snippet.js",
    "content": "// jscs:disable maximumLineLength\n\nvar defaultConfig = require(\"../../../dist/default-config\");\nvar snippetUtils = require(\"../../../dist/snippet\").utils;\nvar isExcluded = snippetUtils.isExcluded;\nvar assert = require(\"chai\").assert;\n\ndescribe(\"isExcluded spec\", function() {\n    var blackList;\n\n    before(function() {\n        blackList = defaultConfig.excludedFileTypes;\n    });\n    it(\"Should be a function\", function() {\n        assert.isFunction(isExcluded);\n    });\n    it(\"should return true if request contains queryString\", function() {\n        var actual = isExcluded(\"/styles/core.css?rel=12322\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request contains queryString\", function() {\n        var actual = isExcluded(\n            \"/imgs/img.jpg?rel=12322&test=2&34=q\",\n            blackList\n        );\n        assert.isTrue(actual);\n    });\n    it(\"should return FALSE for requests with no file noname (dir)\", function() {\n        var actual = isExcluded(\"/\");\n        assert.isFalse(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/core.js\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for CSS\", function() {\n        var actual = isExcluded(\"/styles/core.css\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/files.svg\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/files.ico\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/files.woff\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/files.eot\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/files.ttf\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/files.png\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/files.jpg\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/files.jpeg\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/files.gif\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/files.json\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/files.mp4\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/files.mp3\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/files.ogg\", blackList);\n        assert.isTrue(actual);\n    });\n    it(\"should return true if request for JS\", function() {\n        var actual = isExcluded(\"/files.m4a\", blackList);\n        assert.isTrue(actual);\n    });\n});\n\ndescribe(\"Header replacement for IE8\", function() {\n    it(\"Rewrites headers for old IE\", function(done) {\n        var bs = require(\"../../../\");\n        var request = require(\"supertest\");\n        bs.reset();\n        bs.create().init(\n            {\n                logLevel: \"silent\",\n                open: false,\n                server: \"test/fixtures\"\n            },\n            function(err, bs) {\n                request(bs.options.getIn([\"urls\", \"local\"]))\n                    .get(\"/index.html\")\n                    .set(\n                        \"User-Agent\",\n                        \"Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\"\n                    )\n                    .set(\n                        \"accept\",\n                        \"image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */*\"\n                    )\n                    .expect(200)\n                    .end(function(err, res) {\n                        assert.include(res.text, bs.options.get(\"snippet\"));\n                        bs.cleanup();\n                        done();\n                    });\n            }\n        );\n    });\n    it(\"Skips headers rewrites for excluded files for old IE\", function(done) {\n        var bs = require(\"../../../\");\n        var request = require(\"supertest\");\n        bs.reset();\n        bs.create().init(\n            {\n                logLevel: \"silent\",\n                open: false,\n                server: \"test/fixtures\"\n            },\n            function(err, bs) {\n                request(bs.options.getIn([\"urls\", \"local\"]))\n                    .get(\"/css/bootstrap.css\")\n                    .set(\n                        \"User-Agent\",\n                        \"Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\"\n                    )\n                    .set(\n                        \"accept\",\n                        \"image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */*\"\n                    )\n                    .expect(200)\n                    .end(function(err, res) {\n                        assert.notInclude(res.text, bs.options.get(\"snippet\"));\n                        bs.cleanup();\n                        done();\n                    });\n            }\n        );\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/utils/utils.connect.js",
    "content": "var utils = require(\"../../../dist/connect-utils\");\nvar bs = require(\"../../../\");\nvar req = require(\"supertest\");\nvar merge = require(\"../../../dist/cli/cli-options\").merge;\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Connection snippetUtils\", function() {\n    var options;\n    beforeEach(function() {\n        [options] = merge({\n            port: 3002,\n            server: true\n        });\n    });\n    it(\"should return a connection url with http\", function() {\n        var actual = utils.getConnectionUrl(options);\n        var expected = \"'' + location.host + '/browser-sync'\";\n        assert.equal(actual, expected);\n    });\n    it(\"should return a connection url for snippet mode\", function() {\n        var [options] = merge({\n            port: 3002,\n            scheme: \"http\",\n            mode: \"snippet\"\n        });\n        var actual = utils.getConnectionUrl(options);\n        var expected = \"'http://' + location.hostname + ':3002/browser-sync'\";\n        assert.equal(actual, expected);\n    });\n    it(\"should return a connection url for proxy mode\", function() {\n        var [options] = merge({\n            port: 3002,\n            scheme: \"http\",\n            mode: \"proxy\",\n            proxy: {\n                target: \"localhost\",\n                ws: true\n            },\n            socket: {\n                port: 4000\n            }\n        });\n        var actual = utils.socketConnector(options);\n        assert.include(\n            actual,\n            \"'http://' + location.hostname + ':4000/browser-sync'\"\n        );\n    });\n    it(\"should return a connection url for server mode\", function() {\n        var [options] = merge({\n            port: 3002,\n            server: true\n        });\n        var actual = utils.socketConnector(options);\n        assert.include(actual, \"'' + location.host + '/browser-sync'\");\n    });\n    it(\"should return a connection url for server mode, https\", function() {\n        var [options] = merge({\n            port: 3002,\n            scheme: \"https\",\n            server: true\n        });\n        var actual = utils.socketConnector(options);\n        assert.include(actual, \"'' + location.host + '/browser-sync'\");\n    });\n    it(\"should return a connection url for snippet mode\", function() {\n        var [options] = merge({\n            port: 4002,\n            scheme: \"http\",\n            mode: \"snippet\"\n        });\n        var actual = utils.socketConnector(options);\n        assert.include(\n            actual,\n            \"'http://' + location.hostname + ':4002/browser-sync'\"\n        );\n    });\n    it(\"should return a connection url for secure snippet mode\", function() {\n        var [options] = merge({\n            port: 4002,\n            https: true\n        });\n        var actual = utils.socketConnector(options);\n        assert.include(\n            actual,\n            \"'https://' + location.hostname + ':4002/browser-sync'\"\n        );\n    });\n    it(\"should allow setting of the socket domain\", function() {\n        var [options] = merge({\n            port: 3000,\n            server: \"test/fixtures\",\n            mode: \"server\",\n            socket: {\n                domain: \"localhost:3000\"\n            }\n        });\n        var actual = utils.socketConnector(options);\n        assert.include(\n            actual,\n            \"___browserSync___.socketUrl = 'localhost:3000/browser-sync';\"\n        );\n    });\n    it(\"should allow setting of the socket domain + namespace\", function() {\n        var [options] = merge({\n            port: 3000,\n            server: \"test/fixtures\",\n            mode: \"server\",\n            socket: {\n                namespace: \"shane\",\n                domain: \"localhost:3000\"\n            }\n        });\n        var actual = utils.socketConnector(options);\n        assert.include(\n            actual,\n            \"___browserSync___.socketUrl = 'localhost:3000/shane';\"\n        );\n    });\n    it(\"should allow setting of the socket domain (fn)+ namespace\", function() {\n        var [options] = merge({\n            port: 3000,\n            server: \"test/fixtures\",\n            mode: \"server\",\n            urls: {\n                local: \"http://localhost:3002\"\n            },\n            socket: {\n                namespace: \"shane\",\n                domain: function(options) {\n                    return options.getIn([\"urls\", \"local\"]);\n                }\n            }\n        });\n        var actual = utils.socketConnector(options);\n        assert.include(\n            actual,\n            \"___browserSync___.socketUrl = 'http://localhost:3002/shane';\"\n        );\n    });\n    it(\"should allow setting of the socket namespace with fn (back compat)\", function() {\n        var [options] = merge({\n            port: 3000,\n            server: \"test/fixtures\",\n            mode: \"server\",\n            urls: {\n                local: \"http://localhost:3002\"\n            },\n            socket: {\n                namespace: function() {\n                    return \"/browser-sync\";\n                }\n            }\n        });\n        var actual = utils.socketConnector(options);\n        assert.include(\n            actual,\n            \"___browserSync___.socketUrl = '' + location.host + '/browser-sync';\"\n        );\n    });\n    it(\"E2E Should allow setting of socket.domain + script.domain as strings\", function(done) {\n        bs.reset();\n        bs.create().init(\n            {\n                ui: false,\n                logLevel: \"silent\",\n                script: {\n                    domain: \"http://localhost:3000\"\n                },\n                socket: {\n                    domain: \"http://localhost:3000\"\n                }\n            },\n            function(err, bs) {\n                assert.include(\n                    bs.options.get(\"snippet\"),\n                    '<script async id=\"__bs_script__\" src=\"http://localhost:3000/browser-sync'\n                );\n\n                var expected =\n                    \"___browserSync___.socketUrl = 'http://localhost:3000/browser-sync'\";\n\n                req(bs.server)\n                    .get(bs.options.getIn([\"scriptPaths\", \"path\"]))\n                    .expect(200)\n                    .end(function(err, res) {\n                        assert.include(\n                            res.text,\n                            expected,\n                            \"Socket domain updated in response\"\n                        );\n                        bs.cleanup();\n                        done();\n                    });\n            }\n        );\n    });\n    it(\"E2E Should allow setting of socket.domain + script.domain as strings when using --localOnly flag\", function(done) {\n        bs.reset();\n        bs.create().init(\n            {\n                ui: false,\n                online: false,\n                logLevel: \"silent\",\n                localOnly: true\n            },\n            function(err, bs) {\n                var port = bs.options.get(\"port\");\n                assert.include(\n                    bs.options.get(\"snippet\"),\n                    '<script async id=\"__bs_script__\" src=\"http://localhost:' +\n                        port +\n                        \"/browser-sync\"\n                );\n\n                var expected =\n                    \"___browserSync___.socketUrl = 'http://localhost:\" +\n                    port +\n                    \"/browser-sync'\";\n\n                req(bs.server)\n                    .get(bs.options.getIn([\"scriptPaths\", \"path\"]))\n                    .expect(200)\n                    .end(function(err, res) {\n                        assert.include(\n                            res.text,\n                            expected,\n                            \"Socket domain updated in response\"\n                        );\n                        bs.cleanup();\n                        done();\n                    });\n            }\n        );\n    });\n    it(\"E2E Should allow setting of script.domain as functions\", function(done) {\n        bs.reset();\n        bs.create().init(\n            {\n                ui: false,\n                logLevel: \"silent\",\n                script: {\n                    domain: function(options) {\n                        return \"http://mylocal:\" + options.get(\"port\");\n                    }\n                }\n            },\n            function(err, bs) {\n                assert.include(\n                    bs.options.get(\"snippet\"),\n                    '<script async id=\"__bs_script__\" src=\"http://mylocal:3000/browser-sync'\n                );\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n    it(\"E2E Should allow setting of script.domain with placeholder\", function(done) {\n        bs.reset();\n        bs.create().init(\n            {\n                ui: false,\n                logLevel: \"silent\",\n                script: {\n                    domain: \"http://localhost:{port}\"\n                }\n            },\n            function(err, bs) {\n                assert.ok(\n                    bs.options\n                        .get(\"snippet\")\n                        .match(/http:\\/\\/localhost:\\d{4,5}\\/browser-sync/)\n                );\n                bs.cleanup();\n                done();\n            }\n        );\n    });\n    it(\"E2E Should allow setting of socket.domain with placeholder\", function(done) {\n        bs.reset();\n        bs.create().init(\n            {\n                ui: false,\n                logLevel: \"silent\",\n                socket: {\n                    domain: \"http://localhost:{port}\"\n                }\n            },\n            function(err, bs) {\n                var port = bs.options.get(\"port\");\n                req(bs.server)\n                    .get(bs.options.getIn([\"scriptPaths\", \"path\"]))\n                    .expect(200)\n                    .end(function(err, res) {\n                        var expected =\n                            \"___browserSync___.socketUrl = 'http://localhost:\" +\n                            port +\n                            \"/browser-sync'\";\n                        assert.include(res.text, expected);\n                        bs.cleanup();\n                        done();\n                    });\n            }\n        );\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/utils/utils.default.callback.js",
    "content": "var utils = require(\"../../../dist/utils\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Utils: default callback\", function() {\n    it(\"should log errors if no callback given\", function() {\n        var stub = require(\"sinon\").stub(console, \"error\");\n        utils.defaultCallback(new Error(\"some error\"));\n        require(\"sinon\").assert.called(stub);\n        assert.equal(stub.getCall(0).args[0], \"some error\");\n        console.error.restore();\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/utils/utils.fail.js",
    "content": "var utils = require(\"../../../dist/utils\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Utils: Failing\", function() {\n    it(\"should fail when Error obj given\", function() {\n        require(\"sinon\").stub(process, \"exit\");\n        utils.fail(true, new Error(\"Some err bro\"), function(out) {\n            assert.instanceOf(out, Error);\n        });\n        process.exit.restore();\n    });\n    it(\"should fail with Error obj when string given\", function() {\n        require(\"sinon\").stub(process, \"exit\");\n        utils.fail(true, \"Some err bro\", function(out) {\n            assert.instanceOf(out, Error);\n        });\n        process.exit.restore();\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/utils/utils.getHostIp.js",
    "content": "var utils = require(\"../../../dist/utils\");\nvar merge = require(\"../../../dist/cli/cli-options\").merge;\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Utils: getting the Host IP\", function() {\n    var regex;\n    beforeEach(function() {\n        regex = /\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}/;\n    });\n    it(\"should use the IP address if provided in the options\", function() {\n        var hostIp = utils.getHostIp(\n            merge({ host: \"192.0.0.1\" })[0],\n            \"192.168.0.4\"\n        );\n        assert.equal(hostIp, \"192.0.0.1\");\n    });\n    it(\"should return false detect:false\", function() {\n        var hostIp = utils.getHostIp(\n            merge({ detect: false })[0],\n            \"192.168.0.4\"\n        );\n        assert.equal(hostIp, false);\n    });\n    it(\"should return false when no network available\", function() {\n        var hostIp = utils.getHostIp(merge()[0], []);\n        assert.equal(hostIp, false);\n    });\n    it(\"should return the ip if given as string\", function() {\n        var actual = utils.getHostIp(\n            merge({ host: \"127.0.0.2\" })[0],\n            \"192.168.0.4\"\n        );\n        assert.equal(actual, \"127.0.0.2\");\n    });\n    it(\"should return the first ip if given array\", function() {\n        var stubs = [\"127.0.0.2\", \"21.23.4.6\"];\n        var actual = utils.getHostIp(merge()[0], stubs);\n        assert.equal(actual, stubs[0]);\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/utils/utils.getUrl.js",
    "content": "var utils = require(\"../../../dist/utils\");\nvar merge = require(\"../../../dist/cli/cli-options\").merge;\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Utils: creating URL from options\", function() {\n    var url = \"http://0.0.0.0:3002\";\n\n    it(\"should return the url if no start path given\", function() {\n        var [options] = merge({ startPath: false });\n        var actual = utils.getUrl(url, options);\n        assert.equal(actual, url);\n    });\n    it(\"should return the url with a path appended\", function() {\n        var [options] = merge({ startPath: \"app/mysite\" });\n        var actual = utils.getUrl(url, options);\n        var expected = \"http://0.0.0.0:3002/app/mysite\";\n        assert.equal(actual, expected);\n    });\n    it(\"should return the url with a path appended with leading slash\", function() {\n        var [options] = merge({ startPath: \"/app/mysite\" });\n        var actual = utils.getUrl(url, options);\n        var expected = \"http://0.0.0.0:3002/app/mysite\";\n        assert.equal(actual, expected);\n    });\n\n    describe(\"When the start path is set in the proxy\", function() {\n        it(\"should return the url with a path appended from proxy\", function() {\n            var [options] = merge({\n                proxy: url,\n                startPath: \"subdir/another/path\"\n            });\n            var actual = utils.getUrl(url, options);\n            var expected = \"http://0.0.0.0:3002/subdir/another/path\";\n            assert.equal(actual, expected);\n        });\n        it(\"should return the url with a path appended from proxy\", function() {\n            var [options] = merge({\n                proxy: url,\n                startPath: \"subdir\"\n            });\n            var actual = utils.getUrl(url, options);\n            var expected = \"http://0.0.0.0:3002/subdir\";\n            assert.equal(actual, expected);\n        });\n        it(\"should return the url with a path appended from proxy with query\", function() {\n            var [options] = merge({\n                proxy: url,\n                startPath: \"subdir?rel=1234\"\n            });\n            var actual = utils.getUrl(url, options);\n            var expected = \"http://0.0.0.0:3002/subdir?rel=1234\";\n            assert.equal(actual, expected);\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/utils/utils.getUrls.js",
    "content": "var utils = require(\"../../../dist/utils\");\nvar merge = require(\"../../../dist/cli/cli-options\").merge;\nvar assert = require(\"chai\").assert;\n\nvar external = \"192.168.0.4\";\n\ndescribe(\"Utils: creating URLs\", function() {\n    var options;\n    beforeEach(function() {\n        [options] = merge({\n            port: 3002\n        });\n    });\n    it(\"should return an object with local + remote\", function() {\n        var actual = utils.getUrls(external, \"localhost\", \"http\", options);\n        var expected = {\n            local: \"http://localhost:3002\",\n            external: \"http://192.168.0.4:3002\"\n        };\n        assert.deepEqual(actual, expected);\n    });\n    it(\"should return an object with local + external (2)\", function() {\n        var actual = utils.getUrls(\"10.33.233.3\", \"localhost\", \"http\", options);\n        var expected = {\n            local: \"http://localhost:3002\",\n            external: \"http://10.33.233.3:3002\"\n        };\n        assert.deepEqual(actual, expected);\n    });\n    it(\"should return an object with local + external with paths\", function() {\n        [options] = merge({ startPath: \"app\", port: 3002 });\n        var actual = utils.getUrls(\"10.33.233.3\", \"localhost\", \"http\", options);\n        var expected = {\n            local: \"http://localhost:3002/app\",\n            external: \"http://10.33.233.3:3002/app\"\n        };\n        assert.deepEqual(actual, expected);\n    });\n    it(\"should return an object with local + external with paths & Params\", function() {\n        [options] = merge({ startPath: \"app/home?rel=123\", port: 3002 });\n        var actual = utils.getUrls(\"10.33.233.3\", \"localhost\", \"http\", options);\n        var expected = {\n            local: \"http://localhost:3002/app/home?rel=123\",\n            external: \"http://10.33.233.3:3002/app/home?rel=123\"\n        };\n        assert.deepEqual(actual, expected);\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/utils/utils.js",
    "content": ""
  },
  {
    "path": "packages/browser-sync/test/specs/utils/utils.setUrlOptions.js",
    "content": "require(\"source-map-support\").install();\nvar utils = require(\"../../../dist/utils\");\nvar merge = require(\"../../../dist/cli/cli-options\").merge;\n\nvar assert = require(\"chai\").assert;\nvar sinon = require(\"sinon\");\n\nvar external = \"192.168.0.4\";\n\ndescribe(\"Utils: creating URLs\", function() {\n    var opts, ipStub;\n    before(function() {\n        ipStub = sinon.stub(utils, \"getHostIp\").returns(external);\n    });\n    after(function() {\n        ipStub.restore();\n    });\n    afterEach(function() {\n        ipStub.reset();\n    });\n    beforeEach(function() {\n        [opts, errors] = merge({\n            port: 3000,\n            server: true,\n            scheme: \"http\"\n        });\n    });\n    it(\"should return the local when offline\", function() {\n        var [opts, errors] = merge({\n            port: 3000,\n            server: true,\n            scheme: \"http\",\n            online: false\n        });\n        assert.deepEqual(utils.getUrlOptions(opts).toJS(), {\n            local: \"http://localhost:3000\"\n        });\n    });\n    it(\"should return the external\", function() {\n        var [opts, errors] = merge({\n            port: 3000,\n            server: true,\n            scheme: \"http\",\n            online: true\n        });\n        assert.deepEqual(utils.getUrlOptions(opts).toJS(), {\n            local: \"http://localhost:3000\",\n            external: \"http://\" + external + \":3000\"\n        });\n    });\n    it(\"should NOT ALLOW 'listen' and 'host' options if they differ\", function() {\n        var [opts, errors] = merge({\n            port: 3000,\n            host: \"mysite.test\",\n            listen: \"localhost\"\n        });\n\n        assert.equal(errors.length, 1);\n        assert.equal(errors[0].type, \"HostAndListenIncompatible\");\n        assert.equal(errors[0].level, \"Fatal\");\n    });\n    it(\"should ALLOW 'listen' and 'host' option if they are the same\", function() {\n        var [opts, errors] = merge({\n            port: 3000,\n            host: \"localhost\",\n            listen: \"localhost\"\n        });\n\n        assert.deepEqual(opts.get(\"listen\"), \"localhost\");\n        assert.isUndefined(opts.get(\"host\"));\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/specs/utils/utils.verifyOptions.js",
    "content": "var utils = require(\"../../../dist/utils\");\nvar merge = require(\"../../../dist/cli/cli-options\").merge;\nvar sinon = require(\"sinon\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"Utils: getting config errors\", function() {\n    it(\"return a message if both server + proxy given\", function() {\n        var actual = utils.getConfigErrors(\n            merge({ server: true, proxy: \"http://bbc.co.uk\" })[0]\n        );\n        assert.equal(actual.length, 1);\n    });\n    it(\"returns empty array if no errors\", function() {\n        var actual = utils.getConfigErrors(merge({ server: true })[0]);\n        assert.equal(actual.length, 0);\n    });\n});\n\ndescribe.skip(\"Utils: verifying user-provided config\", function() {\n    var stub;\n    before(function() {\n        stub = sinon.stub(utils, \"fail\");\n    });\n    afterEach(function() {\n        stub.reset();\n    });\n    after(function() {\n        utils.fail.restore();\n    });\n    it(\"ends process if config incorrect\", function() {\n        var fn = function() {};\n        utils.verifyConfig(\n            merge({ server: true, proxy: \"http://bbc.co.uk\" })[0],\n            fn\n        );\n        sinon.assert.calledWithExactly(\n            stub,\n            true,\n            \"Invalid config. You cannot specify both server & proxy options.\",\n            fn\n        );\n    });\n    it(\"does not end process if no errors found with config\", function() {\n        var fn = function() {};\n        utils.verifyConfig(merge({ server: true })[0], fn);\n        sinon.assert.notCalled(stub);\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync/test/utils.js",
    "content": "var Rx = require('rx');\nvar request     = require(\"supertest\");\n\nmodule.exports.getScheduler = function () {\n    var Rx = require('rx');\n    return new Rx.TestScheduler();\n};\n\nmodule.exports.getRequests = function (reqs, server) {\n    return reqs.map(function (req) {\n        return Rx.Observable.create(function (obs) {\n            if (typeof req === 'function') {\n                try {\n                    req();\n                } catch (e) {\n                    obs.onError(e);\n                    return;\n                }\n                process.nextTick(function () {\n                    obs.onNext(true);\n                    obs.onCompleted(true);\n                });\n                return;\n            }\n            request(server)\n                .get(req[0])\n                .set('accept', 'text/html')\n                .end(function (err, res) {\n                    if (err) {\n                        return obs.onError(err);\n                    }\n                    if (res.text === req[1]) {\n                        obs.onNext(true);\n                        obs.onCompleted();\n                        return;\n                    }\n\n                    var errorMessage = [\n                        req[0] + \" did not match the response body\",\n                          'actual:   ' + res.text,\n                          'expected: ' + req[1]\n                    ];\n\n                    obs.onError(new Error(errorMessage.join('\\n')));\n                });\n        });\n    });\n};\n\nmodule.exports.cy = function(setup, specs) {\n\n    const cypress = require('cypress');\n    const bs      = require('../').create();\n\n    bs.init(setup, function(err, bs) {\n        return cypress.run({\n            spec: specs,\n        })\n            .then((results) => {\n                // stop your server when it's complete\n                bs.cleanup();\n                if (results.failures > 0) {\n                    return process.exit(1);\n                }\n                process.exit(0);\n            })\n    });\n}"
  },
  {
    "path": "packages/browser-sync/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    /* Basic Options */\n    \"target\": \"es2015\",                          /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */\n    \"module\": \"commonjs\",                     /* Specify module code generation: 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": false,\n    \"moduleResolution\": \"node\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"es2019\"],\n     \"allowJs\": true,                       /* Allow javascript files to be compiled. */\n    // \"checkJs\": true,                       /* Report errors in .js files. */\n    // \"jsx\": \"preserve\",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */\n//    \"declaration\": true,                   /* Generates corresponding '.d.ts' file. */\n    \"sourceMap\": true,                     /* Generates corresponding '.map' file. */\n    // \"outFile\": \"./\",                       /* Concatenate and emit output to single file. */\n    \"outDir\": \"./dist\"                        /* Redirect output structure to the directory. */\n    // \"rootDir\": \"./\",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */\n    // \"removeComments\": true,                /* Do not emit comments to output. */\n    // \"noEmit\": true,                        /* Do not emit outputs. */\n    // \"importHelpers\": true,                 /* Import emit helpers from 'tslib'. */\n    // \"downlevelIteration\": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */\n    // \"isolatedModules\": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */\n\n    /* Strict Type-Checking Options */\n    // \"strict\": true                            /* Enable all strict type-checking options. */\n    // \"noImplicitAny\": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */\n    // \"strictNullChecks\": true,              /* Enable strict null checks. */\n    // \"noImplicitThis\": true,                /* Raise error on 'this' expressions with an implied 'any' type. */\n    // \"alwaysStrict\": true,                  /* Parse in strict mode and emit \"use strict\" for each source file. */\n\n    /* Additional Checks */\n    // \"noUnusedLocals\": true,                /* Report errors on unused locals. */\n    // \"noUnusedParameters\": true,            /* Report errors on unused parameters. */\n    // \"noImplicitReturns\": true,             /* Report error when not all code paths in function return a value. */\n    // \"noFallthroughCasesInSwitch\": true,    /* Report errors for fallthrough cases in switch statement. */\n\n    /* Module Resolution Options */\n    // \"moduleResolution\": \"node\",            /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */\n    // \"baseUrl\": \"./\",                       /* Base directory to resolve non-absolute module names. */\n    // \"paths\": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */\n    // \"rootDirs\": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */\n    // \"typeRoots\": [],                       /* List of folders to include type definitions from. */\n    // \"types\": [],                           /* Type declaration files to be included in compilation. */\n    // \"allowSyntheticDefaultImports\": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */\n\n    /* Source Map Options */\n    // \"sourceRoot\": \"./\",                    /* Specify the location where debugger should locate TypeScript files instead of source locations. */\n    // \"mapRoot\": \"./\",                       /* Specify the location where debugger should locate map files instead of generated locations. */\n    // \"inlineSourceMap\": true,               /* Emit a single file with source maps instead of having a separate file. */\n    // \"inlineSources\": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */\n\n    /* Experimental Options */\n    // \"experimentalDecorators\": true,        /* Enables experimental support for ES7 decorators. */\n    // \"emitDecoratorMetadata\": true,         /* Enables experimental support for emitting type metadata for decorators. */\n  },\n  \"include\": [\n    \"lib/*\",\n    \"lib/cli/*\",\n    \"lib/public/*\",\n    \"lib/server/*\"\n  ],\n  \"exclude\": [\n    \"client/*\",\n    \"**/node_modules/**\"\n  ]\n}\n"
  },
  {
    "path": "packages/browser-sync-client/.gitignore",
    "content": "node_modules\nnpm-debug.log\ntest/coverage\nexample.proxy.js\n/dist/*\n/_dist/*\n"
  },
  {
    "path": "packages/browser-sync-client/.travis.yml",
    "content": "sudo: false\ngit:\n  depth: 2\nlanguage: node_js\nnode_js:\n  - node\n  - '4.0.0'\nbefore_script:\n  - \"npm install -g gulp\"\n  - \"export DISPLAY=:99.0\"\n  - \"sh -e /etc/init.d/xvfb start\"\n"
  },
  {
    "path": "packages/browser-sync-client/LICENSE-MIT",
    "content": "Copyright (c) 2013 Shane Osbourne\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/browser-sync-client/README.md",
    "content": "# browser-sync-client [![Build Status](https://travis-ci.org/BrowserSync/browser-sync-client.svg)](https://travis-ci.org/BrowserSync/browser-sync-client)\n\nClient-side script for BrowserSync\n\n## Contributors\n\n```\n   177\tShane Osbourne\n     2\tSergey Slipchenko\n     1\tHugo Dias\n     1\tShinnosuke Watanabe\n     1\tTim Schaub\n     1\tShane Daniel\n     1\tMatthieu Vachon\n```\n\n## License\nCopyright (c) 2014 Shane Osbourne\nLicensed under the MIT license.\n"
  },
  {
    "path": "packages/browser-sync-client/index.js",
    "content": "\"use strict\";\n\nvar etag = require(\"etag\");\nvar fresh = require(\"fresh\");\nvar fs = require(\"fs\");\nvar path = require(\"path\");\nvar zlib = require(\"zlib\");\n\nvar minifiedScript = path.join(__dirname, \"dist\", \"index.js\");\nvar unminifiedScript = path.join(__dirname, \"dist\", \"index.js\");\n\n/**\n * Does the current request support compressed encoding?\n * @param {Object} req\n * @returns {boolean}\n */\nfunction supportsGzip(req) {\n    var accept = req.headers[\"accept-encoding\"];\n    return accept && accept.indexOf(\"gzip\") > -1;\n}\n\n/**\n * Set headers on the response\n * @param {Object} res\n * @param {String} body\n */\nfunction setHeaders(res, body) {\n    res.setHeader(\"Cache-Control\", \"public, max-age=0\");\n    res.setHeader(\"Content-Type\", \"text/javascript\");\n    res.setHeader(\"ETag\", etag(body));\n}\n\n/**\n * @param {Object} req\n * @returns {String}\n */\nfunction isConditionalGet(req) {\n    return req.headers[\"if-none-match\"] || req.headers[\"if-modified-since\"];\n}\n\n/**\n * Return a not-modified response\n * @param {Object} res\n */\nfunction notModified(res) {\n    res.removeHeader(\"Content-Type\");\n    res.statusCode = 304;\n    res.end();\n}\n\nfunction processItems(items) {\n    return [].concat(items)\n        .filter(Boolean)\n        .reduce((stringOutput, item) => {\n            if (typeof item === 'string') {\n                return stringOutput + item;\n            }\n            if (typeof item === 'function') {\n                return stringOutput + item();\n            }\n            return stringOutput;\n        }, \"\");\n}\n\n/**\n * Public method for returning either a middleware fn\n * or the content as a string\n * @param {Object} options\n * @param requestBody\n * @param {String} type - either `file` or `middleware`\n * @returns {*}\n */\nfunction init(options, requestBody, type) {\n    /**\n     * If the user asked for a file, simply return the string.\n     */\n    if (type && type === \"file\") {\n        return processItems(requestBody);\n    }\n\n    /**\n     * Otherwise return a function to be used a middleware\n     */\n    return function(req, res) {\n        /**\n         * default to using the uncompressed string\n         * @type {String}\n         */\n        var output = processItems(requestBody);\n\n        /**\n         * Set the appropriate headers for caching\n         */\n        setHeaders(res, output);\n        var resHeaders = res.getHeaders ? res.getHeaders() : res._headers;\n        if (isConditionalGet(req) && fresh(req.headers, resHeaders)) {\n            return notModified(res);\n        }\n\n        /**\n         * If gzip is supported, compress the string once\n         * and save for future requests\n         */\n        if (supportsGzip(req)) {\n            res.setHeader(\"Content-Encoding\", \"gzip\");\n            var buf = Buffer.from(output, \"utf-8\");\n            zlib.gzip(buf, function(_, result) {\n                res.end(result);\n            });\n        } else {\n            res.end(output);\n        }\n    };\n}\n\nmodule.exports.middleware = init;\nmodule.exports.plugin = init;\nmodule.exports.minified = function() {\n    return fs.readFileSync(minifiedScript, \"utf8\");\n};\nmodule.exports.unminified = function() {\n    return fs.readFileSync(unminifiedScript, \"utf8\");\n};\n"
  },
  {
    "path": "packages/browser-sync-client/lib/browser.utils.ts",
    "content": "/**\n * @returns {window}\n */\nimport * as ScrollEvent from \"./messages/ScrollEvent\";\nimport ICoords = ScrollEvent.ICoords;\n\nexport function getWindow() {\n    return window;\n}\n\n/**\n * @returns {HTMLDocument}\n */\nexport function getDocument() {\n    return document;\n}\n\n/**\n * Get the current x/y position crossbow\n * @returns {{x: *, y: *}}\n */\nexport function getBrowserScrollPosition(window, document): ICoords {\n    let scrollX;\n    let scrollY;\n    const dElement = document.documentElement;\n    const dBody = document.body;\n\n    if (window.pageYOffset !== undefined) {\n        scrollX = window.pageXOffset;\n        scrollY = window.pageYOffset;\n    } else {\n        scrollX = dElement.scrollLeft || dBody.scrollLeft || 0;\n        scrollY = dElement.scrollTop || dBody.scrollTop || 0;\n    }\n\n    return {\n        x: scrollX,\n        y: scrollY\n    };\n}\n\n/**\n * @returns {{x: number, y: number}}\n */\nexport function getDocumentScrollSpace(\n    document: Document\n): ScrollEvent.ICoords {\n    const dElement = document.documentElement;\n    const dBody = document.body;\n    return {\n        x: dBody.scrollHeight - dElement.clientWidth,\n        y: dBody.scrollHeight - dElement.clientHeight\n    };\n}\n\n/**\n * Saves scroll position into cookies\n */\nexport function saveScrollPosition(window, document) {\n    const pos = getBrowserScrollPosition(window, document);\n    document.cookie = \"bs_scroll_pos=\" + [pos.x, pos.y].join(\",\");\n}\n\n/**\n * Restores scroll position from cookies\n */\nexport function restoreScrollPosition() {\n    const pos = getDocument()\n        .cookie.replace(\n            /(?:(?:^|.*;\\s*)bs_scroll_pos\\s*\\=\\s*([^;]*).*$)|^.*$/,\n            \"$1\"\n        )\n        .split(\",\");\n    getWindow().scrollTo(Number(pos[0]), Number(pos[1]));\n}\n\n/**\n * @param tagName\n * @param elem\n * @returns {*|number}\n */\nexport function getElementIndex(tagName, elem) {\n    var allElems = getDocument().getElementsByTagName(tagName);\n    return Array.prototype.indexOf.call(allElems, elem);\n}\n\n/**\n * Force Change event on radio & checkboxes (IE)\n */\nexport function forceChange(elem) {\n    elem.blur();\n    elem.focus();\n}\n\n/**\n * @param elem\n * @returns {{tagName: (elem.tagName|*), index: *}}\n */\nexport function getElementData(elem) {\n    var tagName = elem.tagName;\n    var index = getElementIndex(tagName, elem);\n    return {\n        tagName: tagName,\n        index: index\n    };\n}\n\n/**\n * @param {string} tagName\n * @param {number} index\n */\nexport function getSingleElement(tagName, index) {\n    var elems = getDocument().getElementsByTagName(tagName);\n    return elems[index];\n}\n\n/**\n * Get the body element\n */\nexport function getBody() {\n    return getDocument().getElementsByTagName(\"body\")[0];\n}\n\n/**\n * @param {{x: number, y: number}} pos\n */\nexport function setScroll(pos) {\n    getWindow().scrollTo(pos.x, pos.y);\n}\n\n/**\n * Hard reload\n */\nexport function reloadBrowser() {\n    getWindow().location.reload();\n}\n\n/**\n * Foreach polyfill\n * @param coll\n * @param fn\n */\nexport function forEach(coll, fn) {\n    for (var i = 0, n = coll.length; i < n; i += 1) {\n        fn(coll[i], i, coll);\n    }\n}\n\n/**\n * Are we dealing with old IE?\n * @returns {boolean}\n */\nexport function isOldIe() {\n  // @ts-ignore - Only IE < 11 has .attachEvent property\n  // https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa703974(v=vs.85)\n    return typeof getWindow().attachEvent !== \"undefined\";\n}\n\n/**\n * Split the URL information\n * @returns {object}\n */\nexport function getLocation(url) {\n    const location = getDocument().createElement(\"a\");\n    location.href = url;\n\n    if (location.host === \"\") {\n        location.href = location.href;\n    }\n\n    return location;\n}\n\n/**\n * @param {String} val\n * @returns {boolean}\n */\nexport function isUndefined(val) {\n    return \"undefined\" === typeof val;\n}\n\n/**\n * @param obj\n * @param path\n */\nexport function getByPath(obj, path) {\n    for (\n        var i = 0, tempPath = path.split(\".\"), len = tempPath.length;\n        i < len;\n        i++\n    ) {\n        if (!obj || typeof obj !== \"object\") {\n            return false;\n        }\n        obj = obj[tempPath[i]];\n    }\n\n    if (typeof obj === \"undefined\") {\n        return false;\n    }\n\n    return obj;\n}\n\nexport function getScrollPosition(\n    window: Window,\n    document: Document\n): ScrollEvent.Data {\n    const pos = getBrowserScrollPosition(window, document);\n    return {\n        raw: pos, // Get px of x and y axis of scroll\n        proportional: getScrollTopPercentage(pos, document) // Get % of y axis of scroll\n    };\n}\n\nexport function getScrollPositionForElement(\n    element: HTMLElement\n): ScrollEvent.Data {\n    const raw: ICoords = {\n        x: element.scrollLeft,\n        y: element.scrollTop\n    };\n    const scrollSpace: ICoords = {\n        x: element.scrollWidth,\n        y: element.scrollHeight\n    };\n    return {\n        raw, // Get px of x and y axis of scroll\n        proportional: getScrollPercentage(scrollSpace, raw).y // Get % of y axis of scroll\n    };\n}\n\nexport function getScrollTopPercentage(pos, document): number {\n    const scrollSpace = getDocumentScrollSpace(document);\n    const percentage = getScrollPercentage(scrollSpace, pos);\n    return percentage.y;\n}\n\nexport function getScrollPercentage(\n    scrollSpace: ICoords,\n    scrollPosition: ICoords\n): ICoords {\n    const x = scrollPosition.x / scrollSpace.x;\n    const y = scrollPosition.y / scrollSpace.y;\n\n    return {\n        x: x || 0,\n        y: y\n    };\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/dom-effects/link-replace.dom-effect.ts",
    "content": "import { map } from \"rxjs/operators/map\";\nimport { Inputs } from \"../index\";\nimport { filter } from \"rxjs/operators/filter\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { Observable } from \"rxjs/Observable\";\nimport * as Log from \"../log\";\nimport { pluck } from \"rxjs/operators/pluck\";\nimport { Events } from \"../dom-effects\";\n\nexport type LinkReplacePayload = {\n    target: HTMLLinkElement;\n    nextHref: string;\n    prevHref: string;\n    pathname: string;\n    basename: string;\n};\n\nexport function linkReplaceDomEffect(\n    xs: Observable<LinkReplacePayload>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        withLatestFrom<LinkReplacePayload, any>(\n            inputs.option$.pipe(pluck(\"injectNotification\"))\n        ),\n        filter(([, inject]) => inject),\n        map(([incoming, inject]) => {\n            const message = `[LinkReplace] ${incoming.basename}`;\n            if (inject === \"overlay\") {\n                return Log.overlayInfo(message);\n            }\n            return Log.consoleInfo(message);\n        })\n    );\n}\n\nexport function linkReplace(\n    incoming: LinkReplacePayload\n): [Events.LinkReplace, LinkReplacePayload] {\n    return [Events.LinkReplace, incoming];\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/dom-effects/prop-set.dom-effect.ts",
    "content": "import { map } from \"rxjs/operators/map\";\nimport { tap } from \"rxjs/operators/tap\";\nimport { Observable } from \"rxjs/Observable\";\nimport { Events } from \"../dom-effects\";\nimport * as Log from \"../log\";\n\nexport interface PropSetPayload {\n    target: Element;\n    prop: string;\n    value: string;\n    pathname: string;\n}\n\nexport function propSetDomEffect(xs: Observable<PropSetPayload>) {\n    return xs.pipe(\n        tap(event => {\n            const { target, prop, value } = event;\n            target[prop] = value;\n        }),\n        map(e =>\n            Log.consoleInfo(`[PropSet]`, e.target, `${e.prop} = ${e.pathname}`)\n        )\n    );\n}\n\nexport function propSet(incoming: PropSetPayload): [Events.PropSet, any] {\n    return [Events.PropSet, incoming];\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/dom-effects/set-scroll.dom-effect.ts",
    "content": "import { Inputs } from \"../index\";\nimport { ignoreElements } from \"rxjs/operators/ignoreElements\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { tap } from \"rxjs/operators/tap\";\nimport { Observable } from \"rxjs/Observable\";\nimport { Events } from \"../dom-effects\";\n\nexport type SetScrollPayload = { x: number; y: number };\n\nexport function setScroll(\n    x: number,\n    y: number\n): [Events.SetScroll, SetScrollPayload] {\n    return [Events.SetScroll, { x, y }];\n}\n\nexport function setScrollDomEffect(\n    xs: Observable<SetScrollPayload>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        withLatestFrom(inputs.window$),\n        tap(([event, window]) => window.scrollTo(event.x, event.y)),\n        ignoreElements()\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/dom-effects/set-window-name.dom-effect.ts",
    "content": "import { Inputs } from \"../index\";\nimport { ignoreElements } from \"rxjs/operators/ignoreElements\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { tap } from \"rxjs/operators/tap\";\nimport { Observable } from \"rxjs/Observable\";\nimport { Events } from \"../dom-effects\";\n\nexport function setWindowNameDomEffect(xs: Observable<string>, inputs: Inputs) {\n    return xs.pipe(\n        withLatestFrom(inputs.window$),\n        tap(([value, window]) => (window.name = value)),\n        ignoreElements()\n    );\n}\n\nexport function setWindowName(\n    incoming: string\n): [Events.SetWindowName, string] {\n    return [Events.SetWindowName, incoming];\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/dom-effects/style-set.dom-effect.ts",
    "content": "import { map } from \"rxjs/operators/map\";\nimport { Events } from \"../dom-effects\";\nimport { tap } from \"rxjs/operators/tap\";\nimport { Observable } from \"rxjs/Observable\";\nimport * as Log from \"../log\";\n\nexport interface StyleSetPayload {\n    style: string;\n    styleName: string;\n    value: string;\n    newValue: string;\n    pathName: string;\n}\n\nexport function styleSetDomEffect(xs: Observable<StyleSetPayload>) {\n    return xs.pipe(\n        tap(event => {\n            const { style, styleName, newValue } = event;\n            style[styleName] = newValue;\n        }),\n        map(e => Log.consoleInfo(`[StyleSet] ${e.styleName} = ${e.pathName}`))\n    );\n}\n\nexport function styleSet(incoming: StyleSetPayload): [Events.StyleSet, any] {\n    return [Events.StyleSet, incoming];\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/dom-effects.ts",
    "content": "import { BehaviorSubject } from \"rxjs/BehaviorSubject\";\nimport { propSetDomEffect } from \"./dom-effects/prop-set.dom-effect\";\nimport { styleSetDomEffect } from \"./dom-effects/style-set.dom-effect\";\nimport { linkReplaceDomEffect } from \"./dom-effects/link-replace.dom-effect\";\nimport { setScrollDomEffect } from \"./dom-effects/set-scroll.dom-effect\";\nimport { setWindowNameDomEffect } from \"./dom-effects/set-window-name.dom-effect\";\n\nexport enum Events {\n    PropSet = \"@@BSDOM.Events.PropSet\",\n    StyleSet = \"@@BSDOM.Events.StyleSet\",\n    LinkReplace = \"@@BSDOM.Events.LinkReplace\",\n    SetScroll = \"@@BSDOM.Events.SetScroll\",\n    SetWindowName = \"@@BSDOM.Events.SetWindowName\"\n}\n\nexport const domHandlers$ = new BehaviorSubject({\n    [Events.PropSet]: propSetDomEffect,\n    [Events.StyleSet]: styleSetDomEffect,\n    [Events.LinkReplace]: linkReplaceDomEffect,\n    [Events.SetScroll]: setScrollDomEffect,\n    [Events.SetWindowName]: setWindowNameDomEffect\n});\n"
  },
  {
    "path": "packages/browser-sync-client/lib/effects/browser-reload.effect.ts",
    "content": "import { EffectNames } from \"../effects\";\nimport { Inputs } from \"../index\";\nimport { Observable } from \"rxjs/Observable\";\nimport { tap } from \"rxjs/operators/tap\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\n\nexport function browserReload() {\n    return [EffectNames.BrowserReload];\n}\n\nexport function preBrowserReload() {\n    return [EffectNames.PreBrowserReload];\n}\n\nexport function browserReloadEffect(xs: Observable<any>, inputs: Inputs) {\n    return xs.pipe(\n        withLatestFrom(inputs.window$),\n        tap(([, window]) => window.location.reload())\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/effects/browser-set-location.effect.ts",
    "content": "import { Inputs } from \"../index\";\nimport { ignoreElements } from \"rxjs/operators/ignoreElements\";\nimport { tap } from \"rxjs/operators/tap\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { Observable } from \"rxjs/Observable\";\nimport { IncomingPayload } from \"../messages/BrowserLocation\";\nimport { EffectNames } from \"../effects\";\n\nexport function browserSetLocationEffect(\n    xs: Observable<IncomingPayload>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        withLatestFrom(inputs.window$),\n        tap(([event, window]) => {\n            if (event.path) {\n                return ((window.location as any) =\n                    window.location.protocol +\n                    \"//\" +\n                    window.location.host +\n                    event.path);\n            }\n            if (event.url) {\n                return ((window.location as any) = event.url);\n            }\n        }),\n        ignoreElements()\n    );\n}\n\nexport function browserSetLocation(input: IncomingPayload) {\n    return [EffectNames.BrowserSetLocation, input];\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/effects/file-reload.effect.ts",
    "content": "import { FileReloadEventPayload } from \"../types/socket\";\nimport { EffectNames } from \"../effects\";\nimport { Inputs } from \"../index\";\nimport { reload } from \"../vendor/Reloader\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { mergeMap } from \"rxjs/operators/mergeMap\";\nimport { Observable } from \"rxjs/Observable\";\n\nexport function fileReload(event: FileReloadEventPayload) {\n    return [EffectNames.FileReload, event];\n}\n\n/**\n * Attempt to reload files in place\n * @param xs\n * @param inputs\n */\nexport function fileReloadEffect(\n    xs: Observable<FileReloadEventPayload>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        withLatestFrom(inputs.option$, inputs.document$, inputs.navigator$),\n        mergeMap(([event, options, document, navigator]) => {\n            return reload(document, navigator)(event, {\n                tagNames: options.tagNames,\n                liveCSS: true,\n                liveImg: true\n            });\n        })\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/effects/set-element-toggle-value.effect.ts",
    "content": "import { Inputs } from \"../index\";\nimport { Observable } from \"rxjs/Observable\";\nimport * as FormToggleEvent from \"../messages/FormToggleEvent\";\nimport { tap } from \"rxjs/operators/tap\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { EffectNames } from \"../effects\";\n\nexport function setElementToggleValueEffect(\n    xs: Observable<FormToggleEvent.IncomingPayload>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        withLatestFrom(inputs.document$),\n        tap(([event, document]) => {\n            const elems = document.getElementsByTagName(event.tagName);\n            const match = <HTMLInputElement>elems[event.index];\n            if (match) {\n                if (event.type === \"radio\") {\n                    match.checked = true;\n                }\n                if (event.type === \"checkbox\") {\n                    match.checked = event.checked;\n                }\n                if (event.tagName === \"SELECT\") {\n                    match.value = event.value;\n                }\n            }\n        })\n    );\n}\n\nexport function setElementToggleValue(event: FormToggleEvent.IncomingPayload) {\n    return [EffectNames.SetElementToggleValue, event];\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/effects/set-element-value.effect.ts",
    "content": "import { Inputs } from \"../index\";\nimport { Observable } from \"rxjs/Observable\";\nimport * as KeyupEvent from \"../messages/KeyupEvent\";\nimport { tap } from \"rxjs/operators/tap\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { EffectNames } from \"../effects\";\n\nexport function setElementValueEffect(\n    xs: Observable<KeyupEvent.IncomingPayload>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        withLatestFrom(inputs.document$),\n        tap(([event, document]) => {\n            const elems = document.getElementsByTagName(event.tagName);\n            const match = elems[event.index];\n            if (match) {\n                (match as HTMLInputElement).value = event.value;\n            }\n        })\n    );\n}\n\nexport function setElementValue(event: KeyupEvent.IncomingPayload) {\n    return [EffectNames.SetElementValue, event];\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/effects/set-options.effect.ts",
    "content": "import { Inputs } from \"../index\";\nimport { Observable } from \"rxjs/Observable\";\nimport { ignoreElements } from \"rxjs/operators/ignoreElements\";\nimport { tap } from \"rxjs/operators/tap\";\nimport { map } from \"rxjs/operators/map\";\nimport { EffectNames } from \"../effects\";\nimport { consoleInfo } from \"../log\";\n\n/**\n * Set the local client options\n * @param xs\n * @param inputs\n */\nexport function setOptionsEffect(\n    xs: Observable<IBrowserSyncOptions>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        tap(options => inputs.option$.next(options)),\n        // map(() => consoleInfo('set options'))\n        ignoreElements()\n    );\n}\n\nexport function setOptions(options: IBrowserSyncOptions) {\n    return [EffectNames.SetOptions, options];\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/effects/set-scroll.ts",
    "content": "import { IncomingPayload } from \"../messages/ScrollEvent\";\nimport { Inputs } from \"../index\";\nimport { pluck } from \"rxjs/operators/pluck\";\nimport { Observable } from \"rxjs/Observable\";\nimport { ignoreElements } from \"rxjs/operators/ignoreElements\";\nimport { partition } from \"rxjs/operators/partition\";\nimport { merge } from \"rxjs/observable/merge\";\nimport { getDocumentScrollSpace } from \"../browser.utils\";\nimport { tap } from \"rxjs/operators/tap\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { map } from \"rxjs/operators/map\";\n\ntype Tuple = [IncomingPayload, Window, Document, boolean];\n\nexport function setScrollEffect(\n    xs: Observable<IncomingPayload>,\n    inputs: Inputs\n) {\n    {\n        /**\n         * Group the incoming event with window, document & scrollProportionally argument\n         */\n        const tupleStream$: Observable<Tuple> = xs.pipe(\n            withLatestFrom<IncomingPayload, Window, Document, boolean>(\n                inputs.window$,\n                inputs.document$,\n                inputs.option$.pipe(pluck(\"scrollProportionally\"))\n            )\n        );\n\n        /**\n         * Split the stream between document scrolls and element scrolls\n         */\n        const [document$, element$] = partition(([event]: Tuple) => {\n            return event.tagName === \"document\";\n        })(tupleStream$);\n\n        /**\n         * Further split the element scroll between those matching in `scrollElementMapping`\n         * and regular element scrolls\n         */\n        const [mapped$, nonMapped$] = partition(([event]: Tuple) => {\n            return event.mappingIndex > -1;\n        })(element$);\n\n        return merge(\n            /**\n             * Main window scroll\n             */\n            document$.pipe(\n                tap((incoming: Tuple) => {\n                    const [\n                        event,\n                        window,\n                        document,\n                        scrollProportionally\n                    ] = incoming;\n                    const scrollSpace = getDocumentScrollSpace(document);\n\n                    if (scrollProportionally) {\n                        return window.scrollTo(\n                            0,\n                            scrollSpace.y * event.position.proportional\n                        ); // % of y axis of scroll to px\n                    }\n                    return window.scrollTo(0, event.position.raw.y);\n                })\n            ),\n            /**\n             * Regular, non-mapped Element scrolls\n             */\n            nonMapped$.pipe(\n                tap((incoming: Tuple) => {\n                    const [\n                        event,\n                        window,\n                        document,\n                        scrollProportionally\n                    ] = incoming;\n\n                    const matchingElements = document.getElementsByTagName(\n                        event.tagName\n                    );\n                    if (matchingElements && matchingElements.length) {\n                        const match = matchingElements[event.index];\n                        if (match) {\n                            return scrollElement(\n                                match,\n                                scrollProportionally,\n                                event\n                            );\n                        }\n                    }\n                })\n            ),\n            /**\n             * Element scrolls given in 'scrollElementMapping'\n             */\n            mapped$.pipe(\n                withLatestFrom(\n                    inputs.option$.pipe(pluck(\"scrollElementMapping\"))\n                ),\n                /**\n                 * Filter the elements in the option `scrollElementMapping` so\n                 * that it does not contain the element that triggered the event\n                 */\n                map(([incoming, scrollElementMapping]: [Tuple, string[]]) => {\n                    const [event] = incoming;\n                    return [\n                        incoming,\n                        scrollElementMapping.filter(\n                            (item, index) => index !== event.mappingIndex\n                        )\n                    ];\n                }),\n                /**\n                 * Now perform the scroll on all other matching elements\n                 */\n                tap(([incoming, scrollElementMapping]: [Tuple, string[]]) => {\n                    const [\n                        event,\n                        window,\n                        document,\n                        scrollProportionally\n                    ] = incoming;\n                    scrollElementMapping\n                        .map(selector => document.querySelector(selector))\n                        .forEach(element => {\n                            scrollElement(element, scrollProportionally, event);\n                        });\n                })\n            )\n        ).pipe(ignoreElements());\n    }\n}\n\nfunction scrollElement(element, scrollProportionally, event: IncomingPayload) {\n    if (scrollProportionally && element.scrollTo) {\n        return element.scrollTo(\n            0,\n            element.scrollHeight * event.position.proportional\n        ); // % of y axis of scroll to px\n    }\n    return element.scrollTo(0, event.position.raw.y);\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/effects/simulate-click.effect.ts",
    "content": "import { Inputs } from \"../index\";\nimport { Observable } from \"rxjs/Observable\";\nimport { ignoreElements } from \"rxjs/operators/ignoreElements\";\nimport * as ClickEvent from \"../messages/ClickEvent\";\nimport { tap } from \"rxjs/operators/tap\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { EffectNames } from \"../effects\";\nimport { IncomingPayload } from \"../messages/ClickEvent\";\n\nexport function simulateClickEffect(\n    xs: Observable<ClickEvent.IncomingPayload>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        withLatestFrom(inputs.window$, inputs.document$),\n        tap(([event, window, document]) => {\n            const elems = document.getElementsByTagName(event.tagName);\n            const match = elems[event.index];\n\n            if (match) {\n                if (document.createEvent) {\n                    window.setTimeout(function() {\n                        const evObj = document.createEvent(\"MouseEvents\");\n                        evObj.initEvent(\"click\", true, true);\n                        match.dispatchEvent(evObj);\n                    }, 0);\n                } else {\n                    window.setTimeout(function() {\n                        if ((document as any).createEventObject) {\n                            const evObj = (document as any).createEventObject();\n                            evObj.cancelBubble = true;\n                            (match as any).fireEvent(\"on\" + \"click\", evObj);\n                        }\n                    }, 0);\n                }\n            }\n        }),\n        ignoreElements()\n    );\n}\n\nexport function simulateClick(event: IncomingPayload) {\n    return [EffectNames.SimulateClick, event];\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/effects.ts",
    "content": "import { BehaviorSubject } from \"rxjs/BehaviorSubject\";\nimport { setOptionsEffect } from \"./effects/set-options.effect\";\nimport { fileReloadEffect } from \"./effects/file-reload.effect\";\nimport { browserSetLocationEffect } from \"./effects/browser-set-location.effect\";\nimport { simulateClickEffect } from \"./effects/simulate-click.effect\";\nimport { setElementValueEffect } from \"./effects/set-element-value.effect\";\nimport { setElementToggleValueEffect } from \"./effects/set-element-toggle-value.effect\";\nimport { setScrollEffect } from \"./effects/set-scroll\";\nimport { browserReloadEffect } from \"./effects/browser-reload.effect\";\n\nexport enum EffectNames {\n    FileReload = \"@@FileReload\",\n    PreBrowserReload = \"@@PreBrowserReload\",\n    BrowserReload = \"@@BrowserReload\",\n    BrowserSetLocation = \"@@BrowserSetLocation\",\n    BrowserSetScroll = \"@@BrowserSetScroll\",\n    SetOptions = \"@@SetOptions\",\n    SimulateClick = \"@@SimulateClick\",\n    SetElementValue = \"@@SetElementValue\",\n    SetElementToggleValue = \"@@SetElementToggleValue\"\n}\n\nexport const effectOutputHandlers$ = new BehaviorSubject({\n    [EffectNames.SetOptions]: setOptionsEffect,\n    [EffectNames.FileReload]: fileReloadEffect,\n    [EffectNames.BrowserReload]: browserReloadEffect,\n    [EffectNames.BrowserSetLocation]: browserSetLocationEffect,\n    [EffectNames.SimulateClick]: simulateClickEffect,\n    [EffectNames.SetElementValue]: setElementValueEffect,\n    [EffectNames.SetElementToggleValue]: setElementToggleValueEffect,\n    [EffectNames.BrowserSetScroll]: setScrollEffect\n});\n"
  },
  {
    "path": "packages/browser-sync-client/lib/index.ts",
    "content": "///<reference path=\"types.ts\"/>\nimport \"core-js/es/object/assign\"\nimport 'element-scroll-polyfill';\nimport { Observable } from \"rxjs/Observable\";\nimport { BehaviorSubject } from \"rxjs/BehaviorSubject\";\nimport { zip } from \"rxjs/observable/zip\";\nimport { initDocument, initOptions, initSocket, initWindow } from \"./socket\";\nimport { initNotify } from \"./notify\";\nimport { domHandlers$ } from \"./dom-effects\";\nimport { SocketEvent, socketHandlers$ } from \"./socket-messages\";\nimport { merge } from \"rxjs/observable/merge\";\nimport { initLogger, logHandler$ } from \"./log\";\nimport { effectOutputHandlers$ } from \"./effects\";\nimport { Nanologger } from \"./vendor/logger\";\nimport { scrollRestoreHandlers$, initWindowName } from \"./scroll-restore\";\nimport { initListeners } from \"./listeners\";\nimport { groupBy } from \"rxjs/operators/groupBy\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { mergeMap } from \"rxjs/operators/mergeMap\";\nimport { share } from \"rxjs/operators/share\";\nimport { filter } from \"rxjs/operators/filter\";\nimport { pluck } from \"rxjs/operators/pluck\";\nimport { of } from \"rxjs/observable/of\";\n\nexport interface Inputs {\n    window$: Observable<Window>;\n    document$: Observable<Document>;\n    socket$: Observable<SocketEvent>;\n    option$: BehaviorSubject<IBrowserSyncOptions>;\n    navigator$: Observable<Navigator>;\n    notifyElement$: BehaviorSubject<HTMLElement>;\n    logInstance$: Observable<Nanologger>;\n    io$: BehaviorSubject<any>;\n    outgoing$: Observable<any>;\n}\n\nconst window$ = initWindow();\nconst document$ = initDocument();\nconst names$ = initWindowName(window);\nconst { socket$, io$ } = initSocket();\nconst option$ = initOptions();\nconst navigator$ = of(navigator);\nconst notifyElement$ = initNotify(option$.getValue());\nconst logInstance$ = initLogger(option$.getValue());\nconst outgoing$ = initListeners(window, document, socket$, option$);\n\nconst inputs: Inputs = {\n    window$,\n    document$,\n    socket$,\n    option$,\n    navigator$,\n    notifyElement$,\n    logInstance$,\n    io$,\n    outgoing$\n};\n\nfunction getStream(name: string, inputs) {\n    return function(handlers$, inputStream$) {\n        return inputStream$.pipe(\n            groupBy(([keyName]) => {\n                return keyName;\n            }),\n            withLatestFrom(handlers$),\n            filter(([x, handlers]) => {\n                return typeof handlers[x.key] === \"function\";\n            }),\n            mergeMap(([x, handlers]) => {\n                return handlers[x.key](x.pipe(pluck(String(1))), inputs);\n            }),\n            share()\n        );\n    };\n}\n\nconst combinedEffectHandler$ = zip(\n    effectOutputHandlers$,\n    scrollRestoreHandlers$,\n    (...args) => {\n        return args.reduce((acc, item) => ({ ...acc, ...item }), {});\n    }\n);\n\nconst output$ = getStream(\"[socket]\", inputs)(\n    socketHandlers$,\n    merge(inputs.socket$, outgoing$)\n);\n\nconst effect$ = getStream(\"[effect]\", inputs)(combinedEffectHandler$, output$);\nconst dom$ = getStream(\"[dom-effect]\", inputs)(\n    domHandlers$,\n    merge(effect$, names$)\n);\n\nconst merged$ = merge(output$, effect$, dom$);\n\nconst log$ = getStream(\"[log]\", inputs)(logHandler$, merged$);\n\nlog$.subscribe();\n\n// resume$.next(true);\n\n// var socket = require(\"./socket\");\n// var shims = require(\"./client-shims\");\n// var notify = require(\"./notify\");\n// // var codeSync = require(\"./code-sync\");\n// const { BrowserSync } = require(\"./browser-sync\");\n// var ghostMode = require(\"./ghostmode\");\n// var events = require(\"./events\");\n// var utils = require(\"./browser.utils\");\n//\n// const mitt = require(\"mitt\").default;\n//\n// var shouldReload = false;\n// var initialised = false;\n//\n// /**\n//  * @param options\n//  */\n// function init(options: bs.InitOptions) {\n//     if (shouldReload && options.reloadOnRestart) {\n//         utils.reloadBrowser();\n//     }\n//\n//     var BS = window.___browserSync___ || {};\n//     var emitter = mitt();\n//\n//     if (!BS.client) {\n//         BS.client = true;\n//\n//         var browserSync = new BrowserSync({ options, emitter, socket });\n//\n//         // codeSync.init(browserSync);\n//\n//         // // Always init on page load\n//         // ghostMode.init(browserSync);\n//         //\n//         // notify.init(browserSync);\n//         //\n//         // if (options.notify) {\n//         //     notify.flash(\"Connected to BrowserSync\");\n//         // }\n//     }\n//\n//     // if (!initialised) {\n//     //     socket.on(\"disconnect\", function() {\n//     //         if (options.notify) {\n//     //             notify.flash(\"Disconnected from BrowserSync\");\n//     //         }\n//     //         shouldReload = true;\n//     //     });\n//     //     initialised = true;\n//     // }\n// }\n//\n// /**\n//  * Handle individual socket connections\n//  */\n// socket.on(\"connection\", init);\n"
  },
  {
    "path": "packages/browser-sync-client/lib/listeners/clicks.listener.ts",
    "content": "import { createTimedBooleanSwitch } from \"../utils\";\nimport { IncomingSocketNames, OutgoingSocketEvent } from \"../socket-messages\";\nimport { getElementData } from \"../browser.utils\";\nimport { Observable } from \"rxjs/Observable\";\nimport * as ClickEvent from \"../messages/ClickEvent\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { filter } from \"rxjs/operators/filter\";\nimport { map } from \"rxjs/operators/map\";\nimport { Inputs } from \"../index\";\nimport { pluck } from \"rxjs/operators/pluck\";\nimport { skip } from \"rxjs/operators/skip\";\nimport { distinctUntilChanged } from \"rxjs/operators/distinctUntilChanged\";\nimport { switchMap } from \"rxjs/operators/switchMap\";\nimport { fromEvent } from \"rxjs/observable/fromEvent\";\nimport { empty } from \"rxjs/observable/empty\";\n\nexport function getClickStream(\n    document: Document,\n    socket$: Inputs[\"socket$\"],\n    option$: Inputs[\"option$\"]\n): Observable<OutgoingSocketEvent> {\n    const canSync$ = createTimedBooleanSwitch(\n        socket$.pipe(filter(([name]) => name === IncomingSocketNames.Click))\n    );\n\n    return option$.pipe(\n        skip(1), // initial option set before the connection event\n        pluck(\"ghostMode\", \"clicks\"),\n        distinctUntilChanged(),\n        switchMap(canClick => {\n            if (!canClick) {\n                return empty();\n            }\n            return fromEvent(document, \"click\", true).pipe(\n                map((e: Event) => e.target),\n                filter((target: any) => {\n                    if (target.tagName === \"LABEL\") {\n                        const id = target.getAttribute(\"for\");\n                        if (id && document.getElementById(id)) {\n                            return false;\n                        }\n                    }\n                    return true;\n                }),\n                withLatestFrom(canSync$),\n                filter(([, canSync]) => canSync),\n                map(([target]): OutgoingSocketEvent => {\n                    return ClickEvent.outgoing(getElementData(target));\n                })\n            );\n        })\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/listeners/form-inputs.listener.ts",
    "content": "import { IncomingSocketNames, OutgoingSocketEvent } from \"../socket-messages\";\nimport { getElementData } from \"../browser.utils\";\nimport { Observable } from \"rxjs/Observable\";\nimport { createTimedBooleanSwitch } from \"../utils\";\nimport * as KeyupEvent from \"../messages/KeyupEvent\";\nimport { filter } from \"rxjs/operators/filter\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { map } from \"rxjs/operators/map\";\nimport { pluck } from \"rxjs/operators/pluck\";\nimport { skip } from \"rxjs/operators/skip\";\nimport { distinctUntilChanged } from \"rxjs/operators/distinctUntilChanged\";\nimport { switchMap } from \"rxjs/operators/switchMap\";\nimport { empty } from \"rxjs/observable/empty\";\nimport { fromEvent } from \"rxjs/observable/fromEvent\";\nimport { Inputs } from \"../index\";\n\nexport function getFormInputStream(\n    document: Document,\n    socket$: Inputs[\"socket$\"],\n    option$: Inputs[\"option$\"]\n): Observable<OutgoingSocketEvent> {\n    const canSync$ = createTimedBooleanSwitch(\n        socket$.pipe(filter(([name]) => name === IncomingSocketNames.Keyup))\n    );\n    return option$.pipe(\n        skip(1), // initial option set before the connection event\n        pluck(\"ghostMode\", \"forms\", \"inputs\"),\n        distinctUntilChanged(),\n        switchMap(formInputs => {\n            if (!formInputs) {\n                return empty();\n            }\n            return fromEvent(document.body, \"keyup\", true).pipe(\n                map((e: Event) => e.target || e.srcElement),\n                filter(\n                    (target: Element) =>\n                        target.tagName === \"INPUT\" ||\n                        target.tagName === \"TEXTAREA\"\n                ),\n                withLatestFrom(canSync$),\n                filter(([, canSync]) => canSync),\n                map(([eventTarget]) => {\n                    const target = getElementData(eventTarget);\n                    const value = eventTarget.value;\n\n                    return KeyupEvent.outgoing(target, value);\n                })\n            );\n        })\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/listeners/form-toggles.listener.ts",
    "content": "import { IncomingSocketNames, OutgoingSocketEvent } from \"../socket-messages\";\nimport { getElementData } from \"../browser.utils\";\nimport { Observable } from \"rxjs/Observable\";\nimport { createTimedBooleanSwitch } from \"../utils\";\nimport * as FormToggleEvent from \"../messages/FormToggleEvent\";\nimport { filter } from \"rxjs/operators/filter\";\nimport { skip } from \"rxjs/operators/skip\";\nimport { pluck } from \"rxjs/operators/pluck\";\nimport { distinctUntilChanged } from \"rxjs/operators/distinctUntilChanged\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { map } from \"rxjs/operators/map\";\nimport { switchMap } from \"rxjs/operators/switchMap\";\nimport { Inputs } from \"../index\";\nimport { empty } from \"rxjs/observable/empty\";\nimport { fromEvent } from \"rxjs/observable/fromEvent\";\n\nexport function getFormTogglesStream(\n    document: Document,\n    socket$: Inputs[\"socket$\"],\n    option$: Inputs[\"option$\"]\n): Observable<OutgoingSocketEvent> {\n    const canSync$ = createTimedBooleanSwitch(\n        socket$.pipe(\n            filter(([name]) => name === IncomingSocketNames.InputToggle)\n        )\n    );\n\n    return option$.pipe(\n        skip(1),\n        pluck(\"ghostMode\", \"forms\", \"toggles\"),\n        distinctUntilChanged(),\n        switchMap(canToggle => {\n            if (!canToggle) {\n                return empty();\n            }\n            return fromEvent(document, \"change\", true).pipe(\n                map((e: Event) => e.target || e.srcElement),\n                filter((elem: HTMLInputElement) => elem.tagName === \"SELECT\"),\n                withLatestFrom(canSync$),\n                filter(([, canSync]) => canSync),\n                map(([elem, canSync]: [HTMLInputElement, boolean]) => {\n                    const data = getElementData(elem);\n\n                    return FormToggleEvent.outgoing(data, {\n                        type: elem.type,\n                        checked: elem.checked,\n                        value: elem.value\n                    });\n                })\n            );\n        })\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/listeners/scroll.listener.ts",
    "content": "import { createTimedBooleanSwitch } from \"../utils\";\nimport { IncomingSocketNames, OutgoingSocketEvent } from \"../socket-messages\";\nimport {\n    getScrollPosition,\n    getScrollPositionForElement\n} from \"../browser.utils\";\nimport { Observable } from \"rxjs/Observable\";\nimport * as ScrollEvent from \"../messages/ScrollEvent\";\nimport { filter } from \"rxjs/operators/filter\";\nimport { map } from \"rxjs/operators/map\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { Inputs } from \"../index\";\nimport { pluck } from \"rxjs/operators/pluck\";\nimport { distinctUntilChanged } from \"rxjs/operators/distinctUntilChanged\";\nimport { switchMap } from \"rxjs/operators/switchMap\";\nimport { empty } from \"rxjs/observable/empty\";\nimport { skip } from \"rxjs/operators/skip\";\nimport { fromEvent } from \"rxjs/observable/fromEvent\";\n\nexport function getScrollStream(\n    window: Window,\n    document: Document,\n    socket$: Inputs[\"socket$\"],\n    option$: Inputs[\"option$\"]\n): Observable<OutgoingSocketEvent> {\n    const canSync$ = createTimedBooleanSwitch(\n        socket$.pipe(filter(([name]) => name === IncomingSocketNames.Scroll))\n    );\n\n    /**\n     * If the option 'scrollElementMapping' is provided\n     * we cache thw\n     * @type {Observable<(Element | null)[]>}\n     */\n    const elemMap$ = option$.pipe(\n        pluck(\"scrollElementMapping\"),\n        map((selectors: string[]) =>\n            selectors.map(selector => document.querySelector(selector))\n        )\n    );\n\n    return option$.pipe(\n        skip(1), // initial option set before the connection event\n        pluck(\"ghostMode\", \"scroll\"),\n        distinctUntilChanged(),\n        switchMap(scroll => {\n            if (!scroll) return empty();\n            return fromEvent(document, \"scroll\", true).pipe(\n                map((e: Event) => e.target),\n                withLatestFrom(canSync$, elemMap$),\n                filter(([, canSync]) => Boolean(canSync)),\n                map(([target, canSync, elemMap]: [any, boolean, any[]]) => {\n                    if (target === document) {\n                        return ScrollEvent.outgoing(\n                            getScrollPosition(window, document),\n                            \"document\",\n                            0\n                        );\n                    }\n\n                    const elems = document.getElementsByTagName(target.tagName);\n                    const index = Array.prototype.indexOf.call(\n                        elems || [],\n                        target\n                    );\n\n                    return ScrollEvent.outgoing(\n                        getScrollPositionForElement(target),\n                        target.tagName,\n                        index,\n                        elemMap.indexOf(target)\n                    );\n                })\n            );\n        })\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/listeners.ts",
    "content": "import { merge } from \"rxjs/observable/merge\";\nimport { getFormInputStream } from \"./listeners/form-inputs.listener\";\nimport { getClickStream } from \"./listeners/clicks.listener\";\nimport { getScrollStream } from \"./listeners/scroll.listener\";\nimport { getFormTogglesStream } from \"./listeners/form-toggles.listener\";\nimport { OutgoingSocketEvent } from \"./socket-messages\";\nimport { Observable } from \"rxjs/Observable\";\nimport { Inputs } from \"./index\";\n\nexport function initListeners(\n    window: Window,\n    document: Document,\n    socket$: Inputs[\"socket$\"],\n    option$: Inputs[\"option$\"]\n): Observable<OutgoingSocketEvent> {\n    const merged$ = merge(\n        getScrollStream(window, document, socket$, option$),\n        getClickStream(document, socket$, option$),\n        getFormInputStream(document, socket$, option$),\n        getFormTogglesStream(document, socket$, option$)\n    );\n\n    return merged$;\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/log.ts",
    "content": "import { BehaviorSubject } from \"rxjs/BehaviorSubject\";\nimport { timer } from \"rxjs/observable/timer\";\nimport { Observable } from \"rxjs/Observable\";\nimport { of } from \"rxjs/observable/of\";\nimport { Nanologger } from \"./vendor/logger\";\nimport { filter } from \"rxjs/operators/filter\";\nimport { tap } from \"rxjs/operators/tap\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { switchMap } from \"rxjs/operators/switchMap\";\nimport { Inputs } from \"./index\";\nimport { pluck } from \"rxjs/operators/pluck\";\n\nexport function initLogger(options: IBrowserSyncOptions) {\n    const log = new Nanologger(options.logPrefix || \"\", {\n        colors: { magenta: \"#0F2634\" }\n    });\n    return of(log);\n}\n\nexport enum LogNames {\n    Log = \"@@Log\",\n    Info = \"@@Log.info\",\n    Debug = \"@@Log.debug\"\n}\n\nexport enum Overlay {\n    Info = \"@@Overlay.info\"\n}\n\nexport type ConsolePayload = [LogNames, any[]];\n\nexport function consoleInfo(...args): [LogNames.Log, ConsolePayload] {\n    return [LogNames.Log, [LogNames.Info, args]];\n}\n\nexport function consoleDebug(...args): [LogNames.Log, ConsolePayload] {\n    return [LogNames.Log, [LogNames.Debug, args]];\n}\n\nexport type OverlayInfoPayload = [string, number];\n\nexport function overlayInfo(\n    message: string,\n    timeout = 2000\n): [Overlay.Info, OverlayInfoPayload] {\n    return [Overlay.Info, [message, timeout]];\n}\n\nexport const logHandler$ = new BehaviorSubject({\n    [LogNames.Log]: (xs: Observable<[LogNames, any]>, inputs: Inputs) => {\n        return xs.pipe(\n            /**\n             * access injectNotification from the options stream\n             */\n            withLatestFrom(\n                inputs.logInstance$,\n                inputs.option$.pipe(pluck(\"injectNotification\"))\n            ),\n            /**\n             * only accept messages if injectNotification !== console\n             */\n            filter(\n                ([, , injectNotification]) => injectNotification === \"console\"\n            ),\n            tap(([event, log]) => {\n                switch (event[0]) {\n                    case LogNames.Info: {\n                        return log.info.apply(log, event[1]);\n                    }\n                    case LogNames.Debug: {\n                        return log.debug.apply(log, event[1]);\n                    }\n                }\n            })\n        );\n    },\n    [Overlay.Info]: (xs: Observable<[LogNames, any]>, inputs: Inputs) => {\n        return xs.pipe(\n            withLatestFrom(\n                inputs.option$,\n                inputs.notifyElement$,\n                inputs.document$\n            ),\n            /**\n             * Reject all notifications if notify: false\n             */\n            filter(([, options]) => Boolean(options.notify)),\n            /**\n             * Set the HTML of the notify element\n             */\n            tap(([event, options, element, document]) => {\n                element.innerHTML = event[0];\n                element.style.display = \"block\";\n                document.body.appendChild(element);\n            }),\n            /**\n             * Now remove the element after the given timeout\n             */\n            switchMap(([event, options, element, document]) => {\n                return timer(event[1] || 2000).pipe(\n                    tap(() => {\n                        element.style.display = \"none\";\n                        if (element.parentNode) {\n                            document.body.removeChild(element);\n                        }\n                    })\n                );\n            })\n        );\n    }\n});\n"
  },
  {
    "path": "packages/browser-sync-client/lib/messages/BrowserLocation.ts",
    "content": "import { Inputs } from \"../index\";\nimport { pluck } from \"rxjs/operators/pluck\";\nimport { filter } from \"rxjs/operators/filter\";\nimport { map } from \"rxjs/operators/map\";\nimport { Observable } from \"rxjs/Observable\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { browserSetLocation } from \"../effects/browser-set-location.effect\";\n\nexport interface IncomingPayload {\n    url?: string;\n    path?: number;\n}\n\nexport function incomingBrowserLocation(\n    xs: Observable<IncomingPayload>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        withLatestFrom(inputs.option$.pipe(pluck(\"ghostMode\", \"location\"))),\n        filter(([, canSyncLocation]) => canSyncLocation === true),\n        map(([event]) => browserSetLocation(event))\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/messages/BrowserNotify.ts",
    "content": "import { map } from \"rxjs/operators/map\";\nimport { Observable } from \"rxjs/Observable\";\nimport * as Log from \"../log\";\n\nexport interface IncomingPayload {\n    message: string;\n    timeout: number;\n    override?: boolean;\n}\n\nexport function incomingBrowserNotify(xs: Observable<IncomingPayload>) {\n    return xs.pipe(map(event => Log.overlayInfo(event.message, event.timeout)));\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/messages/BrowserReload.ts",
    "content": "import { Inputs } from \"../index\";\nimport { filter } from \"rxjs/operators/filter\";\nimport { Observable } from \"rxjs/Observable\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { mergeMap } from \"rxjs/operators/mergeMap\";\nimport { concat } from \"rxjs/observable/concat\";\nimport { of } from \"rxjs/observable/of\";\nimport {\n    browserReload,\n    preBrowserReload\n} from \"../effects/browser-reload.effect\";\nimport { subscribeOn } from \"rxjs/operators/subscribeOn\";\nimport { async } from \"rxjs/scheduler/async\";\n\nexport function incomingBrowserReload(xs: Observable<any>, inputs: Inputs) {\n    return xs.pipe(\n        withLatestFrom(inputs.option$),\n        filter(([event, options]) => options.codeSync),\n        mergeMap(reloadBrowserSafe)\n    );\n}\n\nexport function reloadBrowserSafe() {\n    return concat(\n        /**\n         * Emit a warning message allowing others to do some work\n         */\n        of(preBrowserReload()),\n        /**\n         * On the next tick, perform the reload\n         */\n        of(browserReload()).pipe(subscribeOn(async))\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/messages/ClickEvent.ts",
    "content": "import { OutgoingSocketEvents } from \"../socket-messages\";\nimport { Inputs } from \"../index\";\nimport { Observable } from \"rxjs/Observable\";\nimport { pluck } from \"rxjs/operators/pluck\";\nimport { filter } from \"rxjs/operators/filter\";\nimport { map } from \"rxjs/operators/map\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { simulateClick } from \"../effects/simulate-click.effect\";\n\nexport interface ElementData {\n    tagName: string;\n    index: number;\n}\n\nexport interface IncomingPayload extends ElementData {\n    pathname: string;\n}\n\nexport function outgoing(\n    data: ElementData\n): [OutgoingSocketEvents.Click, ElementData] {\n    return [OutgoingSocketEvents.Click, data];\n}\n\nexport function incomingHandler$(\n    xs: Observable<IncomingPayload>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        withLatestFrom(\n            inputs.option$.pipe(pluck(\"ghostMode\", \"clicks\")),\n            inputs.window$.pipe(pluck(\"location\", \"pathname\"))\n        ),\n        filter(([event, canClick, pathname]) => {\n            return canClick && event.pathname === pathname;\n        }),\n        map(([event]) => {\n            return simulateClick(event);\n        })\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/messages/Connection.ts",
    "content": "import { Inputs } from \"../index\";\nimport { pluck } from \"rxjs/operators/pluck\";\nimport { of } from \"rxjs/observable/of\";\nimport { Observable } from \"rxjs/Observable\";\nimport * as Log from \"../log\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { mergeMap } from \"rxjs/operators/mergeMap\";\nimport { setOptions } from \"../effects/set-options.effect\";\n\nexport function incomingConnection(\n    xs: Observable<IBrowserSyncOptions>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        withLatestFrom(inputs.option$.pipe(pluck(\"logPrefix\"))),\n        mergeMap(([x, logPrefix]) => {\n\n            const prefix = logPrefix\n                ? `${logPrefix}: `\n                : '';\n\n            return of<any>(\n                setOptions(x),\n                Log.overlayInfo(`${prefix}connected`)\n            );\n        })\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/messages/Disconnect.ts",
    "content": "import { ignoreElements } from \"rxjs/operators/ignoreElements\";\nimport { Observable } from \"rxjs/Observable\";\nimport { tap } from \"rxjs/operators/tap\";\n\nexport function incomingDisconnect(xs: Observable<any>) {\n    return xs.pipe(tap(x => console.log(x)), ignoreElements());\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/messages/FileReload.ts",
    "content": "import { Inputs } from \"../index\";\nimport { filter } from \"rxjs/operators/filter\";\nimport { empty } from \"rxjs/observable/empty\";\nimport { isBlacklisted } from \"../utils\";\nimport { FileReloadEventPayload } from \"../types/socket\";\nimport { of } from \"rxjs/observable/of\";\nimport { Observable } from \"rxjs/Observable\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { mergeMap } from \"rxjs/operators/mergeMap\";\nimport { fileReload } from \"../effects/file-reload.effect\";\nimport { reloadBrowserSafe } from \"./BrowserReload\";\n\nexport function incomingFileReload(\n    xs: Observable<FileReloadEventPayload>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        withLatestFrom(inputs.option$),\n        filter(([event, options]) => options.codeSync),\n        mergeMap(([event, options]) => {\n            if (event.url || !options.injectChanges) {\n                return reloadBrowserSafe();\n            }\n            if (event.basename && event.ext && isBlacklisted(event)) {\n                return empty();\n            }\n            return of(fileReload(event));\n        })\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/messages/FormToggleEvent.ts",
    "content": "import { OutgoingSocketEvents } from \"../socket-messages\";\nimport * as ClickEvent from \"./ClickEvent\";\nimport { Inputs } from \"../index\";\nimport { pluck } from \"rxjs/operators/pluck\";\nimport { filter } from \"rxjs/operators/filter\";\nimport { map } from \"rxjs/operators/map\";\nimport { Observable } from \"rxjs/Observable\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { setElementToggleValue } from \"../effects/set-element-toggle-value.effect\";\n\nexport interface Payload {\n    tagName: string;\n    index: number;\n    value: any;\n    type: any;\n    checked: any;\n}\n\nexport type OutgoingPayload = Payload;\n\nexport interface IncomingPayload extends OutgoingPayload {\n    pathname: string;\n}\n\nexport function outgoing(\n    element: ClickEvent.ElementData,\n    props: { value: string; type: string; checked: boolean }\n): [OutgoingSocketEvents.InputToggle, OutgoingPayload] {\n    return [\n        OutgoingSocketEvents.InputToggle,\n        {\n            ...element,\n            ...props\n        }\n    ];\n}\n\nexport function incomingInputsToggles(\n    xs: Observable<IncomingPayload>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        withLatestFrom(\n            inputs.option$.pipe(pluck(\"ghostMode\", \"forms\", \"toggles\")),\n            inputs.window$.pipe(pluck(\"location\", \"pathname\"))\n        ),\n        filter(([, toggles]) => toggles === true),\n        map(([event]) => setElementToggleValue(event))\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/messages/KeyupEvent.ts",
    "content": "import { OutgoingSocketEvents } from \"../socket-messages\";\nimport * as ClickEvent from \"./ClickEvent\";\nimport { Inputs } from \"../index\";\nimport { pluck } from \"rxjs/operators/pluck\";\nimport { filter } from \"rxjs/operators/filter\";\nimport { map } from \"rxjs/operators/map\";\nimport { Observable } from \"rxjs/Observable\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { setElementValue } from \"../effects/set-element-value.effect\";\n\nexport interface Payload {\n    value: any;\n    tagName: string;\n    index: number;\n}\n\nexport type OutgoingPayload = Payload;\n\nexport interface IncomingPayload extends OutgoingPayload {\n    pathname: string;\n}\n\nexport function outgoing(\n    element: ClickEvent.ElementData,\n    value: any\n): [OutgoingSocketEvents.Keyup, OutgoingPayload] {\n    return [\n        OutgoingSocketEvents.Keyup,\n        {\n            ...element,\n            value\n        }\n    ];\n}\n\nexport function incomingKeyupHandler(\n    xs: Observable<IncomingPayload>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        withLatestFrom(\n            inputs.option$.pipe(pluck(\"ghostMode\", \"forms\", \"inputs\")),\n            inputs.window$.pipe(pluck(\"location\", \"pathname\"))\n        ),\n        filter(([event, canKeyup, pathname]) => {\n            return canKeyup && event.pathname === pathname;\n        }),\n        map(([event]) => setElementValue(event))\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/messages/OptionsSet.ts",
    "content": "import { map } from \"rxjs/operators/map\";\nimport { Observable } from \"rxjs/Observable\";\nimport { setOptions } from \"../effects/set-options.effect\";\nimport { tap } from \"rxjs/operators/tap\";\n\nexport interface Payload {\n    options: IBrowserSyncOptions;\n    path: string[];\n    value: any;\n}\n\ntype IncomingPayload = Payload;\n\nexport function incomingOptionsSet(xs: Observable<IncomingPayload>) {\n    return xs.pipe(map(event => setOptions(event.options)));\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/messages/ScrollEvent.ts",
    "content": "import { OutgoingSocketEvents } from \"../socket-messages\";\nimport { Inputs } from \"../index\";\nimport { pluck } from \"rxjs/operators/pluck\";\nimport { filter } from \"rxjs/operators/filter\";\nimport { map } from \"rxjs/operators/map\";\nimport { Observable } from \"rxjs/Observable\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { EffectNames } from \"../effects\";\n\nexport interface ICoords {\n    x: number;\n    y: number;\n}\n\nexport interface Data {\n    raw: ICoords;\n    proportional: number;\n}\n\nexport interface OutgoingPayload {\n    position: Data;\n    tagName: string;\n    index: number;\n    mappingIndex: number;\n}\n\nexport interface IncomingPayload extends OutgoingPayload {\n    override?: boolean;\n    pathname: string;\n}\n\nexport function outgoing(\n    data: Data,\n    tagName: string,\n    index: number,\n    mappingIndex: number = -1\n): [OutgoingSocketEvents.Scroll, OutgoingPayload] {\n    return [\n        OutgoingSocketEvents.Scroll,\n        { position: data, tagName, index, mappingIndex }\n    ];\n}\n\nexport function incomingScrollHandler(\n    xs: Observable<IncomingPayload>,\n    inputs: Inputs\n) {\n    return xs.pipe(\n        withLatestFrom(\n            inputs.option$.pipe(pluck(\"ghostMode\", \"scroll\")),\n            inputs.window$.pipe(pluck(\"location\", \"pathname\"))\n        ),\n        filter(([event, canScroll, pathname]) => {\n            return canScroll && event.pathname === pathname;\n        }),\n        map(([event]) => {\n            return [EffectNames.BrowserSetScroll, event];\n        })\n    );\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/notify.ts",
    "content": "import { BehaviorSubject } from \"rxjs/BehaviorSubject\";\n\nconst styles = {\n    display: \"none\",\n    padding: \"15px\",\n    fontFamily: \"sans-serif\",\n    position: \"fixed\",\n    fontSize: \"0.9em\",\n    zIndex: 9999,\n    right: 0,\n    top: 0,\n    borderBottomLeftRadius: \"5px\",\n    backgroundColor: \"#1B2032\",\n    margin: 0,\n    color: \"white\",\n    textAlign: \"center\",\n    pointerEvents: \"none\"\n};\n\n/**\n * @param {IBrowserSyncOptions} options\n * @returns {BehaviorSubject<any>}\n */\nexport function initNotify(options) {\n    let cssStyles = styles;\n    let elem;\n\n    if (options.notify.styles) {\n        if (\n            Object.prototype.toString.call(options.notify.styles) ===\n            \"[object Array]\"\n        ) {\n            // handle original array behavior, replace all styles with a joined copy\n            cssStyles = options.notify.styles.join(\";\");\n        } else {\n            for (var key in options.notify.styles) {\n                if (options.notify.styles.hasOwnProperty(key)) {\n                    cssStyles[key] = options.notify.styles[key];\n                }\n            }\n        }\n    }\n\n    elem = document.createElement(\"DIV\");\n    elem.id = \"__bs_notify__\";\n\n    if (typeof cssStyles === \"string\") {\n        elem.style.cssText = cssStyles;\n    } else {\n        for (var rule in cssStyles) {\n            elem.style[rule] = cssStyles[rule];\n        }\n    }\n\n    return new BehaviorSubject(elem);\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/scroll-restore.ts",
    "content": "import { getBrowserScrollPosition } from \"./browser.utils\";\nimport { EffectNames } from \"./effects\";\nimport { Observable } from \"rxjs/Observable\";\nimport { BehaviorSubject } from \"rxjs/BehaviorSubject\";\nimport { Inputs } from \"./index\";\nimport { empty } from \"rxjs/observable/empty\";\nimport { of } from \"rxjs/observable/of\";\nimport * as Log from \"./log\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { map } from \"rxjs/operators/map\";\nimport { setWindowName } from \"./dom-effects/set-window-name.dom-effect\";\nimport { setScroll } from \"./dom-effects/set-scroll.dom-effect\";\n\nexport const PREFIX = \"<<BS_START>>\";\nexport const SUFFIX = \"<<BS_START>>\";\nexport const regex = new RegExp(PREFIX + \"(.+?)\" + SUFFIX, \"g\");\n\nfunction parseFromString(input: string): any {\n    var match;\n    var last;\n    while ((match = regex.exec(input))) {\n        last = match[1];\n    }\n    if (last) {\n        return JSON.parse(last);\n    }\n}\n\nexport function initWindowName(window: Window) {\n    const saved = (() => {\n        /**\n         * On page load, check window.name for an existing\n         * BS json blob & parse it.\n         */\n        try {\n            return parseFromString(window.name);\n        } catch (e) {\n            return {};\n        }\n    })();\n\n    /**\n     * Remove any existing BS json from window.name\n     * to ensure we don't interfere with any other\n     * libs who may be using it.\n     */\n    window.name = window.name.replace(regex, \"\");\n\n    /**\n     * If the JSON was parsed correctly, try to\n     * find a scroll property and restore it.\n     */\n    if (saved && saved.bs && saved.bs.hardReload && saved.bs.scroll) {\n        const { x, y } = saved.bs.scroll;\n        return of<any>(\n            setScroll(x, y),\n            Log.consoleDebug(`[ScrollRestore] x = ${x} y = ${y}`)\n        );\n    }\n    return empty();\n}\n\nexport const scrollRestoreHandlers$ = new BehaviorSubject({\n    // [EffectNames.SetOptions]: (xs, inputs: Inputs) => {\n    //     return xs.pipe(\n    //         withLatestFrom(inputs.window$),\n    //         take(1),\n    //         mergeMap(([options, window]) => {\n    //             if (options.scrollRestoreTechnique === \"window.name\") {\n    //                 return initWindowName(window);\n    //             }\n    //             return empty();\n    //         })\n    //     );\n    // },\n    /**\n     * Save the current scroll position\n     * before the browser is reloaded (via window.location.reload(true))\n     * @param xs\n     * @param {Inputs} inputs\n     */\n    [EffectNames.PreBrowserReload]: (xs: Observable<any>, inputs: Inputs) => {\n        return xs.pipe(\n            withLatestFrom(inputs.window$, inputs.document$),\n            map(([, window, document]) => {\n                return [\n                    window.name,\n                    PREFIX,\n                    JSON.stringify({\n                        bs: {\n                            hardReload: true,\n                            scroll: getBrowserScrollPosition(window, document)\n                        }\n                    }),\n                    SUFFIX\n                ].join(\"\");\n            }),\n            map(value => setWindowName(value))\n        );\n    }\n});\n"
  },
  {
    "path": "packages/browser-sync-client/lib/socket-messages.ts",
    "content": "import { BehaviorSubject } from \"rxjs/BehaviorSubject\";\nimport { withLatestFrom } from \"rxjs/operators/withLatestFrom\";\nimport { ignoreElements } from \"rxjs/operators/ignoreElements\";\nimport { tap } from \"rxjs/operators/tap\";\nimport { pluck } from \"rxjs/operators/pluck\";\nimport { incomingScrollHandler } from \"./messages/ScrollEvent\";\nimport { incomingHandler$ } from \"./messages/ClickEvent\";\nimport { incomingKeyupHandler } from \"./messages/KeyupEvent\";\nimport { incomingBrowserNotify } from \"./messages/BrowserNotify\";\nimport { incomingBrowserLocation } from \"./messages/BrowserLocation\";\nimport { incomingBrowserReload } from \"./messages/BrowserReload\";\nimport { incomingFileReload } from \"./messages/FileReload\";\nimport { incomingConnection } from \"./messages/Connection\";\nimport { incomingDisconnect } from \"./messages/Disconnect\";\nimport { incomingInputsToggles } from \"./messages/FormToggleEvent\";\nimport { incomingOptionsSet } from \"./messages/OptionsSet\";\n\nexport enum IncomingSocketNames {\n    Connection = \"connection\",\n    Disconnect = \"disconnect\",\n    FileReload = \"file:reload\",\n    BrowserReload = \"browser:reload\",\n    BrowserLocation = \"browser:location\",\n    BrowserNotify = \"browser:notify\",\n    Scroll = \"scroll\",\n    Click = \"click\",\n    Keyup = \"input:text\",\n    InputToggle = \"input:toggles\",\n    OptionsSet = \"options:set\"\n}\n\nexport enum OutgoingSocketEvents {\n    Scroll = \"@@outgoing/scroll\",\n    Click = \"@@outgoing/click\",\n    Keyup = \"@@outgoing/keyup\",\n    InputToggle = \"@@outgoing/Toggle\"\n}\n\nexport type SocketEvent = [IncomingSocketNames, any];\nexport type OutgoingSocketEvent = [OutgoingSocketEvents, any];\n\nexport const socketHandlers$ = new BehaviorSubject({\n    [IncomingSocketNames.Connection]: incomingConnection,\n    [IncomingSocketNames.Disconnect]: incomingDisconnect,\n    [IncomingSocketNames.FileReload]: incomingFileReload,\n    [IncomingSocketNames.BrowserReload]: incomingBrowserReload,\n    [IncomingSocketNames.BrowserLocation]: incomingBrowserLocation,\n    [IncomingSocketNames.BrowserNotify]: incomingBrowserNotify,\n    [IncomingSocketNames.Scroll]: incomingScrollHandler,\n    [IncomingSocketNames.Click]: incomingHandler$,\n    [IncomingSocketNames.Keyup]: incomingKeyupHandler,\n    [IncomingSocketNames.InputToggle]: incomingInputsToggles,\n    [IncomingSocketNames.OptionsSet]: incomingOptionsSet,\n    [OutgoingSocketEvents.Scroll]: emitWithPathname(IncomingSocketNames.Scroll),\n    [OutgoingSocketEvents.Click]: emitWithPathname(IncomingSocketNames.Click),\n    [OutgoingSocketEvents.Keyup]: emitWithPathname(IncomingSocketNames.Keyup),\n    [OutgoingSocketEvents.InputToggle]: emitWithPathname(\n        IncomingSocketNames.InputToggle\n    )\n});\n\nfunction emitWithPathname(name) {\n    return function(xs, inputs) {\n        return xs.pipe(\n            withLatestFrom(\n                inputs.io$,\n                inputs.window$.pipe(pluck(\"location\", \"pathname\"))\n            ),\n            tap(([event, io, pathname]) =>\n                io.emit(name, { ...event, pathname })\n            ),\n            ignoreElements()\n        );\n    };\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/socket.ts",
    "content": "import io from \"socket.io-client\";\nimport {Observable} from \"rxjs/Observable\";\nimport {BehaviorSubject} from \"rxjs/BehaviorSubject\";\nimport {of} from \"rxjs/observable/of\";\nimport {share} from \"rxjs/operators/share\";\n\n/**\n * Alias for socket.emit\n * @param name\n * @param data\n */\n// export function emit(name, data) {\n//     if (io && io.emit) {\n//         // send relative path of where the event is sent\n//         data.url = window.location.pathname;\n//         io.emit(name, data);\n//     }\n// }\n//\n// /**\n//  * Alias for socket.on\n//  * @param name\n//  * @param func\n//  */\n// export function on(name, func) {\n//     io.on(name, func);\n// }\n\nexport function initWindow() {\n  return of(window);\n}\n\nexport function initDocument() {\n  return of(document);\n}\n\nexport function initNavigator() {\n  return of(navigator);\n}\n\nexport function initOptions() {\n  return new BehaviorSubject(window.___browserSync___.options);\n}\n\nexport function initSocket() {\n  /**\n   * @type {{emit: emit, on: on}}\n   */\n  const socketConfig = window.___browserSync___.socketConfig;\n  const socketUrl = window.___browserSync___.socketUrl;\n  const socket = io(socketUrl, socketConfig);\n\n  const socket$ = Observable.create(obs => {\n    socket.onAny((...args) => {\n      obs.next(args)\n    })\n  }).pipe(share());\n\n  const io$ = new BehaviorSubject(socket);\n\n  /**\n   * *****BACK-COMPAT*******\n   * Scripts that come after Browsersync may rely on the previous window.___browserSync___.socket\n   */\n  window.___browserSync___.socket = socket;\n\n  return {socket$, io$};\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/types/socket.ts",
    "content": "import {IncomingSocketNames} from \"../socket-messages\";\n\nexport type FileReloadEventPayload = {\n    url?: string;\n    ext: string;\n    path: string;\n    basename: string;\n    event: string;\n    type: 'inject' | 'reload';\n}\n\nexport type FileReloadEvent = [IncomingSocketNames.FileReload, FileReloadEventPayload];\n"
  },
  {
    "path": "packages/browser-sync-client/lib/types/types.d.ts",
    "content": "interface Window {\n    ___browserSync___: any\n    attachEvent?: any\n}\n\ninterface IBrowserSyncOptions {\n    logLevel: string;\n    plugins: any[];\n    port: number;\n    snippetOptions: ISnippetOptions;\n    reloadDebounce: number;\n    mode: string;\n    scriptPaths: IScriptPaths;\n    server: IServer;\n    logFileChanges: boolean;\n    reloadThrottle: number;\n    clientEvents: string[];\n    urls: IUrls;\n    hostnameSuffix: boolean;\n    scrollElements: any[];\n    scheme: string;\n    startPath: null;\n    single: boolean;\n    host: null;\n    codeSync: boolean;\n    watchEvents: string[];\n    browser: string;\n    notify: boolean | { styles: {[index: string]: string} | string[]};\n    open: boolean;\n    reloadDelay: number;\n    minify: boolean;\n    rewriteRules: any[];\n    injectFileTypes: string[];\n    injectNotification: boolean | ('console' | 'overlay');\n    cors: boolean;\n    proxy: boolean;\n    tagNames: {[index: string]: string};\n    scrollRestoreTechnique: string;\n    watch: boolean;\n    watchOptions: IWatchOptions;\n    cwd: string;\n    logConnections: boolean;\n    ghostMode: IGhostMode;\n    middleware: IMiddlewareItem[];\n    ignore: any[];\n    injectChanges: boolean;\n    excludedFileTypes: string[];\n    online: boolean;\n    socket: ISocket;\n    ui: IUi;\n    logPrefix: string;\n    scrollThrottle: number;\n    reloadOnRestart: boolean;\n    localOnly: boolean;\n    files: IFiles;\n    version: string;\n    logSnippet: boolean;\n    snippet: string;\n    timestamps: boolean;\n    serveStatic: any[];\n    scrollElementMapping: any[];\n    scrollProportionally: boolean;\n}\ninterface ISnippetOptions {\n    async: boolean;\n    whitelist: any[];\n    blacklist: any[];\n    rule: IRule;\n}\ninterface IRule {\n    match: IMatch;\n}\ninterface IMatch {\n}\ninterface IScriptPaths {\n    path: string;\n    versioned: string;\n}\ninterface IServer {\n    baseDir: string[];\n    serveStaticOptions: IServeStaticOptions;\n}\ninterface IServeStaticOptions {\n    index: string;\n}\ninterface IUrls {\n    local: string;\n    external: string;\n}\ninterface IWatchOptions {\n    ignoreInitial: boolean;\n    cwd: string;\n    ignored: any[];\n}\ninterface IGhostMode {\n    clicks: boolean;\n    scroll: boolean;\n    location: boolean;\n    forms: IForms;\n}\ninterface IForms {\n    submit: boolean;\n    inputs: boolean;\n    toggles: boolean;\n}\ninterface IMiddlewareItem {\n    route: string;\n    id: string;\n}\ninterface ISocket {\n    socketIoOptions: ISocketIoOptions;\n    socketIoClientConfig: ISocketIoClientConfig;\n    path: string;\n    clientPath: string;\n    namespace: string;\n    clients: IClients;\n}\ninterface ISocketIoOptions {\n    log: boolean;\n}\ninterface ISocketIoClientConfig {\n    reconnectionAttempts: number;\n}\ninterface IClients {\n    heartbeatTimeout: number;\n}\ninterface IUi {\n    port: number;\n}\ninterface IFiles {\n    core: ICore;\n}\ninterface ICore {\n    globs: string[];\n    objs: any[];\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/types.ts",
    "content": "export interface InitOptions {\n    logLevel: string;\n    plugins: any[];\n    port: number;\n    snippetOptions: ISnippetOptions;\n    reloadDebounce: number;\n    mode: string;\n    scriptPaths: IScriptPaths;\n    server: IServer;\n    logFileChanges: boolean;\n    reloadThrottle: number;\n    clientEvents: string[];\n    urls: IUrls;\n    hostnameSuffix: boolean;\n    scrollElements: any[];\n    scheme: string;\n    startPath: null;\n    single: boolean;\n    host: null;\n    codeSync: boolean;\n    watchEvents: string[];\n    browser: string;\n    notify: boolean;\n    open: boolean;\n    reloadDelay: number;\n    minify: boolean;\n    rewriteRules: any[];\n    injectFileTypes: string[];\n    cors: boolean;\n    proxy: boolean;\n    tagNames: { [index: string]: string };\n    scrollRestoreTechnique: string;\n    watch: boolean;\n    watchOptions: IWatchOptions;\n    cwd: string;\n    logConnections: boolean;\n    ghostMode: IGhostMode;\n    middleware: IMiddlewareItem[];\n    ignore: any[];\n    injectChanges: boolean;\n    excludedFileTypes: string[];\n    online: boolean;\n    socket: ISocket;\n    ui: IUi;\n    userPlugins: any[];\n    session: number;\n    logPrefix: string;\n    scrollThrottle: number;\n    reloadOnRestart: boolean;\n    localOnly: boolean;\n    files: IFiles;\n    version: string;\n    logSnippet: boolean;\n    snippet: string;\n    timestamps: boolean;\n    serveStatic: any[];\n    scrollElementMapping: any[];\n    scrollProportionally: boolean;\n}\n\ninterface ISnippetOptions {\n    async: boolean;\n    whitelist: any[];\n    blacklist: any[];\n    rule: IRule;\n}\n\ninterface IRule {\n    match: IMatch;\n}\n\ninterface IMatch {}\n\ninterface IScriptPaths {\n    path: string;\n    versioned: string;\n}\n\ninterface IServer {\n    baseDir: string[];\n    serveStaticOptions: IServeStaticOptions;\n}\n\ninterface IServeStaticOptions {\n    index: string;\n}\n\ninterface IUrls {\n    local: string;\n    external: string;\n    ui: string;\n    \"ui-external\": string;\n}\n\ninterface IWatchOptions {\n    ignoreInitial: boolean;\n    cwd: string;\n    ignored: IIgnoredItem[];\n}\n\ninterface IIgnoredItem {}\n\ninterface IGhostMode {\n    clicks: boolean;\n    scroll: boolean;\n    location: boolean;\n    forms: IForms;\n}\n\ninterface IForms {\n    submit: boolean;\n    inputs: boolean;\n    toggles: boolean;\n}\n\ninterface IMiddlewareItem {\n    route: string;\n    id: string;\n}\n\ninterface ISocket {\n    socketIoOptions: ISocketIoOptions;\n    socketIoClientConfig: ISocketIoClientConfig;\n    path: string;\n    clientPath: string;\n    namespace: string;\n    clients: IClients;\n}\n\ninterface ISocketIoOptions {\n    log: boolean;\n}\n\ninterface ISocketIoClientConfig {\n    reconnectionAttempts: number;\n}\n\ninterface IClients {\n    heartbeatTimeout: number;\n}\n\ninterface IUi {\n    port: number;\n}\n\ninterface IFiles {\n    core: ICore;\n}\n\ninterface ICore {\n    globs: any[];\n    objs: any[];\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/utils.ts",
    "content": "import { concat } from \"rxjs/observable/concat\";\nimport { timer } from \"rxjs/observable/timer\";\nimport { of } from \"rxjs/observable/of\";\nimport { switchMap } from \"rxjs/operators/switchMap\";\nimport { startWith } from \"rxjs/operators/startWith\";\nimport { mapTo } from \"rxjs/operators/mapTo\";\n\nexport function each(incoming) {\n    return [].slice.call(incoming || []);\n}\n\nexport const splitUrl = function(url) {\n    let hash, index, params;\n    if ((index = url.indexOf(\"#\")) >= 0) {\n        hash = url.slice(index);\n        url = url.slice(0, index);\n    } else {\n        hash = \"\";\n    }\n\n    if ((index = url.indexOf(\"?\")) >= 0) {\n        params = url.slice(index);\n        url = url.slice(0, index);\n    } else {\n        params = \"\";\n    }\n\n    return { url, params, hash };\n};\n\nexport const pathFromUrl = function(url) {\n    let path;\n    ({ url } = splitUrl(url));\n    if (url.indexOf(\"file://\") === 0) {\n        path = url.replace(new RegExp(`^file://(localhost)?`), \"\");\n    } else {\n        //                        http  :   // hostname  :8080  /\n        path = url.replace(new RegExp(`^([^:]+:)?//([^:/]+)(:\\\\d*)?/`), \"/\");\n    }\n\n    // decodeURI has special handling of stuff like semicolons, so use decodeURIComponent\n    return decodeURIComponent(path);\n};\n\nexport const pickBestMatch = function(path, objects, pathFunc): any {\n    let score;\n    let bestMatch = { score: 0, object: null };\n\n    objects.forEach(object => {\n        score = numberOfMatchingSegments(path, pathFunc(object));\n        if (score > bestMatch.score) {\n            bestMatch = { object, score };\n        }\n    });\n\n    if (bestMatch.score > 0) {\n        return bestMatch;\n    } else {\n        return null;\n    }\n};\n\nexport const numberOfMatchingSegments = function(path1, path2) {\n    path1 = normalisePath(path1);\n    path2 = normalisePath(path2);\n\n    if (path1 === path2) {\n        return 10000;\n    }\n\n    const comps1 = path1.split(\"/\").reverse();\n    const comps2 = path2.split(\"/\").reverse();\n    const len = Math.min(comps1.length, comps2.length);\n\n    let eqCount = 0;\n    while (eqCount < len && comps1[eqCount] === comps2[eqCount]) {\n        ++eqCount;\n    }\n\n    return eqCount;\n};\n\nexport const pathsMatch = (path1, path2) =>\n    numberOfMatchingSegments(path1, path2) > 0;\n\nexport function getLocation(url: string) {\n    var location = document.createElement(\"a\");\n    location.href = url;\n\n    if (location.host === \"\") {\n        location.href = location.href;\n    }\n\n    return location;\n}\n\n/**\n * @param {string} search\n * @param {string} key\n * @param {string} suffix\n */\nexport function updateSearch(search, key, suffix) {\n    if (search === \"\") {\n        return \"?\" + suffix;\n    }\n\n    return (\n        \"?\" +\n        search\n            .slice(1)\n            .split(\"&\")\n            .map(function(item) {\n                return item.split(\"=\");\n            })\n            .filter(function(tuple) {\n                return tuple[0] !== key;\n            })\n            .map(function(item) {\n                return [item[0], item[1]].join(\"=\");\n            })\n            .concat(suffix)\n            .join(\"&\")\n    );\n}\n\nconst blacklist = [\n    // never allow .map files through\n    function(incoming) {\n        return incoming.ext === \"map\";\n    }\n];\n\n/**\n * @param incoming\n * @returns {boolean}\n */\nexport function isBlacklisted(incoming) {\n    return blacklist.some(function(fn) {\n        return fn(incoming);\n    });\n}\n\nexport function createTimedBooleanSwitch(source$, timeout = 1000) {\n    return source$.pipe(\n        switchMap(() => {\n            return concat(of(false), timer(timeout).pipe(mapTo(true)));\n        }),\n        startWith(true)\n    );\n}\n\nexport function array(incoming) {\n    return [].slice.call(incoming);\n}\n\nexport function normalisePath(path: string): string {\n    return path\n        .replace(/^\\/+/, \"\")\n        .replace(/\\\\/g, \"/\")\n        .toLowerCase();\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/vendor/Reloader.ts",
    "content": "/**\n *\n * With thanks to https://github.com/livereload/livereload-js\n * :) :) :)\n *\n */\nimport {getLocation, pathFromUrl, pathsMatch, pickBestMatch, splitUrl, updateSearch, array} from \"../utils\";\nimport {empty} from \"rxjs/observable/empty\";\nimport {Observable} from \"rxjs/Observable\";\nimport {merge} from \"rxjs/observable/merge\";\nimport {timer} from \"rxjs/observable/timer\";\nimport {from} from \"rxjs/observable/from\";\nimport {filter} from \"rxjs/operators/filter\";\nimport {map} from \"rxjs/operators/map\";\nimport {mergeMap} from \"rxjs/operators/mergeMap\";\nimport {tap} from \"rxjs/operators/tap\";\nimport {mapTo} from \"rxjs/operators/mapTo\";\nimport {propSet} from \"../dom-effects/prop-set.dom-effect\";\nimport {styleSet} from \"../dom-effects/style-set.dom-effect\";\nimport {linkReplace} from \"../dom-effects/link-replace.dom-effect\";\nimport {mergeAll} from \"rxjs/operators/mergeAll\";\n\nvar hiddenElem;\n\ndeclare global {\n    interface HTMLLinkElement {\n        __LiveReload_pendingRemoval: boolean\n    }\n}\n\nconst IMAGE_STYLES = [\n    { selector: 'background', styleNames: ['backgroundImage'] },\n    { selector: 'border', styleNames: ['borderImage', 'webkitBorderImage', 'MozBorderImage'] }\n];\n\nconst attrs = {\n    link: \"href\",\n    img: \"src\",\n    script: \"src\"\n};\n\nexport interface ReloadOptions {\n    stylesheetReloadTimeout?: number;\n    serverURL?: string;\n    overrideURL?: string;\n    liveCSS?: boolean;\n    liveImg?: boolean;\n    tagNames: {[index: string]: string}\n}\n\nexport function reload(document: Document, navigator: Navigator) {\n    return function(data, options: ReloadOptions): Observable<any> {\n        const {path} = data;\n\n        if (options.liveCSS) {\n            if (path.match(/\\.css$/i)) {\n                return reloadStylesheet(path, document, navigator);\n            }\n        }\n\n        if (options.liveImg) {\n            if (path.match(/\\.(jpe?g|png|gif)$/i)) {\n                return reloadImages(path, document);\n            }\n        }\n\n        /**\n         * LEGACY\n         */\n        const domData = getElems(data.ext, options, document);\n        const elems   = getMatches(domData.elems, data.basename, domData.attr);\n\n        for (var i = 0, n = elems.length; i < n; i += 1) {\n            swapFile(elems[i], domData, options, document, navigator);\n        }\n\n        return empty();\n    }\n\n    function getMatches(elems, url, attr) {\n\n        if (url[0] === \"*\") {\n            return elems;\n        }\n\n        var matches = [];\n        var urlMatcher = new RegExp(\"(^|/)\" + url);\n\n        for (var i = 0, len = elems.length; i < len; i += 1) {\n            if (urlMatcher.test(elems[i][attr])) {\n                matches.push(elems[i]);\n            }\n        }\n\n        return matches;\n    }\n\n    function getElems(fileExtension, options: ReloadOptions, document: Document) {\n        const tagName = options.tagNames[fileExtension];\n        const attr    = attrs[tagName];\n        return {\n            attr,\n            tagName,\n            elems: document.getElementsByTagName(tagName)\n        };\n    }\n\n\n    function reloadImages(path, document): Observable<any> {\n\n        const expando = generateUniqueString(Date.now());\n\n        return merge(\n            from([].slice.call(document.images))\n                .pipe(\n                    filter((img: HTMLImageElement) => pathsMatch(path, pathFromUrl(img.src)))\n                    , map((img: HTMLImageElement) => {\n                        const payload = {\n                            target: img,\n                            prop: 'src',\n                            value: generateCacheBustUrl(img.src, expando),\n                            pathname: getLocation(img.src).pathname\n                        };\n                        return propSet(payload);\n                    })\n                ),\n            from(IMAGE_STYLES)\n                .pipe(\n                    mergeMap(({ selector, styleNames }) => {\n                        return from(document.querySelectorAll(`[style*=${selector}]`)).pipe(\n                            mergeMap((img: HTMLImageElement) => {\n                                return reloadStyleImages(img.style, styleNames, path, expando);\n                            })\n                        )\n\n                    })\n                )\n        );\n\n        // if (document.styleSheets) {\n        //     return [].slice.call(document.styleSheets)\n        //         .map((styleSheet) => {\n        //             return reloadStylesheetImages(styleSheet, path, expando);\n        //         });\n        // }\n    }\n\n\n    function reloadStylesheetImages(styleSheet, path, expando) {\n        let rules;\n        try {\n            rules = styleSheet != null ? styleSheet.cssRules : undefined;\n        } catch (e) {}\n        //\n        if (!rules) { return; }\n\n        [].slice.call(rules).forEach(rule => {\n            switch (rule.type) {\n                case CSSRule.IMPORT_RULE:\n                    reloadStylesheetImages(rule.styleSheet, path, expando);\n                    break;\n                case CSSRule.STYLE_RULE:\n                    [].slice.call(IMAGE_STYLES).forEach(({ styleNames }) => {\n                        reloadStyleImages((rule as any).style, styleNames, path, expando);\n                    })\n                    break;\n                case CSSRule.MEDIA_RULE:\n                    reloadStylesheetImages(rule, path, expando);\n                    break;\n            }\n        })\n    }\n\n    function reloadStyleImages(style, styleNames: string[], path, expando): Observable<any> {\n        return from(styleNames).pipe(\n            filter(styleName => typeof style[styleName] === 'string')\n            , map((styleName: string) => {\n                let pathName;\n                const value = style[styleName];\n                const newValue = value.replace(new RegExp(`\\\\burl\\\\s*\\\\(([^)]*)\\\\)`), (match, src) => {\n                    let _src = src;\n                    if (src[0] === '\"' && src[src.length-1] === '\"') {\n                        _src = src.slice(1, -1);\n                    }\n                    pathName = getLocation(_src).pathname;\n                    if (pathsMatch(path, pathFromUrl(_src))) {\n                        return `url(${generateCacheBustUrl(_src, expando)})`;\n                    } else {\n                        return match;\n                    }\n                });\n\n                return [\n                    style,\n                    styleName,\n                    value,\n                    newValue,\n                    pathName\n                ];\n            })\n            , filter(([style, styleName, value, newValue]) => newValue !== value)\n            , map(([style, styleName, value, newValue, pathName]) => styleSet({style, styleName, value, newValue, pathName}))\n        )\n    }\n\n    function swapFile(elem, domData, options, document, navigator) {\n\n        const attr = domData.attr;\n        const currentValue = elem[attr];\n        const timeStamp    = new Date().getTime();\n        const key          = \"browsersync-legacy\";\n        const suffix       = key + \"=\" + timeStamp;\n        const anchor       = getLocation(currentValue);\n        const search       = updateSearch(anchor.search, key, suffix);\n\n        switch (domData.tagName) {\n            case 'link': {\n                // this.logger.trace(`replacing LINK ${attr}`);\n                reloadStylesheet(currentValue, document, navigator);\n                break;\n            }\n            case 'img': {\n                reloadImages(currentValue, document);\n                break;\n            }\n            default: {\n                if (options.timestamps === false) {\n                    elem[attr] = anchor.href;\n                } else {\n                    elem[attr] = anchor.href.split(\"?\")[0] + search;\n                }\n\n                // this.logger.info(`reloading ${elem[attr]}`);\n\n                setTimeout(function () {\n                    if (!hiddenElem) {\n                        hiddenElem = document.createElement(\"DIV\");\n                        document.body.appendChild(hiddenElem);\n                    } else {\n                        hiddenElem.style.display = \"none\";\n                        hiddenElem.style.display = \"block\";\n                    }\n                }, 200);\n            }\n        }\n\n        return {\n            elem: elem,\n            timeStamp: timeStamp\n        };\n    }\n\n    function reattachStylesheetLink(link: HTMLLinkElement, document: Document, navigator: Navigator): Observable<any> {\n        // ignore LINKs that will be removed by LR soon\n        let clone;\n\n        if (link.__LiveReload_pendingRemoval) {\n            return empty();\n        }\n        link.__LiveReload_pendingRemoval = true;\n\n        if (link.tagName === 'STYLE') {\n            // prefixfree\n            clone = document.createElement('link');\n            clone.rel      = 'stylesheet';\n            clone.media    = link.media;\n            clone.disabled = link.disabled;\n        } else {\n            clone = link.cloneNode(false);\n        }\n\n        const prevHref = link.href;\n        const nextHref = generateCacheBustUrl(linkHref(link));\n        clone.href = nextHref;\n\n        const {pathname} = getLocation(nextHref);\n        const basename = pathname.split('/').slice(-1)[0];\n\n        // insert the new LINK before the old one\n        const parent = link.parentNode;\n        if (parent.lastChild === link) {\n            parent.appendChild(clone);\n        } else {\n            parent.insertBefore(clone, link.nextSibling);\n        }\n\n        let additionalWaitingTime;\n        if (/AppleWebKit/.test(navigator.userAgent)) {\n            additionalWaitingTime = 5;\n        } else {\n            additionalWaitingTime = 200;\n        }\n\n        return Observable.create(obs => {\n            clone.onload = () => {\n                obs.next(true);\n                obs.complete()\n            };\n        })\n            .pipe(\n                mergeMap(() => {\n                    return timer(additionalWaitingTime)\n                        .pipe(\n                            tap(() => {\n                                if (link && !link.parentNode) {\n                                    return;\n                                }\n                                link.parentNode.removeChild(link);\n                                clone.onreadystatechange = null;\n                            })\n                            , mapTo(linkReplace({target: clone, nextHref, prevHref, pathname, basename}))\n                        )\n                })\n            )\n    }\n\n    function reattachImportedRule({ rule, index, link }, document: Document): Observable<any> {\n        const parent  = rule.parentStyleSheet;\n        const href    = generateCacheBustUrl(rule.href);\n        const media   = rule.media.length ? [].join.call(rule.media, ', ') : '';\n        const newRule = `@import url(\"${href}\") ${media};`;\n\n        // used to detect if reattachImportedRule has been called again on the same rule\n        rule.__LiveReload_newHref = href;\n\n        // WORKAROUND FOR WEBKIT BUG: WebKit resets all styles if we add @import'ed\n        // stylesheet that hasn't been cached yet. Workaround is to pre-cache the\n        // stylesheet by temporarily adding it as a LINK tag.\n        const tempLink = document.createElement(\"link\");\n        tempLink.rel = 'stylesheet';\n        tempLink.href = href;\n        tempLink.__LiveReload_pendingRemoval = true;  // exclude from path matching\n\n        if (link.parentNode) {\n            link.parentNode.insertBefore(tempLink, link);\n        }\n\n        return timer(200)\n            .pipe(\n                tap(() => {\n                    if (tempLink.parentNode) { tempLink.parentNode.removeChild(tempLink); }\n\n                    // if another reattachImportedRule call is in progress, abandon this one\n                    if (rule.__LiveReload_newHref !== href) { return; }\n\n                    parent.insertRule(newRule, index);\n                    parent.deleteRule(index+1);\n\n                    // save the new rule, so that we can detect another reattachImportedRule call\n                    rule = parent.cssRules[index];\n                    rule.__LiveReload_newHref = href;\n                })\n                , mergeMap(() => {\n                    return timer(200).pipe(\n                        tap(() => {\n                            // if another reattachImportedRule call is in progress, abandon this one\n                            if (rule.__LiveReload_newHref !== href) { return; }\n                            parent.insertRule(newRule, index);\n                            return parent.deleteRule(index+1);\n                        })\n                    )\n                })\n            );\n    }\n\n    function generateCacheBustUrl(url, expando = generateUniqueString(Date.now())) {\n        let hash, oldParams;\n\n        ({ url, hash, params: oldParams } = splitUrl(url));\n\n        // if (this.options.overrideURL) {\n        //     if (url.indexOf(this.options.serverURL) < 0) {\n        //         const originalUrl = url;\n        //         url = this.options.serverURL + this.options.overrideURL + \"?url=\" + encodeURIComponent(url);\n        //         this.logger.debug(`overriding source URL ${originalUrl} with ${url}`);\n        //     }\n        // }\n\n        let params = oldParams.replace(/(\\?|&)browsersync=(\\d+)/, (match, sep) => `${sep}${expando}`);\n        if (params === oldParams) {\n            if (oldParams.length === 0) {\n                params = `?${expando}`;\n            } else {\n                params = `${oldParams}&${expando}`;\n            }\n        }\n\n        return url + params + hash;\n    }\n\n\n    function reloadStylesheet(path: string, document: Document, navigator): Observable<any> {\n        // has to be a real array, because DOMNodeList will be modified\n        const links: HTMLLinkElement[] = array(document.getElementsByTagName('link'))\n            .filter(link => {\n                return link.rel.match(/^stylesheet$/i)\n                    && !link.__LiveReload_pendingRemoval;\n            });\n\n        /**\n         * Find imported style sheets in <style> tags\n         * @type {any[]}\n         */\n        const styleImported = array(document.getElementsByTagName('style'))\n            .filter(style => Boolean(style.sheet))\n            .reduce((acc, style) => {\n                return acc.concat(collectImportedStylesheets(style, style.sheet));\n            }, []);\n\n        /**\n         * Find imported style sheets in <link> tags\n         * @type {any[]}\n         */\n        const linksImported = links\n            .reduce((acc, link) => {\n                return acc.concat(collectImportedStylesheets(link, link.sheet));\n            }, []);\n\n        /**\n         * Combine all links + sheets\n         */\n        const allRules = links.concat(styleImported, linksImported);\n\n        /**\n         * Which href best matches the incoming href?\n         */\n        const match = pickBestMatch(path, allRules, l => pathFromUrl(linkHref(l)));\n\n        if (match) {\n            if (match.object && match.object.rule) {\n                return reattachImportedRule(match.object, document);\n            }\n            return reattachStylesheetLink(match.object, document, navigator);\n        } else {\n            if (links.length) {\n                // no <link> elements matched, so was the path including '*'?\n                const [first, ...rest] = path.split('.');\n                if (first === '*') {\n                    return from(links.map(link => reattachStylesheetLink(link, document, navigator)))\n                        .pipe(mergeAll())\n                }\n            }\n        }\n\n        return empty();\n    }\n\n\n    function collectImportedStylesheets(link, styleSheet) {\n        // in WebKit, styleSheet.cssRules is null for inaccessible stylesheets;\n        // Firefox/Opera may throw exceptions\n        const output = [];\n        collect(link, makeRules(styleSheet));\n        return output;\n\n        function makeRules(styleSheet) {\n            let rules;\n            try {\n                rules = styleSheet != null ? styleSheet.cssRules : undefined;\n            } catch (e) {}\n            return rules;\n        }\n        function collect(link, rules) {\n            if (rules && rules.length) {\n                for (let index = 0; index < rules.length; index++) {\n                    const rule = rules[index];\n                    switch (rule.type) {\n                        case CSSRule.CHARSET_RULE:\n                            break;\n                        case CSSRule.IMPORT_RULE:\n                            output.push({ link, rule, index, href: rule.href });\n                            collect(link, makeRules(rule.styleSheet));\n                            break;\n                        default:\n                            break;  // import rules can only be preceded by charset rules\n                    }\n                }\n            }\n        }\n    }\n\n    function linkHref(link) {\n        // prefixfree uses data-href when it turns LINK into STYLE\n        return link.href || link.getAttribute('data-href');\n    }\n\n    function generateUniqueString(value) {\n        return `browsersync=${value}`;\n    }\n}\n\n"
  },
  {
    "path": "packages/browser-sync-client/lib/vendor/Timer.ts",
    "content": "/*\n * decaffeinate suggestions:\n * DS102: Remove unnecessary code created because of implicit returns\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nexport class Timer {\n    public running = false;\n    public id: any;\n    public _handler: any;\n\n    constructor(public func) {\n        this.id = null;\n        this._handler = () => {\n            this.running = false;\n            this.id = null;\n            return this.func();\n        };\n    }\n\n    public start(timeout) {\n        if (this.running) { clearTimeout(this.id); }\n        this.id = setTimeout(this._handler, timeout);\n        return this.running = true;\n    }\n\n    public stop() {\n        if (this.running) {\n            clearTimeout(this.id);\n            this.running = false; return this.id = null;\n        }\n    }\n\n    public static start (timeout, func) {\n        setTimeout(func, timeout);\n    }\n}\n"
  },
  {
    "path": "packages/browser-sync-client/lib/vendor/logger.ts",
    "content": "const emojis = {\n    trace: '🔍',\n    debug: '🐛',\n    info: '✨',\n    warn: '⚠️',\n    error: '🚨',\n    fatal: '💀'\n};\n\nconst levels = {\n    trace: 10,\n    debug: 20,\n    info: 30,\n    warn: 40,\n    error: 50,\n    fatal: 60\n};\n\nconst defaultColors = {\n    foreground: '#d3c0c8',\n    background: '#2d2d2d',\n    black: '#2d2d2d',\n    red: '#f2777a',\n    green: '#99cc99',\n    yellow: '#ffcc66',\n    blue: '#6699cc',\n    magenta: '#cc99cc',\n    cyan: '#66cccc',\n    white: '#d3d0c8',\n    brightBlack: '#747369'\n};\n\nexport class Nanologger {\n    public _name: string;\n    public _colors: { [index: string]: string };\n    public logLevel: string;\n    public _logLevel: string;\n\n    constructor(public name: string, public opts) {\n        this._name = name || '';\n        this._colors = {\n            ...defaultColors,\n            ...(opts.colors || {})\n        }\n        try {\n            this.logLevel = window.localStorage.getItem('logLevel') || 'info'\n        } catch (e) {\n            this.logLevel = 'info'\n        }\n\n        this._logLevel = levels[this.logLevel]\n    }\n\n    public trace() {\n        var args = ['trace']\n        for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i])\n        this._print.apply(this, args)\n    }\n\n    public debug() {\n        var args = ['debug']\n        for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i])\n        this._print.apply(this, args)\n    }\n\n    public info() {\n        var args = ['info']\n        for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i])\n        this._print.apply(this, args)\n    }\n\n    public warn() {\n        var args = ['warn']\n        for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i])\n        this._print.apply(this, args)\n    }\n\n    public error() {\n        var args = ['error']\n        for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i])\n        this._print.apply(this, args)\n    }\n\n    public fatal() {\n        var args = ['fatal']\n        for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i])\n        this._print.apply(this, args)\n    }\n\n    private _print(level) {\n        if (levels[level] < this._logLevel) return\n\n        // var time = getTimeStamp()\n        var emoji = emojis[level]\n        var name = this._name || 'unknown'\n\n        var msgColor = (level === 'error' || level.fatal)\n            ? this._colors.red\n            : level === 'warn'\n                ? this._colors.yellow\n                : this._colors.green\n\n        var objs = []\n        var args = [null]\n        var msg = emoji + ' %c%s';\n\n        // args.push(color(this._colors.brightBlack), time)\n        args.push(color(this._colors.magenta), name)\n\n        for (var i = 1, len = arguments.length; i < len; i++) {\n            var arg = arguments[i]\n            if (typeof arg === 'string') {\n                if (i === 1) {\n                    // first string argument is in color\n                    msg += ' %c%s'\n                    args.push(color(msgColor))\n                    args.push(arg)\n                } else if (/ms$/.test(arg)) {\n                    // arguments finishing with 'ms', grey out\n                    msg += ' %c%s'\n                    args.push(color(this._colors.brightBlack))\n                    args.push(arg)\n                } else {\n                    // normal colors\n                    msg += ' %c%s'\n                    args.push(color(this._colors.white))\n                    args.push(arg)\n                }\n            } else if (typeof arg === 'number') {\n                msg += ' %c%d'\n                args.push(color(this._colors.magenta))\n                args.push(arg)\n            } else {\n                objs.push(arg)\n            }\n        }\n\n        args[0] = msg\n        objs.forEach(function (obj) {\n            args.push(obj)\n        })\n\n        // In IE/Edge console functions don't inherit from Function.prototype\n        // so this is necessary to get all the args applied.\n        Function.prototype.apply.apply(console.log, [console, args])\n    }\n}\n\nfunction color(color) {\n    return 'color: ' + color + ';'\n}\n\nfunction getTimeStamp() {\n    var date = new Date()\n    var hours = pad(date.getHours().toString())\n    var minutes = pad(date.getMinutes().toString())\n    var seconds = pad(date.getSeconds().toString())\n    return hours + ':' + minutes + ':' + seconds\n}\n\nfunction pad(str) {\n    return str.length !== 2 ? 0 + str : str\n}\n"
  },
  {
    "path": "packages/browser-sync-client/package.json",
    "content": "{\n\t\"name\": \"browser-sync-client\",\n\t\"description\": \"Client-side scripts for BrowserSync\",\n\t\"version\": \"3.0.4\",\n\t\"homepage\": \"https://github.com/shakyshane/browser-sync-client\",\n\t\"author\": \"Shane Osbourne <shane.osbourne8@gmail.com>\",\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git://github.com/shakyshane/browser-sync-client.git\"\n\t},\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/shakyshane/browser-sync-client/issues\"\n\t},\n\t\"licenses\": [\n\t\t{\n\t\t\t\"type\": \"MIT\",\n\t\t\t\"url\": \"https://github.com/shakyshane/browser-sync-client/blob/master/LICENSE-MIT\"\n\t\t}\n\t],\n\t\"main\": \"index.js\",\n\t\"files\": [\n\t\t\"dist\"\n\t],\n\t\"engines\": {\n\t\t\"node\": \">=8.0.0\"\n\t},\n\t\"scripts\": {\n\t\t\"build\": \"npm run clean && webpack\",\n\t\t\"clean\": \"rm -rf dist/*\",\n\t\t\"watch\": \"npm run build -- --watch\",\n\t\t\"prepublishOnly\": \"npm run build\",\n\t\t\"tsc\": \"rm -rf dist/* dist2/* && tsc\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@babel/core\": \"^7.21.3\",\n\t\t\"@babel/preset-env\": \"^7.20.2\",\n\t\t\"@babel/preset-typescript\": \"^7.21.0\",\n\t\t\"@types/node\": \"^8\",\n\t\t\"babel-loader\": \"^9.1.2\",\n\t\t\"core-js\": \"^3.29.1\",\n\t\t\"element-scroll-polyfill\": \"^1.0.1\",\n\t\t\"esbuild\": \"^0.14.27\",\n\t\t\"nanologger\": \"^1.3.1\",\n\t\t\"rxjs\": \"^5.5.6\",\n\t\t\"socket.io-client\": \"^4.4.1\",\n\t\t\"ts-loader\": \"^9.2.7\",\n\t\t\"typescript\": \"^4.6.2\",\n\t\t\"webpack\": \"^5.17.0\",\n\t\t\"webpack-cli\": \"^4.4.0\"\n\t},\n\t\"keywords\": [],\n\t\"dependencies\": {\n\t\t\"etag\": \"1.8.1\",\n\t\t\"fresh\": \"0.5.2\",\n\t\t\"mitt\": \"^1.1.3\"\n\t},\n\t\"directories\": {\n\t\t\"lib\": \"lib\",\n\t\t\"test\": \"test\"\n\t},\n\t\"license\": \"ISC\"\n}\n"
  },
  {
    "path": "packages/browser-sync-client/test/.jshintrc",
    "content": "{\n    \"curly\": true,\n    \"eqeqeq\": true,\n    \"immed\": true,\n    \"latedef\": \"nofunc\",\n    \"newcap\": true,\n    \"noarg\": true,\n    \"sub\": true,\n    \"undef\": false,\n    \"unused\": false,\n    \"quotmark\": \"double\",\n    \"boss\": true,\n    \"eqnull\": true,\n    \"node\": true,\n    \"globals\": {\n        \"describe\" : false,\n        \"it\" : false,\n        \"expect\" : false,\n        \"runs\" : false,\n        \"waitsFor\" : false,\n        \"beforeEach\" : false,\n        \"afterEach\" : false,\n        \"before\" : false,\n        \"after\" : false\n    }\n}\n"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/bs.options.js",
    "content": "describe(\"BrowserSync instance\", function(){\n    var bs;\n    before(function () {\n        bs = new window.__bs();\n    });\n    it(\"should exist\", function () {\n        assert.ok(typeof bs.canSync === \"function\");\n    });\n    it(\"syncs if on same page as emitter\", function () {\n        var actual = bs.canSync({url: window.location.pathname});\n        assert.equal(actual, true);\n    });\n    it(\"refuses to sync if on diff page\", function () {\n        var actual = bs.canSync({url: \"/index.html\"}); // Test url will be something like 'context.html'\n        assert.equal(actual, false);\n    });\n});\n\ndescribe(\"BrowserSync options\", function(){\n\n    var bs;\n\n    before(function () {\n        bs = new window.__bs({\n            ghostMode: {\n                scroll: true,\n                forms: {\n                    toggles: false,\n                    inputs: {\n                        one: {\n                            two: {\n                                three: \"katz\"\n                            }\n                        }\n                    }\n                }\n            },\n            codeSync: true\n        });\n    });\n\n    it(\"returns set values\", function () {\n        assert.ok(bs.getOption(\"codeSync\"), true);\n    });\n\n    it(\"returns false for undefined values\", function () {\n        assert.equal(bs.getOption(\"randomOpt\"), false);\n    });\n\n    it(\"returns deep values (2 levels)\", function () {\n        assert.equal(bs.getOption(\"ghostMode.scroll\"), true);\n    });\n    it(\"returns deep values (2 levels) when undefined\", function () {\n        assert.equal(bs.getOption(\"ghostMode.scrol\"), false);\n    });\n    it(\"returns deep values (3 levels)\", function () {\n        assert.equal(bs.getOption(\"ghostMode.forms.toggles\"), false);\n    });\n    it(\"returns deep values (3 levels)\", function () {\n        assert.deepEqual(bs.getOption(\"ghostMode.forms.inputs\"), {\n            one: {\n                two: {\n                    three: \"katz\"\n                }\n            }\n        });\n    });\n    it(\"returns deep values (6 levels)\", function () {\n        assert.equal(bs.getOption(\"ghostMode.forms.inputs.one.two.three\"), \"katz\");\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/code-sync.js",
    "content": "describe(\"Code Sync\", function () {\n    var codeSync;\n    var bs;\n    var socketSpy;\n    var stubs = [\n        {\n            id: \"stub1\",\n            href: \"http://localhost:8080/style.css\"\n        },\n        {\n            id: \"stub2\",\n            href: \"http://localhost:8080/style-with-rel.css?rel=213456\"\n        },\n        {\n            id: \"stub3\",\n            href: \"http://localhost:8080/stee/erqq/qefrerf/erferf/style-with-paths.css\"\n        }\n    ];\n\n    before(function () {\n        bs = window.__bs_stub__;\n        codeSync = window.__bs_code_sync__;\n        utils = window.__bs_utils__;\n        socketSpy = sinon.spy(bs.socket, \"on\");\n    });\n    after(function () {\n        socketSpy.restore();\n    });\n\n    it(\"should register a listener on the socket\", function () {\n        var reloadStub = sinon.stub(codeSync, \"reload\").returns(\"reloadFunc\");\n\n        codeSync.init(bs);\n        sinon.assert.calledWithExactly(socketSpy, \"file:reload\", \"reloadFunc\");\n\n        var secondCall = socketSpy.getCall(1).args;\n        assert.equal(secondCall[0], \"browser:reload\");\n\n        reloadStub.restore();\n    });\n\n    describe(\"reload() with css files\", function () {\n\n        var dataStub;\n        var reloadStub;\n        before(function () {\n            dataStub = {\n                path: \"css/styles/styles.css\",\n                basename: \"styles.css\",\n                ext: \"css\",\n                type: \"inject\",\n                log: true\n            };\n            reloadStub = sinon.stub(codeSync, \"reloadBrowser\").returns(true);\n        });\n        after(function () {\n            reloadStub.restore();\n        });\n        it(\"can call reload\", function () {\n            var matches = [\n                {attr: \"href\", id: \"match1\", href: \"http://localhst.com/css/styles.css?rel=123\"}\n            ];\n\n            var elemsStub = sinon.stub(codeSync, \"getElems\").returns({elems: matches, attr: \"href\"});\n            var matchesStub = sinon.stub(codeSync, \"getMatches\").returns(matches);\n\n            var reload = codeSync.reload(bs);\n            var actual = reload(dataStub);\n            assert.equal(actual.elem.id, \"match1\");\n            matchesStub.restore();\n            elemsStub.restore();\n        });\n      it(\"ignores an event if blacklisted\", function() {\n        var reload = codeSync.reload(bs);\n        var dataStub = {\n          path: \"css/styles/styles.css.map\",\n          basename: \"styles.css.map\",\n          ext: \"map\",\n          type: \"reload\",\n          log: true\n        };\n        var elemsStub = sinon.stub(codeSync, \"getElems\");\n        var actual = reload(dataStub);\n        elemsStub.restore();\n        assert.equal(actual, undefined);\n        assert.equal(elemsStub.called, false);\n      });\n        it(\"swaps url when css file has existing params\", function () {\n            var matches = [\n                {\n                    attr: \"href\",\n                    id: \"match1\",\n                    href: \"http://localhost.com/css/styles.css?name=kittie&id=||\"\n                }\n            ];\n            var clock = sinon.useFakeTimers();\n            clock.tick(100);\n            var elemsStub = sinon.stub(codeSync, \"getElems\").returns({elems: matches, attr: \"href\"});\n            var matchesStub = sinon.stub(codeSync, \"getMatches\").returns(matches);\n            var reload = codeSync.reload(bs);\n            var actual = reload(dataStub);\n            assert.equal(actual.elem.href, \"http://localhost.com/css/styles.css?name=kittie&id=||&rel=100\", \"Should append rel attribute\");\n            matchesStub.restore();\n            elemsStub.restore();\n            clock.restore();\n        });\n        it(\"swaps url when css file has no params\", function () {\n            var matches = [\n                {\n                    attr: \"href\",\n                    id: \"match1\",\n                    href: \"http://localhost.com/css/styles.css\"\n                }\n            ];\n            var clock = sinon.useFakeTimers();\n            clock.tick(100);\n            var elemsStub = sinon.stub(codeSync, \"getElems\").returns({elems: matches, attr: \"href\"});\n            var matchesStub = sinon.stub(codeSync, \"getMatches\").returns(matches);\n            var reload = codeSync.reload(bs);\n            var actual = reload(dataStub);\n            assert.equal(actual.elem.href, \"http://localhost.com/css/styles.css?rel=100\", \"Should append rel attribute\");\n            matchesStub.restore();\n            elemsStub.restore();\n            clock.restore();\n        });\n        it(\"swaps url when css file has exising rel attr\", function () {\n            var matches = [\n                {\n                    attr: \"href\",\n                    id: \"match1\",\n                    href: \"http://localhost.com/css/styles.css?rel=99\"\n                }\n            ];\n            var clock = sinon.useFakeTimers();\n            clock.tick(100);\n            var elemsStub = sinon.stub(codeSync, \"getElems\").returns({elems: matches, attr: \"href\"});\n            var matchesStub = sinon.stub(codeSync, \"getMatches\").returns(matches);\n            var reload = codeSync.reload(bs);\n            var actual = reload(dataStub);\n            assert.equal(actual.elem.href, \"http://localhost.com/css/styles.css?rel=100\", \"Should append rel attribute\");\n            matchesStub.restore();\n            elemsStub.restore();\n            clock.restore();\n        });\n    });\n    describe(\"reloading the browser\", function () {\n        var spy;\n        var stub;\n        beforeEach(function () {\n            spy = sinon.spy();\n            stub = sinon.stub(utils, \"getWindow\").returns({\n                location: {\n                    reload: spy\n                }\n            });\n        });\n        it(\"can reload the browser\", function () {\n            codeSync.reloadBrowser(true);\n            sinon.assert.called(stub);\n            sinon.assert.called(spy);\n            stub.restore();\n        });\n        it(\"can reload the browser\", function () {\n            codeSync.reloadBrowser(false);\n            sinon.assert.notCalled(spy);\n            stub.restore();\n        });\n    });\n    it(\"getTagName(): 1\", function () {\n        var actual = codeSync.getTagName(\"css\");\n        var expected = \"link\";\n        assert.equal(actual, expected);\n    });\n    it(\"getTagName(): 2\", function () {\n        var actual = codeSync.getTagName(\"jpg\");\n        var expected = \"img\";\n        assert.equal(actual, expected);\n    });\n    it(\"getAttr(): 1\", function () {\n        var actual = codeSync.getAttr(\"link\");\n        var expected = \"href\";\n        assert.equal(actual, expected);\n    });\n    it(\"getAttr(): 2\", function () {\n        var actual = codeSync.getAttr(\"img\");\n        var expected = \"src\";\n        assert.equal(actual, expected);\n    });\n\n    describe(\"matching elements\", function () {\n\n        it(\"can return multiple elements\", function () {\n            var matches = codeSync.getMatches(stubs, \"*\", \"href\");\n            assert.equal(matches.length, 3);\n        });\n        it(\"can return element matches: 1\", function () {\n            var matches = codeSync.getMatches(stubs, \"style.css\", \"href\");\n            var actual = matches[0];\n            var expected = \"stub1\";\n            assert.equal(actual.id, expected);\n            assert.equal(matches.length, 1);\n        });\n        it(\"can return element matches: 2\", function () {\n            var matches = codeSync.getMatches(stubs, \"style-with-rel.css\", \"href\");\n            var actual = matches[0];\n            var expected = \"stub2\";\n            assert.equal(actual.id, expected);\n            assert.equal(matches.length, 1);\n        });\n        it(\"can return element matches: 3\", function () {\n            var matches = codeSync.getMatches(stubs, \"style-with-paths.css\", \"href\");\n            var actual = matches[0];\n            var expected = \"stub3\";\n            assert.equal(actual.id, expected);\n            assert.equal(matches.length, 1);\n        });\n        it(\"can return Multiple element matches: 1\", function () {\n            var elems = stubs.concat({\n                id: \"stub4\",\n                href: \"http://localhost:8080/style.css\"\n            });\n            var matches = codeSync.getMatches(elems, \"style.css\", \"href\");\n            assert.equal(matches[0].id, \"stub1\");\n            assert.equal(matches[1].id, \"stub4\");\n            assert.equal(matches.length, 2);\n        });\n        it(\"can return only elements matching the same name: 1\", function () {\n            var elems = stubs.concat({\n                id: \"stub4\",\n                href: \"http://localhost:8080/test-style.css\"\n            },\n            {\n                id: \"stub5\",\n                href: \"style.css\"\n            });\n            var matches = codeSync.getMatches(elems, \"style.css\", \"href\");\n            assert.equal(matches[0].id, \"stub1\");\n            assert.equal(matches[1].id, \"stub5\");\n            assert.equal(matches.length, 2);\n        });\n    });\n    describe(\"Getting elements\", function () {\n        it(\"should return elements + attr\", function () {\n            var elemStub = sinon.stub(document, \"getElementsByTagName\").returns([\n                {\n                    id: \"stub1\",\n                    href: \"http://localhost:8080/style.css\"\n                }\n            ]);\n            var actual = codeSync.getElems(\"css\");\n            assert.equal(actual.elems[0].id, \"stub1\");\n            assert.equal(actual.attr, \"href\");\n            elemStub.restore();\n        });\n        it(\"should handle filenames with regexes\", function () {\n            var input = \"http://localhost:8080/style.css?rel=123343\";\n            var expected = \"http://localhost:8080/style.css\";\n            var actual = codeSync.getFilenameOnly(input);\n            assert.equal(actual[0], expected);\n        });\n    });\n    describe(\"Saving scroll position\", function () {\n        it(\"should save scroll position in window.name\", function () {\n            sinon.stub(window.__bs_utils__, \"getWindow\").returns({\n                name: \"\"\n            });\n            var $window = window.__bs_utils__.getWindow();\n            codeSync.saveScrollInName();\n            window.__bs_emitter__.emit(\"browser:hardReload\", {\n                scrollPosition: {\n                    x: 0,\n                    y: 0\n                }\n            });\n            assert.equal($window.name, \"<<BS_START>>{\\\"bs\\\":{\\\"hardReload\\\":true,\\\"scroll\\\":{\\\"x\\\":0,\\\"y\\\":0}}}<<BS_END>>\");\n            window.__bs_utils__.getWindow.restore();\n        });\n        it(\"should save scroll position in window.name\", function () {\n            sinon.stub(window.__bs_utils__, \"getWindow\").returns({\n                name: \"NG_SOME_VALUE\"\n            });\n            var $window = window.__bs_utils__.getWindow();\n            codeSync.saveScrollInName();\n            window.__bs_emitter__.emit(\"browser:hardReload\", {\n                scrollPosition: {\n                    x: 0,\n                    y: 0\n                }\n            });\n            assert.equal($window.name, \"NG_SOME_VALUE<<BS_START>>{\\\"bs\\\":{\\\"hardReload\\\":true,\\\"scroll\\\":{\\\"x\\\":0,\\\"y\\\":0}}}<<BS_END>>\");\n            window.__bs_utils__.getWindow.restore();\n        });\n        it(\"should save scroll position in window.name\", function () {\n            sinon.stub(window.__bs_utils__, \"getWindow\").returns({\n                name: \"NG_SOME_VALUE\",\n                scrollTo: function () {\n\n                }\n            });\n            var spy = sinon.spy(window.__bs_utils__, \"setScroll\");\n            var $window = window.__bs_utils__.getWindow();\n            codeSync.saveScrollInName();\n            window.__bs_emitter__.emit(\"browser:hardReload\", {\n                scrollPosition: {\n                    x: 0,\n                    y: 100\n                }\n            });\n            assert.equal($window.name, \"NG_SOME_VALUE<<BS_START>>{\\\"bs\\\":{\\\"hardReload\\\":true,\\\"scroll\\\":{\\\"x\\\":0,\\\"y\\\":100}}}<<BS_END>>\");\n            codeSync.saveScrollInName();\n            assert.equal($window.name, \"NG_SOME_VALUE\");\n            sinon.assert.calledWithExactly(spy, {x: 0, y: 100});\n            window.__bs_utils__.getWindow.restore();\n            window.__bs_utils__.setScroll.restore();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/emitter.js",
    "content": "describe(\"Internal Event Emitter\", function () {\n\n    var emitter = window.__bs_emitter__;\n\n    beforeEach(function () {\n        emitter.events = {};\n    });\n\n    it(\"should have a `on` method\", function () {\n        assert.equal(typeof emitter.on, \"function\");\n    });\n    it(\"should have a `emit` method\", function () {\n        assert.equal(typeof emitter.emit, \"function\");\n    });\n\n    describe(\"Adding events\", function () {\n        it(\"should add a listener and call it \", function () {\n            var spy = sinon.spy();\n\n            emitter.on(\"test\", spy);\n            emitter.emit(\"test\", {data: \"test data\"});\n\n            sinon.assert.calledOnce(spy);\n        });\n        it(\"should add two listeners and call them both\", function () {\n            var spy1 = sinon.spy();\n            var spy2 = sinon.spy();\n\n            emitter.on(\"test2\", spy1);\n            emitter.on(\"test2\", spy2);\n\n            emitter.emit(\"test2\", {data: \"test data\"});\n\n            sinon.assert.calledOnce(spy1);\n            sinon.assert.calledOnce(spy2);\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/ghostmode.click.js",
    "content": "describe(\"The click Plugin\", function () {\n\n    var clicks = window.__bs_clicks__;\n    var bs     = __bs_stub__;\n    var eventStub, browserEventStub, socketEventStub, socketStub;\n\n    before(function () {\n        eventStub        = sinon.stub(__bs_events__, \"addEvent\");\n        browserEventStub = sinon.stub(clicks, \"browserEvent\").returns(\"EVENT\");\n        socketEventStub  = sinon.stub(clicks, \"socketEvent\").returns(\"socketEvent\");\n        socketStub       = sinon.stub(bs.socket, \"on\").returns(\"socket\");\n        socketStubEmit   = sinon.stub(bs.socket, \"emit\").returns(\"socket\");\n    });\n\n    beforeEach(function () {\n        clicks.canEmitEvents = true;\n    });\n\n    after(function () {\n        eventStub.restore();\n        browserEventStub.restore();\n        socketEventStub.restore();\n        socketStub.restore();\n        socketStubEmit.restore();\n    });\n\n    it(\"should init correctly\", function() {\n\n        clicks.init(bs, __bs_events__);\n\n        var args = eventStub.getCall(0).args;\n        assert.equal(args[1], \"click\");\n        assert.equal(args[2], \"EVENT\");\n\n        sinon.assert.calledWithExactly(socketStub, \"click\", \"socketEvent\");\n\n        sinon.assert.calledWithExactly(browserEventStub, bs);\n        sinon.assert.calledWithExactly(socketEventStub, bs, __bs_events__);\n\n    });\n\n    describe(\"browserEvent(): \", function(){\n        var getDataStub, eventMock, func, dataStub, changeSpy;\n        before(function () {\n            browserEventStub.restore();\n            dataStub = {\n                tagName: \"DIV\",\n                index: 0\n            };\n            getDataStub = sinon.stub(bs.utils, \"getElementData\").returns(dataStub);\n            changeSpy   = sinon.stub(bs.utils, \"forceChange\");\n        });\n        beforeEach(function(){\n            eventMock = {\n                target: {},\n                type: \"DIV\"\n            };\n            socketStubEmit.reset();\n            func = clicks.browserEvent(bs);\n        });\n        afterEach(function () {\n            changeSpy.reset();\n        });\n        after(function () {\n            getDataStub.restore();\n        });\n        it(\"should add click events to body\", function(){\n            func(eventMock);\n        });\n        it(\"should return early if element type is checkbox or radio\", function(){\n            eventMock.target.type = \"radio\";\n            func(eventMock);\n            sinon.assert.notCalled(socketStubEmit);\n        });\n        it(\"should emit the event\", function(){\n            func(eventMock);\n            sinon.assert.calledWithExactly(socketStubEmit, \"click\", dataStub);\n        });\n        it(\"should emit only if the flag is true\", function(){\n            clicks.canEmitEvents = false;\n            func(eventMock);\n            sinon.assert.notCalled(socketStubEmit);\n        });\n        it(\"should reset the flag if was initially false\", function(){\n            clicks.canEmitEvents = false;\n            func(eventMock);\n            assert.equal(clicks.canEmitEvents, true);\n        });\n        it(\"should force the change event if elem type is radio or checkbox\", function () {\n            eventMock.target.type = \"checkbox\";\n            func(eventMock);\n            sinon.assert.called(changeSpy);\n        });\n        it(\"should force the change event if elem type is radio or checkbox\", function () {\n            eventMock.target.type = \"radio\";\n            func(eventMock);\n            sinon.assert.called(changeSpy);\n        });\n    });\n\n    describe(\"socketEvent(): \", function(){\n\n        var func, canSyncStub, triggerClick, elemStub;\n        before(function(){\n            socketEventStub.restore();\n            func            = clicks.socketEvent(bs, __bs_events__);\n            canSyncStub     = sinon.stub(bs, \"canSync\").returns(true);\n            triggerClick    = sinon.stub(__bs_events__, \"triggerClick\");\n            elemStub        = sinon.stub(bs.utils, \"getSingleElement\").returns(true);\n        });\n        afterEach(function () {\n            canSyncStub.reset();\n            elemStub.reset();\n            triggerClick.reset();\n        });\n        after(function () {\n            canSyncStub.restore();\n            triggerClick.restore();\n            elemStub.restore();\n        });\n        it(\"should return early if cannot sync\", function(){\n            canSyncStub.returns(false);\n            func({});\n            sinon.assert.notCalled(triggerClick);\n        });\n        it(\"should call triggerClick() if canSync is true\", function(){\n            canSyncStub.returns(true);\n            func({});\n            sinon.assert.called(triggerClick);\n        });\n        it(\"should not attempt to trigger a click if element does not exist\", function(){\n            canSyncStub.returns(true);\n            elemStub.returns(false);\n            func({});\n            sinon.assert.notCalled(triggerClick);\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/ghostmode.forms.inputs.js",
    "content": "describe(\"The scroll Plugin\", function () {\n\n    var forms   = window.__bs_inputs__;\n    var bs      = __bs_stub__;\n    var events  = __bs_events__;\n\n    var socketStub, socketStubEmit;\n\n    before(function () {\n        socketStub = sinon.spy(bs.socket, \"on\");\n        socketStubEmit = sinon.spy(bs.socket, \"emit\");\n    });\n    afterEach(function () {\n        socketStub.reset();\n        socketStubEmit.reset();\n    });\n    after(function () {\n        socketStub.restore();\n        socketStubEmit.restore();\n    });\n\n    describe(\"Init:\", function(){\n        var eventStub, browserEventStub, socketEventStub;\n        before(function () {\n            eventStub = sinon.stub(events, \"addEvent\");\n            browserEventStub = sinon.stub(forms, \"browserEvent\").returns(\"browserEvent\");\n            socketEventStub  = sinon.stub(forms, \"socketEvent\").returns(\"socketEvent\");\n        });\n        after(function () {\n            eventStub.restore();\n            browserEventStub.restore();\n            socketEventStub.restore();\n        });\n        beforeEach(function () {\n            forms.init(bs, events);\n        });\n        it(\"should add browser Event\", function() {\n            var args = eventStub.getCall(0).args;\n            assert.equal(args[1], \"keyup\");\n            assert.equal(args[2], \"browserEvent\");\n        });\n        it(\"should add socket Event\", function() {\n            var args = socketStub.getCall(0).args;\n            assert.equal(args[0], \"input:text\");\n            assert.equal(args[1], \"socketEvent\");\n        });\n        it(\"should call browserEvent with BS object\", function () {\n            sinon.assert.calledWithExactly(browserEventStub, bs);\n        });\n        it(\"should call browserEvent with BS object\", function () {\n            sinon.assert.calledWithExactly(socketEventStub, bs, events);\n        });\n    });\n\n    describe(\"browserEvent\", function(){\n        var dataStub, eventMock;\n        before(function(){\n            dataStub = sinon.stub(bs.utils, \"getElementData\").returns({\n                tagName: \"INPUT\",\n                index: 0\n            });\n        });\n        beforeEach(function(){\n            eventMock = {\n                target: {\n                    tagName: \"INPUT\",\n                    value: \"text\"\n                }\n            };\n        });\n        after(function () {\n            dataStub.restore();\n        });\n        it(\"should return a function\", function(){\n            var func = forms.browserEvent();\n            assert.equal(typeof func === \"function\", true);\n        });\n        it(\"should emit the event if element is text input or textarea\", function () {\n            var func = forms.browserEvent(bs);\n            func(eventMock);\n            sinon.assert.calledWithExactly(socketStubEmit, \"input:text\", {\n                tagName: \"INPUT\",\n                index: 0,\n                value: \"text\"\n            });\n        });\n        it(\"should emit the event if element is text input or textarea: (1)\", function () {\n            var func = forms.browserEvent(bs);\n\n            eventMock.target.value = \"alt text\";\n            func(eventMock);\n\n            sinon.assert.calledWithExactly(socketStubEmit, \"input:text\", {\n                tagName: \"INPUT\",\n                index: 0,\n                value: \"alt text\"\n            });\n        });\n        it(\"should not emit the event if disabled & reset the flag\", function () {\n            forms.canEmitEvents = false;\n            var func = forms.browserEvent(bs);\n            func(eventMock);\n            sinon.assert.notCalled(socketStubEmit);\n            assert.equal(forms.canEmitEvents, true);\n        });\n    });\n    describe(\"socketEvent(): \", function(){\n        var func;\n        before(function () {\n            func = forms.socketEvent(bs);\n        });\n        it(\"should return a function\", function(){\n            assert.equal(typeof func === \"function\", true);\n        });\n        it(\"should return false if cannot sync\", function () {\n            var canSyncStub = sinon.stub(bs, \"canSync\").returns(false);\n            var actual = func({value: \"kittie\"});\n            assert.equal(actual, false);\n            canSyncStub.restore();\n        });\n        it(\"should set the value of the element\", function () {\n            var elementStub = sinon.stub(bs.utils, \"getSingleElement\").returns({});\n            var actual = func({value: \"kittie\"});\n            assert.equal(actual.value, \"kittie\");\n            elementStub.restore();\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/ghostmode.forms.js",
    "content": "describe(\"The Forms Plugin\", function () {\n\n    var forms   = window.__bs_forms__;\n    var bs      = __bs_stub__;\n    var events  = __bs_events__;\n\n    var inputStub, submitStub, togglesStub;\n\n    before(function () {\n        inputStub   = sinon.stub(__bs_inputs__, \"init\");\n        togglesStub = sinon.stub(__bs_toggles__, \"init\");\n        submitStub  = sinon.stub(__bs_submit__, \"init\");\n    });\n\n    afterEach(function () {\n        inputStub.reset();\n        submitStub.reset();\n        togglesStub.reset();\n    });\n\n    after(function () {\n        inputStub.restore();\n        submitStub.restore();\n        togglesStub.restore();\n    });\n\n    describe(\"Init: with defaults\", function(){\n        beforeEach(function () {\n            forms.init(bs, events);\n        });\n        it(\"should init inputs\", function() {\n            sinon.assert.calledOnce(inputStub);\n        });\n        it(\"should init toggles\", function() {\n            sinon.assert.calledOnce(togglesStub);\n        });\n        it(\"should init submit\", function() {\n            sinon.assert.calledOnce(submitStub);\n        });\n    });\n    describe(\"Init: with some disabled\", function(){\n        beforeEach(function () {\n            forms.init({\n                options: {\n                    ghostMode: {\n                        forms: {\n                            submit: false,\n                            toggles: true,\n                            inputs: true\n                        }\n                    }\n                }\n            }, events);\n        });\n        it(\"should init inputs\", function() {\n            sinon.assert.calledOnce(inputStub);\n        });\n        it(\"should init toggles\", function() {\n            sinon.assert.calledOnce(togglesStub);\n        });\n        it(\"should init submit\", function() {\n            sinon.assert.notCalled(submitStub);\n        });\n    });\n    describe(\"Init: with all enabled\", function(){\n        beforeEach(function () {\n            forms.init({\n                options: {\n                    ghostMode: {\n                        forms: true\n                    }\n                }\n            }, events);\n        });\n        it(\"should init inputs\", function() {\n            sinon.assert.calledOnce(inputStub);\n        });\n        it(\"should init toggles\", function() {\n            sinon.assert.calledOnce(togglesStub);\n        });\n        it(\"should init submit\", function() {\n            sinon.assert.calledOnce(submitStub);\n        });\n    });\n    describe(\"Init: with all Disabled\", function(){\n        beforeEach(function () {\n            forms.init({\n                options: {\n                    ghostMode: {\n                        forms: false\n                    }\n                }\n            }, events);\n        });\n        it(\"should init inputs\", function() {\n            sinon.assert.notCalled(inputStub);\n        });\n        it(\"should init toggles\", function() {\n            sinon.assert.notCalled(togglesStub);\n        });\n        it(\"should init submit\", function() {\n            sinon.assert.notCalled(submitStub);\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/ghostmode.forms.submit.js",
    "content": "describe(\"The Form submit Plugin\", function () {\n\n    var submit   = window.__bs_submit__;\n    var bs      = __bs_stub__;\n    var events  = __bs_events__;\n\n    var socketStub, socketStubEmit;\n\n    before(function () {\n        socketStub = sinon.spy(bs.socket, \"on\");\n        socketStubEmit = sinon.spy(bs.socket, \"emit\");\n    });\n    afterEach(function () {\n        socketStub.reset();\n        socketStubEmit.reset();\n    });\n    after(function () {\n        socketStub.restore();\n        socketStubEmit.restore();\n    });\n\n    describe(\"Init:\", function(){\n        var browserEventStub, socketEventStub, eventStub;\n        before(function () {\n            eventStub        = sinon.stub(events, \"addEvent\");\n            browserEventStub = sinon.stub(submit, \"browserEvent\").returns(\"browserEvent\");\n            socketEventStub  = sinon.stub(submit, \"socketEvent\").returns(\"socketEvent\");\n        });\n        afterEach(function () {\n            eventStub.reset();\n        });\n        after(function () {\n            browserEventStub.restore();\n            socketEventStub.restore();\n            eventStub.restore();\n        });\n        beforeEach(function () {\n            submit.init(bs, events);\n        });\n        it(\"should add submit event to the body\", function () {\n            var args = eventStub.getCall(0).args;\n            assert.equal(args[1], \"submit\");\n            assert.equal(args[2], \"browserEvent\");\n        });\n        it(\"should add reser event to the body\", function () {\n            var args = eventStub.getCall(1).args;\n            assert.equal(args[1], \"reset\");\n            assert.equal(args[2], \"browserEvent\");\n        });\n        it(\"should add socket Event\", function() {\n            var args = socketStub.getCall(0).args;\n            assert.equal(args[0], \"form:submit\");\n            assert.equal(args[1], \"socketEvent\");\n        });\n        it(\"should call browserEvent with BS object\", function () {\n            sinon.assert.calledWithExactly(browserEventStub, bs);\n        });\n        it(\"should call socketEvent with BS object\", function () {\n            sinon.assert.calledWithExactly(socketEventStub, bs, events);\n        });\n    });\n\n    describe(\"browserEvent(): \", function(){\n        var dataStub, eventMock;\n        before(function(){\n            dataStub = sinon.stub(bs.utils, \"getElementData\").returns({\n                tagName: \"FORM\",\n                index: 0\n            });\n        });\n        beforeEach(function(){\n            eventMock = {\n                target: {\n                    tagName: \"INPUT\",\n                    value: 1,\n                    type: \"radio\"\n                },\n                type: \"submit\"\n            };\n        });\n        after(function () {\n            dataStub.restore();\n        });\n        it(\"should return a function\", function(){\n            var func = submit.browserEvent();\n            assert.equal(typeof func === \"function\", true);\n        });\n        it(\"should emit the submit event\", function () {\n            var func = submit.browserEvent(bs);\n            func(eventMock);\n            sinon.assert.calledWithExactly(socketStubEmit, \"form:submit\", {\n                tagName: \"FORM\",\n                index: 0,\n                type: \"submit\"\n            });\n        });\n        it(\"should emit the reset event\", function () {\n            var func = submit.browserEvent(bs);\n            eventMock.type = \"reset\";\n            func(eventMock);\n            sinon.assert.calledWithExactly(socketStubEmit, \"form:submit\", {\n                tagName: \"FORM\",\n                index: 0,\n                type: \"reset\"\n            });\n        });\n        it(\"should not emit the event if disabled & reset the flag\", function () {\n            submit.canEmitEvents = false;\n            var func = submit.browserEvent(bs);\n            func(eventMock);\n            sinon.assert.notCalled(socketStubEmit);\n            assert.equal(submit.canEmitEvents, true);\n        });\n    });\n    describe(\"socketEvent(): \", function(){\n        var func, elementStub;\n        before(function () {\n            func = submit.socketEvent(bs);\n            elementStub = sinon.stub(bs.utils, \"getSingleElement\").returns({});\n        });\n        afterEach(function () {\n            elementStub.reset();\n        });\n        after(function () {\n            elementStub.restore();\n        });\n        it(\"should return a function\", function(){\n            assert.equal(typeof func === \"function\", true);\n        });\n        it(\"should return false if cannot sync\", function () {\n            var canSyncStub = sinon.stub(bs, \"canSync\").returns(false);\n            var actual = func({type: \"submit\"});\n            assert.equal(actual, false);\n            canSyncStub.restore();\n        });\n        it(\"should call the submit method on the form\", function () {\n            var spy = sinon.spy();\n            var formElem = {\n                submit: spy\n            };\n            elementStub.returns(formElem);\n            func({type: \"submit\"});\n            sinon.assert.called(spy);\n        });\n        it(\"should call the submit method on the form\", function () {\n            var spy = sinon.spy();\n            var formElem = {\n                reset: spy\n            };\n            elementStub.returns(formElem);\n            func({type: \"reset\"});\n            sinon.assert.called(spy);\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/ghostmode.forms.toggles.js",
    "content": "describe(\"The scroll Plugin\", function () {\n\n    var toggles   = window.__bs_toggles__;\n    var bs      = __bs_stub__;\n    var events  = __bs_events__;\n\n    var socketStub, socketStubEmit;\n\n    before(function () {\n        socketStub = sinon.spy(bs.socket, \"on\");\n        socketStubEmit = sinon.spy(bs.socket, \"emit\");\n    });\n    afterEach(function () {\n        socketStub.reset();\n        socketStubEmit.reset();\n    });\n    after(function () {\n        socketStub.restore();\n        socketStubEmit.restore();\n    });\n\n    describe(\"Init:\", function(){\n        var eventStub, browserEventStub, socketEventStub;\n        before(function () {\n            eventStub = sinon.stub(toggles, \"addEvents\");\n            browserEventStub = sinon.stub(toggles, \"browserEvent\").returns(\"browserEvent\");\n            socketEventStub  = sinon.stub(toggles, \"socketEvent\").returns(\"socketEvent\");\n        });\n        after(function () {\n            eventStub.restore();\n            browserEventStub.restore();\n            socketEventStub.restore();\n        });\n        beforeEach(function () {\n            toggles.init(bs, events);\n        });\n        it(\"should register browser events\", function () {\n            sinon.assert.calledWithExactly(eventStub, events, \"browserEvent\");\n        });\n        it(\"should add socket Event\", function() {\n            var args = socketStub.getCall(0).args;\n            assert.equal(args[0], \"input:toggles\");\n            assert.equal(args[1], \"socketEvent\");\n        });\n        it(\"should call browserEvent with BS object\", function () {\n            sinon.assert.calledWithExactly(browserEventStub, bs);\n        });\n        it(\"should call browserEvent with BS object\", function () {\n            sinon.assert.calledWithExactly(socketEventStub, bs, events);\n        });\n    });\n\n    describe(\"browserEvent(): \", function(){\n        var dataStub, eventMock;\n        before(function(){\n            dataStub = sinon.stub(bs.utils, \"getElementData\").returns({\n                tagName: \"INPUT\",\n                index: 0\n            });\n        });\n        beforeEach(function(){\n            eventMock = {\n                target: {\n                    tagName: \"INPUT\",\n                    value: 1,\n                    type: \"radio\"\n                }\n            };\n        });\n        after(function () {\n            dataStub.restore();\n        });\n        it(\"should return a function\", function(){\n            var func = toggles.browserEvent();\n            assert.equal(typeof func === \"function\", true);\n        });\n        it(\"should emit the event if element type is radio\", function () {\n            var func = toggles.browserEvent(bs);\n            func(eventMock);\n            sinon.assert.calledWithExactly(socketStubEmit, \"input:toggles\", {\n                tagName: \"INPUT\",\n                index: 0,\n                type: \"radio\",\n                value: 1,\n                checked: undefined\n            });\n        });\n        it(\"should emit the event if element type is checkbox\", function () {\n            var func = toggles.browserEvent(bs);\n            eventMock.target.type = \"checkbox\";\n            func(eventMock);\n            sinon.assert.calledWithExactly(socketStubEmit, \"input:toggles\", {\n                tagName: \"INPUT\",\n                index: 0,\n                type: \"checkbox\",\n                value: 1,\n                checked: undefined\n            });\n        });\n        it(\"should emit the event if element type is select\", function () {\n            var func = toggles.browserEvent(bs);\n            dataStub.returns({\n                tagName: \"SELECT\",\n                index: 0\n            });\n            eventMock.target.tagName = \"SELECT\";\n            eventMock.target.type = \"select\";\n            func(eventMock);\n            sinon.assert.calledWithExactly(socketStubEmit, \"input:toggles\", {\n                tagName: \"SELECT\",\n                index: 0,\n                type: \"select\",\n                value: 1,\n                checked: undefined\n            });\n        });\n        it(\"should not emit the event if disabled & reset the flag\", function () {\n            toggles.canEmitEvents = false;\n            var func = toggles.browserEvent(bs);\n            func(eventMock);\n            sinon.assert.notCalled(socketStubEmit);\n            assert.equal(toggles.canEmitEvents, true);\n        });\n    });\n    describe(\"socketEvent(): \", function(){\n        var func, elementStub;\n        before(function () {\n            func = toggles.socketEvent(bs);\n            elementStub = sinon.stub(bs.utils, \"getSingleElement\").returns({});\n        });\n        afterEach(function () {\n            elementStub.reset();\n        });\n        after(function () {\n            elementStub.restore();\n        });\n        it(\"should return a function\", function(){\n            assert.equal(typeof func === \"function\", true);\n        });\n        it(\"should return false if cannot sync\", function () {\n            var canSyncStub = sinon.stub(bs, \"canSync\").returns(false);\n            var actual = func({value: \"kittie\"});\n            assert.equal(actual, false);\n            canSyncStub.restore();\n        });\n        it(\"should set the value of the radio element\", function () {\n            var actual = func({type: \"radio\"});\n            assert.equal(actual.checked, true);\n        });\n        it(\"should set the value of the checkbox element\", function () {\n            var actual = func({type: \"checkbox\", checked: \"dummy\"});\n            assert.equal(actual.checked, \"dummy\");\n        });\n        it(\"should set the value of the SELECT element\", function () {\n            var actual = func({tagName: \"SELECT\", value: true});\n            assert.equal(actual.value, true);\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/ghostmode.js",
    "content": "describe(\"Ghost Mode\", function(){\n    var ghostMode = window.__bs_ghost_mode__;\n    var bs        = window.__bs_stub__;\n    it(\"Should init\", function() {\n        var spy = sinon.spy(ghostMode.plugins.scroll, \"init\");\n        ghostMode.init(bs);\n        sinon.assert.called(spy);\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/ghostmode.location.js",
    "content": "describe(\"The location Plugin\", function () {\n\n    var location = window.__bs_location__;\n    var bs = __bs_stub__, socketStub, socketEventStub;\n\n    describe(\"init():\", function(){\n\n        before(function(){\n            socketStub      = sinon.stub(bs.socket, \"on\").returns(\"socket\");\n            socketEventStub = sinon.stub(location, \"socketEvent\").returns(\"socket\");\n        });\n        afterEach(function () {\n            socketStub.reset();\n            socketEventStub.reset();\n        });\n        after(function () {\n            socketStub.restore();\n            socketEventStub.restore();\n        });\n\n        it(\"should be a function\", function(){\n            assert.equal(typeof location.init === \"function\", true);\n        });\n        it(\"should register an event on the socket\", function () {\n            location.init(bs);\n            sinon.assert.calledWithExactly(socketStub, \"browser:location\", \"socket\");\n        });\n    });\n    describe(\"socketEvent():\", function () {\n\n        var urlStub, func, pathStub;\n        before(function () {\n            urlStub = sinon.stub(location, \"setUrl\");\n            pathStub = sinon.stub(location, \"setPath\");\n            func = location.socketEvent(bs);\n        });\n        afterEach(function () {\n            urlStub.reset();\n            pathStub.reset();\n        });\n        after(function () {\n            urlStub.restore();\n            pathStub.restore();\n        });\n        it(\"should return a function\", function () {\n            assert.equal(typeof location.socketEvent() === \"function\", true);\n        });\n        it(\"should set url if cansync = true\", function () {\n            func({url: \"/index.html\"});\n            sinon.assert.called(urlStub);\n        });\n        it(\"should set url if `canSync` = false, but `override` = true\", function () {\n            func({url: \"/index.html\", override: true});\n            sinon.assert.calledOnce(urlStub);\n        });\n        it(\"should set path if data.path is set\", function () {\n            func({path: \"/form.html\", override: true});\n            sinon.assert.calledWithExactly(pathStub, \"/form.html\");\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/ghostmode.scroll.js",
    "content": "describe(\"The scroll Plugin\", function () {\n\n    var scroll = window.__bs_scroll__;\n    var bs = __bs_stub__;\n    var scrollSpaceStub;\n    var scrollPositionStub;\n\n    beforeEach(function () {\n        scroll.init(bs, __bs_events__);\n    });\n\n    beforeEach(function () {\n        scrollSpaceStub    = sinon.stub(bs.utils, \"getScrollSpace\");\n        scrollPositionStub = sinon.stub(bs.utils, \"getBrowserScrollPosition\");\n    });\n\n\n    afterEach(function () {\n        scrollSpaceStub.restore();\n        scrollPositionStub.restore();\n    });\n\n    it(\"getScrollTopPercentage(): 1\", function () {\n        scrollSpaceStub.returns({x:0, y:1000});\n        var actual   = scroll.getScrollTopPercentage({x:0, y:500});\n        var expected = 0.5;\n        assert.equal(actual, expected);\n    });\n    it(\"getScrollTopPercentage(): 2\", function () {\n        scrollSpaceStub.returns({x:0, y:1000});\n        var actual   = scroll.getScrollTopPercentage({x:0, y:250});\n        var expected = 0.25;\n        assert.equal(actual, expected);\n    });\n    it(\"socketEvent(): 1\", function () {\n        var stub = sinon.stub(window, \"scrollTo\");\n        scroll.socketEvent(bs)({position: {raw: {x: 0, y:100}}});\n        sinon.assert.calledWithExactly(stub, 0, 100);\n        stub.restore();\n    });\n    it(\"socketEvent(): 2\", function () {\n        var stub = sinon.stub(window, \"scrollTo\");\n        scrollSpaceStub.returns({x:0, y:1000});\n        bs.options.scrollProportionally = true;\n        scroll.socketEvent(bs)({position: {proportional: 0.5}});\n        sinon.assert.calledWithExactly(stub, 0, 500);\n        stub.restore();\n    });\n    it(\"socketEvent(): 3\", function () {\n        var stub = sinon.stub(window, \"scrollTo\");\n        scrollSpaceStub.returns({x:0, y:1000});\n        bs.options.scrollProportionally = true;\n        scroll.socketEvent(bs)({position: {proportional: 0.25}});\n        sinon.assert.calledWithExactly(stub, 0, 250);\n        stub.restore();\n    });\n    it(\"should return early if cannot sync\", function () {\n        scrollSpaceStub.returns({x:0, y:1000});\n        var stub   = sinon.stub(bs, \"canSync\").returns(false);\n        var actual = scroll.socketEvent(bs)({raw: {x: 0, y:200 }});\n        assert.equal(actual, false);\n        stub.restore();\n    });\n\n    describe(\"watch scroll\", function () {\n\n        var stub;\n        before(function () {\n            stub   = sinon.stub(scroll, \"getScrollPosition\").returns({\n                proportional: 0.5,\n                raw: {\n                    x: 0,\n                    y: 100\n                }\n            });\n        });\n        afterEach(function () {\n            stub.reset();\n        });\n        after(function () {\n            stub.restore();\n        });\n\n        it(\"should emit event if can scroll\", function () {\n            var spy    = sinon.spy();\n            var socket = {socket: {emit: spy}};\n            scroll.canEmitEvents = true;\n            scroll.browserEvent(socket)();\n            sinon.assert.calledWithExactly(spy, \"scroll\", {\n                position: {\n                    proportional: 0.5,\n                    raw: {\n                        x: 0,\n                        y: 100\n                    }\n                }\n            });\n        });\n        it(\"should not emit\", function () {\n            var spy    = sinon.spy();\n            var socket = {emit: spy};\n            scroll.canEmitEvents = false;\n            scroll.browserEvent(socket, false)();\n            sinon.assert.notCalled(spy);\n        });\n    });\n\n    describe(\"getScrollPercentage(): \", function(){\n        it(\"should return x & y values: 1\", function(){\n            var actual   = scroll.getScrollPercentage({x:0, y:1000}, {x:0, y:250});\n            assert.equal(actual.y, 0.25);\n        });\n        it(\"should return x & y values: 2\", function(){\n            var actual   = scroll.getScrollPercentage({x:0, y:1000}, {x:0, y:100});\n            assert.equal(actual.y, 0.1);\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/index.js",
    "content": "describe(\"Init method\", function(){\n\n    var index       = window.__bs_index__;\n    var notify      = window.__bs_notify__;\n    var ghostMode   = window.__bs_ghost_mode__;\n    var bs          = window.__bs_stub__;\n    var codeSync    = window.__bs_code_sync__;\n    var notifySpy;\n    var notifyFlashSpy;\n    var ghostStub;\n    var codeSyncStub;\n\n    before(function () {\n        notifySpy       = sinon.stub(notify, \"init\");\n        notifyFlashSpy  = sinon.stub(notify, \"flash\");\n        ghostStub       = sinon.stub(ghostMode, \"init\");\n        codeSyncStub    = sinon.stub(codeSync, \"init\");\n    });\n    after(function () {\n        notifySpy.restore();\n        notifyFlashSpy.restore();\n        ghostStub.restore();\n        codeSyncStub.restore();\n    });\n    it(\"should initilize\", function(){\n        index.init(bs.options);\n        sinon.assert.called(notifySpy);\n        sinon.assert.called(notifyFlashSpy);\n        sinon.assert.called(ghostStub);\n        sinon.assert.called(codeSyncStub);\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/libs/assert.js",
    "content": "// http://wiki.commonjs.org/wiki/Unit_Testing/1.0\n//\n// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!\n//\n// Copyright (c) 2011 Jxck\n//\n// Originally from node.js (http://nodejs.org)\n// Copyright Joyent, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the 'Software'), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n(function(global) {\n\n// Object.create compatible in IE\n    var create = Object.create || function(p) {\n        if (!p) throw Error('no type');\n        function f() {};\n        f.prototype = p;\n        return new f();\n    };\n\n// UTILITY\n    var util = {\n        inherits: function(ctor, superCtor) {\n            ctor.super_ = superCtor;\n            ctor.prototype = create(superCtor.prototype, {\n                constructor: {\n                    value: ctor,\n                    enumerable: false,\n                    writable: true,\n                    configurable: true\n                }\n            });\n        }\n    };\n\n    var pSlice = Array.prototype.slice;\n\n// from https://github.com/substack/node-deep-equal\n    var Object_keys = typeof Object.keys === 'function'\n                    ? Object.keys\n                    : function (obj) {\n                var keys = [];\n                for (var key in obj) keys.push(key);\n                return keys;\n            }\n            ;\n\n// 1. The assert module provides functions that throw\n// AssertionError's when particular conditions are not met. The\n// assert module must conform to the following interface.\n\n    var assert = ok;\n\n    global['assert'] = assert;\n\n    if (typeof module === 'object' && typeof module.exports === 'object') {\n        module.exports = assert;\n    };\n\n// 2. The AssertionError is defined in assert.\n// new assert.AssertionError({ message: message,\n//                             actual: actual,\n//                             expected: expected })\n\n    assert.AssertionError = function AssertionError(options) {\n        this.name = 'AssertionError';\n        this.message = options.message;\n        this.actual = options.actual;\n        this.expected = options.expected;\n        this.operator = options.operator;\n        var stackStartFunction = options.stackStartFunction || fail;\n\n        if (Error.captureStackTrace) {\n            Error.captureStackTrace(this, stackStartFunction);\n        } else {\n            // try to throw an error now, and from the stack property\n            // work out the line that called in to assert.js.\n            try {\n                this.stack = (new Error).stack.toString();\n            } catch (e) {}\n        }\n    };\n\n// assert.AssertionError instanceof Error\n    util.inherits(assert.AssertionError, Error);\n\n    function replacer(key, value) {\n        if (value === undefined) {\n            return '' + value;\n        }\n        if (typeof value === 'number' && (isNaN(value) || !isFinite(value))) {\n            return value.toString();\n        }\n        if (typeof value === 'function' || value instanceof RegExp) {\n            return value.toString();\n        }\n        return value;\n    }\n\n    function truncate(s, n) {\n        if (typeof s == 'string') {\n            return s.length < n ? s : s.slice(0, n);\n        } else {\n            return s;\n        }\n    }\n\n    assert.AssertionError.prototype.toString = function() {\n        if (this.message) {\n            return [this.name + ':', this.message].join(' ');\n        } else {\n            return [\n                this.name + ':',\n                truncate(JSON.stringify(this.actual, replacer), 128),\n                this.operator,\n                truncate(JSON.stringify(this.expected, replacer), 128)\n            ].join(' ');\n        }\n    };\n\n// At present only the three keys mentioned above are used and\n// understood by the spec. Implementations or sub modules can pass\n// other keys to the AssertionError's constructor - they will be\n// ignored.\n\n// 3. All of the following functions must throw an AssertionError\n// when a corresponding condition is not met, with a message that\n// may be undefined if not provided.  All assertion methods provide\n// both the actual and expected values to the assertion error for\n// display purposes.\n\n    function fail(actual, expected, message, operator, stackStartFunction) {\n        throw new assert.AssertionError({\n            message: message,\n            actual: actual,\n            expected: expected,\n            operator: operator,\n            stackStartFunction: stackStartFunction\n        });\n    }\n\n// EXTENSION! allows for well behaved errors defined elsewhere.\n    assert.fail = fail;\n\n// 4. Pure assertion tests whether a value is truthy, as determined\n// by !!guard.\n// assert.ok(guard, message_opt);\n// This statement is equivalent to assert.equal(true, !!guard,\n// message_opt);. To test strictly for the value true, use\n// assert.strictEqual(true, guard, message_opt);.\n\n    function ok(value, message) {\n        if (!!!value) fail(value, true, message, '==', assert.ok);\n    }\n    assert.ok = ok;\n\n// 5. The equality assertion tests shallow, coercive equality with\n// ==.\n// assert.equal(actual, expected, message_opt);\n\n    assert.equal = function equal(actual, expected, message) {\n        if (actual != expected) fail(actual, expected, message, '==', assert.equal);\n    };\n\n// 6. The non-equality assertion tests for whether two objects are not equal\n// with != assert.notEqual(actual, expected, message_opt);\n\n    assert.notEqual = function notEqual(actual, expected, message) {\n        if (actual == expected) {\n            fail(actual, expected, message, '!=', assert.notEqual);\n        }\n    };\n\n// 7. The equivalence assertion tests a deep equality relation.\n// assert.deepEqual(actual, expected, message_opt);\n\n    assert.deepEqual = function deepEqual(actual, expected, message) {\n        if (!_deepEqual(actual, expected)) {\n            fail(actual, expected, message, 'deepEqual', assert.deepEqual);\n        }\n    };\n\n    function _deepEqual(actual, expected) {\n        // 7.1. All identical values are equivalent, as determined by ===.\n        if (actual === expected) {\n            return true;\n\n//  } else if (Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) {\n//    if (actual.length != expected.length) return false;\n//\n//    for (var i = 0; i < actual.length; i++) {\n//      if (actual[i] !== expected[i]) return false;\n//    }\n//\n//    return true;\n//\n            // 7.2. If the expected value is a Date object, the actual value is\n            // equivalent if it is also a Date object that refers to the same time.\n        } else if (actual instanceof Date && expected instanceof Date) {\n            return actual.getTime() === expected.getTime();\n\n            // 7.3 If the expected value is a RegExp object, the actual value is\n            // equivalent if it is also a RegExp object with the same source and\n            // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).\n        } else if (actual instanceof RegExp && expected instanceof RegExp) {\n            return actual.source === expected.source &&\n                    actual.global === expected.global &&\n                    actual.multiline === expected.multiline &&\n                    actual.lastIndex === expected.lastIndex &&\n                    actual.ignoreCase === expected.ignoreCase;\n\n            // 7.4. Other pairs that do not both pass typeof value == 'object',\n            // equivalence is determined by ==.\n        } else if (typeof actual != 'object' && typeof expected != 'object') {\n            return actual == expected;\n\n            // 7.5 For all other Object pairs, including Array objects, equivalence is\n            // determined by having the same number of owned properties (as verified\n            // with Object.prototype.hasOwnProperty.call), the same set of keys\n            // (although not necessarily the same order), equivalent values for every\n            // corresponding key, and an identical 'prototype' property. Note: this\n            // accounts for both named and indexed properties on Arrays.\n        } else {\n            return objEquiv(actual, expected);\n        }\n    }\n\n    function isUndefinedOrNull(value) {\n        return value === null || value === undefined;\n    }\n\n    function isArguments(object) {\n        return Object.prototype.toString.call(object) == '[object Arguments]';\n    }\n\n    function objEquiv(a, b) {\n        if (isUndefinedOrNull(a) || isUndefinedOrNull(b))\n            return false;\n        // an identical 'prototype' property.\n        if (a.prototype !== b.prototype) return false;\n        //~~~I've managed to break Object.keys through screwy arguments passing.\n        //   Converting to array solves the problem.\n        if (isArguments(a)) {\n            if (!isArguments(b)) {\n                return false;\n            }\n            a = pSlice.call(a);\n            b = pSlice.call(b);\n            return _deepEqual(a, b);\n        }\n        try {\n            var ka = Object_keys(a),\n                    kb = Object_keys(b),\n                    key, i;\n        } catch (e) {//happens when one is a string literal and the other isn't\n            return false;\n        }\n        // having the same number of owned properties (keys incorporates\n        // hasOwnProperty)\n        if (ka.length != kb.length)\n            return false;\n        //the same set of keys (although not necessarily the same order),\n        ka.sort();\n        kb.sort();\n        //~~~cheap key test\n        for (i = ka.length - 1; i >= 0; i--) {\n            if (ka[i] != kb[i])\n                return false;\n        }\n        //equivalent values for every corresponding key, and\n        //~~~possibly expensive deep test\n        for (i = ka.length - 1; i >= 0; i--) {\n            key = ka[i];\n            if (!_deepEqual(a[key], b[key])) return false;\n        }\n        return true;\n    }\n\n// 8. The non-equivalence assertion tests for any deep inequality.\n// assert.notDeepEqual(actual, expected, message_opt);\n\n    assert.notDeepEqual = function notDeepEqual(actual, expected, message) {\n        if (_deepEqual(actual, expected)) {\n            fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);\n        }\n    };\n\n// 9. The strict equality assertion tests strict equality, as determined by ===.\n// assert.strictEqual(actual, expected, message_opt);\n\n    assert.strictEqual = function strictEqual(actual, expected, message) {\n        if (actual !== expected) {\n            fail(actual, expected, message, '===', assert.strictEqual);\n        }\n    };\n\n// 10. The strict non-equality assertion tests for strict inequality, as\n// determined by !==.  assert.notStrictEqual(actual, expected, message_opt);\n\n    assert.notStrictEqual = function notStrictEqual(actual, expected, message) {\n        if (actual === expected) {\n            fail(actual, expected, message, '!==', assert.notStrictEqual);\n        }\n    };\n\n    function expectedException(actual, expected) {\n        if (!actual || !expected) {\n            return false;\n        }\n\n        if (Object.prototype.toString.call(expected) == '[object RegExp]') {\n            return expected.test(actual);\n        } else if (actual instanceof expected) {\n            return true;\n        } else if (expected.call({}, actual) === true) {\n            return true;\n        }\n\n        return false;\n    }\n\n    function _throws(shouldThrow, block, expected, message) {\n        var actual;\n\n        if (typeof expected === 'string') {\n            message = expected;\n            expected = null;\n        }\n\n        try {\n            block();\n        } catch (e) {\n            actual = e;\n        }\n\n        message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +\n                (message ? ' ' + message : '.');\n\n        if (shouldThrow && !actual) {\n            fail(actual, expected, 'Missing expected exception' + message);\n        }\n\n        if (!shouldThrow && expectedException(actual, expected)) {\n            fail(actual, expected, 'Got unwanted exception' + message);\n        }\n\n        if ((shouldThrow && actual && expected &&\n                !expectedException(actual, expected)) || (!shouldThrow && actual)) {\n            throw actual;\n        }\n    }\n\n// 11. Expected to throw an error:\n// assert.throws(block, Error_opt, message_opt);\n\n    assert.throws = function(block, /*optional*/error, /*optional*/message) {\n        _throws.apply(this, [true].concat(pSlice.call(arguments)));\n    };\n\n// EXTENSION! This is annoying to write outside this module.\n    assert.doesNotThrow = function(block, /*optional*/message) {\n        _throws.apply(this, [false].concat(pSlice.call(arguments)));\n    };\n\n    assert.ifError = function(err) { if (err) {throw err;}};\n\n    if (typeof define === 'function' && define.amd) {\n        define('assert', function () {\n            return assert;\n        });\n    }\n\n})(this);"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/notify.js",
    "content": "describe(\"The Notify Element\", function() {\n\n    var notify = window.__bs_notify__;\n    var bs     = window.__bs_stub__;\n    bs.emitter = window.__bs_emitter__;\n\n    it(\"can be initialised\", function() {\n        var elem     = notify.init(bs);\n        var actual   = elem.style.backgroundColor;\n        var expected = \"rgb(27, 32, 50)\";\n        assert.equal(actual, expected);\n    });\n    it(\"can be initialised with custom styles array\", function() {\n\n        bs.options.notify = {\n            styles: [\n                \"background-color: yellow\",\n                \"color: black\",\n                \"padding: 10px\",\n                \"display: none\",\n                \"font-family: sans-serif\",\n                \"position: absolute\",\n                \"z-index: 9999\",\n                \"right: 0px\",\n                \"border-bottom-left-radius: 5px\"\n            ]\n        };\n        var elem     = notify.init(bs);\n        var actual   = elem.style.backgroundColor;\n        var expected = \"yellow\";\n        assert.equal(actual, expected);\n    });\n    it(\"can be initialised with custom style overrides\", function() {\n\n        bs.options.notify = {\n            styles: {\n                fontSize: \"18px\",\n                backgroundColor: \"plum\"\n            }\n        };\n        var elem     = notify.init(bs);\n        var actualFontSize   = elem.style.fontSize;\n        var expectedFontSize = \"18px\";\n        var actualBGColor   = elem.style.backgroundColor;\n        var expectedBGColor = \"plum\";\n        assert.equal(actualFontSize, expectedFontSize);\n        assert.equal(actualBGColor, expectedBGColor);\n    });\n\n\n    it(\"can return a callback for watching\", function(){\n        var stub = sinon.stub(notify, \"flash\");\n        var cb   = notify.watchEvent({options: {notify:true}});\n        cb({message: \"custom message\"});\n        sinon.assert.calledWithExactly(stub, \"custom message\", undefined);\n        stub.restore();\n    });\n\n    it(\"does not flash a message if notify:false\", function(){\n        var stub = sinon.stub(notify, \"flash\");\n        var cb   = notify.watchEvent({options: {notify:false}});\n        cb({message: \"custom message\"});\n        sinon.assert.notCalled(stub);\n        stub.restore();\n    });\n\n    it(\"DOES flash a message if notify:false but override: true\", function(){\n        var stub = sinon.stub(notify, \"flash\");\n        var cb   = notify.watchEvent({options: {notify:false}});\n        cb({message: \"custom message\", override: true});\n        sinon.assert.calledWithExactly(stub, \"custom message\", undefined);\n        stub.restore();\n    });\n\n    it(\"should register an listener on the emitter\", function () {\n        var spy = sinon.spy(bs.emitter, \"on\");\n        notify.init(bs);\n        var actual   = spy.getCall(0).args[0];\n        var expected = \"notify\";\n        assert.equal(actual, expected);\n        spy.restore();\n    });\n    it(\"should register an listener on the socket\", function () {\n        var spy = sinon.spy(bs.socket, \"on\");\n        notify.init(bs);\n        var actual   = spy.getCall(0).args[0];\n        var expected = \"browser:notify\";\n        assert.equal(actual, expected);\n        spy.restore();\n    });\n\n    describe(\"Flashing\", function () {\n\n        var elemStub;\n        var fakeElem;\n        before(function () {\n            fakeElem = {\n                innerHTML: \"\",\n                style: {\n                    top: \"\",\n                    display: \"\"\n                }\n            };\n            elemStub   = sinon.stub(notify, \"getElem\");\n        });\n        after(function () {\n            elemStub.restore();\n        });\n        it(\"should return early if no ELEM\", function () {\n            elemStub.returns(false);\n            var actual = notify.flash();\n            assert.equal(actual, false);\n        });\n        it(\"should hide the notify elem \", function(){\n\n            sinon.stub(window.__bs_utils__, \"getBody\").returns({\n                appendChild: function () {},\n                removeChild: function () {},\n            });\n\n            elemStub.returns(fakeElem);\n            var clock = sinon.useFakeTimers();\n            var elem = notify.flash(\"MESSAGE\");\n\n            clock.tick(2010);\n\n            var actual    = elem.style.display;\n            var expected = \"none\";\n\n            assert.equal(actual, expected);\n            clock.restore();\n            window.__bs_utils__.getBody.restore();\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/socket.js",
    "content": "describe(\"Socket Connection\", function () {\n\n    var socket = window.__bs_socket__;\n    var event = \"event\";\n    var data  = {name: \"shane\"};\n    var spyOn;\n    var spyEmit;\n    before(function () {\n        spyOn   = sinon.spy(socket.socket, \"on\");\n        spyEmit = sinon.spy(socket.socket, \"emit\");\n    });\n    afterEach(function () {\n        spyEmit.reset();\n    });\n\n    it(\"should add a listener\", function () {\n        socket.on(event, data);\n        sinon.assert.calledWithExactly(spyOn, event, data);\n    });\n    it(\"should emit an event with data\", function () {\n        socket.emit(event, data);\n        sinon.assert.calledWithExactly(spyEmit, event, data);\n    });\n    it(\"should send the path when emitting\", function () {\n        var stub  = sinon.stub(socket, \"getPath\").returns(\"/index.html\");\n        socket.emit(event, data);\n        var actual   = spyEmit.getCall(0).args[1].url;\n        var expected = \"/index.html\";\n        assert.equal(actual, expected);\n        stub.restore();\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/stubs/bs.js",
    "content": "var __bs_stub__ = {\n    options: {\n        notify: true,\n        codeSync: true,\n        ghostMode: {\n            scroll: true,\n            clicks: true,\n            forms: {\n                toggles: true,\n                inputs: true,\n                submit: true\n            }\n        }\n    },\n    utils: {\n        getScrollSpace: function () {},\n        getBrowserScrollPosition: function () {},\n        getBody: function () {},\n        getSingleElement: function () {},\n        getElementData: function () {},\n        forceChange: function () {}\n    },\n    socket: {\n        on: function(){},\n        emit: function(){}\n    },\n    canSync: function(){ return true }\n};\n\nvar __bs_events__ = {\n    addEvent: function(){},\n    triggerClick: function(){}\n};"
  },
  {
    "path": "packages/browser-sync-client/test/client-new/utils.js",
    "content": "describe(\"Generic Browser utils\", function(){\n    var browserUtils;\n    before(function () {\n        browserUtils = window.__bs_utils__;\n    });\n    describe(\"getBrowserScrollPosition(): \", function () {\n        var act, windowStub, documentStub, stub;\n        before(function () {\n            act = function () {\n                return browserUtils.getBrowserScrollPosition();\n            };\n            windowStub   = sinon.stub(browserUtils, \"getWindow\").returns({});\n            documentStub = sinon.stub(browserUtils, \"getDocument\");\n        });\n        beforeEach(function () {\n            stub = {\n                documentElement: {},\n                body: {}\n            };\n        });\n        after(function () {\n            windowStub.restore();\n            documentStub.restore();\n        });\n        afterEach(function () {\n            windowStub.reset();\n            documentStub.reset();\n        });\n        it(\"should get scroll position from document.documentElement.scrollLeft/top\", function(){\n            stub.documentElement.scrollLeft = 0;\n            stub.documentElement.scrollTop = 100;\n            documentStub.returns(stub);\n            var actual = act();\n            assert.equal(actual.x, 0);\n            assert.equal(actual.y, 100);\n        });\n        it(\"should get scroll position from document.body.scrollLeft/top\", function(){\n            stub.body.scrollLeft = 100;\n            stub.body.scrollTop  = 0;\n            documentStub.returns(stub);\n            var actual = act();\n            assert.equal(actual.x, 100);\n            assert.equal(actual.y, 0);\n        });\n        it(\"should get scroll position from document.body.scrollLeft/top\", function(){\n            stub.body.scrollLeft = 100;\n            stub.body.scrollTop  = 0;\n            documentStub.returns(stub);\n            var actual = act();\n            assert.equal(actual.x, 100);\n            assert.equal(actual.y, 0);\n        });\n        it(\"should get scroll position from window by default\", function () {\n            windowStub.restore();\n            documentStub.returns(stub);\n            var actual = act();\n            assert.equal(actual.x, 0);\n            assert.equal(actual.y, 0);\n        });\n\n    });\n    describe(\"getScrollSpace(): 1\", function () {\n        var act;\n        var documentStub;\n        before(function () {\n            act = function () {\n                return browserUtils.getScrollSpace();\n            };\n            documentStub = sinon.stub(browserUtils, \"getDocument\").returns({\n                documentElement: {\n                    clientWidth: 800,\n                    clientHeight: 600\n                },\n                body: {\n                    scrollHeight: 1000\n                }\n            });\n        });\n        after(function () {\n            documentStub.restore();\n        });\n        it(\"should return x & y values\", function(){\n            var actual = act();\n            assert.equal(actual.x, 200);\n            assert.equal(actual.y, 400);\n        });\n    });\n    describe(\"getting a single element\", function(){\n        var fakeElems = [\n            {\n                id: \"item1\",\n                tagName: \"link\"\n            },\n            {\n                id: \"item2\",\n                tagName: \"link\"\n            }\n        ], stub;\n        before(function(){\n            stub = sinon.stub(document, \"getElementsByTagName\").returns(fakeElems);\n        });\n        after(function () {\n            stub.restore();\n        });\n        it(\"should call getElementsByTagName() with the tagname\", function(){\n            browserUtils.getSingleElement(\"link\", 0);\n            sinon.assert.calledWithExactly(stub, \"link\");\n        });\n        it(\"should return the correct index: 1\", function(){\n            var actual   = browserUtils.getSingleElement(\"link\", 0);\n            var expected = \"item1\";\n            assert.equal(actual.id, expected);\n        });\n        it(\"should return the correct index: 2\", function(){\n            var actual   = browserUtils.getSingleElement(\"link\", 1);\n            var expected = \"item2\";\n            assert.equal(actual.id, expected);\n            stub.restore();\n        });\n    });\n    describe(\"Getting index of an element\", function () {\n        it(\"should return the correct index\", function () {\n            var elem     = {id: \"abx\"};\n            var stub     = sinon.stub(document, \"getElementsByTagName\").returns([elem, {id: \"xab\"}]);\n            var actual   = browserUtils.getElementIndex(\"link\", elem);\n            var expected = 0;\n            assert.equal(actual, expected);\n            stub.restore();\n        });\n        it(\"should return the correct index\", function () {\n            var elem     = {id: \"xab\"};\n            var stub     = sinon.stub(document, \"getElementsByTagName\").returns([{id: \"abx\"}, elem]);\n            var actual   = browserUtils.getElementIndex(\"link\", elem);\n            var expected = 1;\n            assert.equal(actual, expected);\n            stub.restore();\n        });\n    });\n\n    describe(\"Getting element data for socket event\", function(){\n        var indexStub;\n        before(function () {\n            indexStub = sinon.stub(browserUtils, \"getElementIndex\").returns(0);\n        });\n        after(function () {\n            indexStub.restore();\n        });\n        it(\"should return an object containing element info\", function(){\n            var elem = {\n                tagName: \"link\"\n            };\n            var actual   = browserUtils.getElementData(elem);\n            assert.equal(actual.tagName, \"link\");\n            assert.equal(actual.index, 0);\n        });\n    });\n\n    describe(\"forceChange(): \", function () {\n        var blur  = sinon.spy();\n        var focus = sinon.spy();\n        var elem = {\n            blur: blur,\n            focus: focus\n        };\n\n        var actual = window.__bs_utils__.forceChange(elem);\n        sinon.assert.calledOnce(blur);\n        sinon.assert.calledOnce(focus);\n    });\n    describe(\"getDocument(): \", function () {\n        window.__bs_utils__.getDocument();\n    });\n    describe(\"getDocument(): \", function () {\n        window.__bs_utils__.getBody();\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/fixtures/css/style.css",
    "content": "body {\n\tbackground: grey;\n}"
  },
  {
    "path": "packages/browser-sync-client/test/fixtures/forms.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Forms</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\"/>\n\n</head>\n<body>\n<div class=\"container\">\n    <h1>Style-injector Ghost Mode: Form sync</h1>\n\n    <p>Links: synced</p>\n    <a href=\"index.html\">Hompage</a>\n\n    <form id=\"form-01\">\n        <p><label for=\"name\">Text Inputs: synced</label></p>\n        <input type=\"text\" name=\"name\" value=\"\" id=\"name\"/>\n\n        <p><label for=\"email\">Email Inputs: synced</label></p>\n        <input type=\"email\" name=\"email\" value=\"\" id=\"email\"/>\n        <p><label for=\"password\">Passwords Inputs: synced</label></p>\n        <input type=\"password\" name=\"password\" value=\"\" id=\"password\"/>\n\n        <p><label for=\"country\">Select Boxes: synced</label></p>\n        <select name=\"country\" id=\"country\">\n            <option value=\"uk\">Uk</option>\n            <option value=\"spain\">Spain</option>\n            <option value=\"france\">France</option>\n        </select>\n\n        <p>Radio Buttons: synced </p>\n\n        <p>\n            <label for=\"confirm-1\">Yes</label>\n            <input type=\"radio\" name=\"confirm\" id=\"confirm-1\" value=\"1\"/>\n            <label for=\"confirm-0\">No</label>\n            <input type=\"radio\" name=\"confirm\" id=\"confirm-0\" value=\"0\"/>\n        </p>\n\n        <p>Check Boxes: synced</p>\n\n        <div>\n            <label for=\"option-1\">Option 1</label>\n            <input type=\"checkbox\" name=\"checkbox\" id=\"option-1\">\n            <label for=\"option-2\">Option 2</label>\n            <input type=\"checkbox\" name=\"checkbox\" id=\"option-2\">\n        </div>\n\n        <p><label for=\"message\">Text Areas: synced</label></p>\n        <textarea name=\"message\" id=\"message\" cols=\"30\" rows=\"10\"></textarea>\n\n        <input type=\"submit\" value=\"Submit\" />\n        <input type=\"reset\" value=\"Reset\" />\n    </form>\n\n</div>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync-client/test/fixtures/index-large.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\"/>\n</head>\n<body>\n\n    <h1>Hello from the test</h1>\n    <a href=\"forms.html\">Forms</a>\n    <a href=\"scrolling.html\">Scrolling Window</a>\n\n    <a href=\"forms.html\">\n        <div>\n            <div>\n                <img src=\"http://placekitten.com/400/600\" alt=\"\"/>\n            </div>\n        </div>\n    </a>\n    <a href=\"forms.html\">\n        <div>\n            <div>\n                <img src=\"http://placekitten.com/400/600\" alt=\"\"/>\n            </div>\n        </div>\n    </a>\n\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Debitis dolorem eligendi\n            exercitationem impedit minus molestiae quia quidem reprehenderit rerum ut. Ab cum\n            debitis laborum necessitatibus officia quia tempore voluptatum! Placeat.</p>\n\n        <p>Aliquid animi expedita, illum ipsum iusto non officia temporibus tenetur ut! Asperiores\n            aspernatur deserunt dignissimos enim exercitationem expedita labore, laborum natus neque\n            odit officiis provident quae quaerat quibusdam sequi, voluptas?</p>\n\n        <p>Deserunt enim esse itaque magnam nam quidem sapiente suscipit temporibus veniam? Beatae,\n            commodi delectus dicta doloremque explicabo ipsum libero natus sapiente sunt suscipit\n            tempore, unde, veniam voluptas. Beatae dolor, tenetur.</p>\n\n        <p>Dolorem nulla quidem sapiente voluptatum! Ea impedit ipsam minima nemo ratione recusandae\n            reprehenderit saepe sint vero! Distinctio ducimus eius fugiat laborum, quaerat quas\n            quos. Assumenda et expedita facere maiores. Culpa!</p>\n\n        <p>Ex, officiis quos. Atque debitis ex expedita harum nisi non optio reiciendis sit\n            voluptates! Aspernatur at delectus et expedita illo, impedit in non sint! Alias iure\n            natus perspiciatis quisquam suscipit?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque blanditiis commodi\n            corporis cumque distinctio dolor dolore dolorem, explicabo fuga, fugit maiores, nam\n            nesciunt optio quam quo rem ullam. Autem, est!</p>\n\n        <p>Aspernatur eveniet fugit ipsum maxime nobis placeat quis repellat voluptatem. Assumenda\n            exercitationem, ipsam ipsum neque nesciunt perferendis quod ullam. Dolores doloribus\n            ducimus enim facilis in possimus quae quis tempore voluptatem!</p>\n\n        <p>Earum eos incidunt quaerat. Aliquam eius eos et ex molestias placeat saepe sed velit.\n            Amet beatae corporis cum dignissimos, distinctio dolore expedita harum incidunt, magnam\n            molestias neque nihil odit ratione.</p>\n\n        <p>Accusantium amet aperiam commodi consequuntur dignissimos distinctio, dolor eos excepturi\n            exercitationem fuga hic illo in incidunt maxime neque nisi nostrum numquam optio\n            perferendis possimus quasi, quod reiciendis repellat velit voluptas.</p>\n\n        <p>Ab accusantium aliquid autem consequatur distinctio dolor eaque eius eum eveniet\n            excepturi harum illo in minima mollitia neque odit omnis, quasi quidem reiciendis\n            repellat reprehenderit sapiente suscipit unde veniam vitae.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Error eveniet nesciunt nostrum\n            nulla, quidem quisquam reiciendis sapiente sint tempora! Consequuntur earum excepturi\n            libero nobis sequi. Debitis eligendi ipsam temporibus vel.</p>\n\n        <p>Eaque rem reprehenderit sint ullam. A aliquid beatae consectetur dolor enim et facilis\n            hic illo ipsam iusto laboriosam magnam maiores nam perferendis porro provident, quo\n            reiciendis, saepe tenetur, velit voluptatem?</p>\n\n        <p>Accusantium ad adipisci commodi cupiditate dolor eligendi, eum impedit ipsum iure nam\n            neque nesciunt nisi nobis quaerat quas quia, quibusdam quidem quis quo recusandae rem\n            suscipit totam, unde veniam voluptatibus!</p>\n\n        <p>Adipisci consectetur maxime modi! Ab amet doloremque earum eligendi facilis ipsam\n            laboriosam nam necessitatibus nobis non odio, omnis perspiciatis quia ratione sint sit\n            tempore, temporibus ut vel vero. Aut, placeat!</p>\n\n        <p>A aliquid aperiam at beatae cumque debitis, dolore dolores ea eaque eius enim explicabo\n            facilis hic illo magnam magni minus numquam officia officiis omnis, qui quidem repellat\n            sint sit unde!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus beatae consectetur\n            distinctio error est exercitationem expedita, necessitatibus officiis possimus quaerat,\n            quis rem repellat vitae? Expedita itaque magnam mollitia rem repudiandae.</p>\n\n        <p>A, animi cupiditate debitis, dignissimos dolorum eveniet explicabo fugiat laboriosam\n            magnam maxime modi nam nisi obcaecati officiis omnis quas quibusdam recusandae,\n            repudiandae sequi sit soluta unde veritatis voluptates! Dolorum, itaque!</p>\n\n        <p>Ad cumque dolor dolore fugit hic iste maiores nisi quae quas quidem! Ad, cum dignissimos\n            dolorum ducimus facere incidunt labore minus natus nisi non pariatur quas quasi\n            quibusdam quo similique!</p>\n\n        <p>Ad cupiditate ex fugiat, iusto omnis possimus sunt tempora ullam vel! Cumque est iure\n            maxime voluptatibus? Aliquam aspernatur culpa dicta eligendi explicabo libero odio quia\n            quidem sapiente sequi! Nostrum, quasi.</p>\n\n        <p>Commodi error incidunt modi. Ad dolores ipsum totam voluptate voluptates. Alias aliquid\n            aspernatur consequuntur deleniti dignissimos excepturi, illo iste laborum magni nisi\n            nobis porro rem similique sint soluta, sunt vero.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet blanditiis consectetur,\n            deleniti dolorem ducimus eum facere facilis fuga illo iusto nihil odit officia\n            praesentium quis rerum temporibus totam voluptates voluptatibus!</p>\n\n        <p>Commodi deserunt distinctio doloremque eos fugit, inventore ipsa laborum modi nesciunt\n            nihil officia officiis quas recusandae repudiandae rerum sapiente temporibus. Ab\n            assumenda consequatur eius error, excepturi in libero optio sunt?</p>\n\n        <p>A adipisci amet architecto, consequuntur corporis debitis deleniti dolores error est\n            eveniet ipsum itaque molestias optio pariatur quasi quis quisquam rem repellat\n            repellendus soluta? Cumque, molestiae, quibusdam. Quia quidem, reiciendis.</p>\n\n        <p>Consectetur delectus error fuga, libero voluptatem voluptatum! Amet aperiam architecto\n            asperiores aspernatur assumenda commodi, debitis delectus eligendi et fuga itaque iusto\n            minus nihil, placeat possimus, ratione reprehenderit rerum tenetur velit.</p>\n\n        <p>Doloribus ducimus eos iste laborum placeat quaerat quam quia, quo repellendus\n            voluptatibus. Aperiam aut cupiditate deserunt dignissimos itaque necessitatibus pariatur\n            sapiente? Asperiores aspernatur minus qui tempora. Alias qui quisquam quo?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis dolorem doloribus,\n            enim harum magnam quisquam sed. A consectetur dignissimos dolorum earum ex hic minus\n            modi obcaecati officiis optio, quos voluptatibus!</p>\n\n        <p>Consectetur cupiditate doloremque ea eius, est ex excepturi fuga fugiat iusto laborum\n            maiores molestias, mollitia nostrum officia optio pariatur porro quae quas quibusdam\n            quod saepe sapiente sequi sint veritatis voluptates?</p>\n\n        <p>Eum quaerat, reprehenderit? A aliquid beatae doloribus error exercitationem expedita\n            impedit in ipsum labore, laudantium minima molestias nesciunt nihil non odit porro quas\n            quibusdam, reiciendis repellat similique velit veritatis voluptatum?</p>\n\n        <p>A accusantium adipisci architecto ipsa libero perferendis placeat praesentium, unde.\n            Accusantium beatae consectetur doloribus esse id laudantium maiores, minima nihil odio\n            quos recusandae, similique tempore voluptatum. Inventore optio suscipit voluptates?</p>\n\n        <p>Adipisci delectus minus, porro recusandae sit totam veniam. Architecto aspernatur,\n            debitis deleniti doloribus et fugit minus necessitatibus nobis odio perferendis placeat,\n            provident quam repellat rerum similique sint, sit suscipit tenetur!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi eligendi esse id illo\n            obcaecati omnis possimus provident reiciendis rem veritatis. Consectetur distinctio\n            dolorum ea eius exercitationem? Dolorum nam quam suscipit.</p>\n\n        <p>Doloremque facilis ipsum nam rem! Alias aliquam aperiam consequuntur cumque cupiditate\n            delectus enim fugiat laboriosam optio perspiciatis placeat, quasi, qui vero! Accusamus\n            ad commodi dolore doloremque facere, incidunt itaque temporibus.</p>\n\n        <p>Amet assumenda consequatur enim error fugit nihil nisi officia officiis quo sapiente!\n            Accusantium aliquam asperiores consequuntur eos, exercitationem explicabo facilis fuga\n            impedit labore molestias nam quod sed tempore temporibus voluptatem.</p>\n\n        <p>Ab at culpa delectus ducimus ea error eum eveniet facere facilis id itaque labore,\n            molestiae mollitia nam necessitatibus nobis officiis optio possimus praesentium, quae\n            quos reprehenderit sapiente tempora tempore voluptatum!</p>\n\n        <p>Alias aspernatur assumenda commodi culpa delectus doloribus eius eos excepturi explicabo\n            in molestias non, officiis perferendis perspiciatis placeat provident ratione repellat\n            tempora temporibus tenetur. Et nostrum quo reiciendis totam velit?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci autem laboriosam\n            libero molestias natus, nihil odio qui quia reiciendis repudiandae sint temporibus vel\n            voluptatem. Ad aliquid neque provident ullam voluptatibus.</p>\n\n        <p>Autem corporis culpa deleniti, dignissimos distinctio dolor dolore eligendi enim, est\n            excepturi fugiat itaque, magnam minima natus nobis nostrum placeat quaerat quasi quis\n            reiciendis repellat soluta sunt suscipit veniam vitae.</p>\n\n        <p>Accusantium asperiores at deserunt dignissimos distinctio doloremque, dolores ea eos fuga\n            fugiat in iusto mollitia nam nemo, nisi obcaecati officiis pariatur perspiciatis quas\n            quasi similique, tempore ut velit voluptatem voluptatibus!</p>\n\n        <p>Ab aspernatur aut blanditiis culpa, cum dolore ea eos exercitationem expedita incidunt\n            libero, molestias non odio odit officia omnis placeat provident quaerat qui\n            reprehenderit repudiandae, similique soluta. Ad consequuntur, totam?</p>\n\n        <p>Alias blanditiis dolore dolorem ducimus expedita illo incidunt, iusto laudantium minima,\n            molestiae necessitatibus, neque nesciunt nobis nulla odit quaerat quas quasi quis\n            quisquam quod saepe sapiente sed sint ut voluptate.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquid architecto, blanditiis\n            dolore ducimus, esse facilis id illum in laudantium odio omnis optio porro quae rem\n            tenetur vel vero voluptas! Perferendis!</p>\n\n        <p>Accusamus animi asperiores assumenda blanditiis corporis, culpa dolor earum eum illum\n            laudantium numquam placeat possimus quae quas quasi quibusdam ratione repellat\n            repellendus repudiandae sapiente sed sint soluta sunt tempore, voluptatibus!</p>\n\n        <p>Ad amet at beatae cumque deserunt dolore dolores doloribus, eaque error esse expedita\n            fuga harum, natus nobis nostrum odio perferendis quas repellendus rerum unde vel veniam\n            vero vitae! Iusto, recusandae.</p>\n\n        <p>Accusamus at ex incidunt iusto mollitia perferendis sequi, vitae. Aperiam earum, et ex\n            facere maiores nemo quos reprehenderit voluptas. Architecto asperiores hic magni natus\n            nemo nesciunt officia quia? Debitis, quaerat.</p>\n\n        <p>A maiores quos sapiente sint sit. Aliquid cupiditate illum incidunt minus neque quasi,\n            qui repellendus sapiente tempore voluptates. A alias aperiam aut excepturi laboriosam\n            laudantium officiis omnis porro praesentium recusandae?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae cumque cupiditate\n            deserunt dicta dignissimos, distinctio ducimus eum facere ipsum laboriosam modi\n            necessitatibus nihil nostrum perferendis quasi quidem similique, sunt veritatis!</p>\n\n        <p>Cupiditate deserunt ducimus eius eligendi, error esse, fuga libero nobis possimus quasi\n            quis rem tempore unde, velit veritatis. Ab ad, dolorem explicabo fugiat nam officia\n            porro voluptas voluptate. Illo, voluptas.</p>\n\n        <p>At deleniti dolore excepturi explicabo neque nostrum quidem ratione repellat. Cupiditate\n            et excepturi fuga fugiat ipsa laborum minima nesciunt nisi nostrum quas quisquam quos,\n            sapiente suscipit, veritatis, voluptatum! Ex, laborum!</p>\n\n        <p>Architecto dolorum eos et impedit ipsa nostrum, nulla officia quia quo sunt! Consequatur\n            dignissimos numquam provident quam. Aliquam ea, esse harum nisi nobis possimus quia quis\n            ratione, saepe tempora, vel?</p>\n\n        <p>Accusantium ad aut commodi consectetur deserunt dolores et excepturi expedita facere id\n            illo ipsa ipsum iure laborum magnam molestiae nesciunt officiis perspiciatis, quaerat\n            quam quisquam quod repellat sit sunt voluptate?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium animi autem cumque\n            cupiditate eaque, earum esse et molestias nam officiis pariatur porro possimus qui\n            quisquam soluta sunt ullam voluptate voluptates?</p>\n\n        <p>Accusantium animi dicta, eius esse ex impedit incidunt minima, neque officia repudiandae\n            soluta suscipit velit? Architecto dicta eos eveniet iusto molestiae numquam obcaecati\n            quam, quo quod recusandae, repellendus repudiandae tempore?</p>\n\n        <p>Adipisci amet animi cupiditate dolores ea eaque esse et facere fuga inventore laudantium\n            libero magnam magni maxime molestiae nam non optio pariatur praesentium, quia sequi unde\n            velit voluptas voluptates voluptatibus.</p>\n\n        <p>Dignissimos, perspiciatis, recusandae! Accusantium aperiam aut commodi cumque, deleniti\n            dolorem, fugit itaque labore non officia optio perferendis provident quaerat quas rerum\n            sapiente sunt tenetur ut vitae voluptate. Assumenda, et, sapiente.</p>\n\n        <p>A assumenda consequatur deleniti dolore dolorum eaque eius, facilis hic incidunt\n            inventore ipsam nemo nostrum nulla numquam odio perspiciatis placeat, praesentium\n            provident quam quas ratione rem sed sequi, tempora veniam.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquid blanditiis dolore ex\n            facere, fugit illo, ipsam laudantium necessitatibus odit placeat quam quisquam quod\n            repellendus reprehenderit soluta temporibus ullam vero voluptas?</p>\n\n        <p>Amet, dolorem odio pariatur quibusdam sit velit voluptas voluptates? Blanditiis\n            doloremque esse laudantium obcaecati, reiciendis repellat? Blanditiis commodi eos esse\n            illo incidunt ipsam maxime nemo praesentium, quam qui, repellat ullam.</p>\n\n        <p>Adipisci commodi consectetur debitis deleniti dolorum eaque fuga fugit harum hic ipsam\n            iusto laborum libero nam nesciunt, numquam, pariatur possimus, qui quia quis quisquam\n            rem repellendus repudiandae sit tenetur voluptate.</p>\n\n        <p>Beatae consequatur debitis dolores facilis fugit hic laborum, magnam maiores maxime\n            minus, perspiciatis provident recusandae repudiandae, sapiente suscipit tempore\n            temporibus tenetur veniam vero vitae. Atque aut id illum qui sunt.</p>\n\n        <p>Assumenda, sit, voluptates! Accusantium aspernatur at consequuntur inventore libero nobis\n            perferendis voluptas voluptatem voluptates. Animi beatae commodi, culpa ea eligendi enim\n            facilis illo minus nam, nesciunt nisi perspiciatis repudiandae unde.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam architecto autem dolor\n            doloremque et facilis hic impedit laboriosam laborum laudantium qui quisquam, quo\n            recusandae repudiandae rerum ut vero! Incidunt, magni!</p>\n\n        <p>Commodi culpa distinctio dolores eius expedita harum itaque molestiae molestias non\n            officia optio, quae quasi quia quibusdam, ratione totam ullam vitae? Odio odit, sunt! A\n            aliquam commodi ipsam nostrum quos!</p>\n\n        <p>Adipisci fuga maiores officia. Ad aliquam aspernatur consequuntur distinctio, eligendi\n            exercitationem fugiat iste itaque iure, magni numquam omnis provident quod repudiandae\n            soluta suscipit ut, veniam voluptas. Fugit iste mollitia vel?</p>\n\n        <p>Aliquid commodi cupiditate eos, excepturi fugiat labore magni maiores numquam optio\n            placeat quaerat sequi similique suscipit tempore ut! Autem debitis ea fuga laudantium\n            quos recusandae sapiente similique voluptatem! Autem, vel!</p>\n\n        <p>Accusantium adipisci dolores exercitationem inventore laboriosam mollitia necessitatibus,\n            obcaecati, omnis quos recusandae velit vitae! Adipisci, in quibusdam. Atque corporis\n            dolore dolorem dolorum esse ipsum quia. Id laboriosam praesentium repellat\n            similique.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Assumenda hic id labore nobis,\n            odio repellendus temporibus. Ad architecto corporis exercitationem illum in\n            necessitatibus nesciunt, vel veniam. Molestiae quasi reiciendis velit!</p>\n\n        <p>Beatae deserunt eos harum praesentium vero? Amet asperiores explicabo fugiat ipsam sunt\n            ullam? Accusamus corporis culpa cumque dolorum earum error fugiat, in ipsam modi\n            molestias nostrum quibusdam sequi similique vitae?</p>\n\n        <p>A aperiam delectus dicta doloribus est ipsam magni necessitatibus nemo obcaecati officiis\n            perferendis quo ratione, recusandae soluta unde veritatis vitae voluptatum. Architecto\n            aut error illum nam nemo nostrum officiis ut.</p>\n\n        <p>Architecto, deleniti dolor dolore doloremque doloribus enim est eum ex excepturi illo\n            incidunt inventore ipsa maxime minima modi necessitatibus non numquam optio perferendis\n            porro possimus quasi, similique tempora veniam voluptatum?</p>\n\n        <p>Asperiores deserunt distinctio fugit id illo, laborum quisquam reprehenderit sapiente\n            sunt veritatis! Aperiam cum cumque dicta dolore ducimus, earum excepturi explicabo,\n            facilis id mollitia nostrum optio quibusdam ullam voluptatibus voluptatum!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Asperiores blanditiis culpa,\n            cum dolorem earum eos est harum iure laborum laudantium molestiae, natus quae, quam qui\n            repudiandae suscipit ullam vel veritatis!</p>\n\n        <p>Ex, fugiat, nisi? Aliquid aut debitis dolore, eaque exercitationem ipsam ipsum\n            necessitatibus odio quam temporibus. Cumque dolores iusto nesciunt? Alias at beatae\n            distinctio ea iure magnam quibusdam sapiente ut vero.</p>\n\n        <p>Fugit libero quos tempora! Ad adipisci, aliquam at aut commodi dolor, est libero,\n            nesciunt nobis nostrum possimus quia rem repellat tempore veritatis voluptas\n            voluptatibus! Esse nobis possimus quisquam recusandae tenetur!</p>\n\n        <p>Cupiditate enim esse omnis quisquam? Ab accusantium aliquam eius esse est et eum\n            exercitationem expedita iusto maxime, minus nulla quas quidem quis rem sit tempora\n            temporibus unde velit voluptatibus! Laborum.</p>\n\n        <p>Amet atque aut, corporis delectus dignissimos dolore dolorem dolores doloribus earum\n            eligendi enim eos eum fuga harum iusto minus mollitia nihil nostrum numquam pariatur\n            perferendis placeat temporibus velit. Minima, provident?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab aliquam, aliquid at\n            blanditiis dolores dolorum eum eveniet hic ipsa iste magni modi mollitia nesciunt nisi\n            nobis nulla optio suscipit ullam?</p>\n\n        <p>Accusamus accusantium amet assumenda at dolor dolore est ex expedita explicabo fugiat\n            laborum magnam mollitia nisi numquam officiis omnis quae quasi quis quisquam, reiciendis\n            repudiandae sequi tenetur ullam ut voluptatem!</p>\n\n        <p>Accusantium animi cum, delectus ea eum ex id incidunt laboriosam perspiciatis praesentium\n            sit soluta temporibus, voluptate. Doloremque error odio possimus totam. Ab aspernatur\n            facilis harum labore nemo nobis, quae repellendus!</p>\n\n        <p>Asperiores assumenda consectetur cumque cupiditate ea eligendi eos error et fugit hic\n            maxime, minus nisi odio optio quam qui quibusdam quo, repudiandae sequi similique sunt\n            tempore totam vel vitae voluptas?</p>\n\n        <p>Cumque doloribus ducimus eligendi ipsum iste non soluta velit. Beatae consequatur cum ea\n            eligendi, ex expedita harum ipsa laudantium quia quisquam. Asperiores consequuntur est\n            iure optio quia rerum sequi, sit!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium animi aut dolor\n            doloremque ducimus eaque exercitationem facere fugit, harum illum magnam, minus\n            necessitatibus non officiis quam quod reprehenderit saepe tempore.</p>\n\n        <p>Aperiam at, et ex, ipsum iure magni maiores nisi obcaecati odit praesentium quia repellat\n            rerum sed similique sunt. Accusamus at autem ducimus esse et inventore iure\n            necessitatibus quibusdam veritatis vitae?</p>\n\n        <p>Debitis labore mollitia odit officia? Ad assumenda corporis, cupiditate doloremque\n            ducimus error ex, optio, perspiciatis possimus rem tenetur veniam veritatis. Excepturi\n            facere facilis harum ipsum magnam nulla vel, velit! Soluta!</p>\n\n        <p>Asperiores eos expedita illum iste laudantium non perspiciatis rem sit? Accusantium\n            assumenda atque, blanditiis cupiditate dolorem doloribus earum, enim esse illo ipsam\n            necessitatibus officia quae repellendus sequi soluta temporibus vero.</p>\n\n        <p>Ad beatae cumque, debitis eius, eveniet excepturi explicabo facilis fugit, illo in libero\n            mollitia nam nemo nobis pariatur placeat porro quasi repellendus repudiandae temporibus\n            tenetur ut vel veniam! Asperiores, omnis.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. A asperiores consectetur cum,\n            eum expedita fugiat iure, minima nisi perspiciatis possimus quia quis quod rem sunt\n            ullam unde, voluptates. Reiciendis, voluptatibus!</p>\n\n        <p>Cum fuga maiores nam natus neque nulla quibusdam, quo repellat reprehenderit veritatis\n            voluptas voluptatum! Architecto dicta doloribus ducimus maxime tenetur. Exercitationem,\n            possimus, sequi. Cumque, eius iste quas rem suscipit tenetur!</p>\n\n        <p>Aliquam aliquid amet aperiam architecto, assumenda autem cum cupiditate dolore earum\n            excepturi fuga id ipsa ipsam, magni numquam odio quidem, repudiandae saepe sed sequi\n            similique soluta sunt tempore tenetur voluptatem!</p>\n\n        <p>Assumenda dolor facilis laboriosam minima molestiae optio pariatur sequi, voluptatem!\n            Enim eum ex facere nobis rem! Distinctio ea id in magnam pariatur qui, reiciendis\n            tenetur vero. Assumenda doloremque odio placeat.</p>\n\n        <p>Accusantium commodi cumque fugit ipsum? Adipisci doloribus iure sequi? Architecto,\n            debitis, deleniti dicta eaque et fuga id illum ipsa labore maiores minima, optio\n            pariatur quia voluptate voluptatem. Culpa, modi, rerum.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto, consectetur\n            deserunt explicabo hic modi obcaecati odit quis suscipit tenetur veritatis! Aspernatur\n            eum fugiat ipsam modi natus quod recusandae repellat voluptatibus.</p>\n\n        <p>Asperiores autem blanditiis consequuntur corporis cupiditate dolorem eius fugit id illum\n            ipsam iusto labore molestias mollitia, natus obcaecati quaerat repellat sapiente sunt\n            tenetur totam unde vel veniam. Facere, impedit, soluta?</p>\n\n        <p>Animi assumenda blanditiis culpa, deserunt doloremque exercitationem explicabo harum\n            molestias nesciunt nostrum, officiis quo, repellendus saepe ullam vitae? Accusantium\n            architecto at aut consectetur consequuntur harum necessitatibus officia possimus sunt\n            tempora!</p>\n\n        <p>Doloremque nisi quibusdam sed. Alias aperiam distinctio doloribus, dolorum ea eligendi\n            error esse eveniet in inventore ipsum molestias nulla odit optio quibusdam quidem\n            ratione recusandae sequi tempora temporibus tenetur velit.</p>\n\n        <p>Aliquid dolore est, fugiat id illo ipsa, laboriosam libero magni maiores non obcaecati\n            officia recusandae repudiandae sapiente suscipit. Non officiis omnis quisquam sed unde!\n            Adipisci impedit iusto rem! Provident, quam?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus, animi blanditiis\n            distinctio dolores eius error inventore laboriosam libero minima nam necessitatibus nemo\n            nihil nisi, obcaecati quam rerum suscipit ullam vitae.</p>\n\n        <p>Ab aliquam aliquid delectus deserunt facere fuga ipsa, ipsam maiores nihil placeat, quia\n            quidem recusandae repellendus voluptatem, voluptatum. Consequatur deserunt dignissimos\n            eaque eligendi fugiat minus natus quas quod sed voluptatibus?</p>\n\n        <p>Deserunt eligendi esse fugiat minus nobis rem, tempora voluptates voluptatibus. Aliquam\n            amet animi architecto assumenda, atque delectus distinctio doloremque dolores, doloribus\n            ea earum laborum magni odit reiciendis saepe sint, soluta.</p>\n\n        <p>Dicta eius inventore optio praesentium repellendus sed vel. Ab architecto assumenda\n            consectetur fugiat id impedit labore magni nam obcaecati placeat, praesentium quidem\n            reprehenderit sapiente sint soluta suscipit velit veritatis voluptatum?</p>\n\n        <p>Accusantium adipisci architecto, assumenda, aut beatae cupiditate deleniti eaque eos ex\n            hic illo in maxime modi necessitatibus nobis perspiciatis quibusdam quis recusandae\n            rerum saepe sint sit suscipit temporibus tenetur vero.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium amet commodi\n            consectetur deleniti dolores ducimus ea ex, iure maxime, nihil nulla possimus qui\n            quidem, quisquam repellendus sequi similique tempore ullam.</p>\n\n        <p>Consequatur culpa debitis delectus dolorum ipsam laborum maxime numquam obcaecati optio,\n            porro possimus ratione repudiandae saepe sequi totam, voluptate voluptatem? Debitis iure\n            magni molestiae non omnis, ratione sit voluptas! Praesentium.</p>\n\n        <p>Debitis eligendi fuga porro quam quis! Ab architecto beatae debitis delectus dignissimos\n            ea ex expedita harum iusto molestias necessitatibus nemo placeat praesentium provident\n            quibusdam repudiandae saepe, sed vel velit voluptates.</p>\n\n        <p>Commodi libero maiores maxime nemo non omnis ratione saepe soluta voluptatibus! A\n            architecto autem consequatur error illo inventore minima nam odio quasi! Assumenda,\n            cupiditate enim eos expedita facilis ratione ut?</p>\n\n        <p>Aliquam consequatur cum dignissimos, dolore doloremque incidunt laborum molestias\n            nesciunt praesentium quae ratione reiciendis saepe voluptates? Dolorem dolorum modi\n            natus, nihil officia pariatur quibusdam tempora! Atque esse harum non sapiente.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam asperiores consequatur\n            corporis, dignissimos est explicabo, illo incidunt ipsum libero maxime praesentium\n            provident quam rem soluta tempora unde vel veniam voluptate!</p>\n\n        <p>Accusamus alias autem, deleniti eos et eum exercitationem odit omnis quasi reprehenderit.\n            A amet dolorem ducimus ea exercitationem fuga hic id molestias placeat possimus quod\n            repellat, repellendus repudiandae voluptas voluptates!</p>\n\n        <p>Accusamus cum dicta enim eos exercitationem illo, mollitia nihil nisi, nulla obcaecati\n            reiciendis, sequi sint totam? Aperiam beatae delectus et harum minus natus nisi nobis\n            optio porro, praesentium qui repellat!</p>\n\n        <p>Ab, aliquam commodi doloribus eligendi inventore nemo nihil nostrum perferendis provident\n            quia repellat repudiandae sapiente sequi suscipit tenetur veniam voluptas! Adipisci\n            aspernatur commodi dolorum earum hic pariatur porro, possimus voluptas.</p>\n\n        <p>Accusamus adipisci aliquam aut consectetur culpa deleniti deserunt dolor eius, error\n            explicabo id illo incidunt inventore iste libero mollitia officia officiis optio quod\n            quos reprehenderit sint tempora totam ullam voluptatem?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. A assumenda atque dolorum harum\n            id ipsum libero placeat reprehenderit sed totam! Consequatur cum deserunt eius illo\n            libero nostrum placeat sequi sunt?</p>\n\n        <p>Cum fuga ipsum iste iure modi nihil nobis perspiciatis praesentium saepe sed. Accusamus\n            amet dolores doloribus eum facere harum, in laborum molestias nulla quaerat, quas\n            recusandae, similique suscipit tempore tenetur!</p>\n\n        <p>Aperiam ea, earum et, hic libero neque nihil porro quae qui quidem quo quos repudiandae\n            rerum sed voluptatum. Alias asperiores distinctio earum fuga harum illum iusto\n            molestiae, obcaecati veritatis. Facilis.</p>\n\n        <p>Assumenda, commodi consequatur. Atque cumque perspiciatis rem similique ut! Accusamus ad\n            adipisci consectetur corporis dolore ea, eaque eum exercitationem impedit in, laudantium\n            neque non ratione sequi similique velit veritatis vitae.</p>\n\n        <p>Dolorem iste magni nam quas unde! Atque distinctio eum ex id labore nemo, omnis ratione\n            repudiandae temporibus voluptatum! Ad asperiores commodi dolorem eveniet laudantium nam\n            necessitatibus perspiciatis quo, reiciendis voluptas!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet aut cum iure laudantium\n            minima nihil quisquam rem temporibus? A architecto deserunt eveniet, fuga harum minima\n            minus optio temporibus vel voluptates?</p>\n\n        <p>Aliquid ea esse laudantium nemo nisi? Aperiam, cumque doloremque eius explicabo facere\n            fugit minus nemo totam veniam vero. Accusamus alias consequatur ducimus eos error et\n            excepturi expedita harum, neque quas.</p>\n\n        <p>Aliquid consectetur cumque illo laudantium natus nemo neque nostrum numquam, sequi\n            veritatis. Autem commodi, dolore laudantium nesciunt pariatur sed voluptatum!\n            Accusantium asperiores cumque doloremque exercitationem illum officia placeat sed\n            voluptatum?</p>\n\n        <p>Animi aspernatur beatae eveniet ex fuga illo voluptate voluptatum. Adipisci aliquid\n            asperiores blanditiis consequuntur deserunt eius eos fuga ipsa laudantium officiis rerum\n            sequi sint, tempora tempore totam vero voluptas voluptatem?</p>\n\n        <p>Commodi expedita quam qui quisquam repellat reprehenderit sequi! Ab aperiam corporis eius\n            ex illum incidunt ipsam ipsum iste necessitatibus, nihil nobis odit omnis, perferendis\n            possimus provident quaerat sint sunt tempora!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam cumque dicta facere,\n            illo porro totam! Aliquam asperiores deserunt eum itaque laborum officiis saepe? Alias\n            aliquid animi atque dolore, facere repellat.</p>\n\n        <p>Animi cum cupiditate distinctio dolores dolorum eaque, facere incidunt inventore labore\n            minus neque officia possimus, praesentium quae ratione sed, sit tempore. Accusamus\n            blanditiis facilis fugiat minus quam tenetur, velit voluptas.</p>\n\n        <p>Cum eius fugiat harum necessitatibus, neque nihil non praesentium rem soluta velit.\n            Accusantium assumenda atque dolorem eaque ipsa, nulla porro quam rem repellat soluta,\n            vero vitae. Cumque obcaecati pariatur similique.</p>\n\n        <p>Amet aspernatur, consectetur deleniti ducimus eius eligendi et excepturi hic illo, ipsa\n            nesciunt sequi! Dolor eligendi facilis nesciunt quia reiciendis! Accusamus atque\n            corporis iusto laudantium necessitatibus quaerat quo rem voluptate!</p>\n\n        <p>Ab, blanditiis eligendi et impedit, iste itaque modi nulla officia officiis perferendis\n            rem sequi veniam vero! Ad at, dolorum eveniet harum ipsa maxime omnis, provident\n            quibusdam repellendus sequi sint tempore?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad, asperiores consequatur\n            dolores dolorum exercitationem harum illo inventore libero? Asperiores labore laboriosam\n            maxime natus quam quas quia quod vero vitae voluptatum?</p>\n\n        <p>Aliquam dolorem dolorum earum eius fuga ipsam neque repudiandae rerum. Beatae distinctio\n            dolorem exercitationem expedita incidunt maxime, minima odio rem reprehenderit voluptas.\n            Alias animi in nemo quasi repudiandae, ut voluptatibus.</p>\n\n        <p>Aperiam facilis ipsam nam quidem recusandae ullam ut? Adipisci autem corporis distinctio\n            ipsum reprehenderit. Aspernatur autem consectetur consequatur delectus est illo ipsum\n            provident quia, sint sunt unde vero vitae voluptate!</p>\n\n        <p>Ab ad aliquid cum ducimus ea eos et facere iure, laboriosam magnam maiores non, officia\n            reiciendis? Ab assumenda beatae commodi ducimus itaque labore necessitatibus qui, quis,\n            quod repellendus totam ullam?</p>\n\n        <p>Ab aut blanditiis est fugit iusto laboriosam odio sint voluptate? Aliquam architecto\n            corporis doloremque harum in mollitia odio, quaerat quisquam rem sapiente sed, sequi sit\n            unde! Debitis delectus eaque officiis.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto aspernatur autem\n            blanditiis consequuntur dolorum molestiae perferendis qui. Ad consequatur consequuntur,\n            ipsa libero molestias optio pariatur placeat, quo rem repudiandae suscipit.</p>\n\n        <p>Aliquam aliquid culpa eum expedita laudantium minima natus, pariatur, quidem quos sed\n            soluta tempore ut vel. Ab accusamus asperiores autem beatae debitis ea est, eveniet\n            magni maiores omnis quae quasi?</p>\n\n        <p>Aperiam atque consectetur, corporis dolor ipsam nulla pariatur! Accusantium, blanditiis\n            deleniti est nemo odio repellendus rerum voluptatem voluptatum. Blanditiis consectetur\n            deleniti eveniet, hic laboriosam reiciendis saepe? Animi perspiciatis rem veritatis!</p>\n\n        <p>Asperiores aut cupiditate distinctio dolores impedit ipsum mollitia omnis placeat\n            possimus temporibus. A accusantium ad commodi culpa cum eveniet excepturi ipsam iste\n            odio, quas quia repellat tempore velit veniam voluptates.</p>\n\n        <p>Amet, architecto consequuntur dicta dolore dolorem eius enim est eveniet excepturi fugiat\n            iste iusto laborum libero minima natus nobis non officiis quae quibusdam quod sequi sit\n            temporibus unde ut, voluptatem?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Facilis quo tenetur veniam?\n            Aliquid blanditiis consequuntur corporis cumque ex fugit incidunt necessitatibus omnis\n            veniam voluptatum? Aliquam dicta iure obcaecati soluta tempora?</p>\n\n        <p>Dolor eos ex incidunt inventore, iure, labore libero minus obcaecati odit quas, sit\n            tempora veniam voluptate. Accusantium amet aut culpa doloribus illum, labore molestiae\n            nam non, nostrum quis quos tenetur?</p>\n\n        <p>Ab accusantium atque aut, autem, consequatur culpa cupiditate, ducimus earum explicabo\n            facere ipsa ipsum iusto laboriosam minima minus molestiae nulla officiis optio placeat\n            qui ratione sapiente sequi suscipit veniam voluptatibus!</p>\n\n        <p>A aliquam assumenda at cupiditate, deleniti dolorum eos error exercitationem facere\n            facilis ipsam labore maiores molestiae nihil nostrum officia officiis provident quae\n            quas reprehenderit repudiandae sed sint tenetur veniam vitae.</p>\n\n        <p>Cum deserunt dolore eum facilis ipsa maxime, officiis possimus ratione similique totam.\n            Aperiam aspernatur atque aut autem commodi debitis, deserunt eligendi exercitationem\n            nobis nostrum, officia placeat quas quia reiciendis sunt.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Autem consequatur cupiditate\n            debitis eius exercitationem illo ipsam numquam odio! Atque eum non pariatur quisquam ut?\n            Consectetur deleniti iste neque officiis sed.</p>\n\n        <p>At consequuntur debitis dolores eum, ipsum libero modi molestias nihil nulla officiis,\n            pariatur praesentium rerum saepe sed, totam vero voluptatibus? Debitis ea natus neque\n            perspiciatis quisquam, recusandae sequi sit. Optio?</p>\n\n        <p>Consequuntur, enim eum nobis optio perspiciatis tenetur voluptates. Adipisci at deserunt\n            ducimus et, facere fugiat fugit in, iusto molestias nisi rem temporibus? Accusantium\n            aliquam enim est eveniet illo velit voluptate!</p>\n\n        <p>Asperiores aspernatur consequatur corporis cumque doloremque eos ex iusto laboriosam\n            nobis non praesentium quam quasi rerum saepe sit soluta tempora voluptatibus,\n            voluptatum. Aperiam distinctio facilis ipsam nobis quaerat sint veritatis!</p>\n\n        <p>A adipisci aspernatur consequuntur doloremque excepturi explicabo iste laborum natus\n            necessitatibus pariatur. Dignissimos doloremque ea fugit inventore ipsam laboriosam\n            maiores necessitatibus nesciunt, numquam porro quam sapiente, sequi tempora tenetur\n            ullam.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium ad aliquam debitis\n            earum error et ex, facere, fugiat harum impedit magni neque nihil quaerat quasi\n            repudiandae similique tenetur totam veritatis.</p>\n\n        <p>A accusamus amet animi architecto, asperiores, autem consequatur debitis dolorum enim\n            harum ipsum laboriosam nihil optio praesentium, quasi quod recusandae reprehenderit\n            rerum sequi tenetur totam ullam unde voluptatum! Aspernatur, quos!</p>\n\n        <p>Ad adipisci aperiam aspernatur atque beatae culpa debitis delectus dignissimos ea enim\n            excepturi impedit laborum magnam molestias neque nostrum omnis quae quaerat quibusdam\n            recusandae rem saepe sunt, veniam veritatis voluptates?</p>\n\n        <p>Accusamus adipisci aspernatur aut consectetur corporis exercitationem fugit nisi omnis\n            provident totam. Corporis eum facere facilis fugit iure iusto libero maxime nulla optio,\n            pariatur possimus provident reiciendis rem sunt tempora?</p>\n\n        <p>Doloribus facilis fugiat incidunt ipsa iste natus, nemo perferendis quo recusandae? Amet\n            aut blanditiis consequatur cupiditate doloremque eum facere, laborum magnam natus odio\n            officia perspiciatis quidem quos soluta velit voluptate.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci aliquid dignissimos\n            doloremque eligendi eum facere, harum illum laborum molestiae, nobis odio placeat quas\n            quibusdam quidem quisquam sequi sint totam voluptate.</p>\n\n        <p>Commodi consequuntur, cum cumque dolores facilis fuga, libero nesciunt optio porro\n            reiciendis, saepe soluta velit voluptatibus. Accusantium corporis eaque in tenetur\n            ullam. At aut dicta impedit iure minus, sit tempore!</p>\n\n        <p>Architecto consectetur corporis cupiditate dicta distinctio dolores et in minus nam,\n            necessitatibus temporibus totam unde voluptates? Atque autem consequuntur corporis\n            doloremque, eum ex hic maiores maxime non quaerat suscipit tenetur?</p>\n\n        <p>Ducimus facilis fugit iusto, non odit qui repudiandae sed? Accusamus aperiam consequatur,\n            culpa cumque dicta dolore dolores ducimus earum fuga id incidunt iure maxime modi neque\n            porro praesentium quam! Nisi.</p>\n\n        <p>Dicta distinctio, dolore id incidunt modi obcaecati quis voluptatem! Ad, animi deserunt\n            ducimus eum expedita laborum, odit possimus quia, quisquam vel voluptatem voluptatum.\n            Deleniti dolorem minima quod ratione. Commodi, eius!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus adipisci animi\n            architecto at deserunt eaque earum fugiat fugit molestias, nam numquam placeat\n            repellendus tempore unde ut veniam vero! Asperiores, nihil.</p>\n\n        <p>Alias cum cupiditate delectus distinctio dolorem doloremque eos et expedita explicabo\n            facere fugit maxime molestias nemo non nostrum, odit omnis quae ratione repellat,\n            sapiente soluta suscipit tenetur totam ut voluptatum.</p>\n\n        <p>Adipisci beatae commodi corporis dolorem esse excepturi, ipsum magni modi nemo obcaecati,\n            odit pariatur quidem quos? Consectetur dicta facere incidunt, ipsum iure minima minus\n            molestiae natus odio perferendis quod veniam.</p>\n\n        <p>Amet at atque cupiditate, eaque eos et exercitationem illum, in magni odit optio\n            provident quae repellat, repellendus sint temporibus voluptas. Cumque enim eveniet harum\n            libero mollitia nesciunt qui tempore voluptate!</p>\n\n        <p>Animi, aperiam atque commodi consequatur cumque debitis dicta dolore dolorum eaque error\n            est ex hic illum ipsam libero minima nesciunt, nisi numquam omnis praesentium quas qui\n            reiciendis repellendus sequi suscipit.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate in laboriosam maxime\n            odio perspiciatis quia temporibus? Architecto cumque distinctio ea, hic id molestias\n            nesciunt repellat sapiente suscipit voluptate. Dolor, similique.</p>\n\n        <p>Asperiores aut dicta doloremque dolorum ea enim et ex explicabo ipsam laboriosam minus\n            nesciunt non officiis quasi qui quis ratione, repudiandae ullam ut voluptatum. Ab dicta\n            explicabo nam nihil obcaecati?</p>\n\n        <p>Ab, accusamus cumque dicta dolor esse est eum explicabo fugiat inventore iste labore,\n            mollitia neque numquam obcaecati odio optio placeat porro possimus quibusdam quisquam\n            saepe suscipit vel voluptas voluptate voluptatibus.</p>\n\n        <p>Amet consequuntur deleniti dolore, dolorum ea earum error fugiat ipsum laudantium magnam\n            molestias neque nobis nulla praesentium quaerat qui quis quos repellat repudiandae sint,\n            tempora ut velit voluptatibus! Maiores, saepe?</p>\n\n        <p>Aliquam, aperiam dolor exercitationem id in ullam voluptatum? Deserunt, eum laborum\n            laudantium nesciunt omnis possimus quas veritatis. Asperiores ducimus esse laudantium\n            quam quidem rem tempora velit? Ea hic neque non!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Asperiores consequuntur\n            doloribus et magni nostrum, quia recusandae, repellendus sint tenetur totam vero\n            voluptate. Hic impedit laborum modi necessitatibus nisi repellat unde.</p>\n\n        <p>Aliquid at aut autem, delectus dolore dolorem eaque earum incidunt ipsa, itaque laborum\n            laudantium molestiae molestias numquam officiis quasi qui quia quod recusandae repellat\n            sed sint vero vitae, voluptas voluptatum!</p>\n\n        <p>Earum labore laudantium quod ullam. Aliquam amet aperiam dolor error magni nam natus\n            numquam possimus quasi vero. Aliquam culpa distinctio inventore laudantium modi\n            molestiae nobis quia quo, repellat tempore, veniam?</p>\n\n        <p>Aliquam aliquid architecto assumenda autem dicta ducimus ea error et ex excepturi in\n            incidunt ipsam magnam nemo, odio officia quaerat qui quis quisquam ratione repudiandae\n            rerum, saepe, sapiente similique voluptatibus.</p>\n\n        <p>Debitis est maxime quaerat quod voluptatem. A ab aperiam autem blanditiis, consequatur\n            cumque delectus dolore dolorum fugit id minima necessitatibus, officiis quisquam ratione\n            recusandae sapiente sequi, sint temporibus ut veritatis.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque cupiditate dicta, eius\n            eligendi nulla possimus sit soluta tempora tempore ullam? Corporis laborum maiores neque\n            nostrum possimus, quo reiciendis unde vitae.</p>\n\n        <p>Alias aliquam assumenda, cumque deleniti expedita facilis fugit hic impedit ipsa itaque\n            libero minima nemo nihil non, numquam perspiciatis praesentium quis quod sed velit,\n            voluptate voluptatem voluptates? Dolor, quae, reprehenderit.</p>\n\n        <p>Commodi, molestiae, unde? Ea ex perspiciatis possimus suscipit. Ad adipisci aliquid\n            commodi consequuntur deleniti, doloremque doloribus eligendi eum in, itaque laborum\n            magni minus molestiae nisi nulla quas qui quis rerum?</p>\n\n        <p>Ad aliquam amet aspernatur atque aut consequatur distinctio fuga inventore, ipsum\n            laudantium magni necessitatibus nesciunt quaerat quasi, quia quod ratione ullam ut\n            veritatis vero. Consectetur corporis itaque natus quis sunt.</p>\n\n        <p>Ad autem commodi cumque dolore doloribus dolorum expedita, fugiat inventore omnis\n            temporibus! Amet blanditiis dolor eaque earum eligendi enim, error, ipsum mollitia\n            obcaecati quaerat quasi qui quia sint temporibus velit!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus ad alias animi,\n            aspernatur consectetur cupiditate debitis dignissimos fuga hic impedit minus nam natus\n            numquam, placeat quibusdam repellendus similique ullam vel!</p>\n\n        <p>Blanditiis deleniti, id impedit minima minus molestiae repellendus saepe veritatis! Autem\n            ea necessitatibus nemo obcaecati quisquam recusandae repellendus soluta voluptates! Ab\n            assumenda deleniti hic incidunt molestiae odit quasi, quidem tempore?</p>\n\n        <p>Aperiam, esse fugiat iusto nihil similique sunt ullam voluptate. At, commodi cum ea earum\n            eius eum excepturi fugit, libero minima modi odit quaerat quam quas rem sed sunt ullam\n            voluptatibus.</p>\n\n        <p>Cumque dignissimos hic iure laborum, neque pariatur praesentium. Accusamus amet\n            aspernatur molestias nulla ratione similique soluta, temporibus veritatis voluptatum?\n            Delectus dolor earum ipsum natus pariatur perspiciatis placeat tenetur velit vero.</p>\n\n        <p>Accusamus, adipisci aspernatur atque, autem dicta doloremque ea eius eos eveniet\n            exercitationem fuga hic impedit ipsam laboriosam minus necessitatibus placeat\n            praesentium quis quod quos ratione repudiandae sapiente sed sunt voluptatibus!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus ad aliquam architecto\n            commodi dignissimos eveniet expedita harum ipsam, nisi, officiis pariatur perferendis\n            praesentium quibusdam quo saepe tenetur ullam, vel voluptatibus!</p>\n\n        <p>Accusantium, aperiam ea enim esse illum voluptatem. Aperiam blanditiis culpa dolores\n            illum ipsam iste officia quasi, unde? Aperiam dicta, exercitationem, fugiat, ipsa\n            laboriosam libero maxime minima necessitatibus nihil unde vitae?</p>\n\n        <p>Blanditiis consectetur deleniti distinctio dolore earum fugit iure iusto, necessitatibus\n            officiis, omnis quod sunt unde vel? Blanditiis commodi, consequuntur cupiditate hic nemo\n            nisi nobis officiis quisquam quos. At delectus, quas.</p>\n\n        <p>Ipsam possimus quidem repellendus sunt. Asperiores atque consequatur debitis dolores\n            ducimus illo in, ipsam numquam possimus quibusdam, quidem ratione, saepe veritatis. At\n            corporis dolorem doloribus eligendi iusto natus pariatur praesentium!</p>\n\n        <p>Alias aspernatur distinctio dolorum ea id ipsa laboriosam modi natus necessitatibus\n            numquam, officia possimus reprehenderit? Distinctio ea eligendi obcaecati, perspiciatis\n            quas reprehenderit vel vero voluptatem? Illum ipsum libero minima non?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab ad, animi aperiam dolor\n            dolore illo itaque laborum minus nam necessitatibus nemo nihil nobis numquam odit\n            officia optio, tempore voluptate voluptatem?</p>\n\n        <p>Ad aliquid autem cum cumque, debitis ducimus eius eligendi enim facere facilis hic\n            inventore ipsam ipsum nesciunt nisi numquam obcaecati officia omnis, placeat reiciendis\n            suscipit vel voluptate? Dignissimos, eligendi tempora?</p>\n\n        <p>Architecto eius eum nobis quas reprehenderit sequi vel veniam voluptatem? Ab accusamus\n            assumenda aut cumque, ducimus eligendi facilis, inventore nesciunt non odit quam\n            recusandae unde, ut vel voluptas! Et, incidunt.</p>\n\n        <p>Aperiam assumenda, aut culpa cum dignissimos eius in nobis obcaecati odio optio possimus\n            provident, quae quaerat sapiente, sequi sint vitae. Earum iusto magnam similique tenetur\n            voluptatum? Nulla perferendis sunt vitae?</p>\n\n        <p>Ad, asperiores, consequuntur culpa cum cumque earum eligendi est eveniet excepturi\n            explicabo impedit itaque, laboriosam libero magnam molestias nam quae quis reprehenderit\n            sint sit tempora tempore unde veniam vero voluptas.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis deleniti distinctio,\n            eveniet facere inventore laborum minus natus odio possimus quaerat. At, deleniti\n            deserunt est ex laborum libero neque nihil rerum!</p>\n\n        <p>Animi distinctio, dolorum harum illo inventore mollitia quod recusandae vel? A eius hic\n            incidunt magnam nostrum perspiciatis rerum sapiente ut vitae! Architecto ea earum odit\n            perferendis quaerat quia voluptatem. Nulla.</p>\n\n        <p>Aliquid amet earum excepturi ipsum libero quibusdam reprehenderit suscipit. Architecto,\n            atque cumque dolore fugit hic iusto labore libero minus nesciunt pariatur porro qui\n            saepe sint tempora vitae. Adipisci, dolorem libero!</p>\n\n        <p>Corporis explicabo iste itaque non quae quis quod tenetur vel veniam voluptatibus. Autem\n            blanditiis, deleniti dignissimos modi mollitia perspiciatis veritatis. Ab aliquid\n            deserunt dicta dolores error eveniet nulla obcaecati sunt!</p>\n\n        <p>Aliquid hic itaque magnam minima nobis quo reprehenderit. A at corporis debitis\n            doloribus, ipsa laboriosam, laudantium libero magni natus omnis porro quas quod ratione\n            reiciendis repellat, ullam vel vitae voluptatum?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequatur delectus distinctio\n            dolor dolore earum eius eos eum id, in iure labore magnam mollitia numquam obcaecati\n            quisquam saepe voluptate voluptatem, voluptatibus!</p>\n\n        <p>A aspernatur dolor fugit illo impedit inventore laboriosam libero mollitia nesciunt nulla\n            quibusdam, recusandae rerum sapiente? Accusamus ad asperiores aut consectetur, culpa\n            doloribus error nulla officiis optio qui soluta temporibus.</p>\n\n        <p>Beatae commodi, dolor, dolorem enim et eveniet itaque iusto quibusdam rem saepe sed sunt\n            voluptate, voluptates? Debitis in pariatur perspiciatis provident quasi. Consectetur,\n            earum explicabo iure nihil reiciendis vel voluptate?</p>\n\n        <p>Architecto debitis eius eveniet? Ab accusantium aliquid, assumenda atque aut\n            consequuntur, cupiditate ea eius ex molestias, nihil quas quisquam ratione rerum sit\n            suscipit temporibus velit veritatis! Facere nam necessitatibus tempore!</p>\n\n        <p>Asperiores, aspernatur assumenda cum, dignissimos distinctio eius inventore iure minima\n            officia praesentium quaerat quas reprehenderit sapiente sequi, vel. Deleniti distinctio\n            dolorem ea explicabo iusto nobis officia perspiciatis quibusdam quos voluptatum.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae enim fugiat modi\n            repudiandae voluptate. Ab blanditiis, consequuntur, doloremque dolores dolorum eos et\n            facilis id magni possimus qui sapiente sint voluptas!</p>\n\n        <p>Accusantium aperiam beatae et, excepturi expedita harum iste molestias, nihil odit quae\n            quidem recusandae rerum suscipit? Ab accusantium illum minus mollitia nobis possimus\n            quaerat, quasi quod repellendus sed sit suscipit!</p>\n\n        <p>Ab accusantium aspernatur atque consequatur debitis dolor dolores eius esse\n            exercitationem expedita fuga ipsa ipsum laudantium natus officia perspiciatis placeat\n            porro quae quam quas, quia, quos saepe tenetur totam voluptatem.</p>\n\n        <p>Beatae distinctio libero modi mollitia, natus possimus quibusdam sequi ut! Aliquam\n            aspernatur deserunt doloremque exercitationem illum incidunt, laboriosam laborum magni\n            molestiae nobis, nostrum obcaecati officiis omnis sequi, unde ut veritatis.</p>\n\n        <p>A assumenda autem, commodi dicta expedita explicabo facere fuga fugit harum natus placeat\n            porro provident quidem rem, sequi soluta tempore tenetur voluptatem. A alias architecto\n            iusto necessitatibus numquam officiis perspiciatis?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus animi cupiditate\n            inventore quis quisquam sequi sunt? Ab alias autem est eum eveniet expedita ipsam nihil\n            officiis quisquam ratione, rerum veniam.</p>\n\n        <p>A accusantium aliquid at culpa dignissimos facere facilis harum id ipsam iste modi neque\n            nesciunt odio omnis, perferendis porro possimus quo repudiandae sunt tempora tenetur\n            veritatis voluptates voluptatum! Quos, sed.</p>\n\n        <p>At ducimus ipsum, maiores qui quo reiciendis? Cum doloremque eos impedit, minus\n            perspiciatis velit. Consectetur dolores eaque facere provident qui quo rerum. Adipisci\n            consequuntur cumque dolorem earum mollitia odio, quos.</p>\n\n        <p>Adipisci, animi atque commodi corporis dicta dignissimos dolores, doloribus eligendi\n            eveniet facere laboriosam modi mollitia nam nobis officia perferendis perspiciatis\n            possimus quas quidem quo quod rem repudiandae totam vero voluptatum!</p>\n\n        <p>Animi, blanditiis iusto laborum libero quasi reiciendis sed voluptatem voluptatum. Ab\n            alias corporis, cupiditate distinctio dolores ducimus eos excepturi harum illum itaque,\n            molestiae omnis quae repellendus sapiente, vero? Aliquid, odit.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Delectus doloremque doloribus\n            eligendi enim eveniet modi molestiae nihil reiciendis. Ab consequuntur doloribus laborum\n            magni perferendis sequi suscipit! Asperiores, distinctio, eligendi! Labore.</p>\n\n        <p>Amet asperiores, beatae commodi consequatur ducimus eaque eos esse, hic id natus possimus\n            quia rerum similique! Consectetur cum facere facilis soluta, tenetur ullam. Amet, fugit\n            minus mollitia quibusdam tenetur voluptate?</p>\n\n        <p>Animi blanditiis cumque, cupiditate dolorem doloremque earum, ipsam maiores officiis,\n            quidem reiciendis soluta temporibus velit! Commodi error ex facere, id in laboriosam\n            natus nemo porro quo repudiandae sint, suscipit voluptatem.</p>\n\n        <p>Deleniti, quibusdam, sed. Numquam, sint, tempore. Aliquam architecto, debitis illum\n            nesciunt quasi quibusdam quo sed totam? Adipisci at autem debitis eaque esse nemo\n            quibusdam, saepe similique sunt. Eaque, nobis, reprehenderit.</p>\n\n        <p>Deleniti eum pariatur quis rem vero! Consequuntur exercitationem pariatur quos unde.\n            Accusamus cumque dignissimos in molestias nobis porro quos sunt? Aperiam deleniti\n            dignissimos explicabo hic molestias nihil quidem reiciendis tempora.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Architecto asperiores autem,\n            deleniti facere in, libero optio praesentium quae quaerat quam quos recusandae rerum\n            tempora totam vel. Asperiores fugit magni perspiciatis?</p>\n\n        <p>Aspernatur eius, facere itaque omnis possimus ut! Accusamus alias asperiores autem culpa\n            cupiditate harum minima neque obcaecati quibusdam soluta. Aspernatur assumenda\n            exercitationem fuga harum ipsa omnis optio, perferendis quod sunt.</p>\n\n        <p>Consequatur, ea quisquam. Aut corporis dignissimos eligendi eum expedita, explicabo\n            molestias non obcaecati odio quaerat quos repellat veniam! Alias aliquam aspernatur\n            deleniti dolore excepturi ipsa molestias nihil repellat saepe suscipit.</p>\n\n        <p>Aperiam delectus enim fugit inventore, modi mollitia repellat similique! Accusamus,\n            aperiam assumenda excepturi explicabo harum labore necessitatibus quisquam sed tenetur?\n            Deleniti dignissimos, iste laudantium odit officiis porro quae quia voluptatum?</p>\n\n        <p>Amet dolorum, earum fugit in ipsum magni nostrum quis! Accusantium aliquam blanditiis\n            deserunt dolor ea, illum impedit itaque iure mollitia necessitatibus nemo obcaecati\n            perspiciatis placeat quod, reprehenderit sapiente sint totam?</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. A ad atque consectetur\n            consequuntur corporis dicta esse facilis id ipsa labore nihil odit, porro quod sequi\n            sunt temporibus vitae voluptatem voluptatum?</p>\n\n        <p>Asperiores, beatae commodi eligendi excepturi, fugiat impedit in necessitatibus qui quos,\n            reprehenderit saepe sapiente sunt vitae? Aperiam aut dolorem doloremque dolores est et\n            eum laborum, magni modi sed totam velit?</p>\n\n        <p>Aliquam consequatur culpa dolor dolorem excepturi expedita illum laboriosam officiis unde\n            voluptates! Assumenda atque beatae culpa dolorem illo, laborum quod! Consequuntur cum\n            esse molestias provident quos ratione voluptatum. Eaque, error.</p>\n\n        <p>Ab dolores iste molestias neque numquam odio officia veritatis! Asperiores dolores ea\n            iure omnis quam! Consectetur illo tempore velit. Amet et ex minima nemo odio placeat\n            quisquam quos repudiandae sapiente?</p>\n\n        <p>Ab blanditiis delectus, dicta est exercitationem explicabo laboriosam libero modi nam,\n            nihil obcaecati officia officiis optio placeat possimus, quisquam reiciendis repellat\n            sapiente sed sint sit tempora ullam vero voluptas voluptatum.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam aspernatur at commodi\n            debitis dignissimos dolores ea eaque, fuga iusto magni nesciunt nulla numquam obcaecati,\n            perferendis quisquam sit suscipit voluptates voluptatibus.</p>\n\n        <p>A blanditiis, consequatur deserunt dolores dolorum ea eveniet expedita, ipsa iste natus\n            neque non omnis pariatur porro provident quasi quia quidem reprehenderit rerum saepe\n            sequi sit sunt temporibus ut voluptatibus?</p>\n\n        <p>Amet commodi, dolorum earum ex reprehenderit saepe. Et exercitationem odio repellendus\n            unde ut? Aperiam libero nulla omnis quasi, repellendus repudiandae velit? Culpa enim eos\n            iste pariatur quasi quisquam sint ut!</p>\n\n        <p>Assumenda eius eveniet nihil officia quaerat rem vero. Assumenda culpa error ipsa libero\n            numquam placeat porro, quam similique unde? Ab adipisci, dolor dolorem doloribus eum\n            fugit incidunt praesentium quis rerum.</p>\n\n        <p>Ab assumenda aut beatae cum deleniti enim eveniet id impedit labore magni modi molestias\n            nostrum nulla numquam obcaecati officiis omnis optio, quod repellat, repudiandae sequi\n            sit veniam veritatis voluptas voluptatibus!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab accusamus accusantium\n            cupiditate deleniti dolore doloribus earum eius, minima modi molestiae, neque quas quod\n            rem, saepe sapiente unde veniam vitae voluptate.</p>\n\n        <p>Deleniti facere nihil porro similique? Ea itaque nulla obcaecati odit, quidem ratione!\n            Accusantium amet asperiores cupiditate, inventore minima odit quae quas, quibusdam\n            recusandae repellat sapiente suscipit temporibus. Impedit minus, saepe!</p>\n\n        <p>Animi atque blanditiis consequuntur distinctio eligendi error iusto libero minima modi\n            molestias nihil nobis obcaecati officiis placeat porro quaerat qui, quidem quo quod rem\n            repudiandae sequi similique voluptatibus. Adipisci, incidunt!</p>\n\n        <p>Aspernatur, dolores iure quidem repellendus voluptate voluptates. Accusamus, architecto\n            beatae deserunt eius error facere labore laborum, maxime molestias, sint veniam\n            veritatis. Eos magnam minus mollitia placeat, saepe tempora? Quae, tenetur.</p>\n\n        <p>Aspernatur dolores earum illo labore, mollitia natus odit omnis similique. Blanditiis\n            enim, eos facere ipsa magni nihil odio quod. Alias ducimus illum, iusto nobis nulla\n            optio provident qui repudiandae voluptatem!</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus alias aspernatur\n            beatae cum cumque dolorem ducimus eligendi facilis iste laborum, natus omnis perferendis\n            qui reprehenderit, repudiandae sequi ullam vitae voluptatum?</p>\n\n        <p>Ad aspernatur assumenda, aut delectus dicta distinctio, dolorem enim error eveniet\n            exercitationem maiores minima molestiae necessitatibus nemo nesciunt praesentium quod\n            tenetur vero! Delectus eius enim ex minima perferendis praesentium provident!</p>\n\n        <p>Adipisci alias, aperiam assumenda autem consectetur debitis delectus dolore, dolores eius\n            eum, id minima minus molestias necessitatibus nemo neque nihil nisi odit optio\n            praesentium quos sapiente sit totam vitae voluptates.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus alias aspernatur\n            beatae cum cumque dolorem ducimus eligendi facilis iste laborum, natus omnis perferendis\n            qui reprehenderit, repudiandae sequi ullam vitae voluptatum?</p>\n\n        <p>Ad aspernatur assumenda, aut delectus dicta distinctio, dolorem enim error eveniet\n            exercitationem maiores minima molestiae necessitatibus nemo nesciunt praesentium quod\n            tenetur vero! Delectus eius enim ex minima perferendis praesentium provident!</p>\n\n        <p>Adipisci alias, aperiam assumenda autem consectetur debitis delectus dolore, dolores eius\n            eum, id minima minus molestias necessitatibus nemo neque nihil nisi odit optio\n            praesentium quos sapiente sit totam vitae voluptates.</p>\n    </div>\n    <div>\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus alias aspernatur\n            beatae cum cumque dolorem ducimus eligendi facilis iste laborum, natus omnis perferendis\n            qui reprehenderit, repudiandae sequi ullam vitae voluptatum?</p>\n\n        <p>Ad aspernatur assumenda, aut delectus dicta distinctio, dolorem enim error eveniet\n            exercitationem maiores minima molestiae necessitatibus nemo nesciunt praesentium quod\n            tenetur vero! Delectus eius enim ex minima perferendis praesentium provident!</p>\n\n        <p>Adipisci alias, aperiam assumenda autem consectetur debitis delectus dolore, dolores eius\n            eum, id minima minus molestias necessitatibus nemo neque nihil nisi odit optio\n            praesentium quos sapiente sit totam vitae voluptates.</p>\n    </div>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync-client/test/fixtures/index-urls.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\"/>\n    <link rel=\"stylesheet\" href=\"fonts/roboto/stylesheet.css\"/>\n</head>\n<body>\n\n    <h1 style=\"font-family: robotoregular, serif\">Hello from the test Page</h1>\n    <a href=\"forms.html\">Forms</a>\n    <a href=\"scrolling.html\">Scrolling Window</a>\n\n    <a href=\"http://0.0.0.0:8001/forms.html\">\n        <div>\n            <div>\n                <img src=\"http://placekitten.com/400/600\" alt=\"\"/>\n            </div>\n        </div>\n    </a>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync-client/test/fixtures/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" href=\"css/style.css\"/>\n    <!--<link rel=\"stylesheet\" href=\"fonts/roboto/stylesheet.css\"/>-->\n</head>\n<body>\n\n    <h1 style=\"font-family: robotoregular, serif\">Hello from the test Page</h1>\n    <a href=\"forms.html\">Forms</a>\n    <a href=\"scrolling.html\">Scrolling Window</a>\n\n    <!--<audio src=\"http://mp3.miselec.com/wp-content/uploads/2013/04/05%20-%20We%20No%20Speak%20Americano.mp3\" preload=\"auto\" controls></audio>-->\n    <!--<audio src=\"Heal8-Bit.ogg\" preload=\"auto\" controls></audio>-->\n    <video src=\"320x240.ogg\" controls>\n        Your browser does not support the <code>video</code> element.\n    </video>\n\n    <p id=\"shower\">Click me</p>\n    <p id=\"toggle\"></p>\n\n    <script type=\"text/javascript\">\n\n        var old = window.addEventListener ? false : true;\n//        alert(old);\n        var elem = document.getElementById(\"shower\");\n        var elem2 = document.getElementById(\"toggle\");\n\n<!---->\n        elem[old ? \"attachEvent\" : \"addEventListener\"]((old ? \"on\" : \"\")  + \"click\", function () {\n            console.log(\"~~~~~Click event occured~~~~~~\");\n        }, true);\n    </script>\n\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync-client/test/fixtures/inputs.html",
    "content": "<form id=\"form01\">\n\n<label for=\"name\">Text Inputs: synced</label>\n<input type=\"text\" name=\"name\" value=\"name here\" id=\"name\"/>\n\n<label for=\"email\">Text Inputs: synced</label>\n<input type=\"text\" name=\"email\" value=\"email here\" id=\"email\"/>\n\n<p><label for=\"message\">Text Areas: synced</label></p>\n<textarea name=\"message\" id=\"message\" cols=\"30\" rows=\"10\">shane</textarea>\n\n<div>\n    <label for=\"option-1\">Option 1</label>\n    <input type=\"checkbox\" name=\"checkbox\" id=\"option-1\">\n    <label for=\"option-2\">Option 2</label>\n    <input type=\"checkbox\" name=\"checkbox\" id=\"option-2\">\n</div>\n\n<p>\n    <label for=\"confirm-0\">No</label>\n    <input type=\"radio\" name=\"confirm\" id=\"confirm-0\" value=\"1\"/>\n    <label for=\"confirm-1\">yes</label>\n    <input type=\"radio\" name=\"confirm\" id=\"confirm-1\" value=\"0\"/>\n    <label for=\"confirm-2\">Maybe</label>\n    <input type=\"radio\" name=\"confirm\" id=\"confirm-2\" value=\"0\"/>\n</p>\n\n<select name=\"country\" id=\"country\">\n    <option value=\"uk\">Uk</option>\n    <option value=\"spain\">Spain</option>\n    <option value=\"france\">France</option>\n</select>\n\n</form>"
  },
  {
    "path": "packages/browser-sync-client/test/fixtures/less.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" href=\"css/bootstrap-less.css\"/>\n</head>\n<body>\n\n    <h1>Hello from the test</h1>\n    <a href=\"forms.html\">Forms</a>\n    <a href=\"scrolling.html\">Scrolling Window</a>\n\n    <a href=\"forms.html\">\n        <div>\n            <div>\n                <img src=\"http://placekitten.com/400/600\" alt=\"\"/>\n            </div>\n        </div>\n    </a>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync-client/test/fixtures/links.html",
    "content": "<a href=\"#\" id=\"link\">Link</a>\n<a href=\"#\" id=\"img-link\">\n    <div>\n        <img src=\"\" alt=\"\"/>\n    </div>\n</a>"
  },
  {
    "path": "packages/browser-sync-client/test/fixtures/proxy-headers.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\"/>\n    <link rel=\"stylesheet\" href=\"fonts/roboto/stylesheet.css\"/>\n</head>\n<body>\n\n    <h1 style=\"font-family: robotoregular, serif\">Hello from the test Page</h1>\n    <a href=\"forms.html\">Forms</a>\n    <a href=\"scrolling.html\">Scrolling Window</a>\n\n    <p id=\"shower\">Click me</p>\n    <p id=\"toggle\"></p>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync-client/test/fixtures/proxy-ip.html",
    "content": "\n<!doctype html>\n<!--[if lt IE 7]>      <html class=\"no-js ie ie6 lt-ie10 lt-ie9 lt-ie8 lt-ie7\" lang=\"en\"> <![endif]-->\n<!--[if IE 7]>         <html class=\"no-js ie ie7 lt-ie10 lt-ie9 lt-ie8\" lang=\"en\"> <![endif]-->\n<!--[if IE 8]>         <html class=\"no-js ie ie8 lt-ie10 lt-ie9\" lang=\"en\"> <![endif]-->\n<!--[if IE 9]>         <html class=\"no-js ie ie9 lt-ie10\" lang=\"en\"> <![endif]-->\n<!--[if gt IE 9]><!--> <html class=\"no-js ffly\" lang=\"en\"> <!--<![endif]-->\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n    <title>Home -  Firecrest UK</title>\n\n    <link rel=\"shortcut icon\" href=\"favicon.ico\" />\n    <link rel=\"address bar icon\" href=\"favicon.ico\">\n\n    <link rel=\"stylesheet\" href=\"/css/style.css\"/>\n    <script src=\"/js/dist/modernizr.min.cd79908d.js\"></script>\n\n</head>\n\n<body id=\"bodyTop\">\n<div class=\"body-mask hidden animated fadeIn\"></div>\n\n<div class=\"wrapper header\">\n    <header class=\"container clearfix\" role=\"banner\">\n        <div class=\"logo\">\n            <a href=\"http://0.0.0.0:8001/home\" class=\"logo__img\" title=\"Firecrest UK LTD Home Page\">\n                Firecrest UK LTD\n            </a>\n        </div>\n        <nav role=\"navigation\" class=\"clearfix nav-container active\">\n            <div class=\"show-menu icon-link fast-click\">\n\n                <span class=\"not-palm menu-text\">MENU</span>\n                <span class=\"icon-menu\"></span>\n                <span class=\"icon-close hidden animated fadeInUp\"></span>\n            </div>\n            <ul class=\"nav main-nav\">\n\n\n                <li class=\"only-palm\">\n                    <a href=\"tel:0800 783 05 88\" tabindex=\"-1\" title=\"Call us on 0800 783 05 88\"><strong>Tel:</strong> 0800 783 05 88</a>\n                </li>\n\n\n\n                <li>\n                    <a href=\"/home\" title=\"Home\" class=\"\">Home</a>\n                </li>\n\n\n\n\n                <li class=\"has-dropdown\">\n\n                    <a href=\"http://0.0.0.0:8001/services\" class=\"with-caret\" title=\"Firecrest UK LTD Services\">\n                        Services <b class=\"caret\"></b>\n                    </a>\n\n                    <div class=\"drop-down\">\n                        <ul class=\"nav sub-nav notify\">\n\n                            <li><a href=\"http://0.0.0.0:8001/services\" tabindex=\"-1\" title=\"View All Services\">VIEW ALL</a></li>\n\n\n                            <li>\n                                <a href=\"http://0.0.0.0:8001/services/fire-extinguishers\" class=\"\" tabindex=\"-1\" title=\"Fire Extinguishers\">\n                                    Fire Extinguishers                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://0.0.0.0:8001/services/fire-alarms\" class=\"\" tabindex=\"-1\" title=\"Fire Alarms\">\n                                    Fire Alarms                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://0.0.0.0:8001/services/fire-risk-assessment\" class=\"\" tabindex=\"-1\" title=\"Fire Risk Assessment\">\n                                    Fire Risk Assessment                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://0.0.0.0:8001/services/staff-fire-safety-training\" class=\"\" tabindex=\"-1\" title=\"Staff Fire Safety Training\">\n                                    Staff Fire Safety Training                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://0.0.0.0:8001/services/emergency-lighting-maintenance\" class=\"\" tabindex=\"-1\" title=\"Emergency Lighting Maintenance\">\n                                    Emergency Lighting Maintenance                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://0.0.0.0:8001/services/portable-appliance-testing\" class=\"\" tabindex=\"-1\" title=\"Portable Appliance Testing\">\n                                    Portable Appliance Testing                    </a>\n                            </li>\n                        </ul>\n                    </div>\n\n                </li>\n\n\n\n\n                <li>\n                    <a href=\"/about\" title=\"About Us\" class=\"\">About Us</a>\n                </li>\n\n\n\n\n                <li>\n                    <a href=\"/contact\" title=\"Contact Us\" class=\"\">Contact Us</a>\n                </li>\n\n\n\n\n                <li>\n                    <a href=\"/testimonials\" title=\"Testimonials\" class=\"\">Testimonials</a>\n                </li>\n\n\n\n            </ul>        </nav>\n    </header>\n</div>    <main role=\"main\">\n    <!-- Hero -->\n    <div class=\"wrapper custom-bg--01-03\">\n        <div class=\"container palm--full-bleed\">\n            <article class=\"hero\">\n                <div class=\"hero-content hero--red\">\n\n                    <h1 class=\"hero-heading\">Firecrest UK LTD</h1>\n                    <h2 class=\"p-styles\">\n                        Welcome to <strong>Firecrest UK LTD</strong>, a midlands based supplier of <strong>fire safety equipment</strong> and solutions for protecting your business from fire.\n                        <a href=\"\" class=\"only-palm inverted trigger\" data-target=\"#hero-subtext\" data-remove=\"true\" data-remove-class=\"not-palm\">read more...</a>\n                    </h2>\n                    <h3 class=\"p-styles not-palm sub-text animated fadeInUp\" id=\"hero-subtext\">\n                        Whether you require fire risk assessments, fire alarm installation and maintenance, fire extinguisher supply and service, Staff fire training or a complete solution to protect your business from the devastation of fire, we can put together a plan to meet all your companies’ requirements.\n                    </h3>\n                    <p>\n                        <a href=\"http://0.0.0.0:8001/about\" class=\"text-bold text-white\">\n                            <span class=\"icon-youtube inline-icon push-right\"></span>Watch our video\n                        </a>\n                    </p>\n\n                    <footer class=\"palm--padding\">\n                        <a href=\"http://0.0.0.0:8001/contact\" class=\"button button--white palm--full-width with-caret\">\n                            Contact us <b class=\"caret caret--red\"></b>\n                        </a>\n                        <a href=\"http://0.0.0.0:8001/services\" class=\"button button--white palm--full-width with-caret\">\n                            Our Services <b class=\"caret caret--red\"></b>\n                        </a>\n                    </footer>\n                </div>\n            </article>\n        </div>\n    </div>\n\n    <!-- Banner -->\n    <div class=\"wrapper\">\n        <div class=\"container\">\n            <article class=\"portfolio text--center\">\n                <h2>People we've loved working with over the years</h2>\n                <div class=\"portfolio-logos\"></div>\n                <!--            <a href=\"--><?//= URL::route(\"testimonials\"); ?><!--\" title=\"\">-->\n                <!--                View More-->\n                <!--            </a>-->\n            </article>\n        </div>\n    </div>\n\n    <!-- Testimonials section -->\n    <div class=\"wrapper custom-bg--01\">\n        <div class=\"overlay--01\">\n            <div class=\"container\">\n                <article class=\"text--center testimonials\">\n                    <h2 class=\"heading-inverted\">Testimonials</h2>\n                    <div class=\"grid equal-heights\">\n                        <div class=\"grid__item one-third palm--full-width\">\n                            <div class=\"callout-box min-height\">\n                                <h3 class=\"callout-box__title\">Sally Pinder\n                                    <small>B & M Honda</small>\n                                </h3>\n                                <p>Great service, delivered on time with no hassle. Good Communication and knowledge, nothing more to say other than well done!</p>\n                            </div>\n                        </div><!--\n                    --><div class=\"grid__item one-third palm--full-width not-palm\">\n                        <div class=\"callout-box min-height\">\n                            <h3 class=\"callout-box__title\">Louise Colebourne\n                                <small>Liberty Hardware</small>\n                            </h3>\n                            <p>Firecrest provided prompt and informative service meeting all our requirements and I have no complaints</p>\n                            <p><strong>Thanks again</strong></p>\n                        </div>\n                    </div><!----><div class=\"grid__item one-third palm--full-width not-palm\">\n                        <div class=\"callout-box min-height\">\n                            <h3 class=\"callout-box__title\">Tony Steward\n                                <small>Balfour Beatty Rail</small>\n                            </h3>\n                            <p>Great service, delivered on time with no hassle. Good Communication and knowledge, nothing more to say other than well done!</p>\n                        </div>\n                    </div>\n                    </div>\n                    <a class=\"button button--red button--small with-caret\" href=\"http://0.0.0.0:8001/testimonials\">\n                        View All Testimonials\n                        <b class=\"caret caret--white\"></b>\n                    </a>\n                </article>\n            </div>\n        </div>\n    </div>\n\n    <div class=\"wrapper\">\n        <div class=\"container\">\n            <div class=\"grid push--top-bottom\">\n                <div class=\"grid__item one-third palm--full-width palm--push-bottom\">\n\n                    <div class=\"info-block\">\n                        <figure class=\"image-block\">\n                            <img src=\"/img/info-fire-safety.jpg\" alt=\"Fire Safety Training\" />\n                        </figure>\n                        <h4>Fire Safety Training</h4>\n                        <p>\n                            Firecrest UK LTD offer a full range of fire satefy training. We include a review of your fire precautions and procedures while conducting the training at your own facilities for total convenience.\n                            <a href=\"http://0.0.0.0:8001/services/staff-fire-safety-training\">Read more...</a>\n                        </p>\n                        <a href=\"http://0.0.0.0:8001/about\" class=\"text-bold\">\n                            <span class=\"icon-youtube inline-icon push-right\"></span>Watch our video\n                        </a>\n                    </div>\n\n                </div><!--\n            --><div class=\"grid__item one-third palm--full-width palm--push-bottom\">\n\n                <div class=\"info-block\">\n\n                    <figure class=\"image-block\">\n                        <img src=\"/img/info-vans.jpg\" alt=\"About Firecrest UK\" />\n                    </figure>\n\n                    <h4>About Us</h4>\n\n                    <p>\n                        Firecrest UK Ltd. are a family run business based in the East Midlands and provide a range of services designed helping businesses meet their legal obligations and protecting their employees and premises from the ravages of fire.\n                        <a href=\"http://0.0.0.0:8001/about\">Read more...</a>\n                    </p>\n\n                </div>\n\n            </div><!--\n            --><div class=\"grid__item one-third palm--full-width\">\n\n                <div class=\"info-block\">\n\n                    <figure class=\"image-block\">\n                        <div class=\"image-block__content outline\">\n                            <img src=\"/img/uk-assoc2.png\" alt=\"UK Fire Association Audited Member\" />\n                        </div>\n                    </figure>\n\n                    <h4>Our Services include</h4>\n                    <ul class=\"text-list list--flush-left\">\n\n\n                        <li>\n                            <a href=\"http://0.0.0.0:8001/services/fire-extinguishers\" class=\"\" title=\"Fire Extinguishers\">\n                                Fire Extinguishers                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://0.0.0.0:8001/services/fire-alarms\" class=\"\" title=\"Fire Alarms\">\n                                Fire Alarms                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://0.0.0.0:8001/services/fire-risk-assessment\" class=\"\" title=\"Fire Risk Assessment\">\n                                Fire Risk Assessment                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://0.0.0.0:8001/services/staff-fire-safety-training\" class=\"\" title=\"Staff Fire Safety Training\">\n                                Staff Fire Safety Training                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://0.0.0.0:8001/services/emergency-lighting-maintenance\" class=\"\" title=\"Emergency Lighting Maintenance\">\n                                Emergency Lighting Maintenance                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://0.0.0.0:8001/services/portable-appliance-testing\" class=\"\" title=\"Portable Appliance Testing\">\n                                Portable Appliance Testing                                        </a>\n                        </li>\n\n\n                    </ul>\n                </div>\n            </div>\n            </div>\n        </div>\n    </div>\n</main>\n\n<footer role=\"contentinfo\">\n    <div class=\"wrapper custom-bg--02\">\n        <div class=\"container\">\n            <footer class=\"text-white clearfix inverted-links footer-bar\">\n                <div class=\"grid\">\n                    <div class=\"grid__item one-half palm--full-width\">\n                        <p>For all enquires, call us on\n                            <a href=\"tel:0800 3456786543\" class=\"inverted\">0800 9874 3343</a>\n                        </p>\n                    </div><!--\n                --><div class=\"grid__item one-half palm--full-width not-palm\">\n                    <p class=\"not-ie7\">\n                        <a class=\"back-to-top with-caret offset-right\" href=\"#bodyTop\">\n                            Back to top\n                            <b class=\"caret caret--up\"></b>\n                        </a>\n                    </p>\n                </div>\n                </div>\n            </footer>\n        </div>\n    </div>\n    <div class=\"wrapper custom-bg--03\">\n        <div class=\"container palm--full-bleed\">\n            <ul class=\"nav nav-inline footer-nav\">\n                <li><a href=\"http://0.0.0.0:8001/home\">Home</a></li>\n                <li><a href=\"http://0.0.0.0:8001/services\">Services</a></li>\n                <li><a href=\"http://0.0.0.0:8001/about\">About Us</a></li>\n                <li><a href=\"http://0.0.0.0:8001/contact\">Contact Us</a></li>\n                <li><a href=\"http://0.0.0.0:8001/testimonials\">Testimonials</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"wrapper only-palm custom-bg--02\">\n        <div class=\"container\">\n            <div class=\"clearfix\">\n                <p>\n                    <a class=\"back-to-top with-caret\" href=\"#bodyTop\">\n                        Back to top\n                        <b class=\"caret caret--up\"></b>\n                    </a>\n                </p>\n            </div>\n        </div>\n    </div>    </footer>\n\n\n<script>\n    document.write('<script src=\"/js/vendor/' + ('__proto__' in {} ? 'zepto.min' : 'jquery-1.10.2.min') + '.js\"><\\/script>')\n</script>\n\n<script src=\"/js/vendor/jquery.magnific-popup.min.js\"></script>\n<script src=\"/js/scripts/public.js\"></script>\n<script src=\"/js/scripts/contact.js\"></script>\n\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync-client/test/fixtures/proxy-vhost.html",
    "content": "\n<!doctype html>\n<!--[if lt IE 7]>      <html class=\"no-js ie ie6 lt-ie10 lt-ie9 lt-ie8 lt-ie7\" lang=\"en\"> <![endif]-->\n<!--[if IE 7]>         <html class=\"no-js ie ie7 lt-ie10 lt-ie9 lt-ie8\" lang=\"en\"> <![endif]-->\n<!--[if IE 8]>         <html class=\"no-js ie ie8 lt-ie10 lt-ie9\" lang=\"en\"> <![endif]-->\n<!--[if IE 9]>         <html class=\"no-js ie ie9 lt-ie10\" lang=\"en\"> <![endif]-->\n<!--[if gt IE 9]><!--> <html class=\"no-js ffly\" lang=\"en\"> <!--<![endif]-->\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">\n\n    <title>Home -  Firecrest UK</title>\n\n    <link rel=\"shortcut icon\" href=\"favicon.ico\" />\n    <link rel=\"address bar icon\" href=\"favicon.ico\">\n\n    <link rel=\"stylesheet\" href=\"/css/style.css\"/>\n    <script src=\"/js/dist/modernizr.min.cd79908d.js\"></script>\n\n</head>\n\n<body id=\"bodyTop\">\n<div class=\"body-mask hidden animated fadeIn\"></div>\n\n<div class=\"wrapper header\">\n    <header class=\"container clearfix\" role=\"banner\">\n        <div class=\"logo\">\n            <a href=\"http://local.dev/home\" class=\"logo__img\" title=\"Firecrest UK LTD Home Page\">\n                Firecrest UK LTD\n            </a>\n        </div>\n        <nav role=\"navigation\" class=\"clearfix nav-container active\">\n            <div class=\"show-menu icon-link fast-click\">\n\n                <span class=\"not-palm menu-text\">MENU</span>\n                <span class=\"icon-menu\"></span>\n                <span class=\"icon-close hidden animated fadeInUp\"></span>\n            </div>\n            <ul class=\"nav main-nav\">\n\n\n                <li class=\"only-palm\">\n                    <a href=\"tel:0800 783 05 88\" tabindex=\"-1\" title=\"Call us on 0800 783 05 88\"><strong>Tel:</strong> 0800 783 05 88</a>\n                </li>\n\n\n\n                <li>\n                    <a href=\"/home\" title=\"Home\" class=\"\">Home</a>\n                </li>\n\n\n\n\n                <li class=\"has-dropdown\">\n\n                    <a href=\"http://local.dev/services\" class=\"with-caret\" title=\"Firecrest UK LTD Services\">\n                        Services <b class=\"caret\"></b>\n                    </a>\n\n                    <div class=\"drop-down\">\n                        <ul class=\"nav sub-nav notify\">\n\n                            <li><a href=\"http://local.dev/services\" tabindex=\"-1\" title=\"View All Services\">VIEW ALL</a></li>\n\n\n                            <li>\n                                <a href=\"http://local.dev/services/fire-extinguishers\" class=\"\" tabindex=\"-1\" title=\"Fire Extinguishers\">\n                                    Fire Extinguishers                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://local.dev/services/fire-alarms\" class=\"\" tabindex=\"-1\" title=\"Fire Alarms\">\n                                    Fire Alarms                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://local.dev/services/fire-risk-assessment\" class=\"\" tabindex=\"-1\" title=\"Fire Risk Assessment\">\n                                    Fire Risk Assessment                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://local.dev/services/staff-fire-safety-training\" class=\"\" tabindex=\"-1\" title=\"Staff Fire Safety Training\">\n                                    Staff Fire Safety Training                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://local.dev/services/emergency-lighting-maintenance\" class=\"\" tabindex=\"-1\" title=\"Emergency Lighting Maintenance\">\n                                    Emergency Lighting Maintenance                    </a>\n                            </li>\n\n                            <li>\n                                <a href=\"http://local.dev/services/portable-appliance-testing\" class=\"\" tabindex=\"-1\" title=\"Portable Appliance Testing\">\n                                    Portable Appliance Testing                    </a>\n                            </li>\n                        </ul>\n                    </div>\n\n                </li>\n\n\n\n\n                <li>\n                    <a href=\"/about\" title=\"About Us\" class=\"\">About Us</a>\n                </li>\n\n\n\n\n                <li>\n                    <a href=\"/contact\" title=\"Contact Us\" class=\"\">Contact Us</a>\n                </li>\n\n\n\n\n                <li>\n                    <a href=\"/testimonials\" title=\"Testimonials\" class=\"\">Testimonials</a>\n                </li>\n\n\n\n            </ul>        </nav>\n    </header>\n</div>    <main role=\"main\">\n    <!-- Hero -->\n    <div class=\"wrapper custom-bg--01-03\">\n        <div class=\"container palm--full-bleed\">\n            <article class=\"hero\">\n                <div class=\"hero-content hero--red\">\n\n                    <h1 class=\"hero-heading\">Firecrest UK LTD</h1>\n                    <h2 class=\"p-styles\">\n                        Welcome to <strong>Firecrest UK LTD</strong>, a midlands based supplier of <strong>fire safety equipment</strong> and solutions for protecting your business from fire.\n                        <a href=\"\" class=\"only-palm inverted trigger\" data-target=\"#hero-subtext\" data-remove=\"true\" data-remove-class=\"not-palm\">read more...</a>\n                    </h2>\n                    <h3 class=\"p-styles not-palm sub-text animated fadeInUp\" id=\"hero-subtext\">\n                        Whether you require fire risk assessments, fire alarm installation and maintenance, fire extinguisher supply and service, Staff fire training or a complete solution to protect your business from the devastation of fire, we can put together a plan to meet all your companies’ requirements.\n                    </h3>\n                    <p>\n                        <a href=\"http://local.dev/about\" class=\"text-bold text-white\">\n                            <span class=\"icon-youtube inline-icon push-right\"></span>Watch our video\n                        </a>\n                    </p>\n\n                    <footer class=\"palm--padding\">\n                        <a href=\"http://local.dev/contact\" class=\"button button--white palm--full-width with-caret\">\n                            Contact us <b class=\"caret caret--red\"></b>\n                        </a>\n                        <a href=\"http://local.dev/services\" class=\"button button--white palm--full-width with-caret\">\n                            Our Services <b class=\"caret caret--red\"></b>\n                        </a>\n                    </footer>\n                </div>\n            </article>\n        </div>\n    </div>\n\n    <!-- Banner -->\n    <div class=\"wrapper\">\n        <div class=\"container\">\n            <article class=\"portfolio text--center\">\n                <h2>People we've loved working with over the years</h2>\n                <div class=\"portfolio-logos\"></div>\n                <!--            <a href=\"--><?//= URL::route(\"testimonials\"); ?><!--\" title=\"\">-->\n                <!--                View More-->\n                <!--            </a>-->\n            </article>\n        </div>\n    </div>\n\n    <!-- Testimonials section -->\n    <div class=\"wrapper custom-bg--01\">\n        <div class=\"overlay--01\">\n            <div class=\"container\">\n                <article class=\"text--center testimonials\">\n                    <h2 class=\"heading-inverted\">Testimonials</h2>\n                    <div class=\"grid equal-heights\">\n                        <div class=\"grid__item one-third palm--full-width\">\n                            <div class=\"callout-box min-height\">\n                                <h3 class=\"callout-box__title\">Sally Pinder\n                                    <small>B & M Honda</small>\n                                </h3>\n                                <p>Great service, delivered on time with no hassle. Good Communication and knowledge, nothing more to say other than well done!</p>\n                            </div>\n                        </div><!--\n                    --><div class=\"grid__item one-third palm--full-width not-palm\">\n                        <div class=\"callout-box min-height\">\n                            <h3 class=\"callout-box__title\">Louise Colebourne\n                                <small>Liberty Hardware</small>\n                            </h3>\n                            <p>Firecrest provided prompt and informative service meeting all our requirements and I have no complaints</p>\n                            <p><strong>Thanks again</strong></p>\n                        </div>\n                    </div><!----><div class=\"grid__item one-third palm--full-width not-palm\">\n                        <div class=\"callout-box min-height\">\n                            <h3 class=\"callout-box__title\">Tony Steward\n                                <small>Balfour Beatty Rail</small>\n                            </h3>\n                            <p>Great service, delivered on time with no hassle. Good Communication and knowledge, nothing more to say other than well done!</p>\n                        </div>\n                    </div>\n                    </div>\n                    <a class=\"button button--red button--small with-caret\" href=\"http://local.dev/testimonials\">\n                        View All Testimonials\n                        <b class=\"caret caret--white\"></b>\n                    </a>\n                </article>\n            </div>\n        </div>\n    </div>\n\n    <div class=\"wrapper\">\n        <div class=\"container\">\n            <div class=\"grid push--top-bottom\">\n                <div class=\"grid__item one-third palm--full-width palm--push-bottom\">\n\n                    <div class=\"info-block\">\n                        <figure class=\"image-block\">\n                            <img src=\"/img/info-fire-safety.jpg\" alt=\"Fire Safety Training\" />\n                        </figure>\n                        <h4>Fire Safety Training</h4>\n                        <p>\n                            Firecrest UK LTD offer a full range of fire satefy training. We include a review of your fire precautions and procedures while conducting the training at your own facilities for total convenience.\n                            <a href=\"http://local.dev/services/staff-fire-safety-training\">Read more...</a>\n                        </p>\n                        <a href=\"http://local.dev/about\" class=\"text-bold\">\n                            <span class=\"icon-youtube inline-icon push-right\"></span>Watch our video\n                        </a>\n                    </div>\n\n                </div><!--\n            --><div class=\"grid__item one-third palm--full-width palm--push-bottom\">\n\n                <div class=\"info-block\">\n\n                    <figure class=\"image-block\">\n                        <img src=\"/img/info-vans.jpg\" alt=\"About Firecrest UK\" />\n                    </figure>\n\n                    <h4>About Us</h4>\n\n                    <p>\n                        Firecrest UK Ltd. are a family run business based in the East Midlands and provide a range of services designed helping businesses meet their legal obligations and protecting their employees and premises from the ravages of fire.\n                        <a href=\"http://local.dev/about\">Read more...</a>\n                    </p>\n\n                </div>\n\n            </div><!--\n            --><div class=\"grid__item one-third palm--full-width\">\n\n                <div class=\"info-block\">\n\n                    <figure class=\"image-block\">\n                        <div class=\"image-block__content outline\">\n                            <img src=\"/img/uk-assoc2.png\" alt=\"UK Fire Association Audited Member\" />\n                        </div>\n                    </figure>\n\n                    <h4>Our Services include</h4>\n                    <ul class=\"text-list list--flush-left\">\n\n\n                        <li>\n                            <a href=\"http://local.dev/services/fire-extinguishers\" class=\"\" title=\"Fire Extinguishers\">\n                                Fire Extinguishers                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://local.dev/services/fire-alarms\" class=\"\" title=\"Fire Alarms\">\n                                Fire Alarms                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://local.dev/services/fire-risk-assessment\" class=\"\" title=\"Fire Risk Assessment\">\n                                Fire Risk Assessment                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://local.dev/services/staff-fire-safety-training\" class=\"\" title=\"Staff Fire Safety Training\">\n                                Staff Fire Safety Training                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://local.dev/services/emergency-lighting-maintenance\" class=\"\" title=\"Emergency Lighting Maintenance\">\n                                Emergency Lighting Maintenance                                        </a>\n                        </li>\n\n\n                        <li>\n                            <a href=\"http://local.dev/services/portable-appliance-testing\" class=\"\" title=\"Portable Appliance Testing\">\n                                Portable Appliance Testing                                        </a>\n                        </li>\n\n\n                    </ul>\n                </div>\n            </div>\n            </div>\n        </div>\n    </div>\n</main>\n\n<footer role=\"contentinfo\">\n    <div class=\"wrapper custom-bg--02\">\n        <div class=\"container\">\n            <footer class=\"text-white clearfix inverted-links footer-bar\">\n                <div class=\"grid\">\n                    <div class=\"grid__item one-half palm--full-width\">\n                        <p>For all enquires, call us on\n                            <a href=\"tel:0800 3456786543\" class=\"inverted\">0800 9874 3343</a>\n                        </p>\n                    </div><!--\n                --><div class=\"grid__item one-half palm--full-width not-palm\">\n                    <p class=\"not-ie7\">\n                        <a class=\"back-to-top with-caret offset-right\" href=\"#bodyTop\">\n                            Back to top\n                            <b class=\"caret caret--up\"></b>\n                        </a>\n                    </p>\n                </div>\n                </div>\n            </footer>\n        </div>\n    </div>\n    <div class=\"wrapper custom-bg--03\">\n        <div class=\"container palm--full-bleed\">\n            <ul class=\"nav nav-inline footer-nav\">\n                <li><a href=\"http://local.dev/home\">Home</a></li>\n                <li><a href=\"http://local.dev/services\">Services</a></li>\n                <li><a href=\"http://local.dev/about\">About Us</a></li>\n                <li><a href=\"http://local.dev/contact\">Contact Us</a></li>\n                <li><a href=\"http://local.dev/testimonials\">Testimonials</a></li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"wrapper only-palm custom-bg--02\">\n        <div class=\"container\">\n            <div class=\"clearfix\">\n                <p>\n                    <a class=\"back-to-top with-caret\" href=\"#bodyTop\">\n                        Back to top\n                        <b class=\"caret caret--up\"></b>\n                    </a>\n                </p>\n            </div>\n        </div>\n    </div>    </footer>\n\n\n<script>\n    document.write('<script src=\"/js/vendor/' + ('__proto__' in {} ? 'zepto.min' : 'jquery-1.10.2.min') + '.js\"><\\/script>')\n</script>\n\n<script src=\"/js/vendor/jquery.magnific-popup.min.js\"></script>\n<script src=\"/js/scripts/public.js\"></script>\n<script src=\"/js/scripts/contact.js\"></script>\n\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync-client/test/fixtures/sass.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Test HTML Page</title>\n    <link rel=\"stylesheet\" href=\"css/bootstrap-scss.css\"/>\n</head>\n<body>\n\n    <h1>Hello from the test</h1>\n    <a href=\"forms.html\">Forms</a>\n    <a href=\"scrolling.html\">Scrolling Window</a>\n\n    <a href=\"forms.html\">\n        <div>\n            <div>\n                <img src=\"http://placekitten.com/400/600\" alt=\"\"/>\n            </div>\n        </div>\n    </a>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync-client/test/fixtures/scrolling.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>About us</title>\n    <link rel=\"stylesheet\" href=\"assets/style.css\"/>\n    <style>\n        .test {\n            max-height: 100px;\n            background: grey;\n            overflow: scroll;\n        }\n    </style>\n</head>\n<body>\n<div class=\"container\">\n    <h1>Style-injector Ghost Mode: Scrolling</h1>\n    <a href=\"index.html\">Homepage</a>\n    <button onclick=\"scroll()\">Scroll</button>\n\n    <div class=\"test\">\n        <p>1</p>\n\n        <p>2</p>\n\n        <p>3</p>\n\n        <p>4</p>\n\n        <p>5</p>\n\n        <p>6</p>\n\n        <p>7</p>\n\n        <p>8</p>\n\n        <p>9</p>\n\n        <p>10</p>\n\n        <p>11</p>\n\n        <p>12</p>\n\n        <p>13</p>\n\n        <p>14</p>\n\n        <p>15</p>\n\n        <p>16</p>\n\n        <p>17</p>\n\n        <p>18</p>\n\n        <p>19</p>\n\n        <p>20</p>\n    </div>\n\n    <h1>1</h1>\n\n    <h1>2</h1>\n\n    <h1>3</h1>\n\n    <h1>4</h1>\n\n    <h1>5</h1>\n\n    <h1>6</h1>\n\n    <h1>7</h1>\n\n    <h1>8</h1>\n\n    <h1>9</h1>\n\n    <h1>10</h1>\n\n    <h1>11</h1>\n\n    <h1>12</h1>\n\n    <h1>13</h1>\n\n    <h1>14</h1>\n\n    <h1>15</h1>\n\n    <h1>16</h1>\n\n    <h1>17</h1>\n\n    <h1>18</h1>\n\n    <h1>19</h1>\n\n    <h1>20</h1>\n\n    <h1>21</h1>\n\n    <h1>22</h1>\n\n    <h1>23</h1>\n\n    <h1>24</h1>\n\n    <h1>25</h1>\n\n    <h1>26</h1>\n\n    <h1>27</h1>\n\n    <h1>28</h1>\n\n    <h1>29</h1>\n\n    <h1>30</h1>\n\n    <h1>31</h1>\n\n    <h1>32</h1>\n\n    <h1>33</h1>\n\n    <h1>34</h1>\n\n    <h1>35</h1>\n\n    <h1>36</h1>\n\n    <h1>37</h1>\n\n    <h1>38</h1>\n\n    <h1>39</h1>\n\n    <h1>40</h1>\n\n    <h1>41</h1>\n\n    <h1>42</h1>\n\n    <h1>43</h1>\n\n    <h1>44</h1>\n\n    <h1>45</h1>\n\n    <h1>46</h1>\n\n    <h1>47</h1>\n\n    <h1>48</h1>\n\n    <h1>49</h1>\n\n    <h1>50</h1>\n\n    <h1>51</h1>\n\n    <h1>52</h1>\n\n    <h1>53</h1>\n\n    <h1>54</h1>\n\n    <h1>55</h1>\n\n    <h1>56</h1>\n\n    <h1>57</h1>\n\n    <h1>58</h1>\n\n    <h1>59</h1>\n\n    <h1>60</h1>\n\n    <h1>61</h1>\n\n    <h1>62</h1>\n\n    <h1>63</h1>\n\n    <h1>64</h1>\n\n    <h1>65</h1>\n\n    <h1>66</h1>\n\n    <h1>67</h1>\n\n    <h1>68</h1>\n\n    <h1>69</h1>\n\n    <h1>70</h1>\n\n    <h1>71</h1>\n\n    <h1>72</h1>\n\n    <h1>73</h1>\n\n    <h1>74</h1>\n\n    <h1>75</h1>\n\n    <h1>76</h1>\n\n    <h1>77</h1>\n\n    <h1>78</h1>\n\n    <h1>79</h1>\n\n    <h1>80</h1>\n\n    <h1>81</h1>\n\n    <h1>82</h1>\n\n    <h1>83</h1>\n\n    <h1>84</h1>\n\n    <h1>85</h1>\n\n    <h1>86</h1>\n\n    <h1>87</h1>\n\n    <h1>88</h1>\n\n    <h1>89</h1>\n\n    <h1>90</h1>\n\n    <h1>91</h1>\n\n    <h1>92</h1>\n\n    <h1>93</h1>\n\n    <h1>94</h1>\n\n    <h1></h1>\n\n    <h1>96</h1>\n    <h1>97</h1>\n    <h1>98</h1>\n    <h1>99</h1>\n\n\n    <h1>100</h1>\n</div>\n\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync-client/test/karma.conf.ci.js",
    "content": "// Config for travis\nvar conf = require(\"./test.conf\");\n\nmodule.exports = function (config) {\n\n    conf.logLevel       = config.LOG_INFO;\n    conf.autoWatch      = false;\n    conf.browsers       = [\"Firefox\"];\n    conf.preprocessors  = {\n        \"fixtures/*.html\" : [\"html2js\"]\n    };\n    conf.singleRun = true;\n\n    config.set(conf);\n};"
  },
  {
    "path": "packages/browser-sync-client/test/karma.conf.js",
    "content": "// Karma configuration\n// Generated on Wed Sep 18 2013 18:10:53 GMT+0100 (BST)\nvar conf = require(\"./test.conf\");\n\nmodule.exports = function (config) {\n    conf.logLevel = config.LOG_INFO;\n    config.set(conf);\n};\n"
  },
  {
    "path": "packages/browser-sync-client/test/middleware/file.js",
    "content": "\"use strict\";\n\nvar index       = require(\"../../index.js\");\n\nvar assert      = require(\"chai\").assert;\nvar http        = require(\"http\");\n\ndescribe(\"Using the file contents\", function () {\n    it(\"Returns a String\", function () {\n        var file = index.middleware({minify: true}, \"UNIQSTRING\", \"file\");\n        assert.isString(file);\n        assert.isTrue(file.indexOf(\"UNIQSTRING\") === 0);\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/middleware/middleware.js",
    "content": "\"use strict\";\n\nvar index       = require(\"../../index.js\");\n\nvar assert      = require(\"chai\").assert;\nvar http        = require(\"http\");\nvar request     = require(\"supertest\");\nvar express     = require(\"express\");\n\ndescribe(\"Using the middleware\", function () {\n\n    var app;\n    before(function () {\n        app = express();\n        app.use(\"/client\", index.middleware({minify: true}, \"BEFORE\"));\n    });\n\n    it(\"Returns a function\", function () {\n        assert.isFunction(index.middleware);\n    });\n\n    it(\"should return the JS when no cache\", function (done) {\n        request(app)\n            .get(\"/client\")\n            .expect(\"Content-Type\", /text\\/javascript/)\n            .expect(\"Cache-Control\", \"public, max-age=0\")\n            .expect(\"ETag\", /\".*-.*\"/)\n            .expect(200)\n            .end(function (err, res) {\n                assert.isTrue(res.text.length > 0);\n                assert.isTrue(res.text.indexOf(\"BEFORE\") > -1);\n                done();\n            });\n    });\n\n    it(\"should return not modified if has cache and fresh\", function (done) {\n        var etag = null;\n        request(app)\n            .get(\"/client\")\n            .end(function (err, res) {\n                etag = res.headers[\"ETag\"];\n            });\n\n        request(app)\n            .get(\"/client\")\n            .set(\"If-None-Match\", etag)\n            .expect(\"Cache-Control\", \"public, max-age=0\")\n            .expect(\"ETag\", /\".*-.*\"/)\n            .expect(304)\n            .end(function (err, res) {\n                assert.isUndefined(res.headers[\"Content-Type\"]);\n                done();\n            });\n    });\n\n    it(\"should return the JS if has cache and not fresh\", function (done) {\n        request(app)\n            .get(\"/client\")\n            .set(\"If-None-Match\", \"Different-ETag\")\n            .expect(\"Content-Type\", /text\\/javascript/)\n            .expect(\"Cache-Control\", \"public, max-age=0\")\n            .expect(\"ETag\", /\".*-.*\"/)\n            .expect(200)\n            .end(function (err, res) {\n                assert.isTrue(res.text.length > 0);\n                assert.isTrue(res.text.indexOf(\"BEFORE\") > -1);\n                done();\n            });\n    });\n\n    it(\"should return a gzipped response when supported\", function (done) {\n        request(app)\n            .get(\"/client\")\n            .set(\"Accept-Encoding\", \"gzip, deflate\")\n            .expect(\"Content-Encoding\", \"gzip\")\n            .expect(200)\n            .end(function (err, res) {\n                assert.isTrue(res.text.indexOf(\"BEFORE\") > -1);\n                done();\n            });\n    });\n\n    it(\"Should return a non-gzipped response when not supported\", function (done) {\n        request(app)\n            .get(\"/client\")\n            .set(\"Accept-Encoding\", \"deflate\")\n            .expect(200)\n            .end(function (err, res) {\n                assert.isTrue(res.text.indexOf(\"BEFORE\") > -1);\n                done();\n            });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-client/test/test.conf.js",
    "content": "module.exports = {\n\n    // base path, that will be used to resolve files and exclude\n    basePath: \"\",\n\n    // frameworks to use\n    frameworks: [\"mocha\", \"sinon\"],\n\n    files: [\n        \"client-new/libs/assert.js\",\n        \"../node_modules/sinon/pkg/sinon.js\",\n        \"../dist/index.js\",\n        \"client-new/stubs/bs.js\",\n        \"client-new/*.js\"\n    ],\n\n\n    // list of files to exclude\n    exclude: [\n\n    ],\n\n\n    // test results reporter to use\n    // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'\n    reporters: [\"dots\", \"coverage\"],\n\n\n    // web server port\n    port: 9876,\n\n\n    // enable / disable colors in the output (reporters and logs)\n    colors: true,\n\n\n    // level of logging\n    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG\n\n    // enable / disable watching file and executing tests whenever any file changes\n    autoWatch: true,\n\n    // Start these browsers, currently available:\n    // - Chrome\n    // - ChromeCanary\n    // - Firefox\n    // - Opera\n    // - Safari (only Mac)\n    // - PhantomJS\n    // - IE (only Windows)\n    browsers: [\"Chrome\"],\n\n\n    // If browser does not capture in given timeout [ms], kill it\n    captureTimeout: 60000,\n\n    preprocessors: {\n        \"fixtures/*.html\": [\"html2js\"],\n        \"../dist/index.js\": [\"coverage\"]\n    },\n\n    // Continuous Integration mode\n    // if true, it capture browsers, run tests and exit\n    singleRun: false\n\n};"
  },
  {
    "path": "packages/browser-sync-client/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"target\": \"ES5\",\n    \"noImplicitAny\": false,\n    \"preserveConstEnums\": true,\n    \"moduleResolution\": \"node\",\n    \"sourceMap\": true,\n    \"outDir\": \"_dist\",\n    \"allowJs\": true,\n    \"esModuleInterop\": true,\n    \"importHelpers\": true,\n    \"lib\": [\n      \"es2015\",\n      \"dom\",\n      \"dom.iterable\"\n    ],\n    \"types\": []\n  },\n  \"include\": [\n    \"./lib\"\n  ],\n  \"exclude\": []\n}\n"
  },
  {
    "path": "packages/browser-sync-client/webpack.config.js",
    "content": "// For instructions about this file refer to\n// webpack and webpack-hot-middleware documentation\nconst webpack = require('webpack');\nconst path = require('path');\nconst context = [__dirname];\n\nmodule.exports = {\n    context: path.join.apply(null, context),\n    entry: [\n        './lib/index'\n    ],\n    output: {\n        path: path.join.apply(null, context.concat(\"dist\")),\n        filename: 'index.js',\n        environment: {\n            arrowFunction: false\n        }\n    },\n    devtool: false,\n    plugins: [\n        // new webpack.NoEmitOnErrorsPlugin(),\n    ],\n    resolve: {\n        extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],\n        // alias: {\n        //     \"rx\": path.resolve(process.cwd(), \"public/assets/js/vendor/rx.lite.dom.ajax.js\")\n        // }\n    },\n    module: {\n        rules: [\n            {\n                test: /\\.m?[jt]s$/,\n                exclude: [/node_modules/],\n                use: {\n                    loader: 'babel-loader',\n                    options: {\n                        presets: [\n                            [\n                                '@babel/preset-env', { targets: \"ie 11\" }\n                            ]\n                        ]\n                    }\n                }\n            },\n            {\n                test: /\\.[tj]sx?$/,\n                use: ['ts-loader']\n            }\n        ]\n    }\n};\n"
  },
  {
    "path": "packages/browser-sync-ui/.editorconfig",
    "content": "# http://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n[*]\ncharset = \"utf8\"\n\n\n[*.css]\nindent_style = space\nindent_size = 4\ntrim_trailing_whitespace = true\n\n\n[*.js]\nindent_style = space\nindent_size = 4\ntrim_trailing_whitespace = true\nquote_type = double\n\n\n[*.json]\nindent_style = space\nindent_size = 2\ntrim_trailing_whitespace = true\n"
  },
  {
    "path": "packages/browser-sync-ui/.gitignore",
    "content": "node_modules\n.idea\nnpm-debug.log\n.DS_Store\n.sass-cache\nlib/bower_components\nexample.proxy.js\nexample.snippet.js\nstatic/*.html"
  },
  {
    "path": "packages/browser-sync-ui/.jshintrc",
    "content": "{\n  \"curly\": true,\n  \"eqeqeq\": true,\n  \"immed\": true,\n  \"laxbreak\": true,\n  \"latedef\": \"nofunc\",\n  \"newcap\": true,\n  \"noarg\": true,\n  \"plusplus\": true,\n  \"sub\": true,\n  \"undef\": true,\n  \"quotmark\": \"double\",\n  \"unused\": true,\n  \"indent\": 4,\n  \"eqnull\": true,\n  \"strict\": false,\n  \"node\": true,\n  \"browser\": true,\n  \"mocha\": true,\n  \"jasmine\": true,\n  \"esnext\": true,\n  \"globals\": {\n    \"browser\": false,\n    \"sinon\": false,\n    \"___browserSync___\": false,\n    \"assert\": false,\n    \"by\": false,\n    \"element\": false,\n    \"protractor\": false,\n    \"inject\": false,\n    \"angular\": false\n  }\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [2015] [Shane Osbourne]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,gs\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "packages/browser-sync-ui/README.md",
    "content": "# Browsersync UI [![Build Status](https://travis-ci.org/BrowserSync/UI.svg?branch=master)](https://travis-ci.org/BrowserSync/UI)\n\nComes bundled with the Browsersync module (version `2.0.0` onwards). \n\n## License\nCopyright (c) 2016 Shane Osbourne\nLicensed under the Apache 2.0 license.\n"
  },
  {
    "path": "packages/browser-sync-ui/crossbow.yaml",
    "content": "watch:\n  default:\n    before:\n      - nodemon\n      - webpack-watch\n    \"src/scss/**\":\n      - \"crossbow-sass --production\"\n    \"src/svg\":\n      - \"icons\"\n    \"src/crossbow\":\n      - \"crossbow\"\n\ntasks:\n\n  pre-release:\n    description: Run server+e2e tests to ensure a safe release\n    tasks:\n      - test\n      - test/protractor.sh\n\n  build-all:\n    description: Run all build tasks\n    runMode: 'parallel'\n    tasks:\n      - build-js\n#      - build-css\n\n  build-js:\n    description: Create the Client-side Javascript bundle\n    tasks:\n      - webpack\n\n  build-css:\n    description: Create the minified CSS files\n    tasks:\n      - 'crossbow-sass --production'\n\n  test:\n    description: Run the build tasks + unit tests\n    tasks:\n      - build-all\n      - mocha\n\n  nodemon: >\n     @bg nodemon example.server.js\n     -w lib\n     -w public\n     -w static\n     -e css,js,html,svg\n\n  webpack-watch: >\n     @bg webpack -w\n\n  mocha:   '@npm mocha --timeout 10000 test/server --recursive'\n  webpack: '@npm webpack'\n\noptions:\n\n  icons:\n    input: \"src/svg/*.svg\"\n    output: \"public/img/icons\"\n\n  crossbow-sass:\n    input: \"src/scss/core.scss\"\n    output: \"public/css\"\n\n  crossbow:\n    input:\n      - \"src/crossbow/*.hbs\"\n      - \"src/crossbow/components/*.hbs\"\n      - \"src/crossbow/content/*.hbs\"\n    output: \"./static\"\n    config:\n      config:\n        base: \"src/crossbow\"\n      data:\n        site: \"file:_config.yml\"\n"
  },
  {
    "path": "packages/browser-sync-ui/example.stream.js",
    "content": "var through2 = require(\"through2\");\nvar vinyl    = require(\"vinyl\");\nvar combiner = require('stream-combiner2');\nvar es       = require('event-stream');\nvar inspect  = require('util').inspect;\nvar Duplex = require(\"stream\").Duplex;\nvar stream = new Duplex();\n\nstream._read = function (out) {};\n\nstream._write = function (out) {\n    this.push(out);\n};\n\nvar fn1 = function (data, cb) {\n    cb(null, data + \"shane\");\n};\n\nvar fn2 = function (data, cb) {\n    cb(null, data + \" Osbourne\");\n};\n\n//var stream = through2.obj(function (data, enc, next) {\n//    this.push(data);\n//    next();\n//});\n\n//var stream = new vinyl(\"hi\");\n\nstream\n    .pipe(es.map(fn1))\n    .pipe(es.map(fn2))\n    .pipe(through2.obj(function (out, enc, next) {\n        console.log(out);\n    }));\n\nstream.write(\"Hi there: \");\n\n\n//var fn = through2.obj(function (file, type, next) {\n//    console.log(\"Stream 1\");\n//    this.push(file.concat([12, 23]));\n//    this.emit(\"error\", new Error(\"Some error thing\"));\n//    next();\n//});\n//\n//var fn2 = through2.obj(function (file, type, next) {\n//    console.log(\"Stream 2\");\n//    this.push(file.concat([5, 7]));\n//});\n\n//stream\n//    .pipe(fn)\n//    .pipe(fn2)\n//    .pipe(through2.obj(function (out) {\n//        console.log(\"Stream 3, out\");\n//        console.log(out);\n//    }));\n\n//var combinedStream = combiner.obj([\n//    stream,\n//    fn,\n//    fn2,\n//    through2.obj(function (out) {\n//        console.log(\"Stream 3, out\");\n//        console.log(out);\n//    })\n//]);\n//\n//stream.write([]);\n//\n//combinedStream.on(\"error\", console.error.bind(console));\n\n//if (!module.parent) {\n//    var es = require('event-stream');\n//    var inspect = require('util').inspect;\n//\n//    process.stdin                        //connect streams together with `pipe`\n//        .pipe(es.split())                  //split stream to break on newlines\n//        .pipe(es.map(function (data, cb) { //turn this async function into a stream\n//            cb(null, inspect(JSON.parse(data)));  //render it nicely\n//        }))\n//        .pipe(process.stdout)              // pipe it to stdout !\n//}"
  },
  {
    "path": "packages/browser-sync-ui/index.js",
    "content": "\"use strict\";\n\nvar UI          = require(\"./lib/UI\");\nvar config      = require(\"./lib/config\");\nvar Events      = require(\"events\").EventEmitter;\n\n/**\n * Hooks are for attaching functionality to BrowserSync\n */\nmodule.exports.hooks = {\n    /**\n     * Client JS is added to each connected client\n     */\n    \"client:js\": fileContent(config.defaults.clientJs)\n};\n\n/**\n * BrowserSync Plugin interface\n * @param {Object} opts\n * @param {BrowserSync} bs\n * @param {Function} cb\n * @returns {UI}\n */\nmodule.exports[\"plugin\"] = function (opts, bs, cb) {\n    var ui = new UI(opts, bs, new Events());\n    bs.setOption(\"session\", new Date().getTime());\n    ui.cb = cb || function () { /*noop*/ };\n    ui.init();\n    return ui;\n};\n\nmodule.exports[\"plugin:name\"]       = config.defaults.pluginName;\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction getPath (filepath) {\n    return require(\"path\").join(__dirname, filepath);\n}\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction fileContent (filepath) {\n    return require(\"fs\").readFileSync(getPath(filepath));\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/UI.js",
    "content": "var fs          = require(\"fs\");\nvar path        = require(\"path\");\nvar chalk       = require(\"chalk\");\n\nvar config      = require(\"./config\");\nvar eachSeries  = require(\"async-each-series\");\nvar asyncTasks  = require(\"./async-tasks\");\nvar hooks       = require(\"./hooks\");\nvar merge       = require(\"./opts\").merge;\n\nvar defaultPlugins = {\n    \"sync-options\":     require(\"./plugins/sync-options/sync-options.plugin\"),\n    \"overview\":         require(\"./plugins/overview/overview.plugin\"),\n    \"history\":          require(\"./plugins/history/history.plugin\"),\n    \"plugins\":          require(\"./plugins/plugins/plugins.plugin\"),\n    \"remote-debug\":     require(\"./plugins/remote-debug/remote-debug.plugin\"),\n    \"help\":             require(\"./plugins/help/help.plugin\"),\n    \"connections\":      require(\"./plugins/connections/connections.plugin\"),\n    \"network-throttle\": require(\"./plugins/network-throttle/network-throttle.plugin\")\n};\n\n/**\n * @param {Object} opts - Any options specifically\n *                        passed to the control panel\n * @param {BrowserSync} bs\n * @param {EventEmitter} emitter\n * @constructor\n * @returns {UI}\n */\nvar UI = function (opts, bs, emitter) {\n\n    var ui            = this;\n    ui.bs             = bs;\n    ui.config         = config.merge();\n    ui.events         = emitter;\n    ui.options        = merge(opts);\n    ui.logger         = bs.getLogger(ui.config.get(\"pluginName\"));\n    ui.defaultPlugins = defaultPlugins;\n    ui.listeners      = {};\n    ui.clients        = bs.io.of(bs.options.getIn([\"socket\", \"namespace\"]));\n    ui.socket         = bs.io.of(ui.config.getIn([\"socket\", \"namespace\"]));\n\n    if (ui.options.get(\"logLevel\")) {\n        ui.logger.setLevel(ui.options.get(\"logLevel\"));\n    }\n\n    /**\n     *\n     */\n    ui.pluginManager = new bs.utils.easyExtender(defaultPlugins, hooks).init();\n\n    /**\n     * Transform/save data RE: plugins\n     * @type {*}\n     */\n    ui.bsPlugins = require(\"./resolve-plugins\")(bs.getUserPlugins());\n\n    return ui;\n};\n\n/**\n * Detect an available port\n * @returns {UI}\n */\nUI.prototype.init = function () {\n\n    var ui = this;\n\n    eachSeries(\n        asyncTasks,\n        taskRunner(ui),\n        tasksComplete(ui)\n    );\n\n    return this;\n};\n\n/**\n * @param cb\n */\nUI.prototype.getServer = function (cb) {\n    var ui = this;\n    if (ui.server) {\n        return ui.server;\n    }\n    this.events.on(\"ui:running\", function () {\n        cb(null, ui.server);\n    });\n};\n\n/**\n * @returns {Array}\n */\nUI.prototype.getInitialTemplates = function () {\n    var prefix = path.resolve(__dirname, \"../templates/directives\");\n    return fs.readdirSync(prefix)\n        .map(function (name) {\n            return path.resolve(prefix, name);\n        });\n};\n\n/**\n * @param event\n */\nUI.prototype.delegateEvent = function (event) {\n\n    var ui = this;\n    var listeners = ui.listeners[event.namespace];\n\n    if (listeners) {\n        if (listeners.event) {\n            listeners.event.call(ui, event);\n        } else {\n            if (event.event && listeners[event.event]) {\n                listeners[event.event].call(ui, event.data);\n            }\n        }\n    }\n};\n\n/**\n * @param cb\n */\nUI.prototype.listen = function (ns, events) {\n    var ui = this;\n    if (Array.isArray(ns)) {\n        ns = ns.join(\":\");\n    }\n    if (!ui.listeners[ns]) {\n        ui.listeners[ns] = events;\n    }\n};\n\n/**\n * @param name\n * @param value\n * @returns {Map|*}\n */\nUI.prototype.setOption = function (name, value) {\n    var ui     = this;\n    ui.options = ui.options.set(name, value);\n    return ui.options;\n};\n\n/**\n * @param path\n * @param value\n * @returns {Map|*}\n */\nUI.prototype.setOptionIn = function (path, value) {\n    this.options = this.options.setIn(path, value);\n    return this.options;\n};\n\n/**\n * @param fn\n */\nUI.prototype.setMany = function (fn) {\n    this.options = this.options.withMutations(fn);\n    return this.options;\n};\n\n/**\n * @param path\n * @returns {any|*}\n */\nUI.prototype.getOptionIn = function (path) {\n    return this.options.getIn(path);\n};\n\n/**\n * Run each setup task in sequence\n * @param ui\n * @returns {Function}\n */\nfunction taskRunner (ui) {\n\n    return function (item, cb) {\n\n        ui.logger.debug(\"Starting Step: \" + item.step);\n\n        /**\n         * Give each step access to the UI Instance\n         */\n        item.fn(ui, function (err, out) {\n            if (err) {\n                return cb(err);\n            }\n            if (out) {\n                handleOut(ui, out);\n            }\n            ui.logger.debug(chalk.green(\"Step Complete: %s\", item.step));\n            cb();\n        });\n    };\n}\n\n/**\n * Setup tasks may return options or instance properties to be set\n * @param {UI} ui\n * @param {Object} out\n */\nfunction handleOut (ui, out) {\n\n    if (out.options) {\n        Object.keys(out.options).forEach(function (key) {\n            ui.options = ui.options.set(key, out.options[key]);\n        });\n    }\n\n    if (out.optionsIn) {\n        out.optionsIn.forEach(function (item) {\n            ui.options = ui.options.setIn(item.path, item.value);\n        });\n    }\n\n    if (out.instance) {\n        Object.keys(out.instance).forEach(function (key) {\n            ui[key] = out.instance[key];\n        });\n    }\n}\n\n/**\n * All async tasks complete at this point\n * @param ui\n */\nfunction tasksComplete (ui) {\n\n    return function (err) {\n\n        /**\n         * Log any error according to BrowserSync's Logging level\n         */\n        if (err) {\n            ui.logger.setOnce(\"useLevelPrefixes\", true).error(err.message || err);\n        }\n\n        /**\n         * Running event\n         */\n        ui.events.emit(\"ui:running\", {instance: ui, options: ui.options});\n\n        /**\n         * Finally call the user-provided callback\n         */\n        ui.cb(null, ui);\n    };\n}\n\nmodule.exports = UI;\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/async-tasks.js",
    "content": "var async       = require(\"./async\");\n\nmodule.exports = [\n    {\n        step: \"Setting default plugins\",\n        fn:   async.initDefaultHooks\n    },\n    {\n        step: \"Finding a free port\",\n        fn:   async.findAFreePort\n    },\n    {\n        step: \"Setting options also relevant to UI from BS\",\n        fn:   async.setBsOptions\n    },\n    {\n        step: \"Setting available URLS for UI\",\n        fn:   async.setUrlOptions\n    },\n    {\n        step: \"Starting the Control Panel Server\",\n        fn:   async.startServer\n    },\n    {\n        step: \"Add element events\",\n        fn:   async.addElementEvents\n    },\n    {\n        step: \"Registering default plugins\",\n        fn:   async.registerPlugins\n    },\n    {\n        step: \"Add options setting event\",\n        fn: async.addOptionsEvent\n    }\n];"
  },
  {
    "path": "packages/browser-sync-ui/lib/async.js",
    "content": "var Immutable = require(\"immutable\");\nvar url = require(\"url\");\n\nmodule.exports = {\n    /**\n     * The UI uses it's own server/port\n     * @param ui\n     * @param done\n     */\n    findAFreePort: function (ui, done) {\n        var port = ui.options.get(\"port\");\n        var listenHost = ui.options.get(\"listen\", \"localhost\");\n        ui.bs.utils.portscanner.findAPortNotInUse(port, port + 100, {\n            host: listenHost,\n            timeout: 1000\n        }, function (err, port) {\n            if (err) {\n                return done(err);\n            }\n            done(null, {\n                options: {\n                    port: port\n                }\n            });\n        });\n    },\n    /**\n     * Default hooks do things like creating/joining JS files &\n     * building angular config\n     * @param ui\n     * @param done\n     */\n    initDefaultHooks: function (ui, done) {\n\n        var out = ui.pluginManager.hook(\"page\", ui);\n\n        done(null, {\n            instance: {\n                clientJs:    ui.pluginManager.hook(\"client:js\", ui),\n                templates:   ui.pluginManager.hook(\"templates\", ui.getInitialTemplates(), ui),\n                pagesConfig: out.pagesConfig,\n                pages:       out.pagesObj,\n                pageMarkup:  out.pageMarkup\n            }\n        });\n    },\n    setBsOptions: function (ui, done) {\n        done(null, {\n            options: {\n                bs: Immutable.Map({\n                    mode: ui.bs.options.get(\"mode\"),\n                    port: ui.bs.options.get(\"port\")\n                })\n            }\n        });\n    },\n    /**\n     * @param ui\n     * @param done\n     */\n    setUrlOptions: function (ui, done) {\n\n        var port        = ui.options.get(\"port\");\n        var bsUrls      = ui.bs.getOptionIn([\"urls\"]).toJS();\n        var listenHost  = ui.bs.options.get(\"listen\", \"localhost\");\n\n        var urls        = {\n            ui: \"http://\" + listenHost + \":\" + port\n        };\n\n        if (bsUrls.external) {\n            var externalListen = url.parse(bsUrls.external).hostname || listenHost;\n            urls[\"ui-external\"] = [\"http://\", externalListen, \":\", port].join(\"\");\n        }\n\n        done(null, {\n            options: {\n                urls: Immutable.fromJS(urls)\n            }\n        });\n    },\n    /**\n     * Simple static file server with some middlewares for custom\n     * scripts/routes.\n     * @param ui\n     * @param done\n     */\n    startServer: function (ui, done) {\n\n        var bs          = ui.bs;\n        var port        = ui.options.get(\"port\");\n        var listenHost  = ui.options.get(\"listen\");\n\n        ui.logger.debug(\"Using port %s\", port);\n\n        var server = require(\"./server\")(ui, {\n            middleware: {\n                socket: bs.getMiddleware(\"socket-js\"),\n                connector: bs.getSocketConnector(bs.options.get(\"port\"), {\n                    path: bs.options.getIn([\"socket\", \"path\"]),\n                    namespace: ui.config.getIn([\"socket\", \"namespace\"])\n                })\n            }\n        });\n\n        require('server-destroy')(server.server);\n\n        bs.registerCleanupTask(function () {\n            if (server.server) {\n                server.server.destroy();\n            }\n            if (ui.servers) {\n                Object.keys(ui.servers).forEach(function (key) {\n                    if (ui.servers[key].server) {\n                        ui.servers[key].server.destroy();\n                    }\n                });\n            }\n        });\n\n        done(null, {\n            instance: {\n                server: server.server.listen(port, listenHost),\n                app: server.app\n            }\n        });\n\n    },\n    /**\n     * Allow an API for adding/removing elements to clients\n     * @param ui\n     * @param done\n     */\n    addElementEvents: function (ui, done) {\n\n        var elems = ui.pluginManager.hook(\"elements\");\n        var bs    = ui.bs;\n\n        if (!Object.keys(elems).length) {\n            return done();\n        }\n\n        ui.setOption(\"clientFiles\", Immutable.fromJS(elems));\n\n        done(null, {\n            instance: {\n                enableElement:  require(\"./client-elements\").enable(ui.clients, ui, bs),\n                disableElement: require(\"./client-elements\").disable(ui.clients, ui, bs),\n                addElement:     require(\"./client-elements\").addElement\n            }\n        });\n    },\n    /**\n     * Run default plugins\n     * @param ui\n     * @param done\n     */\n    registerPlugins: function (ui, done) {\n        Object.keys(ui.defaultPlugins).forEach(function (key) {\n            ui.pluginManager.get(key)(ui, ui.bs);\n        });\n        done();\n    },\n    /**\n     * The most important event is the initial connection where\n     * the options are received from the socket\n     * @param ui\n     * @param done\n     */\n    addOptionsEvent: function (ui, done) {\n\n        var bs = ui.bs;\n\n        ui.clients.on(\"connection\", function (client) {\n\n            client.emit(\"ui:connection\", ui.options.toJS());\n\n            ui.options.get(\"clientFiles\").map(function (item) {\n                if (item.get(\"active\")) {\n                    ui.addElement(client, item.toJS());\n                }\n            });\n        });\n\n        ui.socket.on(\"connection\", function (client) {\n\n            client.emit(\"connection\", bs.getOptions().toJS());\n\n            client.emit(\"ui:connection\", ui.options.toJS());\n\n            client.on(\"ui:get:options\", function () {\n                client.emit(\"ui:receive:options\", {\n                    bs: bs.getOptions().toJS(),\n                    ui: ui.options.toJS()\n                });\n            });\n\n            // proxy client events\n            client.on(\"ui:client:proxy\", function (evt) {\n                ui.clients.emit(evt.event, evt.data);\n            });\n\n            client.on(\"ui\", function (data) {\n                ui.delegateEvent(data);\n            });\n        });\n        done();\n    }\n};\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/client-elements.js",
    "content": "var fs = require(\"fs\");\n\nconst CLIENT_FILES_OPT = \"clientFiles\";\n\n/**\n * Enable a element on clients\n * @param clients\n * @param ui\n * @param bs\n * @returns {Function}\n */\n\nvar types = {\n    \"css\": \"text/css\",\n    \"js\":  \"application/javascript\"\n};\n\nfunction enableElement (clients, ui, bs) {\n\n    return function (file) {\n\n        var uiItem   = ui.getOptionIn([CLIENT_FILES_OPT, file.name]);\n        var item     = uiItem.toJS();\n        var enableFn = uiItem.getIn([\"callbacks\", \"enable\"]);\n\n        if (item.active) {\n            return;\n        }\n\n        ui.setOptionIn([CLIENT_FILES_OPT, item.name, \"active\"], true, {silent: true});\n\n        if (enableFn) {\n            enableFn.call(ui, item);\n        }\n\n        if (item.file && !item.served) {\n\n            ui.setOptionIn([CLIENT_FILES_OPT, item.name, \"served\"], true, {silent: true});\n\n            bs.serveFile(item.src, {\n                type:    types[item.type],\n                content: fs.readFileSync(item.file)\n            });\n        }\n\n        addElement(clients, ui.getOptionIn([CLIENT_FILES_OPT, item.name]).toJS());\n    };\n}\n\n/**\n * @param clients\n * @param ui\n * @returns {Function}\n */\nfunction disableElement (clients, ui) {\n\n    return function (file) {\n        var uiItem    = ui.getOptionIn([CLIENT_FILES_OPT, file.name]);\n        var item      = uiItem.toJS();\n        var disableFn = uiItem.getIn([\"callbacks\", \"disable\"]);\n\n        if (disableFn) {\n            disableFn.call(ui, item);\n        }\n\n        ui.setOptionIn([CLIENT_FILES_OPT, item.name, \"active\"], false, {silent: true});\n\n        removeElement(clients, item.id);\n    };\n}\n\n/**\n * @param clients\n * @param item\n */\nfunction addElement (clients, item) {\n\n    clients.emit(\"ui:element:add\", item);\n}\n\n/**\n * @param clients\n * @param id\n */\nfunction removeElement(clients, id) {\n\n    clients.emit(\"ui:element:remove\", {id: id});\n}\n\nmodule.exports.addElement    = addElement;\nmodule.exports.removeElement = removeElement;\nmodule.exports.enable        = enableElement;\nmodule.exports.disable       = disableElement;\n\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/client-js.js",
    "content": "\"use strict\";\n\n(function (window, document, bs, undefined) {\n\n    var socket = bs.socket;\n\n    var uiOptions = {\n        bs: {}\n    };\n\n    socket.on(\"ui:connection\", function (options) {\n\n        uiOptions = options;\n\n        bs.socket.emit(\"ui:history:connected\", {\n            href: window.location.href\n        });\n    });\n\n    socket.on(\"ui:element:remove\", function (data) {\n        if (data.id) {\n            var elem = document.getElementById(data.id);\n            if (elem) {\n                removeElement(elem);\n            }\n        }\n    });\n\n    socket.on(\"highlight\", function () {\n        var id = \"__browser-sync-highlight__\";\n        var elem = document.getElementById(id);\n        if (elem) {\n            return removeElement(elem);\n        }\n        (function (e) {\n            e.style.position = \"fixed\";\n            e.style.zIndex = \"1000\";\n            e.style.width = \"100%\";\n            e.style.height = \"100%\";\n            e.style.borderWidth = \"5px\";\n            e.style.borderColor = \"red\";\n            e.style.borderStyle = \"solid\";\n            e.style.top = \"0\";\n            e.style.left = \"0\";\n            e.setAttribute(\"id\", id);\n            document.getElementsByTagName(\"body\")[0].appendChild(e);\n        })(document.createElement(\"div\"));\n    });\n\n    socket.on(\"ui:element:add\", function (data) {\n\n        var elem = document.getElementById(data.id);\n\n        if (!elem) {\n            if (data.type === \"css\") {\n                return addCss(data);\n            }\n            if (data.type === \"js\") {\n                return addJs(data);\n            }\n            if (data.type === \"dom\") {\n                return addDomNode(data);\n            }\n        }\n    });\n\n    bs.addDomNode = addDomNode;\n    bs.addJs      = addJs;\n    bs.addCss     = addJs;\n\n    function addJs(data) {\n        (function (e) {\n            e.setAttribute(\"src\", getAbsoluteUrl(data.src));\n            e.setAttribute(\"id\", data.id);\n            document.getElementsByTagName(\"body\")[0].appendChild(e);\n        })(document.createElement(\"script\"));\n    }\n\n    function addCss(data) {\n        (function (e) {\n            e.setAttribute(\"rel\",  \"stylesheet\");\n            e.setAttribute(\"type\", \"text/css\");\n            e.setAttribute(\"id\",   data.id);\n            e.setAttribute(\"media\", \"all\");\n            e.setAttribute(\"href\", getAbsoluteUrl(data.src));\n            document.getElementsByTagName(\"head\")[0].appendChild(e);\n        })(document.createElement(\"link\"));\n    }\n\n    function addDomNode(data) {\n        var elem = document.createElement(data.tagName);\n        for (var attr in data.attrs) {\n            elem.setAttribute(attr,  data.attrs[attr]);\n        }\n        if (data.placement) {\n            document.getElementsByTagName(data.placement)[0].appendChild(elem);\n        } else {\n            document.getElementsByTagName(\"body\")[0].appendChild(elem);\n        }\n        return elem;\n    }\n\n    function removeElement(element) {\n        if (element && element.parentNode) {\n            element.parentNode.removeChild(element);\n        }\n    }\n\n    function getAbsoluteUrl(path) {\n        if (path.match(/^h/)) {\n            return path;\n        }\n        return [window.location.protocol, \"//\", getHost(), path].join(\"\");\n    }\n\n    function getHost () {\n        return uiOptions.bs.mode === \"snippet\" ? window.location.hostname + \":\" + uiOptions.bs.port : window.location.host;\n    }\n\n})(window, document, ___browserSync___);\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/config.js",
    "content": "var Immutable = require(\"immutable\");\n\n/**\n * Any configurable paths/config\n * @type {{pluginName: string, indexPage: string, socketJs: string, appJs: string, connector: string}}\n */\nvar defaults = {\n    pluginName:  \"UI\",\n    indexPage:   \"/index.html\",\n    socketJs:    \"/js/vendor/socket.js\",\n    appJs:       \"/js/dist/app.js\",\n    app:         \"/app.js\",\n    appExtraJs:  \"/js/app-extra.js\",\n    connector:   \"/js/connector.js\",\n    pagesConfig: \"/js/pages-config.js\",\n    public: {\n        svg: \"/img/icons/icons.svg\",\n        css: \"/css/core.min.css\"\n    },\n    clientJs:    \"/lib/client-js.js\",\n    socket: {\n        namespace: \"/browser-sync-cp\"\n    },\n    components: {\n        header: \"/components/header.html\",\n        footer: \"/components/footer.html\"\n    }\n};\n\nmodule.exports.defaults = defaults;\n\n/**\n * @param [userConfig]\n * @returns {Map}\n */\nmodule.exports.merge    = function (userConfig) {\n    return Immutable\n        .fromJS(defaults)\n        .mergeDeep(userConfig);\n};"
  },
  {
    "path": "packages/browser-sync-ui/lib/directive-stripper.js",
    "content": "var tokenize   = require(\"html-tokenize\");\nvar through2   = require(\"through2\");\nvar vinyl      = require(\"vinyl\");\nvar select     = require(\"html-select\");\n\n/**\n * @param config\n * @param item\n * @param markup\n * @param done\n */\nfunction directiveStripper(config, item, markup, done) {\n\n    var replacer = getReplacer(item, config);\n    var chunks = [];\n\n    new vinyl({\n            contents: new Buffer(markup)\n        })\n        .pipe(tokenize())\n        .pipe(replacer)\n        .pipe(through2.obj(function (row, buf, next) {\n            chunks.push(row[1]);\n            next();\n        }, function () {\n            done(null, chunks.join(\"\"));\n        }));\n\n    replacer.resume();\n}\n\n/**\n * @param name\n * @param item\n * @returns {*|exports}\n */\nfunction getReplacer (name, markup) {\n\n    return select(name, function (e) {\n\n        var tr = through2.obj(function (row, buf, next) {\n\n            if (row[0] === \"open\") {\n                this.push([row[0], directive(name, String(row[1]), markup)]);\n            } else {\n                this.push([ row[0], \"\" ]);\n            }\n\n            next();\n        });\n\n        tr.pipe(e.createStream()).pipe(tr);\n    });\n}\n\n/**\n * @param name\n * @param content\n * @param item\n * @returns {*|string}\n */\nfunction directive (name, content, item) {\n\n    var angularDir;\n    try {\n        angularDir = require(\"../src/scripts/directives/\" + name)();\n    } catch (e) {\n        console.log(\"Directive not found, cannot re-use\");\n        return content;\n    }\n\n    var scope = item;\n\n    scope = angularDir.link(scope, {}, {});\n\n    return angularDir.template.replace(/\\{\\{(.+?)\\}\\}/, function ($1, $2) {\n        if ($2 in scope) {\n            return scope[$2];\n        }\n        return $1;\n    });\n}\n\nmodule.exports.getReplacer       = getReplacer;\nmodule.exports.directive         = directive;\nmodule.exports.directiveStripper = directiveStripper;"
  },
  {
    "path": "packages/browser-sync-ui/lib/hooks.js",
    "content": "var fs         = require(\"fs\");\nvar path       = require(\"path\");\n\nvar pluginTmpl     = templateFile(\"/plugin.tmpl\");\nvar configTmpl     = templateFile(\"/config.tmpl\");\nvar configItem     = templateFile(\"/config.item.tmpl\");\nvar inlineTemp     = templateFile(\"/inline.template.tmpl\");\nvar pluginItemTmpl = fs.readFileSync(path.resolve(__dirname, \"../\", \"templates/plugin.item.tmpl\"), \"utf-8\");\n\nfunction templateFile (filepath) {\n    return fs.readFileSync(path.join(__dirname, \"/../templates\", filepath || \"\"), \"utf-8\");\n}\n\n/**\n * @type {{page: Function, markup: Function, client:js: Function, templates: Function}}\n */\nmodule.exports = {\n    /**\n     * Create the url config for each section of the ui\n     * @param hooks\n     * @param ui\n     */\n    \"page\": function (hooks, ui) {\n\n        var config = hooks\n            .map(transformConfig)\n            .reduce(createConfigItem, {});\n\n        return {\n            /**\n             * pagesConfig - This is the angular configuration such as routes\n             */\n            pagesConfig: configTmpl\n                .replace(\"%when%\", hooks.reduce(\n                    createAngularRoutes,\n                    \"\"\n                ))\n                .replace(\"%pages%\", JSON.stringify(\n                    config,\n                    null,\n                    4\n                )),\n            /**\n             * pagesConfig in object form\n             */\n            pagesObj: config,\n            pageMarkup: function () {\n                return preAngular(ui.pluginManager.plugins, config, ui);\n            }\n        };\n    },\n    /**\n     * Controller markup for each plugin\n     * @param hooks\n     * @returns {*}\n     */\n    \"markup\": function (hooks) {\n        return hooks.reduce(pluginTemplate, \"\");\n    },\n    /**\n     * @param hooks\n     * @param {UI} ui\n     * @returns {*|string}\n     */\n    \"client:js\": function (hooks, ui) {\n\n        /**\n         * Add client JS from Browsersync Plugins\n         */\n        ui.bsPlugins.forEach(function (plugin) {\n            if (plugin.has(\"client:js\")) {\n                plugin.get(\"client:js\").forEach(function (value) {\n                    hooks.push(value);\n                });\n            }\n        });\n\n        var out = hooks.reduce(function (all, item) {\n            if (typeof item === \"string\") {\n                all += \";\" + item;\n            } else if (Array.isArray(item)) {\n                item.forEach(function (item) {\n                    all += \";\" + item;\n                });\n            }\n            return all;\n        }, \"\");\n\n        return out;\n    },\n    /**\n     * @param hooks\n     * @param initial\n     * @param {UI} ui\n     * @returns {String}\n     */\n    \"templates\": function (hooks, initial, ui) {\n\n        /**\n         * Add templates from each Browsersync registered plugin\n         * @type {string}\n         */\n        var pluginDirectives = ui.bsPlugins.reduce(function (all, plugin) {\n\n            if (!plugin.has(\"templates\")) {\n                return all;\n            }\n\n            /**\n             * Slugify-ish the plugin name\n             *  eg: Test Browsersync Plugin\n             *    = test-browsersync-plugin\n             * @type {string}\n             */\n            var slug = plugin.get(\"name\")\n                .trim()\n                .split(\" \")\n                .map(function (word) {\n                    return word.trim().toLowerCase();\n                })\n                .join(\"-\");\n\n            /**\n             * For every plugin that has templates, wrap\n             * the markup in the <script type=\"text/ng-template\" id=\"{{slug}}\"></script>\n             * markup to result in the single output string.\n             */\n            plugin.get(\"templates\").forEach(function (value, key) {\n                all +=  angularWrap([slug, path.basename(key)].join(\"/\"), value);\n            });\n\n            return all;\n\n        }, \"\");\n\n        /**\n         * Combine the markup from the plugins done above with any\n         * others registered via hooks + initial\n         * to create the final markup\n         */\n        return [pluginDirectives, createInlineTemplates(hooks.concat([initial]))].join(\"\");\n    },\n    /**\n     * Allow plugins to register toggle-able elements\n     * @param hooks\n     * @returns {{}}\n     */\n    \"elements\": function (hooks) {\n        var obj = {};\n        hooks.forEach(function (elements) {\n            elements.forEach(function (item) {\n                if (!obj[item.name]) {\n                    obj[item.name] = item;\n                }\n            });\n        });\n        return obj;\n    }\n};\n\n/**\n * @param hooks\n * @returns {String}\n */\nfunction createInlineTemplates (hooks) {\n    return hooks.reduce(function (combined, item) {\n        return combined + item.reduce(function (all, filepath) {\n            return all + angularWrap(\n                path.basename(filepath),\n                fs.readFileSync(filepath));\n        }, \"\");\n    }, \"\");\n}\n\n/**\n * @param item\n * @returns {*}\n */\nfunction transformConfig (item) {\n    return item;\n}\n\n/**\n * @param {String} all\n * @param {Object} item\n * @returns {*}\n */\nfunction createAngularRoutes(all, item) {\n    return all + configItem.replace(/%(.+)%/g, function () {\n        var key = arguments[1];\n        if (item[key]) {\n            return item[key];\n        }\n    });\n}\n\n/**\n * @param joined\n * @param item\n * @returns {*}\n */\nfunction createConfigItem (joined, item) {\n    if (item.path === \"/\") {\n        joined[\"overview\"] = item;\n    } else {\n        joined[item.path.slice(1)] = item;\n    }\n    return joined;\n}\n\n/**\n * @returns {*}\n */\nfunction pluginTemplate (combined, item) {\n    return [combined, pluginTmpl.replace(\"%markup%\", item)].join(\"\\n\");\n}\n\n/**\n * @param plugins\n * @param config\n * @returns {*}\n */\nfunction preAngular (plugins, config, ui) {\n\n    return Object.keys(plugins)\n        .filter(function (key) {\n            return config[key]; // only work on plugins that have pages\n        })\n        .map(function (key) {\n            if (key === \"plugins\") {\n                var pluginMarkup = ui.bsPlugins.reduce(function (all, item, i) {\n                    all += pluginItemTmpl\n                        .replace(\"%content%\", item.get(\"markup\") || \"\")\n                        .replace(/%index%/g, i)\n                        .replace(/%name%/g, item.get(\"name\"));\n\n                    return all;\n                }, \"\");\n                plugins[key].hooks.markup = plugins[key].hooks.markup.replace(\"%pluginlist%\", pluginMarkup);\n            }\n            return angularWrap(config[key].template, bindOnce(plugins[key].hooks.markup, config[key]));\n        })\n        .reduce(function (combined, item) {\n            return combined + item;\n        }, \"\");\n}\n\n/**\n * @param templateName\n * @param markup\n * @returns {*}\n */\nfunction angularWrap (templateName, markup) {\n    return inlineTemp\n        .replace(\"%content%\", markup)\n        .replace(\"%id%\", templateName);\n}\n\n/**\n * @param markup\n * @param config\n * @returns {*|string}\n */\nfunction bindOnce (markup, config) {\n    return markup.toString().replace(/\\{\\{ctrl.section\\.(.+?)\\}\\}/g, function ($1, $2) {\n        return config[$2] || \"\";\n    });\n}\n\nmodule.exports.bindOnce = bindOnce;\n\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/opts.js",
    "content": "var Immutable  = require(\"immutable\");\n\nvar defaults = Immutable.fromJS({\n    port: 3001\n});\n\n/**\n * @param {Object} obj\n * @returns {Map}\n */\nmodule.exports.merge = function (obj) {\n    return defaults.mergeDeep(Immutable.fromJS(obj));\n};\n\n/**\n * @param {Immutable.Map} obj\n * @returns {*}\n */\n//function transformOptions(obj) {\n//\n//    var out;\n//\n//    Object.keys(transforms).forEach(function (key) {\n//        out = obj.set(key, transforms[key](obj));\n//    });\n//\n//    return out;\n//}"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/connections/connections.client.js",
    "content": "(function (angular) {\n\n    const SECTION_NAME = \"connections\";\n\n    angular\n        .module(\"BrowserSync\")\n        .controller(\"ConnectionsController\", [\n            \"pagesConfig\",\n            ConnectionsControllers\n        ]);\n\n    /**\n     * @param pagesConfig\n     * @constructor\n     */\n    function ConnectionsControllers(pagesConfig) {\n        var ctrl = this;\n        ctrl.section = pagesConfig[SECTION_NAME];\n    }\n\n    angular\n        .module(\"BrowserSync\")\n        .directive(\"connectionList\", function () {\n            return {\n                restrict:    \"E\",\n                scope:       {\n                    options:     \"=\"\n                },\n                templateUrl: \"connections.directive.html\",\n                controller:  [\"$scope\", \"Clients\", \"Socket\", connectionListDirective],\n                controllerAs: \"ctrl\"\n            };\n        });\n\n    /**\n     * Controller for the URL sync\n     * @param $scope - directive scope\n     * @param Clients\n     * @param Socket\n     */\n    function connectionListDirective($scope, Clients, Socket) {\n\n        var ctrl = this;\n        ctrl.connections = [];\n\n        ctrl.update = function (data) {\n            ctrl.connections = data;\n            $scope.$digest();\n        };\n\n        // Always try to retreive the sockets first time.\n        Socket.getData(\"clients\").then(function (data) {\n            ctrl.connections = data;\n        });\n\n        // Listen to events to update the list on the fly\n        Socket.on(\"ui:connections:update\", ctrl.update);\n\n        $scope.$on(\"$destroy\", function () {\n            Socket.off(\"ui:connections:update\", ctrl.update);\n        });\n\n        ctrl.highlight = function (connection) {\n            Clients.highlight(connection);\n        };\n    }\n\n})(angular);\n\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/connections/connections.directive.html",
    "content": "<ul bs-list=\"basic\" ng-show=\"ctrl.connections\" id=\"bs-connection-list\">\n    <li ng-repeat=\"connection in ctrl.connections track by connection.id\">\n        <p>{{connection.browser.name}} - ({{connection.browser.version}})</p>\n        <!--<span bs-multi-controls=\"right\">\n            <a href=\"#\" ng-click=\"highlight(connection)\" bs-button>\n                <svg bs-svg-icon><use xlink:href=\"#svg-target\"></use></svg> Highlight\n            </a>\n        </span>-->\n    </li>\n</ul>"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/connections/connections.html",
    "content": "<div bs-panel=\"controls outline\">\n    <h1 bs-heading><icon icon=\"{{section.icon}}\"></icon> {{section.title}}</h1>\n</div>\n<div bs-panel ng-if=\"!ui.connections.length\">\n    <div bs-panel-content=\"basic\">\n        <p>Connected devices/browsers will be listed here. If you are not seeing your device in the list,\n        it's probably because the Browsersync script tag is not being loaded on your page.</p>\n        <p>\n            Browsersync works by injecting an asynchronous script tag (<code>&lt;script async&gt;...&lt;/script&gt;</code>) right after the &lt;body&gt; tag during initial request. In order for this to work properly the &lt;body&gt; tag must be present. Alternatively you can provide a custom rule for the snippet using snippetOptions\n        </p>\n    </div>\n</div>\n\n<div bs-skinny>\n    <connection-list ng-if=\"ui.connections\"\n                  options=\"options\"\n                  connections=\"ui.connections\"></connection-list>\n</div>\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/connections/connections.plugin.js",
    "content": "var connections = require(\"./lib/connections\");\n\nconst PLUGIN_NAME = \"Connections\";\n\n/**\n * @type {{plugin: Function, plugin:name: string, markup: string}}\n */\nmodule.exports = {\n    /**\n     * @param {UI} ui\n     * @param {BrowserSync} bs\n     */\n    \"plugin\": function (ui, bs) {\n        connections.init(ui, bs);\n    },\n    /**\n     * Hooks\n     */\n    \"hooks\": {\n        \"client:js\": fileContent(\"/connections.client.js\"),\n        \"templates\": [\n            getPath(\"/connections.directive.html\")\n        ]\n    },\n    /**\n     * Plugin name\n     */\n    \"plugin:name\": PLUGIN_NAME\n};\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction getPath (filepath) {\n    return require(\"path\").join(__dirname, filepath);\n}\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction fileContent (filepath) {\n    return require(\"fs\").readFileSync(getPath(filepath), \"utf-8\");\n}"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/connections/lib/connections.js",
    "content": "var Immutable = require(\"immutable\");\n\n/**\n * Track connected clients\n * @param {UI} ui\n * @param {BrowserSync} bs\n */\nmodule.exports.init = function (ui, bs) {\n\n    var uaParser = new bs.utils.UAParser();\n\n    var currentConnections = [];\n\n    ui.clients.on(\"connection\", function (client) {\n        client.on(\"client:heartbeat\", function (data) {\n            var match;\n            if (currentConnections.some(function (item, index) {\n                    if (item.id === client.id) {\n                        match = index;\n                        return true;\n                    }\n                    return false;\n                })) {\n                if (typeof match === \"number\") {\n                    currentConnections[match].timestamp = new Date().getTime();\n                    currentConnections[match].data = data;\n                }\n            } else {\n                currentConnections.push({\n                    id: client.id,\n                    timestamp: new Date().getTime(),\n                    browser: uaParser.setUA(client.handshake.headers[\"user-agent\"]).getBrowser(),\n                    data: data\n                });\n            }\n        });\n    });\n\n    var registry;\n    var temp;\n    var initialSent;\n\n    var int = setInterval(function () {\n\n        var sockets = ui.clients.sockets;\n        var keys = Object.keys(sockets);\n\n        if (keys.length) {\n            temp = Immutable.List(keys.map(function (clientKey) {\n                var currentClient = sockets[clientKey];\n                return Immutable.fromJS({\n                    id: currentClient.id,\n                    browser: uaParser.setUA(currentClient.handshake.headers[\"user-agent\"]).getBrowser()\n                });\n            }));\n            if (!registry) {\n                registry = temp;\n                sendUpdated(ui.socket, decorateClients(registry.toJS(), currentConnections));\n            } else {\n                if (Immutable.is(registry, temp)) {\n                    if (!initialSent) {\n                        sendUpdated(ui.socket, decorateClients(registry.toJS(), currentConnections));\n                        initialSent = true;\n                    }\n                } else {\n                    registry = temp;\n                    sendUpdated(ui.socket, decorateClients(registry.toJS(), currentConnections));\n                }\n            }\n        } else {\n            sendUpdated(ui.socket, []);\n        }\n\n    }, 1000);\n\n    bs.registerCleanupTask(function () {\n        clearInterval(int);\n    });\n};\n\n\n/**\n * Use heart-beated data to decorate clients\n * @param clients\n * @param clientsInfo\n * @returns {*}\n */\nfunction decorateClients(clients, clientsInfo) {\n    return clients.map(function (item) {\n        clientsInfo.forEach(function (client) {\n            if (client.id === item.id) {\n                item.data = client.data;\n                return false;\n            }\n        });\n        return item;\n    });\n}\n\n/**\n * @param socket\n * @param connectedClients\n */\nfunction sendUpdated(socket, connectedClients) {\n    socket.emit(\"ui:connections:update\", connectedClients);\n}\n\n/**\n * @param clients\n * @param data\n */\n//function highlightClient (clients, data) {\n//    var socket = getClientById(clients, data.id);\n//    if (socket) {\n//        socket.emit(\"highlight\");\n//    }\n//}\n\n/**\n * @param clients\n * @param id\n */\n//function getClientById (clients, id) {\n//    var match;\n//    clients.sockets.some(function (item, i) {\n//        if (item.id === id) {\n//            match = clients.sockets[i];\n//            return true;\n//        }\n//    });\n//    return match;\n//}"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/help/help.client.js",
    "content": "(function (angular) {\n\n    const SECTION_NAME = \"history\";\n\n    angular\n        .module(\"BrowserSync\")\n        .controller(\"HelpAboutController\", [\n            \"options\",\n            \"pagesConfig\",\n            helpAboutController\n        ]);\n\n    /**\n     * @param options\n     * @param pagesConfig\n     */\n    function helpAboutController(options, pagesConfig) {\n        var ctrl = this;\n        ctrl.options = options.bs;\n        ctrl.section = pagesConfig[SECTION_NAME];\n    }\n\n})(angular);\n\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/help/help.directive.html",
    "content": ""
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/help/help.html",
    "content": "<div bs-panel=\"controls outline\">\n    <h1 bs-heading><icon icon=\"{{ctrl.section.icon}}\"></icon> {{ctrl.section.title}}</h1>\n</div>\n<div bs-panel id=\"bs-help\">\n    <div bs-panel-content=\"basic\">\n        <p>Help page</p>\n    </div>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/help/help.plugin.js",
    "content": "const PLUGIN_NAME = \"Help / About\";\n\n/**\n * @type {{plugin: Function, plugin:name: string, markup: string}}\n */\nmodule.exports = {\n    /**\n     * Plugin init\n     */\n    \"plugin\": function () {},\n    /**\n     * Hooks\n     */\n    \"hooks\": {\n        \"markup\": fileContent(\"/../../../static/content/help.content.html\"),\n        \"client:js\": fileContent(\"/help.client.js\"),\n        \"templates\": [\n            getPath(\"/help.directive.html\")\n        ],\n        \"page\": {\n            path: \"/help\",\n            title: PLUGIN_NAME,\n            template: \"help.html\",\n            controller: \"HelpAboutController\",\n            order: 6,\n            icon: \"help\"\n        }\n    },\n    /**\n     * Plugin name\n     */\n    \"plugin:name\": PLUGIN_NAME\n};\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction getPath (filepath) {\n    return require(\"path\").join(__dirname, filepath);\n}\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction fileContent (filepath) {\n    return require(\"fs\").readFileSync(getPath(filepath), \"utf-8\");\n}"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/history/history.client.js",
    "content": "(function (angular) {\n\n    const SECTION_NAME = \"history\";\n\n    angular\n        .module(\"BrowserSync\")\n        .controller(\"HistoryController\", [\n            \"$scope\",\n            \"options\",\n            \"History\",\n            \"pagesConfig\",\n            historyController\n        ]);\n\n    /**\n     * @param $scope\n     * @param options\n     * @param History\n     * @param pagesConfig\n     */\n    function historyController($scope, options, History, pagesConfig) {\n\n        var ctrl       = this;\n        ctrl.options = options.bs;\n        ctrl.section = pagesConfig[SECTION_NAME];\n        ctrl.visited = [];\n\n        ctrl.update  = function (items) {\n            ctrl.visited = items;\n            $scope.$digest();\n        };\n\n        History.get().then(function (items) {\n            ctrl.visited = items;\n        });\n\n        History.on(\"change\", ctrl.update);\n\n        $scope.$on(\"$destroy\", function () {\n            History.off(ctrl.update);\n        });\n\n        ctrl.clearVisited = function () {\n            History.clear();\n        };\n    }\n\n    angular\n        .module(\"BrowserSync\")\n        .directive(\"historyList\", function () {\n            return {\n                restrict: \"E\",\n                scope: {\n                    options: \"=\",\n                    visited: \"=\"\n                },\n                templateUrl: \"history.directive.html\",\n                controller: [\"$scope\", \"History\", \"Clients\", historyDirective],\n                controllerAs: \"ctrl\"\n            };\n        });\n\n    /**\n     * Controller for the URL sync\n     * @param $scope - directive scope\n     * @param History\n     * @param Clients\n     */\n    function historyDirective($scope, History, Clients) {\n\n        var ctrl = this;\n\n        ctrl.visited = [];\n\n        ctrl.utils = {};\n\n        ctrl.utils.localUrl = function (path) {\n            return [$scope.options.urls.local, path].join(\"\");\n        };\n\n        ctrl.updateVisited = function (data) {\n            ctrl.visited = data;\n            $scope.$digest();\n        };\n\n        ctrl.sendAllTo = function (url) {\n            url.success = true;\n            Clients.sendAllTo(url.path);\n            setTimeout(function () {\n                url.success = false;\n                $scope.$digest();\n            }, 1000);\n        };\n\n        ctrl.removeVisited = function (item) {\n            History.remove(item);\n        };\n\n        History.get().then(function (items) {\n            ctrl.visited = items;\n        });\n\n        History.on(\"change\", ctrl.updateVisited);\n\n        $scope.$on(\"$destroy\", function () {\n            History.off(ctrl.updateVisited);\n        });\n    }\n\n})(angular);\n\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/history/history.directive.html",
    "content": "<ul bs-list=\"bordered inline-controls\" ng-if=\"ctrl.visited\" id=\"bs-history-list\">\n    <li ng-repeat=\"url in ctrl.visited track by $index\">\n        <p>{{url.path}}</p>\n        <div bs-button-group>\n            <new-tab url=\"{{ctrl.utils.localUrl(url.path)}}\" mode=\"options.mode\"></new-tab>\n            <a href=\"#\"\n               title=\"Sync all devices to this address.\"\n               bs-button=\"subtle-alt icon-left\"\n               ng-click=\"ctrl.sendAllTo(url)\"\n               ng-class=\"{success: url.success}\"\n               >\n                <icon icon=\"circle-ok\" bs-state=\"success\"></icon>\n                <icon icon=\"syncall\"   bs-state=\"default\"></icon> Sync all\n            </a>\n            <a href=\"#\" bs-button=\"subtle-alt icon\" bs-remove ng-click=\"ctrl.removeVisited(url)\">\n                <icon icon=\"bin\"></icon>\n            </a>\n        </div>\n    </li>\n</ul>"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/history/history.html",
    "content": "<div bs-panel=\"controls outline\">\n    <h1 bs-heading><icon icon=\"{{ctrl.section.icon}}\"></icon> {{ctrl.section.title}}</h1>\n</div>\n<div bs-button-row ng-if=\"ctrl.visited.length\">\n    <button bs-button=\"icon-left inline\" ng-click=\"ctrl.clearVisited()\" ng-show=\"ctrl.visited.length\">\n        <svg bs-svg-icon><use xlink:href=\"#svg-bin\"></use></svg>\n        Clear all\n    </button>\n</div>\n<div bs-panel ng-if=\"!ctrl.visited.length\" id=\"bs-history-empty\">\n    <div bs-panel-content=\"basic\">\n        <p>Pages you navigate to will appear here - making it easy\n            to sync all devices to a specific page</p>\n    </div>\n</div>\n<history-list options=\"ctrl.options\"></history-list>"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/history/history.js",
    "content": "var url       = require(\"url\");\nvar Immutable = require(\"immutable\");\n\nmodule.exports.init = function (ui, bs) {\n\n    var validUrls = Immutable.OrderedSet();\n\n    var methods = {\n        /**\n         * Send the url list to UI\n         * @param urls\n         */\n        sendUpdatedUrls: function (urls) {\n            ui.socket.emit(\"ui:history:update\", decorateUrls(urls));\n        },\n        /**\n         * Only send to UI if list changed\n         * @param current\n         * @param temp\n         */\n        sendUpdatedIfChanged: function (current, temp) {\n            if (!Immutable.is(current, temp)) {\n                validUrls = temp;\n                methods.sendUpdatedUrls(validUrls);\n            }\n        },\n        /**\n         * Send all clients to a URL - this is a proxy\n         * in case we need to limit/check anything.\n         * @param data\n         */\n        sendToUrl: function (data) {\n\n            var parsed = url.parse(data.path);\n\n            data.override = true;\n            data.path = parsed.path;\n            data.url  = parsed.href;\n\n            ui.clients.emit(\"browser:location\", data);\n        },\n        /**\n         * Add a new path\n         * @param data\n         */\n        addPath: function (data) {\n            var temp = addPath(validUrls, url.parse(data.href), bs.options.get(\"mode\"));\n            methods.sendUpdatedIfChanged(validUrls, temp, ui.socket);\n        },\n        /**\n         * Remove a path\n         * @param data\n         */\n        removePath: function (data) {\n            var temp = removePath(validUrls, data.path);\n            methods.sendUpdatedIfChanged(validUrls, temp, ui.socket);\n        },\n        /**\n         * Get the current list\n         */\n        getVisited: function () {\n            ui.socket.emit(\"ui:receive:visited\", decorateUrls(validUrls));\n        }\n    };\n\n    ui.clients.on(\"connection\", function (client) {\n        client.on(\"ui:history:connected\", methods.addPath);\n    });\n\n    ui.socket.on(\"connection\", function (uiClient) {\n        /**\n         * Send urls on first connection\n         */\n        uiClient.on(\"ui:get:visited\",    methods.getVisited);\n        methods.sendUpdatedUrls(validUrls);\n    });\n\n    ui.listen(\"history\", {\n        \"sendAllTo\": methods.sendToUrl,\n        \"remove\":    methods.removePath,\n        \"clear\":     function () {\n            validUrls = Immutable.OrderedSet([]);\n            methods.sendUpdatedUrls(validUrls);\n        }\n    });\n\n    return methods;\n};\n\n/**\n * @param {Immutable.Set} urls\n * @returns {Array}\n */\nfunction decorateUrls (urls) {\n    var count = 0;\n    return urls.map(function (value) {\n        count += 1;\n        return {\n            path: value,\n            key: count\n        };\n    }).toJS().reverse();\n}\n\n/**\n * If snippet mode, add the full URL\n * if server/proxy, add JUST the path\n * @param immSet\n * @param urlObj\n * @param mode\n * @returns {Set}\n */\nfunction addPath(immSet, urlObj, mode) {\n    return immSet.add(\n        mode === \"snippet\"\n            ? urlObj.href\n            : urlObj.path\n    );\n}\n\nmodule.exports.addPath = addPath;\n\n/**\n * @param immSet\n * @param urlPath\n * @returns {*}\n */\nfunction removePath(immSet, urlPath) {\n    return immSet.remove(url.parse(urlPath).path);\n}\n\nmodule.exports.removePath = removePath;\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/history/history.plugin.js",
    "content": "var historyPlugin = require(\"./history\");\n\nconst PLUGIN_NAME = \"History\";\n\n/**\n * @type {{plugin: Function, plugin:name: string, markup: string}}\n */\nmodule.exports = {\n    /**\n     * @param ui\n     * @param bs\n     */\n    \"plugin\": function (ui, bs) {\n        ui.history = historyPlugin.init(ui, bs);\n    },\n    /**\n     * Hooks\n     */\n    \"hooks\": {\n        \"markup\": fileContent(\"history.html\"),\n        \"client:js\": fileContent(\"/history.client.js\"),\n        \"templates\": [\n            getPath(\"/history.directive.html\")\n        ],\n        \"page\": {\n            path: \"/history\",\n            title: PLUGIN_NAME,\n            template: \"history.html\",\n            controller: PLUGIN_NAME + \"Controller\",\n            order: 3,\n            icon: \"list2\"\n        }\n    },\n    /**\n     * Plugin name\n     */\n    \"plugin:name\": PLUGIN_NAME\n};\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction getPath (filepath) {\n    return require(\"path\").join(__dirname, filepath);\n}\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction fileContent (filepath) {\n    return require(\"fs\").readFileSync(getPath(filepath), \"utf-8\");\n}"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/network-throttle/network-throttle.client.js",
    "content": "(function (angular) {\n\n    const SECTION_NAME = \"network-throttle\";\n\n    angular\n        .module(\"BrowserSync\")\n        .controller(\"NetworkThrottleController\", [\n            \"options\",\n            \"pagesConfig\",\n            \"Socket\",\n            \"$scope\",\n            NetworkThrottleController\n        ]);\n\n    /**\n     * @param options\n     * @param pagesConfig\n     * @param Socket\n     * @param $scope\n     */\n    function NetworkThrottleController (options, pagesConfig, Socket, $scope) {\n\n        var ctrl         = this;\n\n        ctrl.section     = pagesConfig[SECTION_NAME];\n        ctrl.options     = options.bs;\n        ctrl.uiOptions   = options.ui;\n        ctrl.clientFiles = options.ui.clientFiles || {};\n        ctrl.section     = pagesConfig[SECTION_NAME];\n\n        ctrl.throttle    = ctrl.uiOptions[SECTION_NAME];\n        ctrl.selected    = ctrl.throttle.targets[0].id;\n        ctrl.servers     = ctrl.throttle.servers;\n        ctrl.port        = \"\";\n        ctrl.portEntry   = \"auto\";\n        ctrl.serverCount = Object.keys(ctrl.servers).length;\n        ctrl.blurs       = [];\n\n        ctrl.state = {\n            success: false,\n            waiting: false,\n            classname: \"ready\"\n        };\n\n        ctrl.createServer = function (selected, event) {\n\n            if (ctrl.blurs.indexOf(event.target) === -1) {\n                ctrl.blurs.push(event.target);\n            }\n\n            var item = getByProp(ctrl.throttle.targets, \"id\", ctrl.selected);\n\n\n            if (ctrl.portEntry === \"auto\") {\n                return send(\"\");\n            }\n\n            if (!ctrl.port || !ctrl.port.length) {\n                setError();\n                return;\n            }\n\n            if (!ctrl.port.match(/\\d{4,5}/)) {\n                setError();\n                return;\n            }\n\n            var port = parseInt(ctrl.port, 10);\n\n            if (port < 1024 || port > 65535) {\n                setError();\n                return;\n            }\n\n            send(ctrl.port);\n\n            function setError() {\n                ctrl.state.waiting   = false;\n                ctrl.state.portError = true;\n            }\n\n            function send (port) {\n\n                ctrl.state.classname = \"waiting\";\n                ctrl.state.waiting   = true;\n\n                Socket.uiEvent({\n                    namespace: SECTION_NAME,\n                    event: \"server:create\",\n                    data: {\n                        speed: item,\n                        port: port\n                    }\n                });\n            }\n        };\n\n        ctrl.destroyServer = function (item, port) {\n            Socket.uiEvent({\n                namespace: SECTION_NAME,\n                event: \"server:destroy\",\n                data: {\n                    speed: item,\n                    port: port\n                }\n            });\n        };\n\n        ctrl.toggleSpeed = function (item) {\n            if (!item.active) {\n                item.urls = [];\n            }\n        };\n\n        ctrl.update = function (data) {\n\n            ctrl.servers     = data.servers;\n            ctrl.serverCount = Object.keys(ctrl.servers).length;\n\n            if (data.event === \"server:create\") {\n                updateButtonState();\n            }\n\n            $scope.$digest();\n        };\n\n        function updateButtonState() {\n\n            ctrl.state.success = true;\n            ctrl.state.classname = \"success\";\n\n            setTimeout(function () {\n\n                ctrl.blurs.forEach(function (elem) {\n                    elem.blur();\n                });\n\n                setTimeout(function () {\n                    ctrl.state.success   = false;\n                    ctrl.state.waiting   = false;\n                    ctrl.state.classname = \"ready\";\n\n                    $scope.$digest();\n\n                }, 500);\n\n            }, 300);\n        }\n\n        /**\n         * @param collection\n         * @param prop\n         * @returns {*}\n         */\n        function getByProp (collection, prop, name) {\n            var match = collection.filter(function (item) {\n                return item[prop] === name;\n            });\n            if (match.length) {\n                return match[0];\n            }\n            return false;\n        }\n\n        Socket.on(\"ui:network-throttle:update\", ctrl.update);\n        $scope.$on(\"$destroy\", function () {\n            Socket.off(\"ui:network-throttle:update\", ctrl.update);\n        });\n    }\n\n    /**\n     * Display the snippet when in snippet mode\n     */\n    angular\n        .module(\"BrowserSync\")\n        .directive(\"throttle\", function () {\n            return {\n                restrict: \"E\",\n                replace: true,\n                scope: {\n                    \"target\": \"=\",\n                    \"options\": \"=\"\n                },\n                templateUrl: \"network-throttle.directive.html\",\n                controller: [\"$scope\", \"Socket\", throttleDirectiveControlller],\n                controllerAs: \"ctrl\"\n            };\n        });\n\n    /**\n     * @param $scope\n     */\n    function throttleDirectiveControlller ($scope) {\n\n        var ctrl = this;\n\n        ctrl.throttle = $scope.options[SECTION_NAME];\n\n    }\n\n})(angular);"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/network-throttle/network-throttle.directive.html",
    "content": "<section bs-panel-content>\n    <div ng-if=\"target.active\">\n        <p ng-if=\"!target.urls.length\">\n            Creating a throttled server, please wait...\n        </p>\n        <div ng-if=\"target.urls.length\">\n            <ul bs-list>\n                <li ng-repeat=\"url in target.urls\"><a href=\"{{url}}\">{{url}}</a></li>\n            </ul>\n        </div>\n    </div>\n</section>\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/network-throttle/network-throttle.html",
    "content": "<article>\n    <div bs-panel=\"controls outline\">\n        <h1 bs-heading>\n            <icon icon=\"{{ctrl.section.icon}}\"></icon>\n            {{ctrl.section.title}}\n        </h1>\n    </div>\n    <div bs-panel=\"no-border\" ng-if=\"ctrl.options.mode === 'snippet'\">\n        <div bs-panel-content=\"basic\">\n            <p class=\"lede\">Sorry, Network Throttling is only available in Server or Proxy mode.</p>\n        </div>\n    </div>\n    <div bs-panel=\"no-border\" ng-if=\"ctrl.options.mode !== 'snippet'\">\n        <div bs-panel-content=\"basic\">\n            <div bs-inputs bs-grid=\"wide-3 desk-2\">\n                <div bs-grid-item>\n                    <p bs-label-heading>Speed</p>\n                    <div bs-input=\"inline\" ng-repeat=\"(key, item) in ctrl.throttle.targets | orderObjectBy:'order'\">\n                        <input\n                                type=\"radio\"\n                                id=\"speed-{{item.id}}\"\n                                checked name=\"speed\"\n                                ng-model=\"ctrl.selected\"\n                                value=\"{{item.id}}\">\n\n                        <label for=\"speed-{{item.id}}\" bs-input-label=\"light\">{{item.title}}</label>\n                    </div>\n                </div>\n                <div bs-grid-item>\n                    <p bs-label-heading>Port</p>\n                    <div bs-input=\"text\">\n                        <div bs-input=\"inline\">\n                            <input type=\"radio\" name=\"port-select\" id=\"port-auto\" checked value=\"auto\"\n                                   ng-model=\"ctrl.portEntry\">\n                            <label for=\"port-auto\" bs-input-label=\"light\">Auto Detection</label>\n                        </div>\n                        <div bs-input=\"inline\">\n                            <input type=\"radio\" id=\"port-manual\" name=\"port-select\" value=\"manual\" ng-model=\"ctrl.portEntry\">\n                            <label for=\"port-manual\" bs-input-label=\"light\">User specified <span ng-if=\"ctrl.state.portError\">(between\n                                1024 & 65535)</span></label>\n                        </div>\n                        <input id=\"server-port\"\n                               type=\"text\"\n                               value=\"\"\n                               placeholder=\"Eg: 1024\"\n                               ng-model=\"ctrl.port\"\n                               ng-focus=\"ctrl.portEntry = 'manual'\"\n                               custom-validation>\n\n                    </div>\n                    <br/>\n                    <div ng-class=\"[ctrl.state.classname]\" bs-state-wrapper>\n                        <button\n                                id=\"create-server\"\n                                bs-button=\"size-small subtle-alt icon-left\"\n                                ng-click=\"ctrl.createServer(ctrl.selected, $event)\"\n                                ng-disabled=\"ctrl.state.waiting\"\n                                >\n                            <icon icon=\"circle-plus\"></icon>\n                            Create Server\n                        </button>\n                        <div bs-state-icons>\n                            <icon icon=\"circle-ok\"    bs-state=\"success inline\"></icon>\n                            <icon icon=\"circle-minus\" bs-state=\"waiting inline\" bs-anim=\"spin\"></icon>\n                        </div>\n                    </div>\n                </div>\n                <div bs-grid-item>\n                </div>\n            </div>\n        </div>\n        <br/>\n        <div bs-panel-content=\"basic\">\n            <h3 ng-if=\"ctrl.serverCount\">Your Servers:</h3>\n            <h3 ng-if=\"!ctrl.serverCount\">Your Servers will appear here...</h3>\n        </div>\n\n        <ul bs-list=\"bordered inline-controls\" bs-offset=\"basic\" id=\"throttle-server-list\">\n            <li ng-repeat=\"(key, item) in ctrl.servers track by key\">\n                <p bs-width=\"5\">{{$index + 1}}.</p>\n                <p bs-width=\"10\"><b>{{item.speed.id | uppercase}}</b></p>\n                <p><a href=\"{{item.urls[0]}}\">{{item.urls[0]}}</a></p>\n                <p><a href=\"{{item.urls[1]}}\">{{item.urls[1]}}</a></p>\n                <div bs-button-group>\n                    <button href=\"#\" bs-button=\"subtle-alt icon\" ng-click=\"ctrl.destroyServer(item, key)\">\n                        <svg bs-svg-icon><use xlink:href=\"#svg-bin\"></use></svg>\n                    </button>\n                </div>\n            </li>\n        </ul>\n    </div>\n\n</article>\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/network-throttle/network-throttle.js",
    "content": "var Immutable = require(\"immutable\");\n\nmodule.exports.init = function (ui) {\n\n    var optPath = [\"network-throttle\"];\n    var serverOptPath = optPath.concat([\"servers\"]);\n    var listenHost = ui.options.get(\"listen\");\n    ui.servers  = {};\n\n    ui.setOptionIn(optPath, Immutable.fromJS({\n        name: \"network-throttle\",\n        title: \"Network Throttle\",\n        active: false,\n        targets: require(\"./targets\")\n    }));\n\n    ui.setOptionIn(serverOptPath, Immutable.Map({}));\n\n    /**\n     * @param input\n     * @returns {number}\n     */\n    function getPortArg(input) {\n        input = input.trim();\n        if (input.length && input.match(/\\d{3,5}/)) {\n            input = parseInt(input, 10);\n        } else {\n            input = ui.bs.options.get(\"port\") + 1;\n        }\n        return input;\n    }\n\n    /**\n     * @returns {string}\n     */\n    function getTargetUrl() {\n        return require(\"url\").parse(ui.bs.options.getIn([\"urls\", \"local\"]));\n    }\n\n    var methods = {\n        /**\n         * @param data\n         */\n        \"server:create\": function (data) {\n\n            data.port = getPortArg(data.port);\n            data.cb   = data.cb || function () { /* noop */};\n\n            /**\n             * @param opts\n             */\n            function saveThrottleInfo (opts) {\n\n                var urls = getUrls(ui.bs.options.set(\"port\", opts.port).toJS());\n\n                ui.setOptionIn(serverOptPath.concat([opts.port]), Immutable.fromJS({\n                    urls: urls,\n                    speed: opts.speed\n                }));\n\n                setTimeout(function () {\n\n                    ui.socket.emit(\"ui:network-throttle:update\", {\n                        servers: ui.getOptionIn(serverOptPath).toJS(),\n                        event: \"server:create\"\n                    });\n\n                    ui.servers[opts.port] = opts.server;\n\n                    data.cb(null, opts);\n\n                }, 300);\n\n            }\n\n            /**\n             * @param err\n             * @param port\n             */\n            function createThrottle (err, port) {\n\n                var target = getTargetUrl();\n\n                var args = {\n                    port: port,\n                    target: target,\n                    speed: data.speed\n                };\n\n                if (ui.bs.getOption(\"scheme\") === \"https\") {\n                    var httpsOpts = require(\"browser-sync/dist/server/utils\").getHttpsOptions(ui.bs.options);\n                    args.key  = httpsOpts.key;\n                    args.cert = httpsOpts.cert;\n                }\n\n                args.server = require(\"./throttle-server\")(args, listenHost);\n                require('server-destroy')(args.server);\n                args.server.listen(port, listenHost);\n\n                saveThrottleInfo(args);\n            }\n\n            /**\n             * Try for a free port\n             */\n            ui.bs.utils.portscanner.findAPortNotInUse(data.port, data.port + 100, (listenHost || \"127.0.0.1\"), function (err, port) {\n                if (err) {\n                    return createThrottle(err);\n                } else {\n                    createThrottle(null, port);\n                }\n            });\n        },\n        /**\n         * @param data\n         */\n        \"server:destroy\": function (data) {\n            if (ui.servers[data.port]) {\n                ui.servers[data.port].destroy();\n                ui.setMany(function (item) {\n                    item.deleteIn(serverOptPath.concat([parseInt(data.port, 10)]));\n                });\n                delete ui.servers[data.port];\n            }\n            ui.socket.emit(\"ui:network-throttle:update\", {\n                servers: ui.getOptionIn(serverOptPath).toJS(),\n                event: \"server:destroy\"\n            });\n        },\n        /**\n         * @param event\n         */\n        event: function (event) {\n            methods[event.event](event.data);\n        }\n    };\n\n    return methods;\n};\n\n/**\n * Get local + external urls with a different port\n * @param opts\n * @returns {List<T>|List<any>}\n */\nfunction getUrls (opts) {\n\n    var list    = [];\n\n    var bsLocal = require(\"url\").parse(opts.urls.local);\n\n    list.push([bsLocal.protocol + \"//\", bsLocal.hostname, \":\", opts.port].join(\"\"));\n\n    if (opts.urls.external) {\n        var external = require(\"url\").parse(opts.urls.external);\n        list.push([bsLocal.protocol + \"//\", external.hostname, \":\", opts.port].join(\"\"));\n    }\n\n    return Immutable.List(list);\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/network-throttle/network-throttle.plugin.js",
    "content": "var networkThrottle = require(\"./network-throttle\");\n\nconst PLUGIN_NAME = \"Network Throttle\";\n\n/**\n * @type {{plugin: Function, plugin:name: string, markup: string}}\n */\nmodule.exports = {\n    /**\n     * Plugin init\n     */\n    \"plugin\": function (ui, bs) {\n        ui.throttle = networkThrottle.init(ui, bs);\n        ui.listen(\"network-throttle\", ui.throttle);\n    },\n\n    /**\n     * Hooks\n     */\n    \"hooks\": {\n        \"markup\": fileContent(\"/network-throttle.html\"),\n        \"client:js\": [fileContent(\"/network-throttle.client.js\")],\n        \"templates\": [],\n        \"page\": {\n            path: \"/network-throttle\",\n            title: PLUGIN_NAME,\n            template: \"network-throttle.html\",\n            controller: \"NetworkThrottleController\",\n            order: 5,\n            icon: \"time\"\n        }\n    },\n    /**\n     * Plugin name\n     */\n    \"plugin:name\": PLUGIN_NAME\n};\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction getPath (filepath) {\n    return require(\"path\").join(__dirname, filepath);\n}\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction fileContent (filepath) {\n    return require(\"fs\").readFileSync(getPath(filepath));\n}"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/network-throttle/targets.js",
    "content": "module.exports = [\n    {\n        active:  false,\n        title:   \"DSL (2Mbs, 5ms RTT)\",\n        id:      \"dsl\",\n        speed:   200,\n        latency: 5,\n        urls:    [],\n        order:   1\n    },\n    {\n        active:  false,\n        title:   \"4G (4Mbs, 20ms RTT)\",\n        id:     \"4g\",\n        speed:   400,\n        latency: 10,\n        urls:    [],\n        order:   2\n\n    },\n    {\n        active:  false,\n        title:   \"3G (750kbs, 100ms RTT)\",\n        id:     \"3g\",\n        speed:   75,\n        latency: 50,\n        urls:    [],\n        order:   3\n    },\n    {\n        active:  false,\n        id:      \"good-2g\",\n        title:   \"Good 2G (450kbs, 150ms RTT)\",\n        speed:   45,\n        latency: 75,\n        urls:    [],\n        order:   4\n    },\n    {\n        active:  false,\n        id:      \"2g\",\n        title:   \"Regular 2G (250kbs, 300ms RTT)\",\n        speed:   25,\n        latency: 150,\n        urls:    [],\n        order:   5\n    },\n    {\n        active:  false,\n        id:      \"gprs\",\n        title:   \"GPRS (50kbs, 500ms RTT)\",\n        speed:   5,\n        latency: 250,\n        urls:    [],\n        order:   6\n    }\n];\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/network-throttle/throttle-server.js",
    "content": "var ThrottleGroup = require(\"stream-throttle\").ThrottleGroup;\n\nmodule.exports = throttle;\n\n/**\n *\n */\nfunction throttle (opts, listenHost) {\n\n    var options = {\n        local_host:  listenHost,\n        remote_host: listenHost,\n        upstream:    10*1024,\n        downstream:  opts.speed.speed * 1024,\n        keepalive:   false\n    };\n\n    var serverOpts = {\n        allowHalfOpen: true,\n        rejectUnauthorized: false\n    };\n\n    var module = \"net\";\n    var method = \"createConnection\";\n\n    if (opts.key) {\n        module = \"tls\";\n        method = \"connect\";\n        serverOpts.key = opts.key;\n        serverOpts.cert = opts.cert;\n    }\n\n    return require(module).createServer(serverOpts, function (local) {\n\n        var remote = require(module)[method]({\n            host: opts.target.hostname,\n            port: opts.target.port,\n            allowHalfOpen: true,\n            rejectUnauthorized: false\n        });\n\n        var upThrottle = new ThrottleGroup({ rate: options.upstream });\n        var downThrottle = new ThrottleGroup({ rate: options.downstream });\n\n        var localThrottle = upThrottle.throttle();\n        var remoteThrottle = downThrottle.throttle();\n\n        setTimeout(function () {\n            local\n                .pipe(localThrottle)\n                .pipe(remote);\n        }, opts.speed.latency);\n\n        setTimeout(function () {\n            remote\n                .pipe(remoteThrottle)\n                .pipe(local);\n        }, opts.speed.latency);\n\n        local.on(\"error\", function() {\n            remote.destroy();\n            local.destroy();\n        });\n\n        remote.on(\"error\", function() {\n            local.destroy();\n            remote.destroy();\n        });\n    });\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/overview/overview.client.js",
    "content": "(function (angular) {\n\n    const SECTION_NAME = \"overview\";\n\n    angular\n        .module(\"BrowserSync\")\n        .controller(\"OverviewController\", [\n            \"options\",\n            \"pagesConfig\",\n            OverviewController\n        ]);\n\n    /**\n     * @param options\n     * @param pagesConfig\n     */\n    function OverviewController (options, pagesConfig) {\n        var ctrl     = this;\n        ctrl.section = pagesConfig[SECTION_NAME];\n        ctrl.options = options.bs;\n        ctrl.ui = {\n            snippet: !ctrl.options.server && !ctrl.options.proxy\n        };\n    }\n\n    /**\n     * Url Info - this handles rendering of each server\n     * info item\n     */\n    angular\n        .module(\"BrowserSync\")\n        .directive(\"urlInfo\", function () {\n            return {\n                restrict: \"E\",\n                replace: true,\n                scope: {\n                    \"options\": \"=\"\n                },\n                templateUrl: \"url-info.html\",\n                controller: [\n                    \"$scope\",\n                    \"$rootScope\",\n                    \"Clients\",\n                    urlInfoController\n                ]\n            };\n        });\n\n    /**\n     * @param $scope\n     * @param $rootScope\n     * @param Clients\n     */\n    function urlInfoController($scope, $rootScope, Clients) {\n\n        var options = $scope.options;\n        var urls    = options.urls;\n\n        $scope.ui = {\n            server: false,\n            proxy: false\n        };\n\n        if ($scope.options.mode === \"server\") {\n            $scope.ui.server = true;\n            if (!Array.isArray($scope.options.server.baseDir)) {\n                $scope.options.server.baseDir = [$scope.options.server.baseDir];\n            }\n        }\n\n        if ($scope.options.mode === \"proxy\") {\n            $scope.ui.proxy = true;\n        }\n\n        $scope.urls = [];\n\n        $scope.urls.push({\n            title: \"Local\",\n            tagline: \"URL for the machine you are running BrowserSync on\",\n            url: urls.local,\n            icon: \"imac\"\n        });\n\n        if (urls.external) {\n            $scope.urls.push({\n                title: \"External\",\n                tagline: \"Other devices on the same wifi network\",\n                url: urls.external,\n                icon: \"wifi\"\n            });\n        }\n\n        if (urls.tunnel) {\n            $scope.urls.push({\n                title: \"Tunnel\",\n                tagline: \"Secure HTTPS public url\",\n                url: urls.tunnel,\n                icon: \"globe\"\n            });\n        }\n\n        /**\n         *\n         */\n        $scope.sendAllTo = function (path) {\n            Clients.sendAllTo(path);\n            $rootScope.$emit(\"notify:flash\", {\n                heading: \"Instruction sent:\",\n                message: \"Sync all Browsers to: \" + path\n            });\n        };\n    }\n\n    /**\n     * Display the snippet when in snippet mode\n     */\n    angular\n        .module(\"BrowserSync\")\n        .directive(\"snippetInfo\", function () {\n            return {\n                restrict: \"E\",\n                replace: true,\n                scope: {\n                    \"options\": \"=\"\n                },\n                templateUrl: \"snippet-info.html\",\n                controller: [\"$scope\", function snippetInfoController() {/*noop*/}]\n            };\n        });\n\n})(angular);"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/overview/overview.html",
    "content": "<article>\n    <div bs-panel=\"controls outline\">\n        <h1 bs-heading>\n            <icon icon=\"{{ctrl.section.icon}}\"></icon>\n            {{ctrl.section.title}}\n        </h1>\n    </div>\n\n    <url-info ng-if=\"ctrl.options.server || ctrl.options.proxy\" options=\"ctrl.options\"></url-info>\n    <snippet-info ng-if=\"ctrl.options && ctrl.ui.snippet\" options=\"ctrl.options\"></snippet-info>\n\n    <div bs-panel=\"full\">\n        <div bs-panel-content>\n            <div bs-panel-icon>\n                <svg bs-svg-icon><use xlink:href=\"#svg-devices\"></use></svg>\n            </div>\n            <p bs-text=\"lede\">Current Connections</p>\n            <p>Connected browsers will be listed here.</p>\n\n            <connection-list options=\"ctrl.options\"></connection-list>\n\n        </div>\n    </div>\n\n</article>"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/overview/overview.plugin.js",
    "content": "const PLUGIN_NAME = \"Overview\";\n\n/**\n * @type {{plugin: Function, plugin:name: string, markup: string}}\n */\nmodule.exports = {\n    /**\n     * Plugin init\n     */\n    \"plugin\": function () { /* noop */ },\n\n    /**\n     * Hooks\n     */\n    \"hooks\": {\n        \"markup\": fileContent(\"/overview.html\"),\n        \"client:js\": fileContent(\"/overview.client.js\"),\n        \"templates\": [\n            getPath(\"/snippet-info.html\"),\n            getPath(\"/url-info.html\")\n        ],\n        \"page\": {\n            path: \"/\",\n            title: PLUGIN_NAME,\n            template: \"overview.html\",\n            controller: PLUGIN_NAME.replace(\" \", \"\") + \"Controller\",\n            order: 1,\n            icon: \"cog\"\n        }\n    },\n    /**\n     * Plugin name\n     */\n    \"plugin:name\": PLUGIN_NAME\n};\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction getPath (filepath) {\n    return require(\"path\").join(__dirname, filepath);\n}\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction fileContent (filepath) {\n    return require(\"fs\").readFileSync(getPath(filepath), \"utf-8\");\n}"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/overview/snippet-info.html",
    "content": "<div bs-panel=\"full\">\n    <div bs-panel-content>\n        <div bs-panel-icon>\n            <svg bs-svg-icon=\"\"><use xlink:href=\"#svg-code\"></use></svg>\n        </div>\n        <p bs-text=\"lede\">Place this snippet somewhere before the closing <code>&lt;/body&gt;</code> tag in your website</p>\n<pre><code>{{options.snippet}}</code></pre>\n\n    </div>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/overview/url-info.html",
    "content": "<div>\n    <section bs-panel ng-repeat=\"url in urls\">\n        <div bs-panel-content>\n            <div bs-panel-icon>\n                <icon icon=\"{{url.icon}}\"></icon>\n            </div>\n            <p bs-text=\"lede\">{{url.title}}</p>\n            <p><a href=\"{{url.url}}\">{{url.url}}</a></p>\n            <div bs-button-group>\n                <a href=\"{{url.url}}\" target=\"_blank\" bs-button=\"size-small subtle-alt icon-left\">\n                    <icon icon=\"newtab\"></icon>\n                    new tab\n                </a>\n                <a href=\"#\" ng-click=\"sendAllTo(url.url)\" bs-button=\"size-small subtle-alt icon-left\">\n                    <icon icon=\"syncall\"></icon>\n                    sync all\n                </a>\n            </div>\n        </div>\n    </section>\n    <section ng-if=\"ui.server\">\n        <div bs-panel=\"full\">\n            <div bs-panel-content>\n                <div bs-panel-icon>\n                    <icon icon=\"terminal\"></icon>\n                </div>\n                <p bs-text=\"lede\">Serving files from</p>\n                <ul bs-list=\"basic\">\n                    <li ng-repeat=\"url in options.server.baseDir\">{{url}}</li>\n                </ul>\n            </div>\n        </div>\n    </section>\n    <section bs-panel ng-if=\"ui.proxy\">\n        <div bs-panel-content>\n            <div bs-panel-icon>\n                <icon icon=\"target\"></icon></svg>\n            </div>\n            <p bs-text=\"lede\">Proxying:</p>\n            <p>\n                <a href=\"{{options.proxy.target}}\" target=\"_blank\">{{options.proxy.target}}</a>\n            </p>\n        </div>\n    </section>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/plugins/plugins.client.js",
    "content": "/**\n *\n */\n(function (angular) {\n\n    var SECTION_NAME          = \"plugins\";\n\n    angular\n        .module(\"BrowserSync\")\n        .controller(\"PluginsController\", [\n            \"options\",\n            \"Socket\",\n            \"pagesConfig\",\n            PluginsPageController\n        ]);\n\n    /**\n     * @param options\n     * @param Socket\n     * @param pagesConfig\n     * @constructor\n     */\n    function PluginsPageController(options, Socket, pagesConfig) {\n\n\n        var ctrl = this;\n        ctrl.section = pagesConfig[SECTION_NAME];\n\n        ctrl.options     = options.bs;\n        ctrl.uiOptions   = options.ui;\n\n        /**\n         * Don't show this UI as user plugin\n         */\n        var filtered = ctrl.options.userPlugins.filter(function (item) {\n            return item.name !== \"UI\";\n        }).map(function (item) {\n            item.title = item.name;\n            return item;\n        });\n\n        var named = filtered.reduce(function (all, item) {\n            all[item.name] = item;\n            return all;\n        }, {});\n\n        /**\n         * @type {{loading: boolean}}\n         */\n        ctrl.ui = {\n            loading: false,\n            plugins: filtered,\n            named: named\n        };\n\n        /**\n         * Toggle a pluginrs\n         */\n        ctrl.togglePlugin = function (plugin) {\n            Socket.uiEvent({\n                namespace: SECTION_NAME,\n                event: \"set\",\n                data: plugin\n            });\n        };\n\n        /**\n         * Set the state of many options\n         * @param value\n         */\n        ctrl.setMany = function (value) {\n            Socket.uiEvent({\n                namespace: SECTION_NAME,\n                event: \"setMany\",\n                data: value\n            });\n            ctrl.ui.plugins = ctrl.ui.plugins.map(function (item) {\n                item.active = value;\n                return item;\n            });\n        };\n    }\n\n})(angular);\n\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/plugins/plugins.html",
    "content": "<div bs-panel=\"controls outline\">\n    <h1 bs-heading>\n        <icon icon=\"{{ctrl.section.icon}}\"></icon>\n        {{ctrl.section.title}}\n    </h1>\n    <div ng-if=\"ui.plugins.length\" bs-button-row>\n        <button bs-button=\"inline success\" ng-click=\"ctrl.setMany(true)\">\n            <svg bs-svg-icon=\"\">\n                <use xlink:href=\"#svg-circle-ok\"></use>\n            </svg>\n            Enable All\n        </button>\n        <button bs-button=\"inline\" ng-click=\"ctrl.setMany(false)\">\n            <svg bs-svg-icon=\"\">\n                <use xlink:href=\"#svg-circle-delete\"></use>\n            </svg>\n            Disable all\n        </button>\n    </div>\n</div>\n\n%pluginlist%\n\n<section ng-if=\"!ctrl.ui.plugins.length\">\n    <div bs-panel>\n        <div bs-panel-content=\"basic\">\n            <p bs-text=\"lede\">Sorry, no plugins were loaded</p>\n            <p>You can either write your own plugin (guide coming soon!) or <a href=\"https://www.npmjs.org/search?q=browser%20sync%20plugin\" target=\"_blank\">Search NPM</a>\n                for packages that contain the keywords <code>browser sync plugin</code>\n            </p>\n        </div>\n    </div>\n</section>"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/plugins/plugins.plugin.js",
    "content": "const PLUGIN_NAME = \"Plugins\";\n\n/**\n * @type {{plugin: Function, plugin:name: string, markup: string}}\n */\nmodule.exports = {\n    /**\n     * @param ui\n     * @param bs\n     */\n    \"plugin\": function (ui, bs) {\n\n        ui.listen(\"plugins\", {\n\n            \"set\": function (data) {\n                bs.events.emit(\"plugins:configure\", data);\n            },\n\n            \"setMany\": function (data) {\n\n                if (data.value !== true) {\n                    data.value = false;\n                }\n\n                bs.getUserPlugins()\n                    .filter(function (item) {\n                        return item.name !== \"UI    \"; // todo dupe code server/client\n                    })\n                    .forEach(function (item) {\n                        item.active = data.value;\n                        bs.events.emit(\"plugins:configure\", item);\n                    });\n            }\n        });\n    },\n    /**\n     * Hooks\n     */\n    \"hooks\": {\n        \"markup\": fileContent(\"plugins.html\"),\n        \"client:js\": fileContent(\"/plugins.client.js\"),\n        \"templates\": [\n            //getPath(\"plugins.directive.html\")\n        ],\n        \"page\": {\n            path: \"/plugins\",\n            title: PLUGIN_NAME,\n            template: \"plugins.html\",\n            controller: PLUGIN_NAME + \"Controller\",\n            order: 4,\n            icon: \"plug\"\n        }\n    },\n    /**\n     * Plugin name\n     */\n    \"plugin:name\": PLUGIN_NAME\n};\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction getPath (filepath) {\n    return require(\"path\").join(__dirname, filepath);\n}\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction fileContent (filepath) {\n    return require(\"fs\").readFileSync(getPath(filepath), \"utf-8\");\n}"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/client-files.js",
    "content": "var files = [\n    {\n        type: \"css\",\n        context: \"remote-debug\",\n        id: \"__browser-sync-pesticide__\",\n        active: false,\n        file: __dirname + \"/css/pesticide.min.css\",\n        title: \"CSS Outlining\",\n        served: false,\n        name: \"pesticide\",\n        src: \"/browser-sync/pesticide.css\",\n        tagline: \"Add simple CSS outlines to all elements. (powered by <span style='text-decoration: line-through'>Pesticide.io</span>)\",\n        hidden: \"\"\n    },\n    {\n        type: \"css\",\n        context: \"remote-debug\",\n        id: \"__browser-sync-pesticidedepth__\",\n        active: false,\n        file: __dirname + \"/css/pesticide-depth.css\",\n        title: \"CSS Depth Outlining\",\n        served: false,\n        name: \"pesticide-depth\",\n        src: \"/browser-sync/pesticide-depth.css\",\n        tagline: \"Add CSS box-shadows to all elements. (powered by <span style='text-decoration: line-through'>Pesticide.io</span>)\",\n        hidden: \"\"\n    },\n    {\n        type:    \"js\",\n        context: \"n/a\",\n        id:      \"__browser-sync-gridoverlay__\",\n        active:  false,\n        file:    __dirname + \"/overlay-grid/js/grid-overlay.js\",\n        served:  false,\n        name:    \"overlay-grid-js\",\n        src:     \"/browser-sync/grid-overlay-js.js\"\n    }\n];\n\nmodule.exports.files = files;\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/compression.html",
    "content": "<div bs-panel=\"switch\" ng-class=\"{'disabled': !ctrl.compression.active}\">\n    <div bs-panel-content>\n        <div bs-panel-icon=\"switch\">\n            <div class=\"switch\">\n                <input id=\"cmn-form-{{ctrl.compression.name}}\"\n                       ng-model=\"ctrl.compression.active\"\n                       ng-change=\"ctrl.toggleLatency(ctrl.compression)\"\n                       class=\"cmn-toggle cmn-toggle-round\"\n                       type=\"checkbox\"\n                       checked=\"\">\n                <label for=\"cmn-form-{{ctrl.compression.name}}\"></label>\n            </div>\n        </div>\n        <div>\n            <p bs-Text=\"lede\">{{ctrl.compression.title}}</p>\n            <p ng-if=\"ctrl.compression.tagline.length\" ng-bind-html=\"ctrl.compression.tagline\"></p>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/compression.js",
    "content": "var Immutable = require(\"immutable\");\n\nmodule.exports.init = function (ui, bs) {\n\n    var optPath = [\"remote-debug\", \"compression\"];\n\n    ui.setOptionIn(optPath, Immutable.Map({\n        name: \"compression\",\n        title: \"Compression\",\n        active: false,\n        tagline: \"Add Gzip Compression to all responses\"\n    }));\n\n    var methods = {\n        toggle: function (value) {\n            if (value !== true) {\n                value = false;\n            }\n            if (value) {\n                ui.setOptionIn(optPath.concat(\"active\"), true);\n                bs.addMiddleware(\"\", require(\"compression\")(), {id: \"ui-compression\", override: true});\n            } else {\n                ui.setOptionIn(optPath.concat(\"active\"), false);\n                bs.removeMiddleware(\"ui-compression\");\n            }\n        },\n        event: function (event) {\n            methods[event.event](event.data);\n        }\n    };\n\n    return methods;\n};"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/css/pesticide-depth.css",
    "content": "/*\n    pesticide v1.0.0 . @mrmrs . MIT\n*/\nbody {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\narticle {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nnav {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\naside {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nsection {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nheader {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nfooter {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nh1 {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nh2 {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nh3 {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nh4 {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nh5 {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nh6 {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nmain {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\naddress {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ndiv {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\np {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nhr {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\npre {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nblockquote {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nol {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nul {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nli {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ndl {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ndt {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ndd {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nfigure {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nfigcaption {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ntable {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ncaption {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nthead {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ntbody {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ntfoot {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ntr {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nth {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ntd {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ncol {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ncolgroup {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nbutton {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ndatalist {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nfieldset {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nform {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ninput {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nkeygen {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nlabel {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nlegend {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nmeter {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\noptgroup {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\noption {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\noutput {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nprogress {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nselect {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ntextarea {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ndetails {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nsummary {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ncommand {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nmenu {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ndel {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nins {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nimg {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\niframe {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nembed {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nobject {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nparam {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nvideo {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\naudio {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nsource {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ncanvas {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ntrack {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nmap {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\narea {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\na {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nem {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nstrong {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ni {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nb {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nu {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ns {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nsmall {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nabbr {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nq {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ncite {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ndfn {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nsub {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nsup {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ntime {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\ncode {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nkbd {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nsamp {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nvar {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nmark {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nbdi {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nbdo {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nruby {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nrt {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nrp {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nspan {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nbr {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\nwbr {\n  -webkit-box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  box-shadow: 0 0 1rem rgba(0,0,0,0.6);\n  background-color: rgba(255,255,255,0.25);\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/css/pesticide.css",
    "content": "/*\n    pesticide v1.0.0 . @mrmrs . MIT\n*/\n {\nbody\n  outline: 1px solid #2980b9 !important;\narticle\n  outline: 1px solid #3498db !important;\nnav\n  outline: 1px solid #0088c3 !important;\naside\n  outline: 1px solid #33a0ce !important;\nsection\n  outline: 1px solid #66b8da !important;\nheader\n  outline: 1px solid #99cfe7 !important;\nfooter\n  outline: 1px solid #cce7f3 !important;\nh1\n  outline: 1px solid #162544 !important;\nh2\n  outline: 1px solid #314e6e !important;\nh3\n  outline: 1px solid #3e5e85 !important;\nh4\n  outline: 1px solid #449baf !important;\nh5\n  outline: 1px solid #c7d1cb !important;\nh6\n  outline: 1px solid #4371d0 !important;\nmain\n  outline: 1px solid #2f4f90 !important;\naddress\n  outline: 1px solid #1a2c51 !important;\ndiv\n  outline: 1px solid #036cdb !important;\n  outline: 1px solid #ac050b !important;\nhr\n  outline: 1px solid #ff063f !important;\npre\n  outline: 1px solid #850440 !important;\nblockquote\n  outline: 1px solid #f1b8e7 !important;\nol\n  outline: 1px solid #ff050c !important;\nul\n  outline: 1px solid #d90416 !important;\nli\n  outline: 1px solid #d90416 !important;\ndl\n  outline: 1px solid #fd3427 !important;\ndt\n  outline: 1px solid #ff0043 !important;\ndd\n  outline: 1px solid #e80174 !important;\nfigure\n  outline: 1px solid #f0b !important;\nfigcaption\n  outline: 1px solid #bf0032 !important;\ntable\n  outline: 1px solid #0c9 !important;\ncaption\n  outline: 1px solid #37ffc4 !important;\nthead\n  outline: 1px solid #98daca !important;\ntbody\n  outline: 1px solid #64a7a0 !important;\ntfoot\n  outline: 1px solid #22746b !important;\ntr\n  outline: 1px solid #86c0b2 !important;\nth\n  outline: 1px solid #a1e7d6 !important;\ntd\n  outline: 1px solid #3f5a54 !important;\ncol\n  outline: 1px solid #6c9a8f !important;\ncolgroup\n  outline: 1px solid #6c9a9d !important;\nbutton\n  outline: 1px solid #da8301 !important;\ndatalist\n  outline: 1px solid #c06000 !important;\nfieldset\n  outline: 1px solid #d95100 !important;\nform\n  outline: 1px solid #d23600 !important;\ninput\n  outline: 1px solid #fca600 !important;\nkeygen\n  outline: 1px solid #b31e00 !important;\nlabel\n  outline: 1px solid #ee8900 !important;\nlegend\n  outline: 1px solid #de6d00 !important;\nmeter\n  outline: 1px solid #e8630c !important;\noptgroup\n  outline: 1px solid #b33600 !important;\noption\n  outline: 1px solid #ff8a00 !important;\noutput\n  outline: 1px solid #ff9619 !important;\nprogress\n  outline: 1px solid #e57c00 !important;\nselect\n  outline: 1px solid #e26e0f !important;\ntextarea\n  outline: 1px solid #cc5400 !important;\ndetails\n  outline: 1px solid #33848f !important;\nsummary\n  outline: 1px solid #60a1a6 !important;\ncommand\n  outline: 1px solid #438da1 !important;\nmenu\n  outline: 1px solid #449da6 !important;\ndel\n  outline: 1px solid #bf0000 !important;\nins\n  outline: 1px solid #400000 !important;\nimg\n  outline: 1px solid #22746b !important;\niframe\n  outline: 1px solid #64a7a0 !important;\nembed\n  outline: 1px solid #98daca !important;\nobject\n  outline: 1px solid #0c9 !important;\nparam\n  outline: 1px solid #37ffc4 !important;\nvideo\n  outline: 1px solid #6ee866 !important;\naudio\n  outline: 1px solid #027353 !important;\nsource\n  outline: 1px solid #012426 !important;\ncanvas\n  outline: 1px solid #a2f570 !important;\ntrack\n  outline: 1px solid #59a600 !important;\nmap\n  outline: 1px solid #7be500 !important;\narea\n  outline: 1px solid #305900 !important;\na\n  outline: 1px solid #ff62ab !important;\nem\n  outline: 1px solid #800b41 !important;\nstrong\n  outline: 1px solid #ff1583 !important;\ni\n  outline: 1px solid #803156 !important;\nb\n  outline: 1px solid #cc1169 !important;\nu\n  outline: 1px solid #ff0430 !important;\n  outline: 1px solid #f805e3 !important;\nsmall\n  outline: 1px solid #d107b2 !important;\nabbr\n  outline: 1px solid #4a0263 !important;\nq\n  outline: 1px solid #240018 !important;\ncite\n  outline: 1px solid #64003c !important;\ndfn\n  outline: 1px solid #b4005a !important;\nsub\n  outline: 1px solid #dba0c8 !important;\nsup\n  outline: 1px solid #cc0256 !important;\ntime\n  outline: 1px solid #d6606d !important;\ncode\n  outline: 1px solid #e04251 !important;\nkbd\n  outline: 1px solid #5e001f !important;\nsamp\n  outline: 1px solid #9c0033 !important;\nvar\n  outline: 1px solid #d90047 !important;\nmark\n  outline: 1px solid #ff0053 !important;\nbdi\n  outline: 1px solid #bf3668 !important;\nbdo\n  outline: 1px solid #6f1400 !important;\nruby\n  outline: 1px solid #ff7b93 !important;\nrt\n  outline: 1px solid #ff2f54 !important;\nrp\n  outline: 1px solid #803e49 !important;\nspan\n  outline: 1px solid #cc2643 !important;\nbr\n  outline: 1px solid #db687d !important;\nwbr\n  outline: 1px solid #db175b !important;\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/latency/latency.client.js",
    "content": "(function (angular) {\n\n    const SECTION_NAME = \"remote-debug\";\n    /**\n     * Display the snippet when in snippet mode\n     */\n    angular\n        .module(\"BrowserSync\")\n        .directive(\"latency\", function () {\n            return {\n                restrict:     \"E\",\n                replace:      true,\n                scope:        {\n                    \"options\": \"=\"\n                },\n                templateUrl:  \"latency.html\",\n                controller:   [\"$scope\", \"Socket\", latencyDirectiveControlller],\n                controllerAs: \"ctrl\"\n            };\n        });\n\n    /**\n     * @param $scope\n     * @param Socket\n     */\n    function latencyDirectiveControlller($scope, Socket) {\n\n        var ctrl = this;\n        var ns = SECTION_NAME + \":latency\";\n\n        ctrl.latency = $scope.options[SECTION_NAME][\"latency\"];\n\n        ctrl.alterLatency = function () {\n            Socket.emit(\"ui\", {\n                namespace: ns,\n                event:     \"adjust\",\n                data:      {\n                    rate: ctrl.latency.rate\n                }\n            });\n        };\n    }\n})(angular);\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/latency/latency.html",
    "content": "<div ng-show=\"ctrl.latency.active\" bs-panel-content>\n    <input type=\"range\"\n           max=\"5\"\n           min=\"0\"\n           step=\".50\"\n           id=\"latency-rate\"\n           ng-change=\"ctrl.alterLatency()\"\n           ng-model=\"ctrl.latency.rate\"/>\n\n    <label for=\"latency-rate\">{{ctrl.latency.rate | number:1}}s</label>\n</div>\n\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/latency/latency.js",
    "content": "var Immutable = require(\"immutable\");\n\nmodule.exports.init = function (ui, bs) {\n\n    var timeout = 0;\n    var optPath = [\"remote-debug\", \"latency\"];\n\n    ui.setOptionIn(optPath, Immutable.Map({\n        name: \"latency\",\n        title: \"Latency\",\n        active: false,\n        tagline: \"Simulate slower connections by throttling the response time of each request.\",\n        rate: 0\n    }));\n\n    var methods = {\n        toggle: function (value) {\n            if (value !== true) {\n                value = false;\n            }\n            if (value) {\n                ui.setOptionIn(optPath.concat(\"active\"), true);\n                bs.addMiddleware(\"*\", function (req, res, next) {\n                    setTimeout(next, timeout);\n                }, {id: \"cp-latency\", override: true});\n            } else {\n                ui.setOptionIn(optPath.concat(\"active\"), false);\n                bs.removeMiddleware(\"cp-latency\");\n            }\n        },\n        adjust: function (data) {\n            timeout   = parseFloat(data.rate) * 1000;\n            var saved = ui.options.getIn(optPath.concat(\"rate\"));\n            if (saved !== data.rate) {\n                ui.setOptionIn(optPath.concat(\"rate\"), timeout/1000);\n            }\n        },\n        event: function (event) {\n            methods[event.event](event.data);\n        }\n    };\n\n    return methods;\n};"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/no-cache.html",
    "content": "<div bs-panel=\"switch\" ng-class=\"{'disabled': !ctrl.noCache.active}\">\n    <div bs-panel-content>\n        <div bs-panel-icon=\"switch\">\n            <div class=\"switch\">\n                <input id=\"cmn-form-{{ctrl.noCache.name}}\"\n                       ng-model=\"ctrl.noCache.active\"\n                       ng-change=\"ctrl.toggleLatency(ctrl.noCache)\"\n                       class=\"cmn-toggle cmn-toggle-round\"\n                       type=\"checkbox\"\n                       checked=\"\">\n                <label for=\"cmn-form-{{ctrl.noCache.name}}\"></label>\n            </div>\n        </div>\n        <div>\n            <p bs-Text=\"lede\">{{ctrl.noCache.title}}</p>\n            <p ng-if=\"ctrl.noCache.tagline.length\" ng-bind-html=\"ctrl.noCache.tagline\"></p>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/no-cache.js",
    "content": "var Immutable = require(\"immutable\");\n\nmodule.exports.init = function (ui, bs) {\n\n    var optPath = [\"remote-debug\", \"no-cache\"];\n\n    ui.setOptionIn(optPath, Immutable.Map({\n        name: \"no-cache\",\n        title: \"No Cache\",\n        active: false,\n        tagline: \"Disable all Browser Caching\"\n    }));\n\n    var methods = {\n        toggle: function (value) {\n            if (value !== true) {\n                value = false;\n            }\n            if (value) {\n                ui.setOptionIn(optPath.concat(\"active\"), true);\n                bs.addMiddleware(\"*\", function (req, res, next) {\n                    res.setHeader(\"Cache-Control\", \"no-cache, no-store, must-revalidate\");\n                    res.setHeader(\"Pragma\", \"no-cache\");\n                    res.setHeader(\"Expires\", \"0\");\n                    next();\n                }, {id: \"ui-no-cache\", override: true});\n            } else {\n                ui.setOptionIn(optPath.concat(\"active\"), false);\n                bs.removeMiddleware(\"ui-no-cache\");\n            }\n        },\n        event: function (event) {\n            methods[event.event](event.data);\n        }\n    };\n\n    return methods;\n};"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/overlay-grid/css/grid-overlay-horizontal.css",
    "content": "{{selector}}:after {\n  position: absolute;\n  width: auto;\n  height: auto;\n  z-index: 9999;\n  content: '';\n  display: block;\n  pointer-events: none;\n  top: {{offsetY}};\n  right: 0;\n  bottom: 0;\n  left: {{offsetX}};\n  background-color: transparent;\n  background-image: linear-gradient({{color}} 1px, transparent 1px);\n  background-size: 100% {{size}};\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/overlay-grid/css/grid-overlay-vertical.css",
    "content": "{{selector}}:before {\n  position: absolute;\n  width: auto;\n  height: auto;\n  z-index: 9999;\n  content: '';\n  display: block;\n  pointer-events: none;\n  top: {{offsetY}};\n  right: 0;\n  bottom: 0;\n  left: {{offsetX}};\n  background-color: transparent;\n  background-image: linear-gradient(90deg, {{color}} 1px, transparent 1px);\n  background-size: {{size}} 100%;\n}"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/overlay-grid/js/grid-overlay.js",
    "content": "(function (window, bs, undefined) {\n\n    var styleElem = bs.addDomNode({\n        placement: \"head\",\n        attrs: {\n            \"type\": \"text/css\",\n            id: \"__bs_overlay-grid-styles__\"\n        },\n        tagName: \"style\"\n    });\n\n    bs.socket.on(\"ui:remote-debug:css-overlay-grid\", function (data) {\n        styleElem.innerHTML = data.innerHTML;\n    });\n\n    bs.socket.emit(\"ui:remote-debug:css-overlay-grid:ready\");\n\n}(window, window.___browserSync___));"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/overlay-grid/overlay-grid.client.js",
    "content": "(function (angular) {\n\n    const SECTION_NAME = \"remote-debug\";\n\n    /**\n     * Display the snippet when in snippet mode\n     */\n    angular\n        .module(\"BrowserSync\")\n        .directive(\"cssGrid\", function () {\n            return {\n                restrict:     \"E\",\n                replace:      true,\n                scope:        {\n                    \"options\": \"=\"\n                },\n                templateUrl:  \"overlay-grid.html\",\n                controller:   [\"$scope\", \"Socket\", overlayGridDirectiveControlller],\n                controllerAs: \"ctrl\"\n            };\n        });\n\n    /**\n     * @param $scope\n     * @param Socket\n     */\n    function overlayGridDirectiveControlller($scope, Socket) {\n\n        var ctrl = this;\n\n        ctrl.overlayGrid = $scope.options[SECTION_NAME][\"overlay-grid\"];\n        ctrl.size = ctrl.overlayGrid.size;\n\n        var ns = SECTION_NAME + \":overlay-grid\";\n\n        ctrl.alter = function (value) {\n            Socket.emit(\"ui\", {\n                namespace: ns,\n                event:     \"adjust\",\n                data:      value\n            });\n        };\n\n        ctrl.toggleAxis = function (axis, value) {\n            Socket.emit(\"ui\", {\n                namespace: ns,\n                event:     \"toggle:axis\",\n                data:      {\n                    axis:  axis,\n                    value: value\n                }\n            });\n        };\n    }\n\n})(angular);\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/overlay-grid/overlay-grid.html",
    "content": "<div ng-show=\"ctrl.overlayGrid.active\" bs-panel-content>\n\n    <div bs-inputs bs-grid=\"wide-4 desk-2\">\n        <div bs-grid-item>\n            <div bs-input=\"text\">\n                <label for=\"grid-size\" bs-input-label>Grid Size</label>\n\n                <div bs-input>\n                    <input type=\"text\"\n                           max=\"100\"\n                           min=\"0\"\n                           step=\"1\"\n                           id=\"grid-size\"\n                           size=\"20\"\n                           ng-change=\"ctrl.alter(ctrl.overlayGrid)\"\n                           ng-model=\"ctrl.overlayGrid.size\"/>\n                </div>\n            </div>\n        </div>\n        <div bs-grid-item>\n            <div bs-input=\"text\">\n                <label for=\"grid-color\" bs-input-label>Grid Colour</label>\n\n                <div bs-input>\n                    <input type=\"text\"\n                           max=\"100\"\n                           min=\"0\"\n                           step=\"1\"\n                           id=\"grid-color\"\n                           size=\"20\"\n                           ng-change=\"ctrl.alter(ctrl.overlayGrid)\"\n                           ng-model=\"ctrl.overlayGrid.color\"/>\n                </div>\n            </div>\n        </div>\n        <div bs-grid-item>\n            <div bs-input=\"text\">\n\n                <label for=\"grid-selector\" bs-input-label>CSS Selector</label>\n\n                <div bs-input>\n                    <input type=\"text\"\n                           max=\"100\"\n                           min=\"0\"\n                           step=\"1\"\n                           id=\"grid-selector\"\n                           size=\"20\"\n                           ng-change=\"ctrl.alter(ctrl.overlayGrid)\"\n                           ng-model=\"ctrl.overlayGrid.selector\"/>\n                </div>\n            </div>\n        </div>\n    </div>\n    <div bs-inputs bs-grid=\"wide-4 desk-2\">\n        <div bs-grid-item>\n            <div bs-input=\"text\">\n\n                <label for=\"grid-offsetY\" bs-input-label>Offset Top</label>\n\n                <div bs-input>\n                    <input type=\"text\"\n                           id=\"grid-offsetY\"\n                           size=\"20\"\n                           ng-change=\"ctrl.alter(ctrl.overlayGrid)\"\n                           ng-model=\"ctrl.overlayGrid.offsetY\"/>\n                </div>\n            </div>\n        </div>\n        <div bs-grid-item>\n            <div bs-input=\"text\">\n\n                <label for=\"grid-offsetX\" bs-input-label>Offset Left</label>\n\n                <div bs-input>\n                    <input type=\"text\"\n                           id=\"grid-offsetX\"\n                           size=\"20\"\n                           ng-change=\"ctrl.alter(ctrl.overlayGrid)\"\n                           ng-model=\"ctrl.overlayGrid.offsetX\"/>\n                </div>\n            </div>\n        </div>\n    </div>\n    <div bs-inputs bs-grid=\"wide-4 desk-2\">\n        <div bs-grid-item>\n            <div bs-input=\"inline\">\n                <input\n                        type=\"checkbox\"\n                        id=\"grid-axis-y\"\n                        ng-model=\"ctrl.overlayGrid.vertical\"\n                        ng-change=\"ctrl.toggleAxis('vertical', ctrl.overlayGrid.vertical)\"/>\n                <label for=\"grid-axis-y\" bs-input-label>Vertical Axis</label>\n            </div>\n        </div>\n        <div bs-grid-item>\n            <div bs-input=\"inline\">\n                <input\n                        type=\"checkbox\"\n                        id=\"grid-axis-x\"\n                        ng-model=\"ctrl.overlayGrid.horizontal\"\n                        ng-change=\"ctrl.toggleAxis('horizontal', ctrl.overlayGrid.horizontal)\"/>\n                <label for=\"grid-axis-x\" bs-input-label>Horizontal Axis</label>\n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/overlay-grid/overlay-grid.js",
    "content": "var Immutable = require(\"immutable\");\nvar fs        = require(\"fs\");\nvar path      = require(\"path\");\nvar baseHorizontal = fs.readFileSync(path.resolve(__dirname, \"css/grid-overlay-horizontal.css\"), \"utf8\");\nvar baseVertical   = fs.readFileSync(path.resolve(__dirname, \"css/grid-overlay-vertical.css\"), \"utf8\");\n\nfunction template (string, obj) {\n    obj = obj || {};\n    return string.replace(/\\{\\{(.+?)\\}\\}/g, function () {\n        if (obj[arguments[1]]) {\n           return obj[arguments[1]];\n        }\n        return \"\";\n    });\n}\n\nfunction getCss(opts) {\n\n    var base = opts.selector + \" {position:relative;}\";\n\n    if (opts.horizontal) {\n        base += baseHorizontal;\n    }\n\n    if (opts.vertical) {\n        base += baseVertical;\n    }\n\n    return template(base, opts);\n}\n\nmodule.exports.init = function (ui) {\n\n    const TRANSMIT_EVENT = \"ui:remote-debug:css-overlay-grid\";\n    const READY_EVENT    = \"ui:remote-debug:css-overlay-grid:ready\";\n    const OPT_PATH       = [\"remote-debug\", \"overlay-grid\"];\n\n    var defaults = {\n        offsetY:  \"0\",\n        offsetX:  \"0\",\n        size:     \"16px\",\n        selector: \"body\",\n        color:    \"rgba(0, 0, 0, .2)\",\n        horizontal: true,\n        vertical: true\n    };\n\n    ui.clients.on(\"connection\", function (client) {\n        client.on(READY_EVENT, function () {\n            client.emit(TRANSMIT_EVENT, {\n                innerHTML: getCss(ui.options.getIn(OPT_PATH).toJS())\n            });\n        });\n    });\n\n    ui.setOptionIn(OPT_PATH, Immutable.Map({\n        name: \"overlay-grid\",\n        title: \"Overlay CSS Grid\",\n        active: false,\n        tagline: \"Add an adjustable CSS overlay grid to your webpage\",\n        innerHTML: \"\"\n    }).merge(defaults));\n\n\n    var methods = {\n        toggle: function (value) {\n            if (value !== true) {\n                value = false;\n            }\n            if (value) {\n                ui.setOptionIn(OPT_PATH.concat(\"active\"), true);\n                ui.enableElement({name: \"overlay-grid-js\"});\n            } else {\n                ui.setOptionIn(OPT_PATH.concat(\"active\"), false);\n                ui.disableElement({name: \"overlay-grid-js\"});\n                ui.clients.emit(\"ui:element:remove\", {id: \"__bs_overlay-grid-styles__\"});\n            }\n        },\n        adjust: function (data) {\n\n            ui.setOptionIn(OPT_PATH, ui.getOptionIn(OPT_PATH).merge(data));\n\n            ui.clients.emit(TRANSMIT_EVENT, {\n                innerHTML: getCss(ui.options.getIn(OPT_PATH).toJS())\n            });\n        },\n        \"toggle:axis\": function (item) {\n\n            ui.setOptionIn(OPT_PATH.concat([item.axis]), item.value);\n\n            ui.clients.emit(TRANSMIT_EVENT, {\n                innerHTML: getCss(ui.options.getIn(OPT_PATH).toJS())\n            });\n        },\n        event: function (event) {\n            methods[event.event](event.data);\n        }\n    };\n\n    return methods;\n};"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/remote-debug.client.js",
    "content": "(function (angular) {\n\n    const SECTION_NAME = \"remote-debug\";\n\n    angular\n        .module(\"BrowserSync\")\n        .controller(\"RemoteDebugController\", [\n            \"options\",\n            \"Socket\",\n            \"pagesConfig\",\n            RemoteDebugController\n        ]);\n\n    /**\n     * @param options\n     * @param Socket\n     * @param pagesConfig\n     */\n    function RemoteDebugController(options, Socket, pagesConfig) {\n\n        var ctrl         = this;\n        ctrl.options     = options.bs;\n        ctrl.uiOptions   = options.ui;\n        ctrl.clientFiles = options.ui.clientFiles || {};\n        ctrl.section     = pagesConfig[SECTION_NAME];\n        ctrl.overlayGrid = options.ui[SECTION_NAME][\"overlay-grid\"];\n        ctrl.items = [];\n\n        if (Object.keys(ctrl.clientFiles).length) {\n            Object.keys(ctrl.clientFiles).forEach(function (key) {\n                if (ctrl.clientFiles[key].context === SECTION_NAME) {\n                    ctrl.items.push(ctrl.clientFiles[key]);\n                }\n            });\n        }\n\n        ctrl.toggleClientFile = function (item) {\n            if (item.active) {\n                return ctrl.enable(item);\n            }\n            return ctrl.disable(item);\n        };\n\n        ctrl.toggleOverlayGrid = function (item) {\n            var ns = SECTION_NAME + \":overlay-grid\";\n            Socket.uiEvent({\n                namespace: ns,\n                event: \"toggle\",\n                data: item.active\n            });\n        };\n\n        ctrl.enable = function (item) {\n            Socket.uiEvent({\n                namespace: SECTION_NAME + \":files\",\n                event: \"enableFile\",\n                data: item\n            });\n        };\n\n        ctrl.disable = function (item) {\n            Socket.uiEvent({\n                namespace: SECTION_NAME + \":files\",\n                event: \"disableFile\",\n                data: item\n            });\n        };\n    }\n\n    /**\n     * Display the snippet when in snippet mode\n     */\n    angular\n        .module(\"BrowserSync\")\n        .directive(\"noCache\", function () {\n            return {\n                restrict: \"E\",\n                replace: true,\n                scope: {\n                    \"options\": \"=\"\n                },\n                templateUrl: \"no-cache.html\",\n                controller: [\"$scope\", \"Socket\", noCacheDirectiveControlller],\n                controllerAs: \"ctrl\"\n            };\n        });\n\n    /**\n     * @param $scope\n     * @param Socket\n     */\n    function noCacheDirectiveControlller ($scope, Socket) {\n\n        var ctrl = this;\n\n        ctrl.noCache = $scope.options[SECTION_NAME][\"no-cache\"];\n\n        ctrl.toggleLatency = function (item) {\n            Socket.emit(\"ui:no-cache\", {\n                event: \"toggle\",\n                data: item.active\n            });\n        };\n    }\n\n\n    /**\n     * Display the snippet when in snippet mode\n     */\n    angular\n        .module(\"BrowserSync\")\n        .directive(\"compression\", function () {\n            return {\n                restrict: \"E\",\n                replace: true,\n                scope: {\n                    \"options\": \"=\"\n                },\n                templateUrl: \"compression.html\",\n                controller: [\"$scope\", \"Socket\", compressionDirectiveControlller],\n                controllerAs: \"ctrl\"\n            };\n        });\n\n    /**\n     * @param $scope\n     * @param Socket\n     */\n    function compressionDirectiveControlller ($scope, Socket) {\n\n        var ctrl = this;\n\n        ctrl.compression = $scope.options[SECTION_NAME][\"compression\"];\n\n        ctrl.toggleLatency = function (item) {\n            Socket.emit(\"ui:compression\", {\n                event: \"toggle\",\n                data: item.active\n            });\n        };\n    }\n\n})(angular);\n\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/remote-debug.html",
    "content": "<div bs-panel=\"controls outline\">\n    <h1 bs-heading>\n        <icon icon=\"{{ctrl.section.icon}}\"></icon>\n        {{ctrl.section.title}}\n    </h1>\n</div>\n\n<switch toggle=\"ctrl.toggleClientFile(item)\"\n        switchid=\"plugins-{{$index}}\"\n        active=\"item.active\"\n        prop=\"active\"\n        ng-repeat=\"item in ctrl.items track by $index\"\n        item=\"item\">\n    <div bs-panel-content ng-if=\"item.active && item.hidden.length\" ng-bind-html=\"item.hidden\"></div>\n</switch>\n\n<switch toggle=\"ctrl.toggleOverlayGrid(ctrl.overlayGrid)\"\n        switchid=\"css-overlay-grid\"\n        active=\"ctrl.overlayGrid.active\"\n        prop=\"active\"\n        item=\"ctrl.overlayGrid\">\n    <css-grid options=\"ctrl.uiOptions\" ng-if=\"ctrl.options.mode !== 'snippet'\"></css-grid>\n</switch>\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/remote-debug/remote-debug.plugin.js",
    "content": "//var compression     = require(\"./compression\");\n//var noCachePlugin   = require(\"./no-cache\");\nvar overlayPlugin  = require(\"./overlay-grid/overlay-grid\");\nvar clientFiles    = require(\"./client-files\");\n\nconst PLUGIN_NAME  = \"Remote Debug\";\n\n/**\n * @type {{plugin: Function, plugin:name: string, markup: string}}\n */\nmodule.exports = {\n    /**\n     * @param ui\n     * @param bs\n     */\n    \"plugin\": function (ui, bs) {\n\n        ui.overlayGrid = overlayPlugin.init(ui, bs);\n\n        //ui.noCache     = noCachePlugin.init(ui, bs);\n        //ui.compression = compression.init(ui, bs);\n\n        /**\n         * Listen for file events\n         */\n        ui.listen(\"remote-debug:files\", {\n            \"enableFile\": function (file) {\n                ui.enableElement(file);\n            },\n            \"disableFile\": function (file) {\n                ui.disableElement(file);\n            }\n        });\n\n        /**\n         * Listen for overlay-grid events\n         */\n        ui.listen(\"remote-debug:overlay-grid\", ui.overlayGrid);\n    },\n    /**\n     * Hooks\n     */\n    \"hooks\": {\n        \"markup\": fileContent(\"remote-debug.html\"),\n        \"client:js\": [\n            fileContent(\"/remote-debug.client.js\"),\n            fileContent(\"/overlay-grid/overlay-grid.client.js\")\n        ],\n        \"templates\": [\n            getPath(\"/overlay-grid/overlay-grid.html\")\n        ],\n        \"page\": {\n            path: \"/remote-debug\",\n            title: PLUGIN_NAME,\n            template: \"remote-debug.html\",\n            controller: PLUGIN_NAME.replace(\" \", \"\") + \"Controller\",\n            order: 4,\n            icon: \"bug\"\n        },\n        elements: clientFiles.files\n    },\n    /**\n     * Plugin name\n     */\n    \"plugin:name\": PLUGIN_NAME\n};\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction getPath (filepath) {\n    return require(\"path\").join(__dirname, filepath);\n}\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction fileContent (filepath) {\n    return require(\"fs\").readFileSync(getPath(filepath), \"utf-8\");\n}"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/sync-options/sync-options.client.js",
    "content": "(function (angular) {\n\n    const SECTION_NAME = \"sync-options\";\n\n    angular\n        .module(\"BrowserSync\")\n        .controller(\"SyncOptionsController\", [\n            \"Socket\",\n            \"options\",\n            \"pagesConfig\",\n            SyncOptionsController\n        ]);\n\n    /**\n     * @param Socket\n     * @param options\n     * @param pagesConfig\n     * @constructor\n     */\n    function SyncOptionsController(Socket, options, pagesConfig) {\n\n        var ctrl = this;\n        ctrl.options = options.bs;\n        ctrl.section = pagesConfig[SECTION_NAME];\n\n        ctrl.setMany = function (value) {\n            Socket.uiEvent({\n                namespace: SECTION_NAME,\n                event: \"setMany\",\n                data: {\n                    value: value\n                }\n            });\n            ctrl.syncItems = ctrl.syncItems.map(function (item) {\n                item.value = value;\n                return item;\n            });\n        };\n\n        /**\n         * Toggle Options\n         * @param item\n         */\n        ctrl.toggleSyncItem = function (item) {\n            Socket.uiEvent({\n                namespace: SECTION_NAME,\n                event: \"set\",\n                data: {\n                    path:  item.path,\n                    value: item.value\n                }\n            });\n        };\n\n        ctrl.syncItems = [];\n\n        var taglines = {\n            clicks:  \"Mirror clicks across devices\",\n            scroll:  \"Mirror scroll position across devices\",\n            \"ghostMode.submit\":  \"Form Submissions will be synced\",\n            \"ghostMode.inputs\":  \"Text inputs (including text-areas) will be synced\",\n            \"ghostMode.toggles\": \"Radio + Checkboxes changes will be synced\",\n            codeSync:            \"Reload or Inject files when they change\"\n        };\n\n        // If watching files, add the code-sync toggle\n        ctrl.syncItems.push(addItem(\"codeSync\", [\"codeSync\"], ctrl.options.codeSync, taglines[\"codeSync\"]));\n\n        Object.keys(ctrl.options.ghostMode).forEach(function (item) {\n            if (item !== \"forms\" && item !== \"location\") {\n                ctrl.syncItems.push(addItem(item, [\"ghostMode\", item], ctrl.options.ghostMode[item], taglines[item]));\n            }\n        });\n\n        Object.keys(ctrl.options.ghostMode.forms).forEach(function (item) {\n            ctrl.syncItems.push(addItem(\"Forms: \" + item, [\"ghostMode\", \"forms\", item], ctrl.options.ghostMode[\"forms\"][item], taglines[\"ghostMode.\" + item]));\n        });\n\n        function addItem (item, path, value, tagline) {\n            return {\n                value: value,\n                name: item,\n                path: path,\n                title: ucfirst(item),\n                tagline: tagline\n            };\n        }\n    }\n\n    function ucfirst (string) {\n        return string.charAt(0).toUpperCase() + string.slice(1);\n    }\n\n})(angular);\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/sync-options/sync-options.html",
    "content": "<article>\n    <div bs-panel=\"controls outline\">\n        <h1 bs-heading>\n            <icon icon=\"{{ctrl.section.icon}}\"></icon>\n            {{ctrl.section.title}}\n        </h1>\n    </div>\n    <div bs-button-row>\n        <button bs-button=\"icon-left inline success\" ng-click=\"ctrl.setMany(true)\">\n            <svg bs-svg-icon><use xlink:href=\"#svg-circle-ok\"></use></svg>\n            Enable All\n        </button>\n        <button bs-button=\"icon-left inline\" ng-click=\"ctrl.setMany(false)\">\n            <svg bs-svg-icon><use xlink:href=\"#svg-circle-delete\"></use></svg>\n            Disable all\n        </button>\n    </div>\n\n    <switch toggle=\"ctrl.toggleSyncItem(item)\"\n            switchid=\"sync-options-{{$index}}\"\n            active=\"item.value\"\n            prop=\"value\"\n            ng-repeat=\"item in ctrl.syncItems track by $index\"\n            item=\"item\"></switch>\n</article>"
  },
  {
    "path": "packages/browser-sync-ui/lib/plugins/sync-options/sync-options.plugin.js",
    "content": "const PLUGIN_NAME = \"Sync Options\";\nvar chalk         = require(\"chalk\");\n\n/**\n * @type {{plugin: Function, plugin:name: string, hooks: object}}\n */\nmodule.exports = {\n\n    \"plugin\": function (ui, bs) {\n\n        ui.listen(\"sync-options\", {\n\n            \"set\": function (data) {\n\n                ui.logger.debug(\"Setting option: %s:%s\", chalk.magenta(data.path.join(\".\")), chalk.cyan(data.value));\n                bs.setOptionIn(data.path, data.value);\n            },\n\n            \"setMany\": function (data) {\n\n                ui.logger.debug(\"Setting Many options...\");\n\n                if (data.value !== true) {\n                    data.value = false;\n                }\n\n                bs.setMany(function (item) {\n                    [\n                        [\"codeSync\"],\n                        [\"ghostMode\", \"clicks\"],\n                        [\"ghostMode\", \"scroll\"],\n                        [\"ghostMode\", \"forms\", \"inputs\"],\n                        [\"ghostMode\", \"forms\", \"toggles\"],\n                        [\"ghostMode\", \"forms\", \"submit\"]\n                    ].forEach(function (option) {\n                            item.setIn(option, data.value);\n                        });\n                });\n\n                return bs;\n            }\n        });\n    },\n    \"hooks\": {\n        \"markup\": fileContent(\"sync-options.html\"),\n        \"client:js\": fileContent(\"sync-options.client.js\"),\n        \"templates\": [],\n        \"page\": {\n            path: \"/sync-options\",\n            title: PLUGIN_NAME,\n            template: \"sync-options.html\",\n            controller: PLUGIN_NAME.replace(\" \", \"\") + \"Controller\",\n            order: 2,\n            icon: \"sync\"\n        }\n    },\n    \"plugin:name\": PLUGIN_NAME\n};\n\nfunction getPath (filepath) {\n    return require(\"path\").join(__dirname, filepath);\n}\n\nfunction fileContent (filepath) {\n    return require(\"fs\").readFileSync(getPath(filepath), \"utf-8\");\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/resolve-plugins.js",
    "content": "var fs          = require(\"fs\");\nvar path        = require(\"path\");\nvar Immutable   = require(\"immutable\");\n\n/**\n * Take Browsersync plugins and determine if\n * any UI is provided by looking at data in the the\n * modules package.json file\n * @param plugins\n * @returns {*}\n */\nmodule.exports = function (plugins) {\n    return require(\"immutable\")\n        .fromJS(plugins)\n        /**\n         * Exclude the UI\n         */\n        .filter(function (plugin) {\n            return plugin.get(\"name\") !== \"UI\";\n        })\n        /**\n         * Attempt to retrieve a plugins package.json file\n         */\n        .map(function (plugin) {\n\n            var moduleName = plugin.getIn([\"opts\", \"moduleName\"]);\n            var pkg = {};\n\n            if (!moduleName) {\n                return plugin;\n            }\n\n            try {\n                pkg = require(\"immutable\").fromJS(require(path.join(moduleName, \"package.json\")));\n            } catch (e) {\n                console.error(e);\n                return plugin;\n            }\n\n            plugin = plugin.set(\"pkg\", pkg);\n\n            return plugin.set(\"relpath\", path.dirname(require.resolve(moduleName)));\n        })\n        /**\n         * Try to load markup for each plugin\n         */\n        .map(function (plugin) {\n\n            if (!plugin.hasIn([\"pkg\", \"browser-sync:ui\"])) {\n                return plugin;\n            }\n\n            var markup    = plugin.getIn([\"pkg\", \"browser-sync:ui\", \"hooks\", \"markup\"]);\n\n            if (markup) {\n                plugin = plugin.set(\"markup\", fs.readFileSync(path.resolve(plugin.get(\"relpath\"), markup), \"utf8\"));\n            }\n\n            return plugin;\n        })\n        /**\n         * Load any template files for the plugin\n         */\n        .map(function (plugin) {\n\n            if (!plugin.hasIn([\"pkg\", \"browser-sync:ui\"])) {\n                return plugin;\n            }\n\n            return resolveIfPluginHas([\"pkg\", \"browser-sync:ui\", \"hooks\", \"templates\"], \"templates\", plugin);\n        })\n        /**\n         * Try to load Client JS for each plugin\n         */\n        .map(function (plugin) {\n\n            if (!plugin.hasIn([\"pkg\", \"browser-sync:ui\"])) {\n                return plugin;\n            }\n\n            return resolveIfPluginHas([\"pkg\", \"browser-sync:ui\", \"hooks\", \"client:js\"], \"client:js\", plugin);\n        });\n};\n\n/**\n * If a plugin contains this option path, resolve/read the files\n * @param {Array} optPath - How to access the collection\n * @param {String} propName - Key for property access\n * @param {Immutable.Map} plugin\n * @returns {*}\n */\nfunction resolveIfPluginHas(optPath, propName, plugin) {\n    var opt = plugin.getIn(optPath);\n    if (opt.size) {\n        return plugin.set(\n            propName,\n            resolvePluginFiles(opt, plugin.get(\"relpath\"))\n        );\n    }\n    return plugin;\n}\n\n/**\n * Read & store a file from a plugin\n * @param {Array|Immutable.List} collection\n * @param {String} relPath\n * @returns {any}\n */\nfunction resolvePluginFiles (collection, relPath) {\n    return Immutable.fromJS(collection.reduce(function (all, item) {\n        var full = path.join(relPath, item);\n        if (fs.existsSync(full)) {\n            all[full] = fs.readFileSync(full, \"utf8\");\n        }\n        return all;\n    }, {}));\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/lib/server.js",
    "content": "var http        = require(\"http\");\nvar fs          = require(\"fs\");\nvar path        = require(\"path\");\nvar config      = require(\"./config\");\nvar svg         = publicFile(config.defaults.public.svg);\nvar indexPage   = publicFile(config.defaults.indexPage);\n//var css         = publicFile(config.defaults.public.css);\nvar header      = staticFile(config.defaults.components.header);\nvar footer      = staticFile(config.defaults.components.footer);\nvar zlib        = require(\"zlib\");\n\n/**\n * @param {UI} ui\n * @returns {*}\n */\nfunction startServer(ui) {\n\n    var connect     = ui.bs.utils.connect;\n    var serveStatic = ui.bs.utils.serveStatic;\n\n    /**\n     * Create a connect server\n     */\n    var app         = connect();\n    var socketJs    = getSocketJs(ui);\n    var jsFilename  = \"/\" + md5(socketJs, 10) + \".js\";\n    //var cssFilename = \"/\" + md5(css, 10)   + \".css\";\n\n    /**\n     * Create a single big file with all deps\n     */\n    //app.use(serveFile(jsFilename, \"js\", socketJs));\n    app.use(serveFile(config.defaults.socketJs, \"js\", socketJs));\n\n    // also serve for convenience/testing\n    app.use(serveFile(config.defaults.pagesConfig, \"js\", ui.pagesConfig));\n\n    //\n    app.use(serveFile(config.defaults.clientJs, \"js\",    ui.clientJs));\n\n    /**\n     * Add any markup from plugins/hooks/templates\n     */\n    insertPageMarkupFromHooks(\n        app,\n        ui.pages,\n        indexPage\n            .replace(\"%pageMarkup%\", ui.pageMarkup)\n            .replace(\"%templates%\", ui.templates)\n            .replace(\"%svg%\", svg)\n            .replace(\"%header%\", header)\n            .replace(/%footer%/g, footer)\n    );\n\n    /**\n     * gzip css\n     */\n    //app.use(serveFile(cssFilename, \"css\", css));\n\n    app.use(serveStatic(path.join(__dirname, \"../public\")));\n\n    /**\n     * all public dir as static\n     */\n    app.use(serveStatic(publicDir(\"\")));\n\n    /**\n     * History API fallback\n     */\n    app.use(require(\"connect-history-api-fallback\"));\n\n    /**\n     * Development use\n     */\n    app.use(\"/node_modules\", serveStatic(packageDir(\"node_modules\")));\n\n    /**\n     * Return the server.\n     */\n    return {\n        server: http.createServer(app),\n        app: app\n    };\n}\n\n/**\n * @param app\n * @param pages\n * @param markup\n */\nfunction insertPageMarkupFromHooks(app, pages, markup) {\n\n    var cached;\n\n    app.use(function (req, res, next) {\n\n        if (req.url === \"/\" || pages[req.url.slice(1)]) {\n            res.writeHead(200, {\"Content-Type\": \"text/html\", \"Content-Encoding\": \"gzip\"});\n            if (!cached) {\n                var buf = Buffer.from(markup, \"utf-8\");\n                zlib.gzip(buf, function (_, result) {\n                    cached = result;\n                    res.end(result);\n                });\n            } else {\n                res.end(cached);\n            }\n        } else {\n            next();\n        }\n    });\n}\n\n/**\n * Serve Gzipped files & cache them\n * @param app\n * @param all\n */\nvar gzipCache = {};\nfunction serveFile(path, type, string) {\n    var typemap = {\n        js:  \"application/javascript\",\n        css: \"text/css\"\n    };\n    return function (req, res, next) {\n        if (req.url !== path) {\n            return next();\n        }\n\n        res.writeHead(200, {\n            \"Content-Type\": typemap[type],\n            \"Content-Encoding\": \"gzip\",\n            \"Cache-Control\": \"no-cache, no-store, must-revalidate\",\n            \"Expires\": 0,\n            \"Pragma\": \"no-cache\"\n        });\n\n        if (gzipCache[path]) {\n            return res.end(gzipCache[path]);\n        }\n        var buf = Buffer.from(string, \"utf-8\");\n        zlib.gzip(buf, function (_, result) {\n            gzipCache[path] = result;\n            res.end(result);\n        });\n    };\n}\n\n\n/**\n * @param cp\n * @returns {string}\n */\nfunction getSocketJs (cp) {\n\n    return [\n        cp.bs.getExternalSocketConnector({namespace: \"/browser-sync-cp\"})\n    ].join(\";\");\n}\n\n///**\n// * @returns {*}\n// * @param filepath\n// */\n//function fileContent (filepath) {\n//    return fs.readFileSync(require.resolve(filepath), \"utf8\");\n//}\n\n/**\n * @param src\n * @param length\n */\nfunction md5(src, length) {\n    var crypto = require(\"crypto\");\n    var hash   = crypto.createHash(\"md5\").update(src, \"utf8\").digest(\"hex\");\n    return hash.slice(0, length);\n}\n\n/**\n * CWD directory helper for static dir\n * @param {string} filepath\n * @returns {string}\n */\nfunction publicDir (filepath) {\n    return path.join(__dirname, \"/../public\" + filepath) || \"\";\n}\n\n/**\n * @param {string} filepath\n * @returns {string|string}\n */\nfunction staticDir (filepath) {\n    return path.join(__dirname, \"/../static\" + filepath) || \"\";\n}\n\n/**\n * @param {string} filepath\n * @returns {*}\n */\nfunction publicFile(filepath) {\n    return fs.readFileSync(publicDir(filepath), \"utf-8\");\n}\n\n/**\n * @param filepath\n * @returns {*}\n */\nfunction staticFile(filepath) {\n    return fs.readFileSync(staticDir(filepath), \"utf-8\");\n}\n\n/**\n * @param {string} filepath\n * @returns {string}\n */\nfunction packageDir (filepath) {\n    return path.join(__dirname, \"/../\" + filepath);\n}\n\nmodule.exports = startServer;"
  },
  {
    "path": "packages/browser-sync-ui/lib/transform.options.js",
    "content": "var path   = require(\"path\");\n\nmodule.exports = function (bs) {\n    /**\n     * Transform server options to offer additional functionality\n     * @param bs\n     */\n\n    var options = bs.options;\n    var server  = options.server;\n    var cwd     = bs.cwd;\n\n    /**\n     * Transform server option\n     */\n    if (server) {\n        if (Array.isArray(server.baseDir)) {\n            server.baseDirs = options.server.baseDir.map(function (item) {\n                return path.join(cwd, item);\n            });\n        } else {\n            server.baseDirs = [path.join(cwd, server.baseDir)];\n        }\n    }\n};"
  },
  {
    "path": "packages/browser-sync-ui/lib/transforms.js",
    "content": "module.exports = {\n    \"mode\": function (obj) {\n        if (obj.get(\"server\")) {\n            return \"Server\";\n        }\n        if (obj.get(\"proxy\")) {\n            return \"Proxy\";\n        }\n        return \"Snippet\";\n    }\n};"
  },
  {
    "path": "packages/browser-sync-ui/lib/urls.js",
    "content": ""
  },
  {
    "path": "packages/browser-sync-ui/lib/utils.js",
    "content": "var url      = require(\"url\");\nvar http     = require(\"http\");\n\n/**\n * @param localUrl\n * @param urlPath\n * @returns {*}\n */\nfunction createUrl(localUrl, urlPath) {\n    return url.parse(url.resolve(localUrl, urlPath));\n}\n\n/**\n * @param url\n * @param cb\n */\nfunction verifyUrl(url, cb) {\n\n    url.headers = {\n        \"accept\": \"text/html\"\n    };\n\n    http.get(url, function (res) {\n        if (res.statusCode === 200) {\n            cb(null, res);\n        } else {\n            cb(\"not 200\");\n        }\n    }).on(\"error\", function(e) {\n        console.log(\"Got error: \" + e.message);\n    });\n}\n\nmodule.exports.createUrl = createUrl;\nmodule.exports.verifyUrl = verifyUrl;\n"
  },
  {
    "path": "packages/browser-sync-ui/package.json",
    "content": "{\n\t\"name\": \"browser-sync-ui\",\n\t\"description\": \"User Interface for BrowserSync\",\n\t\"version\": \"3.0.4\",\n\t\"homepage\": \"http://www.browsersync.io/\",\n\t\"author\": {\n\t\t\"name\": \"Shane Osbourne\"\n\t},\n\t\"repository\": \"BrowserSync/UI\",\n\t\"files\": [\n\t\t\"index.js\",\n\t\t\"lib\",\n\t\t\"public\",\n\t\t\"static\",\n\t\t\"templates\"\n\t],\n\t\"scripts\": {\n\t\t\"build\": \"npm run build:static && npm run build:bundle\",\n\t\t\"build:static\": \"node tasks/crossbow.js\",\n\t\t\"build:bundle\": \"esbuild src/scripts/app.js --bundle --outdir=public/js --minify\",\n\t\t\"prepublishOnly\": \"npm run build\",\n\t\t\"watch\": \"npm run build:webpack -- --watch\"\n\t},\n\t\"license\": \"Apache-2.0\",\n\t\"dependencies\": {\n\t\t\"async-each-series\": \"0.1.1\",\n\t\t\"chalk\": \"4.1.2\",\n\t\t\"connect-history-api-fallback\": \"^1\",\n\t\t\"immutable\": \"^3\",\n\t\t\"server-destroy\": \"1.0.1\",\n\t\t\"socket.io-client\": \"^4.4.1\",\n\t\t\"stream-throttle\": \"^0.1.3\"\n\t},\n\t\"devDependencies\": {\n\t\t\"angular\": \"^1.8.2\",\n\t\t\"angular-route\": \"~1.8.2\",\n\t\t\"angular-sanitize\": \"^1.8.2\",\n\t\t\"angular-touch\": \"^1.8.2\",\n\t\t\"bs-snippet-injector\": \"^2.0.1\",\n\t\t\"chai\": \"^3\",\n\t\t\"compression\": \"^1\",\n\t\t\"crossbow-sites\": \"^1.0.1\",\n\t\t\"easy-svg\": \"^3.0.0\",\n\t\t\"esbuild\": \"^0.14.27\",\n\t\t\"jshint\": \"^2.8.0\",\n\t\t\"mocha\": \"^10.2.0\",\n\t\t\"no-abs\": \"0.0.0\",\n\t\t\"object-path\": \"^0.11.5\",\n\t\t\"parallelshell\": \"^2.0.0\",\n\t\t\"pretty-js\": \"^0.1.8\",\n\t\t\"request\": \"^2\",\n\t\t\"sinon\": \"^1\",\n\t\t\"store\": \"^1.3.20\",\n\t\t\"supertest\": \"^3\",\n\t\t\"uglify-js\": \"^2.6.1\",\n\t\t\"vinyl-fs\": \"3.0.3\"\n\t},\n\t\"keywords\": [\n\t\t\"browser sync\",\n\t\t\"live reload\",\n\t\t\"css injection\",\n\t\t\"action sync\"\n\t]\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/public/css/components.css",
    "content": "svg {\n  width: 100%;\n  height: 100%;\n  opacity: 1;\n  fill: currentColor !important;\n  -webkit-transition: .3s;\n          transition: .3s; }\n  svg.icon-hidden {\n    opacity: 0; }\n\nbody, html {\n  height: auto; }\n\n.tube {\n  padding: 0 14px; }\n"
  },
  {
    "path": "packages/browser-sync-ui/public/css/core.css",
    "content": "\n/*# sourceMappingURL=core.css.map */\n"
  },
  {
    "path": "packages/browser-sync-ui/public/img/icons/preview.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Document</title>\n    \n    <style type=\"text/css\">\n        * {\n            box-sizing: border-box;\n        }\n\n        body {\n            padding: 0;\n            margin: 0;\n            color: #666;\n            background: #fafafa;\n            font-family: Arial, Helvetica, sans-serif;\n            font-size: 1em;\n            line-height: 1.4\n        }\n\n        header {\n            display: block;\n            padding: 3em 3em 2em 3em;\n            background-color: #fff\n        }\n\n        header p {\n            margin: 0 0 0 0;\n        }\n\n        nav {\n            font-size: .7em;\n            display: block;\n            width: 100%;\n            margin: 0 0 2em 0\n        }\n\n        nav a {\n            display: inline-block;\n            text-decoration: none;\n            margin-left: 2em;\n            color: #0f7595;\n            white-space: nowrap\n        }\n\n        nav a:hover {\n            text-decoration: underline\n        }\n\n        nav a.current {\n            font-weight: bold;\n            text-decoration: underline;\n            color: #666\n        }\n\n        section {\n            border-top: 1px solid #eee;\n            padding: 2em 3em 0 3em\n        }\n\n        ul {\n            margin: 0;\n            padding: 0\n        }\n\n        .icon-box {\n            margin: 0;\n            width: 100%;\n            padding: 20px;\n            position: relative;\n            background: #ccc url(data:image/gif;base64,R0lGODlhDAAMAIAAAMzMzP///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjEgNjQuMTQwOTQ5LCAyMDEwLzEyLzA3LTEwOjU3OjAxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1LjEgV2luZG93cyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozQjk4OTI0MUY5NTIxMUUyQkJDMEI5NEFEM0Y1QTYwQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozQjk4OTI0MkY5NTIxMUUyQkJDMEI5NEFEM0Y1QTYwQyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjNCOTg5MjNGRjk1MjExRTJCQkMwQjk0QUQzRjVBNjBDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjNCOTg5MjQwRjk1MjExRTJCQkMwQjk0QUQzRjVBNjBDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAAAAAAAsAAAAAAwADAAAAhaEH6mHmmzcgzJAUG/NVGrfOZ8YLlABADs=) top left repeat;\n            border: 1px solid #ccc;\n            display: inline-block;\n            vertical-align: middle;\n            text-align: center;\n            color: black;\n        }\n\n        .icon-box.inverted {\n            background: black;\n        }\n\n        .icon-wrapper {\n            width: 150px;\n            float: left;\n        }\n\n        .icon-snippet {\n            width: 100%;\n            overflow-x: scroll;\n            box-shadow: 0 0 1px grey inset;\n            text-align: center;\n        }\n\n        pre {\n            padding: 10px;\n            margin: 0;\n        }\n\n        h2 {\n            margin: 0;\n            padding: 5px 0;\n            font-size: 1em;\n            font-weight: normal;\n            white-space: nowrap;\n            overflow: hidden;\n            text-overflow: ellipsis;\n        }\n\n        h4 {\n            margin: 0;\n        }\n\n        footer {\n            display: block;\n            margin: 0;\n            padding: 0 3em 3em 3em\n        }\n\n        footer p {\n            margin: 0;\n            font-size: .7em\n        }\n\n        footer a {\n            color: #0f7595;\n            margin-left: 0\n        }\n\n        .icons {\n            padding: 50px 0;\n            max-width: 90%;\n            margin: 0 auto;\n        }\n\n        svg {\n            display: inline-block;\n            fill: currentColor !important;\n            vertical-align: middle;\n            max-width: 80%;\n            height: 80%;\n        }\n    </style>\n</head>\n<body>\n<header>\n    <h1>Symbols</h1>\n    <p>Example usage:</p>\n<pre><code>&lt;svg&gt;&lt;use xlink:href=\"icons.svg#svg-logo\"&gt;&lt;/use&gt;&lt;/svg&gt;</code></pre>\n</header>\n<main class=\"icons\">\n    <div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-bin\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-bin</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-block\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-block</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-book\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-book</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-bug\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-bug</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-circle-delete\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-circle-delete</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-circle-minus\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-circle-minus</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-circle-ok\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-circle-ok</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-circle-pause\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-circle-pause</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-circle-play\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-circle-play</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-circle-plus\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-circle-plus</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-code\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-code</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-cog\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-cog</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-devices\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-devices</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-github\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-github</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-globe\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-globe</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-help\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-help</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-home\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-home</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-imac\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-imac</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-jh\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-jh</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-list\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-list</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-list2\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-list2</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-logo-word\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-logo-word</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-logo\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-logo</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-newtab\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-newtab</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-pen\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-pen</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-pencil\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-pencil</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-plug\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-plug</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-repeat\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-repeat</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-square-add\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-square-add</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-square-up\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-square-up</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-sync-browser\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-sync-browser</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-sync\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-sync</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-syncall\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-syncall</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-target\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-target</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-terminal\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-terminal</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-time\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-time</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-trash\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-trash</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-twitter\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-twitter</code></pre>\n    </div>\n</div><div class=\"icon-wrapper\">\n    <div class=\"icon-box\">\n        <svg><use xlink:href=\"icons.svg#svg-wifi\"></use></svg>\n    </div>\n    <div class=\"icon-snippet\">\n        <pre><code>svg-wifi</code></pre>\n    </div>\n</div>\n</main>\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync-ui/public/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title>Browsersync</title>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\" />\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <link rel=\"stylesheet\" href=\"css/core.min.css\"/>\n    <link href=\"favicon.ico\" rel=\"shortcut icon\" type=\"image/ico\">\n</head>\n<body ng-app=\"BrowserSync\">\n\n    %svg%\n\n    <disconnect-elem></disconnect-elem>\n    <notify-elem></notify-elem>\n\n    <main ng-controller=\"MainController as app\">\n\n        %header%\n\n        <section bs-container>\n\n            <section bs-sidebar>\n                <div class=\"loader\" ng-class=\"{ready:true}\">Loading...</div>\n                <nav bs-section-nav ng-class=\"{'active': app.ui.sectionMenu, ready: true}\">\n                    <ul bs-list=\"stacked\">\n                        <li ng-class=\"{'active': item.active}\" ng-repeat=\"(key, item) in app.ui.menu | orderObjectBy: 'order'\">\n                            <button bs-button ng-class=\"{'active': item.active}\" ng-click=\"app.setActiveSection(item)\">\n                                <icon icon=\"{{item.icon}}\"></icon>\n                                {{item.title | ucfirst}}\n                            </button>\n                        </li>\n                        <li bs-action=\"menu-close\" bs-visible=\"palm\">\n                            <button bs-button=\"nav\" ng-click=\"app.toggleMenu()\"><icon icon=\"circle-delete\"></icon> CLOSE</button>\n                        </li>\n                    </ul>\n                </nav>\n                <div bs-visible=\"not-palm\">\n                    %footer%\n                </div>\n            </section>\n\n            <section bs-content>\n\n                %pageMarkup%\n                %templates%\n\n                <div ng-view></div>\n\n                <div bs-visible=\"palm\">\n                    %footer%\n                </div>\n\n            </section>\n        </section>\n    </main>\n\n    <!--\n        app.js contains:\n\n        Socket.io,\n        BrowserSync connector,\n        Angular,\n        Angular Touch,\n        Angular Sanitize,\n        BrowserSync UI app code\n        BrowserSync UI Page Configuration\n        BrowserSync UI Plugin scripts\n\n    -->\n\n    <script src=\"/js/vendor/socket.js\"></script>\n    <script src=\"/js/app.js\"></script>\n    <script src=\"/js/pages-config.js\"></script>\n    <script src=\"/lib/client-js.js\"></script>\n\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync-ui/public/js/app.js",
    "content": "(()=>{var _e=(c,s)=>()=>(s||c((s={exports:{}}).exports,s),s.exports);var Du=_e(()=>{(function(c){\"use strict\";var s={objectMaxDepth:5,urlErrorParamsEnabled:!0};function f(e){if(Y(e))fe(e.objectMaxDepth)&&(s.objectMaxDepth=v(e.objectMaxDepth)?e.objectMaxDepth:NaN),fe(e.urlErrorParamsEnabled)&&$n(e.urlErrorParamsEnabled)&&(s.urlErrorParamsEnabled=e.urlErrorParamsEnabled);else return s}function v(e){return de(e)&&e>0}function w(e,t){t=t||Error;var n=\"https://errors.angularjs.org/1.8.2/\",r=n.replace(\".\",\"\\\\.\")+\"[\\\\s\\\\S]*\",i=new RegExp(r,\"g\");return function(){var l=arguments[0],u=arguments[1],a=\"[\"+(e?e+\":\":\"\")+l+\"] \",o=Nr(arguments,2).map(function(p){return Bo(p,s.objectMaxDepth)}),h,d;if(a+=u.replace(/\\{\\d+\\}/g,function(p){var g=+p.slice(1,-1);return g<o.length?o[g].replace(i,\"\"):p}),a+=`\n`+n+(e?e+\"/\":\"\")+l,s.urlErrorParamsEnabled)for(d=0,h=\"?\";d<o.length;d++,h=\"&\")a+=h+\"p\"+d+\"=\"+encodeURIComponent(o[d]);return new t(a)}}var q=/^\\/(.+)\\/([a-z]*)$/,ae=\"validity\",$e=Object.prototype.hasOwnProperty,pe=function(e){return V(e)?e.toLowerCase():e},Pe=function(e){return V(e)?e.toUpperCase():e},x,S,Q,se=[].slice,ge=[].splice,j=[].push,P=Object.prototype.toString,G=Object.getPrototypeOf,X=w(\"ng\"),ue=c.angular||(c.angular={}),Oe,qe=0;x=c.document.documentMode;function Le(e){if(e==null||Rt(e))return!1;if(oe(e)||V(e)||S&&e instanceof S)return!0;var t=\"length\"in Object(e)&&e.length;return de(t)&&(t>=0&&t-1 in e||typeof e.item==\"function\")}function M(e,t,n){var r,i;if(e)if(ve(e))for(r in e)r!==\"prototype\"&&r!==\"length\"&&r!==\"name\"&&e.hasOwnProperty(r)&&t.call(n,e[r],r,e);else if(oe(e)||Le(e)){var l=typeof e!=\"object\";for(r=0,i=e.length;r<i;r++)(l||r in e)&&t.call(n,e[r],r,e)}else if(e.forEach&&e.forEach!==M)e.forEach(t,n,e);else if(Ae(e))for(r in e)t.call(n,e[r],r,e);else if(typeof e.hasOwnProperty==\"function\")for(r in e)e.hasOwnProperty(r)&&t.call(n,e[r],r,e);else for(r in e)$e.call(e,r)&&t.call(n,e[r],r,e);return e}function We(e,t,n){for(var r=Object.keys(e).sort(),i=0;i<r.length;i++)t.call(n,e[r[i]],r[i]);return r}function Ze(e){return function(t,n){e(n,t)}}function vt(){return++qe}function Qe(e,t){t?e.$$hashKey=t:delete e.$$hashKey}function Ct(e,t,n){for(var r=e.$$hashKey,i=0,l=t.length;i<l;++i){var u=t[i];if(!(!Y(u)&&!ve(u)))for(var a=Object.keys(u),o=0,h=a.length;o<h;o++){var d=a[o],p=u[d];n&&Y(p)?Ee(p)?e[d]=new Date(p.valueOf()):Tt(p)?e[d]=new RegExp(p):p.nodeName?e[d]=p.cloneNode(!0):ds(p)?e[d]=p.clone():d!==\"__proto__\"&&(Y(e[d])||(e[d]=oe(p)?[]:{}),Ct(e[d],[p],!0)):e[d]=p}}return Qe(e,r),e}function Fe(e){return Ct(e,se.call(arguments,1),!1)}function Bt(e){return Ct(e,se.call(arguments,1),!0)}function Ye(e){return parseInt(e,10)}var je=Number.isNaN||function(t){return t!==t};function It(e,t){return Fe(Object.create(e),t)}function we(){}we.$inject=[];function _t(e){return e}_t.$inject=[];function st(e){return function(){return e}}function zt(e){return ve(e.toString)&&e.toString!==P}function he(e){return typeof e>\"u\"}function fe(e){return typeof e<\"u\"}function Y(e){return e!==null&&typeof e==\"object\"}function Ae(e){return e!==null&&typeof e==\"object\"&&!G(e)}function V(e){return typeof e==\"string\"}function de(e){return typeof e==\"number\"}function Ee(e){return P.call(e)===\"[object Date]\"}function oe(e){return Array.isArray(e)||e instanceof Array}function xe(e){var t=P.call(e);switch(t){case\"[object Error]\":return!0;case\"[object Exception]\":return!0;case\"[object DOMException]\":return!0;default:return e instanceof Error}}function ve(e){return typeof e==\"function\"}function Tt(e){return P.call(e)===\"[object RegExp]\"}function Rt(e){return e&&e.window===e}function Vt(e){return e&&e.$evalAsync&&e.$watch}function ai(e){return P.call(e)===\"[object File]\"}function Rf(e){return P.call(e)===\"[object FormData]\"}function Mf(e){return P.call(e)===\"[object Blob]\"}function $n(e){return typeof e==\"boolean\"}function ui(e){return e&&ve(e.then)}var Ff=/^\\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array]$/;function Lf(e){return e&&de(e.length)&&Ff.test(P.call(e))}function Df(e){return P.call(e)===\"[object ArrayBuffer]\"}var tt=function(e){return V(e)?e.trim():e},Mo=function(e){return e.replace(/([-()[\\]{}+?*.$^|,:#<!\\\\])/g,\"\\\\$1\").replace(/\\x08/g,\"\\\\x08\")};function ds(e){return!!(e&&(e.nodeName||e.prop&&e.attr&&e.find))}function If(e){var t={},n=e.split(\",\"),r;for(r=0;r<n.length;r++)t[n[r]]=!0;return t}function en(e){return pe(e.nodeName||e[0]&&e[0].nodeName)}function ps(e,t){return Array.prototype.indexOf.call(e,t)!==-1}function Dr(e,t){var n=e.indexOf(t);return n>=0&&e.splice(n,1),n}function Rn(e,t,n){var r=[],i=[];if(n=v(n)?n:NaN,t){if(Lf(t)||Df(t))throw X(\"cpta\",\"Can't copy! TypedArray destination cannot be mutated.\");if(e===t)throw X(\"cpi\",\"Can't copy! Source and destination are identical.\");return oe(t)?t.length=0:M(t,function(o,h){h!==\"$$hashKey\"&&delete t[h]}),r.push(e),i.push(t),l(e,t,n)}return u(e,n);function l(o,h,d){if(d--,d<0)return\"...\";var p=h.$$hashKey,g;if(oe(o))for(var y=0,b=o.length;y<b;y++)h.push(u(o[y],d));else if(Ae(o))for(g in o)h[g]=u(o[g],d);else if(o&&typeof o.hasOwnProperty==\"function\")for(g in o)o.hasOwnProperty(g)&&(h[g]=u(o[g],d));else for(g in o)$e.call(o,g)&&(h[g]=u(o[g],d));return Qe(h,p),h}function u(o,h){if(!Y(o))return o;var d=r.indexOf(o);if(d!==-1)return i[d];if(Rt(o)||Vt(o))throw X(\"cpws\",\"Can't copy! Making copies of Window or Scope instances is not supported.\");var p=!1,g=a(o);return g===void 0&&(g=oe(o)?[]:Object.create(G(o)),p=!0),r.push(o),i.push(g),p?l(o,g,h):g}function a(o){switch(P.call(o)){case\"[object Int8Array]\":case\"[object Int16Array]\":case\"[object Int32Array]\":case\"[object Float32Array]\":case\"[object Float64Array]\":case\"[object Uint8Array]\":case\"[object Uint8ClampedArray]\":case\"[object Uint16Array]\":case\"[object Uint32Array]\":return new o.constructor(u(o.buffer),o.byteOffset,o.length);case\"[object ArrayBuffer]\":if(!o.slice){var h=new ArrayBuffer(o.byteLength);return new Uint8Array(h).set(new Uint8Array(o)),h}return o.slice(0);case\"[object Boolean]\":case\"[object Number]\":case\"[object String]\":case\"[object Date]\":return new o.constructor(o.valueOf());case\"[object RegExp]\":var d=new RegExp(o.source,o.toString().match(/[^/]*$/)[0]);return d.lastIndex=o.lastIndex,d;case\"[object Blob]\":return new o.constructor([o],{type:o.type})}if(ve(o.cloneNode))return o.cloneNode(!0)}}function vs(e,t){return e===t||e!==e&&t!==t}function tn(e,t){if(e===t)return!0;if(e===null||t===null)return!1;if(e!==e&&t!==t)return!0;var n=typeof e,r=typeof t,i,l,u;if(n===r&&n===\"object\")if(oe(e)){if(!oe(t))return!1;if((i=e.length)===t.length){for(l=0;l<i;l++)if(!tn(e[l],t[l]))return!1;return!0}}else{if(Ee(e))return Ee(t)?vs(e.getTime(),t.getTime()):!1;if(Tt(e))return Tt(t)?e.toString()===t.toString():!1;if(Vt(e)||Vt(t)||Rt(e)||Rt(t)||oe(t)||Ee(t)||Tt(t))return!1;u=nt();for(l in e)if(!(l.charAt(0)===\"$\"||ve(e[l]))){if(!tn(e[l],t[l]))return!1;u[l]=!0}for(l in t)if(!(l in u)&&l.charAt(0)!==\"$\"&&fe(t[l])&&!ve(t[l]))return!1;return!0}return!1}var Mn=function(){if(!fe(Mn.rules)){var e=c.document.querySelector(\"[ng-csp]\")||c.document.querySelector(\"[data-ng-csp]\");if(e){var t=e.getAttribute(\"ng-csp\")||e.getAttribute(\"data-ng-csp\");Mn.rules={noUnsafeEval:!t||t.indexOf(\"no-unsafe-eval\")!==-1,noInlineStyle:!t||t.indexOf(\"no-inline-style\")!==-1}}else Mn.rules={noUnsafeEval:n(),noInlineStyle:!1}}return Mn.rules;function n(){try{return new Function(\"\"),!1}catch{return!0}}},ci=function(){if(fe(ci.name_))return ci.name_;var e,t,n=Zn.length,r,i;for(t=0;t<n;++t)if(r=Zn[t],e=c.document.querySelector(\"[\"+r.replace(\":\",\"\\\\:\")+\"jq]\"),e){i=e.getAttribute(r+\"jq\");break}return ci.name_=i};function Ir(e,t,n){return e.concat(se.call(t,n))}function Nr(e,t){return se.call(e,t||0)}function Kn(e,t){var n=arguments.length>2?Nr(arguments,2):[];return ve(t)&&!(t instanceof RegExp)?n.length?function(){return arguments.length?t.apply(e,Ir(n,arguments,0)):t.apply(e,n)}:function(){return arguments.length?t.apply(e,arguments):t.call(e)}:t}function Fo(e,t){var n=t;return typeof e==\"string\"&&e.charAt(0)===\"$\"&&e.charAt(1)===\"$\"?n=void 0:Rt(t)?n=\"$WINDOW\":t&&c.document===t?n=\"$DOCUMENT\":Vt(t)&&(n=\"$SCOPE\"),n}function qr(e,t){if(!he(e))return de(t)||(t=t?2:null),JSON.stringify(e,Fo,t)}function Lo(e){return V(e)?JSON.parse(e):e}var Nf=/:/g;function gs(e,t){e=e.replace(Nf,\"\");var n=Date.parse(\"Jan 01, 1970 00:00:00 \"+e)/6e4;return je(n)?t:n}function Do(e,t){return e=new Date(e.getTime()),e.setMinutes(e.getMinutes()+t),e}function $s(e,t,n){n=n?-1:1;var r=e.getTimezoneOffset(),i=gs(t,r);return Do(e,n*(i-r))}function un(e){e=S(e).clone().empty();var t=S(\"<div></div>\").append(e).html();try{return e[0].nodeType===wn?pe(t):t.match(/^(<[^>]+>)/)[1].replace(/^<([\\w-]+)/,function(n,r){return\"<\"+pe(r)})}catch{return pe(t)}}function Io(e){try{return decodeURIComponent(e)}catch{}}function ms(e){var t={};return M((e||\"\").split(\"&\"),function(n){var r,i,l;n&&(i=n=n.replace(/\\+/g,\"%20\"),r=n.indexOf(\"=\"),r!==-1&&(i=n.substring(0,r),l=n.substring(r+1)),i=Io(i),fe(i)&&(l=fe(l)?Io(l):!0,$e.call(t,i)?oe(t[i])?t[i].push(l):t[i]=[t[i],l]:t[i]=l))}),t}function qf(e){var t=[];return M(e,function(n,r){oe(n)?M(n,function(i){t.push(Gt(r,!0)+(i===!0?\"\":\"=\"+Gt(i,!0)))}):t.push(Gt(r,!0)+(n===!0?\"\":\"=\"+Gt(n,!0)))}),t.length?t.join(\"&\"):\"\"}function ys(e){return Gt(e,!0).replace(/%26/gi,\"&\").replace(/%3D/gi,\"=\").replace(/%2B/gi,\"+\")}function Gt(e,t){return encodeURIComponent(e).replace(/%40/gi,\"@\").replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%3B/gi,\";\").replace(/%20/g,t?\"%20\":\"+\")}var Zn=[\"ng-\",\"data-ng-\",\"ng:\",\"x-ng-\"];function Uf(e,t){var n,r,i=Zn.length;for(r=0;r<i;++r)if(n=Zn[r]+t,V(n=e.getAttribute(n)))return n;return null}function Bf(e){var t=e.currentScript;if(!t)return!0;if(!(t instanceof c.HTMLScriptElement||t instanceof c.SVGScriptElement))return!1;var n=t.attributes,r=[n.getNamedItem(\"src\"),n.getNamedItem(\"href\"),n.getNamedItem(\"xlink:href\")];return r.every(function(i){if(!i)return!0;if(!i.value)return!1;var l=e.createElement(\"a\");if(l.href=i.value,e.location.origin===l.origin)return!0;switch(l.protocol){case\"http:\":case\"https:\":case\"ftp:\":case\"blob:\":case\"file:\":case\"data:\":return!0;default:return!1}})}var Vf=Bf(c.document);function jf(e,t){var n,r,i={};if(M(Zn,function(l){var u=l+\"app\";!n&&e.hasAttribute&&e.hasAttribute(u)&&(n=e,r=e.getAttribute(u))}),M(Zn,function(l){var u=l+\"app\",a;!n&&(a=e.querySelector(\"[\"+u.replace(\":\",\"\\\\:\")+\"]\"))&&(n=a,r=a.getAttribute(u))}),n){if(!Vf){c.console.error(\"AngularJS: disabling automatic bootstrap. <script> protocol indicates an extension, document.location.href does not match.\");return}i.strictDi=Uf(n,\"strict-di\")!==null,t(n,r?[r]:[],i)}}function No(e,t,n){Y(n)||(n={});var r={strictDi:!1};n=Fe(r,n);var i=function(){if(e=S(e),e.injector()){var a=e[0]===c.document?\"document\":un(e);throw X(\"btstrpd\",\"App already bootstrapped with this element '{0}'\",a.replace(/</,\"&lt;\").replace(/>/,\"&gt;\"))}t=t||[],t.unshift([\"$provide\",function(h){h.value(\"$rootElement\",e)}]),n.debugInfoEnabled&&t.push([\"$compileProvider\",function(h){h.debugInfoEnabled(!0)}]),t.unshift(\"ng\");var o=jr(t,n.strictDi);return o.invoke([\"$rootScope\",\"$rootElement\",\"$compile\",\"$injector\",function(d,p,g,y){d.$apply(function(){p.data(\"$injector\",y),g(p)(d)})}]),o},l=/^NG_ENABLE_DEBUG_INFO!/,u=/^NG_DEFER_BOOTSTRAP!/;if(c&&l.test(c.name)&&(n.debugInfoEnabled=!0,c.name=c.name.replace(l,\"\")),c&&!u.test(c.name))return i();c.name=c.name.replace(u,\"\"),ue.resumeBootstrap=function(a){return M(a,function(o){t.push(o)}),i()},ve(ue.resumeDeferredBootstrap)&&ue.resumeDeferredBootstrap()}function Hf(){c.name=\"NG_ENABLE_DEBUG_INFO!\"+c.name,c.location.reload()}function Wf(e){var t=ue.element(e).injector();if(!t)throw X(\"test\",\"no injector found for element argument to getTestability\");return t.get(\"$$testability\")}var zf=/[A-Z]/g;function qo(e,t){return t=t||\"_\",e.replace(zf,function(n,r){return(r?t:\"\")+n.toLowerCase()})}var Uo=!1;function Gf(){var e;if(!Uo){var t=ci();Q=he(t)?c.jQuery:t?c[t]:void 0,Q&&Q.fn.on?(S=Q,Fe(Q.fn,{scope:tr.scope,isolateScope:tr.isolateScope,controller:tr.controller,injector:tr.injector,inheritedData:tr.inheritedData})):S=ct,e=S.cleanData,S.cleanData=function(n){for(var r,i=0,l;(l=n[i])!=null;i++)r=(S._data(l)||{}).events,r&&r.$destroy&&S(l).triggerHandler(\"$destroy\");e(n)},ue.element=S,Uo=!0}}function Xf(){ct.legacyXHTMLReplacement=!0}function Ur(e,t,n){if(!e)throw X(\"areq\",\"Argument '{0}' is {1}\",t||\"?\",n||\"required\");return e}function fi(e,t,n){return n&&oe(e)&&(e=e[e.length-1]),Ur(ve(e),t,\"not a function, got \"+(e&&typeof e==\"object\"?e.constructor.name||\"Object\":typeof e)),e}function Qn(e,t){if(e===\"hasOwnProperty\")throw X(\"badname\",\"hasOwnProperty is not a valid {0} name\",t)}function Yf(e,t,n){if(!t)return e;for(var r=t.split(\".\"),i,l=e,u=r.length,a=0;a<u;a++)i=r[a],e&&(e=(l=e)[i]);return!n&&ve(e)?Kn(l,e):e}function li(e){for(var t=e[0],n=e[e.length-1],r,i=1;t!==n&&(t=t.nextSibling);i++)(r||e[i]!==t)&&(r||(r=S(se.call(e,0,i))),r.push(t));return r||e}function nt(){return Object.create(null)}function bs(e){if(e==null)return\"\";switch(typeof e){case\"string\":break;case\"number\":e=\"\"+e;break;default:zt(e)&&!oe(e)&&!Ee(e)?e=e.toString():e=qr(e)}return e}var mn=1,Jf=2,wn=3,Br=8,Cs=9,Es=11;function Kf(e){var t=w(\"$injector\"),n=w(\"ng\");function r(l,u,a){return l[u]||(l[u]=a())}var i=r(e,\"angular\",Object);return i.$$minErr=i.$$minErr||w,r(i,\"module\",function(){var l={};return function(a,o,h){var d={},p=function(g,y){if(g===\"hasOwnProperty\")throw n(\"badname\",\"hasOwnProperty is not a valid {0} name\",y)};return p(a,\"module\"),o&&l.hasOwnProperty(a)&&(l[a]=null),r(l,a,function(){if(!o)throw t(\"nomod\",\"Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.\",a);var g=[],y=[],b=[],D=I(\"$injector\",\"invoke\",\"push\",y),z={_invokeQueue:g,_configBlocks:y,_runBlocks:b,info:function(F){if(fe(F)){if(!Y(F))throw n(\"aobj\",\"Argument '{0}' must be an object\",\"value\");return d=F,this}return d},requires:o,name:a,provider:L(\"$provide\",\"provider\"),factory:L(\"$provide\",\"factory\"),service:L(\"$provide\",\"service\"),value:I(\"$provide\",\"value\"),constant:I(\"$provide\",\"constant\",\"unshift\"),decorator:L(\"$provide\",\"decorator\",y),animation:L(\"$animateProvider\",\"register\"),filter:L(\"$filterProvider\",\"register\"),controller:L(\"$controllerProvider\",\"register\"),directive:L(\"$compileProvider\",\"directive\"),component:L(\"$compileProvider\",\"component\"),config:D,run:function(F){return b.push(F),this}};return h&&D(h),z;function I(F,U,A,T){return T||(T=g),function(){return T[A||\"push\"]([F,U,arguments]),z}}function L(F,U,A){return A||(A=g),function(T,m){return m&&ve(m)&&(m.$$moduleName=a),A.push([F,U,arguments]),z}}})}})}function nn(e,t){if(oe(e)){t=t||[];for(var n=0,r=e.length;n<r;n++)t[n]=e[n]}else if(Y(e)){t=t||{};for(var i in e)i.charAt(0)===\"$\"&&i.charAt(1)===\"$\"||(t[i]=e[i])}return t||e}function Zf(e,t){var n=[];return v(t)&&(e=ue.copy(e,null,t)),JSON.stringify(e,function(r,i){if(i=Fo(r,i),Y(i)){if(n.indexOf(i)>=0)return\"...\";n.push(i)}return i})}function Bo(e,t){return typeof e==\"function\"?e.toString().replace(/ \\{[\\s\\S]*$/,\"\"):he(e)?\"undefined\":typeof e!=\"string\"?Zf(e,t):e}var Qf={full:\"1.8.2\",major:1,minor:8,dot:2,codeName:\"meteoric-mining\"};function el(e){Fe(e,{errorHandlingConfig:f,bootstrap:No,copy:Rn,extend:Fe,merge:Bt,equals:tn,element:S,forEach:M,injector:jr,noop:we,bind:Kn,toJson:qr,fromJson:Lo,identity:_t,isUndefined:he,isDefined:fe,isString:V,isFunction:ve,isObject:Y,isNumber:de,isElement:ds,isArray:oe,version:Qf,isDate:Ee,callbacks:{$$counter:0},getTestability:Wf,reloadWithDebugInfo:Hf,UNSAFE_restoreLegacyJqLiteXHTMLReplacement:Xf,$$minErr:w,$$csp:Mn,$$encodeUriSegment:ys,$$encodeUriQuery:Gt,$$lowercase:pe,$$stringify:bs,$$uppercase:Pe}),Oe=Kf(c),Oe(\"ng\",[\"ngLocale\"],[\"$provide\",function(n){n.provider({$$sanitizeUri:Ih}),n.provider(\"$compile\",aa).directive({a:md,input:au,textarea:au,form:bd,script:mp,select:Cp,option:Ep,ngBind:Nd,ngBindHtml:Ud,ngBindTemplate:qd,ngClass:Vd,ngClassEven:Hd,ngClassOdd:jd,ngCloak:Wd,ngController:zd,ngForm:Cd,ngHide:lp,ngIf:Xd,ngInclude:Yd,ngInit:Kd,ngNonBindable:rp,ngPluralize:ap,ngRef:up,ngRepeat:cp,ngShow:fp,ngStyle:hp,ngSwitch:dp,ngSwitchWhen:pp,ngSwitchDefault:vp,ngOptions:op,ngTransclude:$p,ngModel:ep,ngList:Zd,ngChange:Bd,pattern:yu,ngPattern:yu,required:mu,ngRequired:mu,minlength:Cu,ngMinlength:Cu,maxlength:bu,ngMaxlength:bu,ngValue:Id,ngModelOptions:np}).directive({ngInclude:Jd,input:Ld}).directive(xi).directive(uu),n.provider({$anchorScroll:Ol,$animate:Ll,$animateCss:Nl,$$animateJs:Ml,$$animateQueue:Fl,$$AnimateRunner:Il,$$animateAsyncRun:Dl,$browser:Vl,$cacheFactory:jl,$controller:Xl,$document:Yl,$$isDocumentHidden:Jl,$exceptionHandler:Kl,$filter:Da,$$forceReflow:Zl,$interpolate:ch,$interval:lh,$$intervalFactory:hh,$http:sh,$httpParamSerializer:nh,$httpParamSerializerJQLike:rh,$httpBackend:ah,$xhrFactory:oh,$jsonpCallbacks:dh,$location:wh,$log:Ah,$parse:Rh,$rootScope:Dh,$q:Mh,$$q:Fh,$sce:Bh,$sceDelegate:Uh,$sniffer:Vh,$$taskTrackerFactory:jh,$templateCache:Hl,$templateRequest:zh,$$testability:Gh,$timeout:Yh,$window:td,$$rAF:Lh,$$jqLite:yl,$$Map:Cl,$$cookieReader:nd})}]).info({angularVersion:\"1.8.2\"})}ct.expando=\"ng339\";var er=ct.cache={},tl=1;ct._data=function(e){return this.cache[e[this.expando]]||{}};function nl(){return++tl}var rl=/-([a-z])/g,il=/^-ms-/,hi={mouseleave:\"mouseout\",mouseenter:\"mouseover\"},ws=w(\"jqLite\");function sl(e){return di(e.replace(il,\"ms-\"))}function Vo(e,t){return t.toUpperCase()}function di(e){return e.replace(rl,Vo)}var ol=/^<([\\w-]+)\\s*\\/?>(?:<\\/\\1>|)$/,al=/<|&#?\\w+;/,ul=/<([\\w:-]+)/,cl=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:-]+)[^>]*)\\/>/gi,cn={thead:[\"table\"],col:[\"colgroup\",\"table\"],tr:[\"tbody\",\"table\"],td:[\"tr\",\"tbody\",\"table\"]};cn.tbody=cn.tfoot=cn.colgroup=cn.caption=cn.thead,cn.th=cn.td;var Vr={option:[1,'<select multiple=\"multiple\">',\"</select>\"],_default:[0,\"\",\"\"]};for(var jo in cn){var Ho=cn[jo],Wo=Ho.slice().reverse();Vr[jo]=[Wo.length,\"<\"+Wo.join(\"><\")+\">\",\"</\"+Ho.join(\"></\")+\">\"]}Vr.optgroup=Vr.option;function As(e){return!al.test(e)}function Ss(e){var t=e.nodeType;return t===mn||!t||t===Cs}function fl(e){for(var t in er[e.ng339])return!0;return!1}function zo(e,t){var n,r,i,l,u=t.createDocumentFragment(),a=[],o;if(As(e))a.push(t.createTextNode(e));else{if(n=u.appendChild(t.createElement(\"div\")),r=(ul.exec(e)||[\"\",\"\"])[1].toLowerCase(),l=ct.legacyXHTMLReplacement?e.replace(cl,\"<$1></$2>\"):e,x<10)for(i=Vr[r]||Vr._default,n.innerHTML=i[1]+l+i[2],o=i[0];o--;)n=n.firstChild;else{for(i=cn[r]||[],o=i.length;--o>-1;)n.appendChild(c.document.createElement(i[o])),n=n.firstChild;n.innerHTML=l}a=Ir(a,n.childNodes),n=u.firstChild,n.textContent=\"\"}return u.textContent=\"\",u.innerHTML=\"\",M(a,function(h){u.appendChild(h)}),u}function ll(e,t){t=t||c.document;var n;return(n=ol.exec(e))?[t.createElement(n[1])]:(n=zo(e,t))?n.childNodes:[]}function hl(e,t){var n=e.parentNode;n&&n.replaceChild(t,e),t.appendChild(e)}var dl=c.Node.prototype.contains||function(e){return!!(this.compareDocumentPosition(e)&16)};function ct(e){if(e instanceof ct)return e;var t;if(V(e)&&(e=tt(e),t=!0),!(this instanceof ct)){if(t&&e.charAt(0)!==\"<\")throw ws(\"nosel\",\"Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element\");return new ct(e)}t?Os(this,ll(e)):ve(e)?Zo(e):Os(this,e)}function _s(e){return e.cloneNode(!0)}function pi(e,t){!t&&Ss(e)&&S.cleanData([e]),e.querySelectorAll&&S.cleanData(e.querySelectorAll(\"*\"))}function Go(e){var t;for(t in e)return!1;return!0}function Xo(e){var t=e.ng339,n=t&&er[t],r=n&&n.events,i=n&&n.data;(!i||Go(i))&&(!r||Go(r))&&(delete er[t],e.ng339=void 0)}function Yo(e,t,n,r){if(fe(r))throw ws(\"offargs\",\"jqLite#off() does not support the `selector` argument\");var i=vi(e),l=i&&i.events,u=i&&i.handle;if(!!u){if(t){var a=function(o){var h=l[o];fe(n)&&Dr(h||[],n),fe(n)&&h&&h.length>0||(e.removeEventListener(o,u),delete l[o])};M(t.split(\" \"),function(o){a(o),hi[o]&&a(hi[o])})}else for(t in l)t!==\"$destroy\"&&e.removeEventListener(t,u),delete l[t];Xo(e)}}function Ts(e,t){var n=e.ng339,r=n&&er[n];r&&(t?delete r.data[t]:r.data={},Xo(e))}function vi(e,t){var n=e.ng339,r=n&&er[n];return t&&!r&&(e.ng339=n=nl(),r=er[n]={events:{},data:{},handle:void 0}),r}function ks(e,t,n){if(Ss(e)){var r,i=fe(n),l=!i&&t&&!Y(t),u=!t,a=vi(e,!l),o=a&&a.data;if(i)o[di(t)]=n;else{if(u)return o;if(l)return o&&o[di(t)];for(r in t)o[di(r)]=t[r]}}}function gi(e,t){return e.getAttribute?(\" \"+(e.getAttribute(\"class\")||\"\")+\" \").replace(/[\\n\\t]/g,\" \").indexOf(\" \"+t+\" \")>-1:!1}function $i(e,t){if(t&&e.setAttribute){var n=(\" \"+(e.getAttribute(\"class\")||\"\")+\" \").replace(/[\\n\\t]/g,\" \"),r=n;M(t.split(\" \"),function(i){i=tt(i),r=r.replace(\" \"+i+\" \",\" \")}),r!==n&&e.setAttribute(\"class\",tt(r))}}function mi(e,t){if(t&&e.setAttribute){var n=(\" \"+(e.getAttribute(\"class\")||\"\")+\" \").replace(/[\\n\\t]/g,\" \"),r=n;M(t.split(\" \"),function(i){i=tt(i),r.indexOf(\" \"+i+\" \")===-1&&(r+=i+\" \")}),r!==n&&e.setAttribute(\"class\",tt(r))}}function Os(e,t){if(t)if(t.nodeType)e[e.length++]=t;else{var n=t.length;if(typeof n==\"number\"&&t.window!==t){if(n)for(var r=0;r<n;r++)e[e.length++]=t[r]}else e[e.length++]=t}}function Jo(e,t){return yi(e,\"$\"+(t||\"ngController\")+\"Controller\")}function yi(e,t,n){e.nodeType===Cs&&(e=e.documentElement);for(var r=oe(t)?t:[t];e;){for(var i=0,l=r.length;i<l;i++)if(fe(n=S.data(e,r[i])))return n;e=e.parentNode||e.nodeType===Es&&e.host}}function Ko(e){for(pi(e,!0);e.firstChild;)e.removeChild(e.firstChild)}function bi(e,t){t||pi(e);var n=e.parentNode;n&&n.removeChild(e)}function pl(e,t){t=t||c,t.document.readyState===\"complete\"?t.setTimeout(e):S(t).on(\"load\",e)}function Zo(e){function t(){c.document.removeEventListener(\"DOMContentLoaded\",t),c.removeEventListener(\"load\",t),e()}c.document.readyState===\"complete\"?c.setTimeout(e):(c.document.addEventListener(\"DOMContentLoaded\",t),c.addEventListener(\"load\",t))}var tr=ct.prototype={ready:Zo,toString:function(){var e=[];return M(this,function(t){e.push(\"\"+t)}),\"[\"+e.join(\", \")+\"]\"},eq:function(e){return e>=0?S(this[e]):S(this[this.length+e])},length:0,push:j,sort:[].sort,splice:[].splice},Ci={};M(\"multiple,selected,checked,disabled,readOnly,required,open\".split(\",\"),function(e){Ci[pe(e)]=e});var Qo={};M(\"input,select,option,textarea,button,form,details\".split(\",\"),function(e){Qo[e]=!0});var ea={ngMinlength:\"minlength\",ngMaxlength:\"maxlength\",ngMin:\"min\",ngMax:\"max\",ngPattern:\"pattern\",ngStep:\"step\"};function ta(e,t){var n=Ci[t.toLowerCase()];return n&&Qo[en(e)]&&n}function vl(e){return ea[e]}M({data:ks,removeData:Ts,hasData:fl,cleanData:function(t){for(var n=0,r=t.length;n<r;n++)Ts(t[n]),Yo(t[n])}},function(e,t){ct[t]=e}),M({data:ks,inheritedData:yi,scope:function(e){return S.data(e,\"$scope\")||yi(e.parentNode||e,[\"$isolateScope\",\"$scope\"])},isolateScope:function(e){return S.data(e,\"$isolateScope\")||S.data(e,\"$isolateScopeNoTemplate\")},controller:Jo,injector:function(e){return yi(e,\"$injector\")},removeAttr:function(e,t){e.removeAttribute(t)},hasClass:gi,css:function(e,t,n){if(t=sl(t),fe(n))e.style[t]=n;else return e.style[t]},attr:function(e,t,n){var r,i=e.nodeType;if(!(i===wn||i===Jf||i===Br||!e.getAttribute)){var l=pe(t),u=Ci[l];if(fe(n))n===null||n===!1&&u?e.removeAttribute(t):e.setAttribute(t,u?l:n);else return r=e.getAttribute(t),u&&r!==null&&(r=l),r===null?void 0:r}},prop:function(e,t,n){if(fe(n))e[t]=n;else return e[t]},text:function(){return e.$dv=\"\",e;function e(t,n){if(he(n)){var r=t.nodeType;return r===mn||r===wn?t.textContent:\"\"}t.textContent=n}}(),val:function(e,t){if(he(t)){if(e.multiple&&en(e)===\"select\"){var n=[];return M(e.options,function(r){r.selected&&n.push(r.value||r.text)}),n}return e.value}e.value=t},html:function(e,t){if(he(t))return e.innerHTML;pi(e,!0),e.innerHTML=t},empty:Ko},function(e,t){ct.prototype[t]=function(n,r){var i,l,u=this.length;if(e!==Ko&&he(e.length===2&&e!==gi&&e!==Jo?n:r))if(Y(n)){for(i=0;i<u;i++)if(e===ks)e(this[i],n);else for(l in n)e(this[i],l,n[l]);return this}else{for(var a=e.$dv,o=he(a)?Math.min(u,1):u,h=0;h<o;h++){var d=e(this[h],n,r);a=a?a+d:d}return a}else{for(i=0;i<u;i++)e(this[i],n,r);return this}}});function gl(e,t){var n=function(r,i){r.isDefaultPrevented=function(){return r.defaultPrevented};var l=t[i||r.type],u=l?l.length:0;if(!!u){if(he(r.immediatePropagationStopped)){var a=r.stopImmediatePropagation;r.stopImmediatePropagation=function(){r.immediatePropagationStopped=!0,r.stopPropagation&&r.stopPropagation(),a&&a.call(r)}}r.isImmediatePropagationStopped=function(){return r.immediatePropagationStopped===!0};var o=l.specialHandlerWrapper||$l;u>1&&(l=nn(l));for(var h=0;h<u;h++)r.isImmediatePropagationStopped()||o(e,r,l[h])}};return n.elem=e,n}function $l(e,t,n){n.call(e,t)}function ml(e,t,n){var r=t.relatedTarget;(!r||r!==e&&!dl.call(e,r))&&n.call(e,t)}M({removeData:Ts,on:function(t,n,r,i){if(fe(i))throw ws(\"onargs\",\"jqLite#on() does not support the `selector` or `eventData` parameters\");if(!!Ss(t)){var l=vi(t,!0),u=l.events,a=l.handle;a||(a=l.handle=gl(t,u));for(var o=n.indexOf(\" \")>=0?n.split(\" \"):[n],h=o.length,d=function(p,g,y){var b=u[p];b||(b=u[p]=[],b.specialHandlerWrapper=g,p!==\"$destroy\"&&!y&&t.addEventListener(p,a)),b.push(r)};h--;)n=o[h],hi[n]?(d(hi[n],ml),d(n,void 0,!0)):d(n)}},off:Yo,one:function(e,t,n){e=S(e),e.on(t,function r(){e.off(t,n),e.off(t,r)}),e.on(t,n)},replaceWith:function(e,t){var n,r=e.parentNode;pi(e),M(new ct(t),function(i){n?r.insertBefore(i,n.nextSibling):r.replaceChild(i,e),n=i})},children:function(e){var t=[];return M(e.childNodes,function(n){n.nodeType===mn&&t.push(n)}),t},contents:function(e){return e.contentDocument||e.childNodes||[]},append:function(e,t){var n=e.nodeType;if(!(n!==mn&&n!==Es)){t=new ct(t);for(var r=0,i=t.length;r<i;r++){var l=t[r];e.appendChild(l)}}},prepend:function(e,t){if(e.nodeType===mn){var n=e.firstChild;M(new ct(t),function(r){e.insertBefore(r,n)})}},wrap:function(e,t){hl(e,S(t).eq(0).clone()[0])},remove:bi,detach:function(e){bi(e,!0)},after:function(e,t){var n=e,r=e.parentNode;if(r){t=new ct(t);for(var i=0,l=t.length;i<l;i++){var u=t[i];r.insertBefore(u,n.nextSibling),n=u}}},addClass:mi,removeClass:$i,toggleClass:function(e,t,n){t&&M(t.split(\" \"),function(r){var i=n;he(i)&&(i=!gi(e,r)),(i?mi:$i)(e,r)})},parent:function(e){var t=e.parentNode;return t&&t.nodeType!==Es?t:null},next:function(e){return e.nextElementSibling},find:function(e,t){return e.getElementsByTagName?e.getElementsByTagName(t):[]},clone:_s,triggerHandler:function(e,t,n){var r,i,l,u=t.type||t,a=vi(e),o=a&&a.events,h=o&&o[u];h&&(r={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return this.defaultPrevented===!0},stopImmediatePropagation:function(){this.immediatePropagationStopped=!0},isImmediatePropagationStopped:function(){return this.immediatePropagationStopped===!0},stopPropagation:we,type:u,target:e},t.type&&(r=Fe(r,t)),i=nn(h),l=n?[r].concat(n):[r],M(i,function(d){r.isImmediatePropagationStopped()||d.apply(e,l)}))}},function(e,t){ct.prototype[t]=function(n,r,i){for(var l,u=0,a=this.length;u<a;u++)he(l)?(l=e(this[u],n,r,i),fe(l)&&(l=S(l))):Os(l,e(this[u],n,r,i));return fe(l)?l:this}}),ct.prototype.bind=ct.prototype.on,ct.prototype.unbind=ct.prototype.off;function yl(){this.$get=function(){return Fe(ct,{hasClass:function(t,n){return t.attr&&(t=t[0]),gi(t,n)},addClass:function(t,n){return t.attr&&(t=t[0]),mi(t,n)},removeClass:function(t,n){return t.attr&&(t=t[0]),$i(t,n)}})}}function nr(e,t){var n=e&&e.$$hashKey;if(n)return typeof n==\"function\"&&(n=e.$$hashKey()),n;var r=typeof e;return r===\"function\"||r===\"object\"&&e!==null?n=e.$$hashKey=r+\":\"+(t||vt)():n=r+\":\"+e,n}var bl=Object.create(null);function na(){this._keys=[],this._values=[],this._lastKey=NaN,this._lastIndex=-1}na.prototype={_idx:function(e){return e!==this._lastKey&&(this._lastKey=e,this._lastIndex=this._keys.indexOf(e)),this._lastIndex},_transformKey:function(e){return je(e)?bl:e},get:function(e){e=this._transformKey(e);var t=this._idx(e);if(t!==-1)return this._values[t]},has:function(e){e=this._transformKey(e);var t=this._idx(e);return t!==-1},set:function(e,t){e=this._transformKey(e);var n=this._idx(e);n===-1&&(n=this._lastIndex=this._keys.length),this._keys[n]=e,this._values[n]=t},delete:function(e){e=this._transformKey(e);var t=this._idx(e);return t===-1?!1:(this._keys.splice(t,1),this._values.splice(t,1),this._lastKey=NaN,this._lastIndex=-1,!0)}};var Ei=na,Cl=[function(){this.$get=[function(){return Ei}]}],El=/^([^(]+?)=>/,wl=/^[^(]*\\(\\s*([^)]*)\\)/m,Al=/,/,Sl=/^\\s*(_?)(\\S+?)\\1\\s*$/,_l=/((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg,Fn=w(\"$injector\");function ra(e){return Function.prototype.toString.call(e)}function ia(e){var t=ra(e).replace(_l,\"\"),n=t.match(El)||t.match(wl);return n}function Tl(e){var t=ia(e);return t?\"function(\"+(t[1]||\"\").replace(/[\\s\\r\\n]+/,\" \")+\")\":\"fn\"}function kl(e,t,n){var r,i,l;if(typeof e==\"function\"){if(!(r=e.$inject)){if(r=[],e.length){if(t)throw(!V(n)||!n)&&(n=e.name||Tl(e)),Fn(\"strictdi\",\"{0} is not using explicit annotation and cannot be invoked in strict mode\",n);i=ia(e),M(i[1].split(Al),function(u){u.replace(Sl,function(a,o,h){r.push(h)})})}e.$inject=r}}else oe(e)?(l=e.length-1,fi(e[l],\"fn\"),r=e.slice(0,l)):fi(e,\"fn\",!0);return r}function jr(e,t){t=t===!0;var n={},r=\"Provider\",i=[],l=new Ei,u={$provide:{provider:g(y),factory:g(D),service:g(z),value:g(I),constant:g(L),decorator:F}},a=u.$injector=A(u,function(T,m){throw ue.isString(m)&&i.push(m),Fn(\"unpr\",\"Unknown provider: {0}\",i.join(\" <- \"))}),o={},h=A(o,function(T,m){var $=a.get(T+r,m);return d.invoke($.$get,$,void 0,T)}),d=h;u[\"$injector\"+r]={$get:st(h)},d.modules=a.modules=nt();var p=U(e);return d=h.get(\"$injector\"),d.strictDi=t,M(p,function(T){T&&d.invoke(T)}),d.loadNewModules=function(T){M(U(T),function(m){m&&d.invoke(m)})},d;function g(T){return function(m,$){if(Y(m))M(m,Ze(T));else return T(m,$)}}function y(T,m){if(Qn(T,\"service\"),(ve(m)||oe(m))&&(m=a.instantiate(m)),!m.$get)throw Fn(\"pget\",\"Provider '{0}' must define $get factory method.\",T);return u[T+r]=m}function b(T,m){return function(){var C=d.invoke(m,this);if(he(C))throw Fn(\"undef\",\"Provider '{0}' must return a value from $get factory method.\",T);return C}}function D(T,m,$){return y(T,{$get:$!==!1?b(T,m):m})}function z(T,m){return D(T,[\"$injector\",function($){return $.instantiate(m)}])}function I(T,m){return D(T,st(m),!1)}function L(T,m){Qn(T,\"constant\"),u[T]=m,o[T]=m}function F(T,m){var $=a.get(T+r),C=$.$get;$.$get=function(){var E=d.invoke(C,$);return d.invoke(m,null,{$delegate:E})}}function U(T){Ur(he(T)||oe(T),\"modulesToLoad\",\"not an array\");var m=[],$;return M(T,function(C){if(l.get(C))return;l.set(C,!0);function E(O){var B,R;for(B=0,R=O.length;B<R;B++){var W=O[B],K=a.get(W[0]);K[W[1]].apply(K,W[2])}}try{V(C)?($=Oe(C),d.modules[C]=$,m=m.concat(U($.requires)).concat($._runBlocks),E($._invokeQueue),E($._configBlocks)):ve(C)||oe(C)?m.push(a.invoke(C)):fi(C,\"module\")}catch(O){throw oe(C)&&(C=C[C.length-1]),O.message&&O.stack&&O.stack.indexOf(O.message)===-1&&(O=O.message+`\n`+O.stack),Fn(\"modulerr\",`Failed to instantiate module {0} due to:\n{1}`,C,O.stack||O.message||O)}}),m}function A(T,m){function $(R,W){if(T.hasOwnProperty(R)){if(T[R]===n)throw Fn(\"cdep\",\"Circular dependency found: {0}\",R+\" <- \"+i.join(\" <- \"));return T[R]}else try{return i.unshift(R),T[R]=n,T[R]=m(R,W),T[R]}catch(K){throw T[R]===n&&delete T[R],K}finally{i.shift()}}function C(R,W,K){for(var ne=[],J=jr.$$annotate(R,t,K),ie=0,Te=J.length;ie<Te;ie++){var Se=J[ie];if(typeof Se!=\"string\")throw Fn(\"itkn\",\"Incorrect injection token! Expected service name as string, got {0}\",Se);ne.push(W&&W.hasOwnProperty(Se)?W[Se]:$(Se,K))}return ne}function E(R){if(x||typeof R!=\"function\")return!1;var W=R.$$ngIsClass;return $n(W)||(W=R.$$ngIsClass=/^class\\b/.test(ra(R))),W}function O(R,W,K,ne){typeof K==\"string\"&&(ne=K,K=null);var J=C(R,K,ne);return oe(R)&&(R=R[R.length-1]),E(R)?(J.unshift(null),new(Function.prototype.bind.apply(R,J))):R.apply(W,J)}function B(R,W,K){var ne=oe(R)?R[R.length-1]:R,J=C(R,W,K);return J.unshift(null),new(Function.prototype.bind.apply(ne,J))}return{invoke:O,instantiate:B,get:$,annotate:jr.$$annotate,has:function(R){return u.hasOwnProperty(R+r)||T.hasOwnProperty(R)}}}}jr.$$annotate=kl;function Ol(){var e=!0;this.disableAutoScrolling=function(){e=!1},this.$get=[\"$window\",\"$location\",\"$rootScope\",function(t,n,r){var i=t.document;function l(h){var d=null;return Array.prototype.some.call(h,function(p){if(en(p)===\"a\")return d=p,!0}),d}function u(){var h=o.yOffset;if(ve(h))h=h();else if(ds(h)){var d=h[0],p=t.getComputedStyle(d);p.position!==\"fixed\"?h=0:h=d.getBoundingClientRect().bottom}else de(h)||(h=0);return h}function a(h){if(h){h.scrollIntoView();var d=u();if(d){var p=h.getBoundingClientRect().top;t.scrollBy(0,p-d)}}else t.scrollTo(0,0)}function o(h){h=V(h)?h:de(h)?h.toString():n.hash();var d;h?(d=i.getElementById(h))||(d=l(i.getElementsByName(h)))?a(d):h===\"top\"&&a(null):a(null)}return e&&r.$watch(function(){return n.hash()},function(d,p){d===p&&d===\"\"||pl(function(){r.$evalAsync(o)})}),o}]}var sa=w(\"$animate\"),xl=1,oa=\"ng-animate\";function Hr(e,t){return!e&&!t?\"\":e?t?(oe(e)&&(e=e.join(\" \")),oe(t)&&(t=t.join(\" \")),e+\" \"+t):e:t}function Pl(e){for(var t=0;t<e.length;t++){var n=e[t];if(n.nodeType===xl)return n}}function Rl(e){V(e)&&(e=e.split(\" \"));var t=nt();return M(e,function(n){n.length&&(t[n]=!0)}),t}function Ln(e){return Y(e)?e:{}}var Ml=function(){this.$get=we},Fl=function(){var e=new Ei,t=[];this.$get=[\"$$AnimateRunner\",\"$rootScope\",function(n,r){return{enabled:we,on:we,off:we,pin:we,push:function(a,o,h,d){d&&d(),h=h||{},h.from&&a.css(h.from),h.to&&a.css(h.to),(h.addClass||h.removeClass)&&u(a,h.addClass,h.removeClass);var p=new n;return p.complete(),p}};function i(a,o,h){var d=!1;return o&&(o=V(o)?o.split(\" \"):oe(o)?o:[],M(o,function(p){p&&(d=!0,a[p]=h)})),d}function l(){M(t,function(a){var o=e.get(a);if(o){var h=Rl(a.attr(\"class\")),d=\"\",p=\"\";M(o,function(g,y){var b=!!h[y];g!==b&&(g?d+=(d.length?\" \":\"\")+y:p+=(p.length?\" \":\"\")+y)}),M(a,function(g){d&&mi(g,d),p&&$i(g,p)}),e.delete(a)}}),t.length=0}function u(a,o,h){var d=e.get(a)||{},p=i(d,o,!0),g=i(d,h,!1);(p||g)&&(e.set(a,d),t.push(a),t.length===1&&r.$$postDigest(l))}}]},Ll=[\"$provide\",function(e){var t=this,n=null,r=null;this.$$registeredAnimations=Object.create(null),this.register=function(i,l){if(i&&i.charAt(0)!==\".\")throw sa(\"notcsel\",\"Expecting class selector starting with '.' got '{0}'.\",i);var u=i+\"-animation\";t.$$registeredAnimations[i.substr(1)]=u,e.factory(u,l)},this.customFilter=function(i){return arguments.length===1&&(r=ve(i)?i:null),r},this.classNameFilter=function(i){if(arguments.length===1&&(n=i instanceof RegExp?i:null,n)){var l=new RegExp(\"[(\\\\s|\\\\/)]\"+oa+\"[(\\\\s|\\\\/)]\");if(l.test(n.toString()))throw n=null,sa(\"nongcls\",'$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the \"{0}\" CSS class.',oa)}return n},this.$get=[\"$$animateQueue\",function(i){function l(u,a,o){if(o){var h=Pl(o);h&&!h.parentNode&&!h.previousElementSibling&&(o=null)}o?o.after(u):a.prepend(u)}return{on:i.on,off:i.off,pin:i.pin,enabled:i.enabled,cancel:function(u){u.cancel&&u.cancel()},enter:function(u,a,o,h){return a=a&&S(a),o=o&&S(o),a=a||o.parent(),l(u,a,o),i.push(u,\"enter\",Ln(h))},move:function(u,a,o,h){return a=a&&S(a),o=o&&S(o),a=a||o.parent(),l(u,a,o),i.push(u,\"move\",Ln(h))},leave:function(u,a){return i.push(u,\"leave\",Ln(a),function(){u.remove()})},addClass:function(u,a,o){return o=Ln(o),o.addClass=Hr(o.addclass,a),i.push(u,\"addClass\",o)},removeClass:function(u,a,o){return o=Ln(o),o.removeClass=Hr(o.removeClass,a),i.push(u,\"removeClass\",o)},setClass:function(u,a,o,h){return h=Ln(h),h.addClass=Hr(h.addClass,a),h.removeClass=Hr(h.removeClass,o),i.push(u,\"setClass\",h)},animate:function(u,a,o,h,d){return d=Ln(d),d.from=d.from?Fe(d.from,a):a,d.to=d.to?Fe(d.to,o):o,h=h||\"ng-inline-animate\",d.tempClasses=Hr(d.tempClasses,h),i.push(u,\"animate\",d)}}}]}],Dl=function(){this.$get=[\"$$rAF\",function(e){var t=[];function n(r){t.push(r),!(t.length>1)&&e(function(){for(var i=0;i<t.length;i++)t[i]();t=[]})}return function(){var r=!1;return n(function(){r=!0}),function(i){r?i():n(i)}}}]},Il=function(){this.$get=[\"$q\",\"$sniffer\",\"$$animateAsyncRun\",\"$$isDocumentHidden\",\"$timeout\",function(e,t,n,r,i){var l=0,u=1,a=2;o.chain=function(h,d){var p=0;g();function g(){if(p===h.length){d(!0);return}h[p](function(y){if(y===!1){d(!1);return}p++,g()})}},o.all=function(h,d){var p=0,g=!0;M(h,function(b){b.done(y)});function y(b){g=g&&b,++p===h.length&&d(g)}};function o(h){this.setHost(h);var d=n(),p=function(g){i(g,0,!1)};this._doneCallbacks=[],this._tick=function(g){r()?p(g):d(g)},this._state=0}return o.prototype={setHost:function(h){this.host=h||{}},done:function(h){this._state===a?h():this._doneCallbacks.push(h)},progress:we,getPromise:function(){if(!this.promise){var h=this;this.promise=e(function(d,p){h.done(function(g){g===!1?p():d()})})}return this.promise},then:function(h,d){return this.getPromise().then(h,d)},catch:function(h){return this.getPromise().catch(h)},finally:function(h){return this.getPromise().finally(h)},pause:function(){this.host.pause&&this.host.pause()},resume:function(){this.host.resume&&this.host.resume()},end:function(){this.host.end&&this.host.end(),this._resolve(!0)},cancel:function(){this.host.cancel&&this.host.cancel(),this._resolve(!1)},complete:function(h){var d=this;d._state===l&&(d._state=u,d._tick(function(){d._resolve(h)}))},_resolve:function(h){this._state!==a&&(M(this._doneCallbacks,function(d){d(h)}),this._doneCallbacks.length=0,this._state=a)}},o}]},Nl=function(){this.$get=[\"$$rAF\",\"$q\",\"$$AnimateRunner\",function(e,t,n){return function(r,i){var l=i||{};l.$$prepared||(l=Rn(l)),l.cleanupStyles&&(l.from=l.to=null),l.from&&(r.css(l.from),l.from=null);var u,a=new n;return{start:o,end:o};function o(){return e(function(){h(),u||a.complete(),u=!0}),a}function h(){l.addClass&&(r.addClass(l.addClass),l.addClass=null),l.removeClass&&(r.removeClass(l.removeClass),l.removeClass=null),l.to&&(r.css(l.to),l.to=null)}}}]};function ql(e){var t=e.indexOf(\"#\");return t===-1?\"\":e.substr(t)}function Ul(e){return e.replace(/#$/,\"\")}function Bl(e,t,n,r,i){var l=this,u=e.location,a=e.history,o=e.setTimeout,h=e.clearTimeout,d={},p=i(n);l.isMock=!1,l.$$completeOutstandingRequest=p.completeTask,l.$$incOutstandingRequestCount=p.incTaskCount,l.notifyWhenNoOutstandingRequests=p.notifyWhenNoPendingTasks;var g,y,b=u.href,D=t.find(\"base\"),z=null,I=r.history?function(){try{return a.state}catch{}}:we;T(),l.url=function($,C,E){if(he(E)&&(E=null),u!==e.location&&(u=e.location),a!==e.history&&(a=e.history),$){var O=y===E;if($=Nt($).href,b===$&&(!r.history||O))return l;var B=b&&In(b)===In($);return b=$,y=E,r.history&&(!B||!O)?(a[C?\"replaceState\":\"pushState\"](E,\"\",$),T()):(B||(z=$),C?u.replace($):B?u.hash=ql($):u.href=$,u.href!==$&&(z=$)),z&&(z=$),l}else return Ul(z||u.href)},l.state=function(){return g};var L=[],F=!1;function U(){z=null,m()}var A=null;function T(){g=I(),g=he(g)?null:g,tn(g,A)&&(g=A),A=g,y=g}function m(){var $=y;T(),!(b===l.url()&&$===g)&&(b=l.url(),y=g,M(L,function(C){C(l.url(),g)}))}l.onUrlChange=function($){return F||(r.history&&S(e).on(\"popstate\",U),S(e).on(\"hashchange\",U),F=!0),L.push($),$},l.$$applicationDestroyed=function(){S(e).off(\"hashchange popstate\",U)},l.$$checkUrlChange=m,l.baseHref=function(){var $=D.attr(\"href\");return $?$.replace(/^(https?:)?\\/\\/[^/]*/,\"\"):\"\"},l.defer=function($,C,E){var O;return C=C||0,E=E||p.DEFAULT_TASK_TYPE,p.incTaskCount(E),O=o(function(){delete d[O],p.completeTask($,E)},C),d[O]=E,O},l.defer.cancel=function($){if(d.hasOwnProperty($)){var C=d[$];return delete d[$],h($),p.completeTask(we,C),!0}return!1}}function Vl(){this.$get=[\"$window\",\"$log\",\"$sniffer\",\"$document\",\"$$taskTrackerFactory\",function(e,t,n,r,i){return new Bl(e,r,t,n,i)}]}function jl(){this.$get=function(){var e={};function t(n,r){if(n in e)throw w(\"$cacheFactory\")(\"iid\",\"CacheId '{0}' is already taken!\",n);var i=0,l=Fe({},r,{id:n}),u=nt(),a=r&&r.capacity||Number.MAX_VALUE,o=nt(),h=null,d=null;return e[n]={put:function(y,b){if(!he(b)){if(a<Number.MAX_VALUE){var D=o[y]||(o[y]={key:y});p(D)}return y in u||i++,u[y]=b,i>a&&this.remove(d.key),b}},get:function(y){if(a<Number.MAX_VALUE){var b=o[y];if(!b)return;p(b)}return u[y]},remove:function(y){if(a<Number.MAX_VALUE){var b=o[y];if(!b)return;b===h&&(h=b.p),b===d&&(d=b.n),g(b.n,b.p),delete o[y]}y in u&&(delete u[y],i--)},removeAll:function(){u=nt(),i=0,o=nt(),h=d=null},destroy:function(){u=null,l=null,o=null,delete e[n]},info:function(){return Fe({},l,{size:i})}};function p(y){y!==h&&(d?d===y&&(d=y.n):d=y,g(y.n,y.p),g(y,h),h=y,h.n=null)}function g(y,b){y!==b&&(y&&(y.p=b),b&&(b.n=y))}}return t.info=function(){var n={};return M(e,function(r,i){n[i]=r.info()}),n},t.get=function(n){return e[n]},t}}function Hl(){this.$get=[\"$cacheFactory\",function(e){return e(\"templates\")}]}var ht=w(\"$compile\");function Wl(){}var xs=new Wl;aa.$inject=[\"$provide\",\"$$sanitizeUriProvider\"];function aa(e,t){var n={},r=\"Directive\",i=/^\\s*directive:\\s*([\\w-]+)\\s+(.*)$/,l=/(([\\w-]+)(?::([^;]+))?;?)/,u=If(\"ngSrc,ngSrcset,src,srcset\"),a=/^(?:(\\^\\^?)?(\\?)?(\\^\\^?)?)?/,o=/^(on[a-z]+|formaction)$/,h=nt();function d(A,T,m){var $=/^([@&]|[=<](\\*?))(\\??)\\s*([\\w$]*)$/,C=nt();return M(A,function(E,O){if(E=E.trim(),E in h){C[O]=h[E];return}var B=E.match($);if(!B)throw ht(\"iscp\",\"Invalid {3} for directive '{0}'. Definition: {... {1}: '{2}' ...}\",T,O,E,m?\"controller bindings definition\":\"isolate scope definition\");C[O]={mode:B[1][0],collection:B[2]===\"*\",optional:B[3]===\"?\",attrName:B[4]||O},B[4]&&(h[E]=C[O])}),C}function p(A,T){var m={isolateScope:null,bindToController:null};if(Y(A.scope)&&(A.bindToController===!0?(m.bindToController=d(A.scope,T,!0),m.isolateScope={}):m.isolateScope=d(A.scope,T,!1)),Y(A.bindToController)&&(m.bindToController=d(A.bindToController,T,!0)),m.bindToController&&!A.controller)throw ht(\"noctrl\",\"Cannot bind to controller without directive '{0}'s controller.\",T);return m}function g(A){var T=A.charAt(0);if(!T||T!==pe(T))throw ht(\"baddir\",\"Directive/Component name '{0}' is invalid. The first character must be a lowercase letter\",A);if(A!==A.trim())throw ht(\"baddir\",\"Directive/Component name '{0}' is invalid. The name should not contain leading or trailing whitespaces\",A)}function y(A){var T=A.require||A.controller&&A.name;return!oe(T)&&Y(T)&&M(T,function(m,$){var C=m.match(a),E=m.substring(C[0].length);E||(T[$]=C[0]+$)}),T}function b(A,T){if(A&&!(V(A)&&/[EACM]/.test(A)))throw ht(\"badrestrict\",\"Restrict property '{0}' of directive '{1}' is invalid\",A,T);return A||\"EA\"}this.directive=function A(T,m){return Ur(T,\"name\"),Qn(T,\"directive\"),V(T)?(g(T),Ur(m,\"directiveFactory\"),n.hasOwnProperty(T)||(n[T]=[],e.factory(T+r,[\"$injector\",\"$exceptionHandler\",function($,C){var E=[];return M(n[T],function(O,B){try{var R=$.invoke(O);ve(R)?R={compile:st(R)}:!R.compile&&R.link&&(R.compile=st(R.link)),R.priority=R.priority||0,R.index=B,R.name=R.name||T,R.require=y(R),R.restrict=b(R.restrict,T),R.$$moduleName=O.$$moduleName,E.push(R)}catch(W){C(W)}}),E}])),n[T].push(m)):M(T,Ze(A)),this},this.component=function A(T,m){if(!V(T))return M(T,Ze(Kn(this,A))),this;var $=m.controller||function(){};function C(E){function O(W){return ve(W)||oe(W)?function(K,ne){return E.invoke(W,this,{$element:K,$attrs:ne})}:W}var B=!m.template&&!m.templateUrl?\"\":m.template,R={controller:$,controllerAs:Gl(m.controller)||m.controllerAs||\"$ctrl\",template:O(B),templateUrl:O(m.templateUrl),transclude:m.transclude,scope:{},bindToController:m.bindings||{},restrict:\"E\",require:m.require};return M(m,function(W,K){K.charAt(0)===\"$\"&&(R[K]=W)}),R}return M(m,function(E,O){O.charAt(0)===\"$\"&&(C[O]=E,ve($)&&($[O]=E))}),C.$inject=[\"$injector\"],this.directive(T,C)},this.aHrefSanitizationTrustedUrlList=function(A){return fe(A)?(t.aHrefSanitizationTrustedUrlList(A),this):t.aHrefSanitizationTrustedUrlList()},Object.defineProperty(this,\"aHrefSanitizationWhitelist\",{get:function(){return this.aHrefSanitizationTrustedUrlList},set:function(A){this.aHrefSanitizationTrustedUrlList=A}}),this.imgSrcSanitizationTrustedUrlList=function(A){return fe(A)?(t.imgSrcSanitizationTrustedUrlList(A),this):t.imgSrcSanitizationTrustedUrlList()},Object.defineProperty(this,\"imgSrcSanitizationWhitelist\",{get:function(){return this.imgSrcSanitizationTrustedUrlList},set:function(A){this.imgSrcSanitizationTrustedUrlList=A}});var D=!0;this.debugInfoEnabled=function(A){return fe(A)?(D=A,this):D};var z=!1;this.strictComponentBindingsEnabled=function(A){return fe(A)?(z=A,this):z};var I=10;this.onChangesTtl=function(A){return arguments.length?(I=A,this):I};var L=!0;this.commentDirectivesEnabled=function(A){return arguments.length?(L=A,this):L};var F=!0;this.cssClassDirectivesEnabled=function(A){return arguments.length?(F=A,this):F};var U=nt();this.addPropertySecurityContext=function(A,T,m){var $=A.toLowerCase()+\"|\"+T.toLowerCase();if($ in U&&U[$]!==m)throw ht(\"ctxoverride\",\"Property context '{0}.{1}' already set to '{2}', cannot override to '{3}'.\",A,T,U[$],m);return U[$]=m,this},function(){function T(m,$){M($,function(C){U[C.toLowerCase()]=m})}T(dt.HTML,[\"iframe|srcdoc\",\"*|innerHTML\",\"*|outerHTML\"]),T(dt.CSS,[\"*|style\"]),T(dt.URL,[\"area|href\",\"area|ping\",\"a|href\",\"a|ping\",\"blockquote|cite\",\"body|background\",\"del|cite\",\"input|src\",\"ins|cite\",\"q|cite\"]),T(dt.MEDIA_URL,[\"audio|src\",\"img|src\",\"img|srcset\",\"source|src\",\"source|srcset\",\"track|src\",\"video|src\",\"video|poster\"]),T(dt.RESOURCE_URL,[\"*|formAction\",\"applet|code\",\"applet|codebase\",\"base|href\",\"embed|src\",\"frame|src\",\"form|action\",\"head|profile\",\"html|manifest\",\"iframe|src\",\"link|href\",\"media|src\",\"object|codebase\",\"object|data\",\"script|src\"])}(),this.$get=[\"$injector\",\"$interpolate\",\"$exceptionHandler\",\"$templateRequest\",\"$parse\",\"$controller\",\"$rootScope\",\"$sce\",\"$animate\",function(A,T,m,$,C,E,O,B,R){var W=/^\\w/,K=c.document.createElement(\"div\"),ne=L,J=F,ie=I,Te;function Se(){try{if(!--ie)throw Te=void 0,ht(\"infchng\",`{0} $onChanges() iterations reached. Aborting!\n`,I);O.$apply(function(){for(var _=0,k=Te.length;_<k;++_)try{Te[_]()}catch(N){m(N)}Te=void 0})}finally{ie++}}function Me(_,k){if(!_)return _;if(!V(_))throw ht(\"srcset\",'Can\\'t pass trusted values to `{0}`: \"{1}\"',k,_.toString());for(var N=\"\",H=tt(_),Z=/(\\s+\\d+x\\s*,|\\s+\\d+w\\s*,|\\s+,|,\\s+)/,ee=/\\s/.test(H)?Z:/(,)/,ce=H.split(ee),Re=Math.floor(ce.length/2),le=0;le<Re;le++){var me=le*2;N+=B.getTrustedMediaUrl(tt(ce[me])),N+=\" \"+tt(ce[me+1])}var ye=tt(ce[le*2]).split(/\\s/);return N+=B.getTrustedMediaUrl(tt(ye[0])),ye.length===2&&(N+=\" \"+tt(ye[1])),N}function Ue(_,k){if(k){var N=Object.keys(k),H,Z,ee;for(H=0,Z=N.length;H<Z;H++)ee=N[H],this[ee]=k[ee]}else this.$attr={};this.$$element=_}Ue.prototype={$normalize:rn,$addClass:function(_){_&&_.length>0&&R.addClass(this.$$element,_)},$removeClass:function(_){_&&_.length>0&&R.removeClass(this.$$element,_)},$updateClass:function(_,k){var N=ca(_,k);N&&N.length&&R.addClass(this.$$element,N);var H=ca(k,_);H&&H.length&&R.removeClass(this.$$element,H)},$set:function(_,k,N,H){var Z=this.$$element[0],ee=ta(Z,_),ce=vl(_),Re=_,le;ee?(this.$$element.prop(_,k),H=ee):ce&&(this[ce]=k,Re=ce),this[_]=k,H?this.$attr[_]=H:(H=this.$attr[_],H||(this.$attr[_]=H=qo(_,\"-\"))),le=en(this.$$element),le===\"img\"&&_===\"srcset\"&&(this[_]=k=Me(k,\"$set('srcset', value)\")),N!==!1&&(k===null||he(k)?this.$$element.removeAttr(H):W.test(H)?ee&&k===!1?this.$$element.removeAttr(H):this.$$element.attr(H,k):Be(this.$$element[0],H,k));var me=this.$$observers;me&&M(me[Re],function(ye){try{ye(k)}catch(Ce){m(Ce)}})},$observe:function(_,k){var N=this,H=N.$$observers||(N.$$observers=nt()),Z=H[_]||(H[_]=[]);return Z.push(k),O.$evalAsync(function(){!Z.$$inter&&N.hasOwnProperty(_)&&!he(N[_])&&k(N[_])}),function(){Dr(Z,k)}}};function Be(_,k,N){K.innerHTML=\"<span \"+k+\">\";var H=K.firstChild.attributes,Z=H[0];H.removeNamedItem(Z.name),Z.value=N,_.attributes.setNamedItem(Z)}function Ge(_,k){try{_.addClass(k)}catch{}}var ot=T.startSymbol(),et=T.endSymbol(),wt=ot===\"{{\"&&et===\"}}\"?_t:function(k){return k.replace(/\\{\\{/g,ot).replace(/}}/g,et)},pt=/^ng(Attr|Prop|On)([A-Z].*)$/,bt=/^(.+)Start$/;return it.$$addBindingInfo=D?function(k,N){var H=k.data(\"$binding\")||[];oe(N)?H=H.concat(N):H.push(N),k.data(\"$binding\",H)}:we,it.$$addBindingClass=D?function(k){Ge(k,\"ng-binding\")}:we,it.$$addScopeInfo=D?function(k,N,H,Z){var ee=H?Z?\"$isolateScopeNoTemplate\":\"$isolateScope\":\"$scope\";k.data(ee,N)}:we,it.$$addScopeClass=D?function(k,N){Ge(k,N?\"ng-isolate-scope\":\"ng-scope\")}:we,it.$$createComment=function(_,k){var N=\"\";return D&&(N=\" \"+(_||\"\")+\": \",k&&(N+=k+\" \")),c.document.createComment(N)},it;function it(_,k,N,H,Z){_ instanceof S||(_=S(_));var ee=Bn(_,k,_,N,H,Z);it.$$addScopeClass(_);var ce=null;return function(le,me,ye){if(!_)throw ht(\"multilink\",\"This element has already been linked.\");Ur(le,\"scope\"),Z&&Z.needsNewScope&&(le=le.$parent.$new()),ye=ye||{};var Ce=ye.parentBoundTranscludeFn,re=ye.transcludeControllers,ke=ye.futureParentElement;Ce&&Ce.$$boundTransclude&&(Ce=Ce.$$boundTransclude),ce||(ce=Un(ke));var De;if(ce!==\"html\"?De=S(ro(ce,S(\"<div></div>\").append(_).html())):me?De=tr.clone.call(_):De=_,re)for(var Xe in re)De.data(\"$\"+Xe+\"Controller\",re[Xe].instance);return it.$$addScopeInfo(De,le),me&&me(De,le),ee&&ee(le,De,De,Ce),me||(_=ee=null),De}}function Un(_){var k=_&&_[0];return k&&en(k)!==\"foreignobject\"&&P.call(k).match(/SVG/)?\"svg\":\"html\"}function Bn(_,k,N,H,Z,ee){for(var ce=[],Re=oe(_)||_ instanceof S,le,me,ye,Ce,re,ke,De,Xe=0;Xe<_.length;Xe++)le=new Ue,x===11&&eo(_,Xe,Re),me=Sn(_[Xe],[],le,Xe===0?H:void 0,Z),ye=me.length?Au(me,_[Xe],le,k,N,null,[],[],ee):null,ye&&ye.scope&&it.$$addScopeClass(le.$$element),re=ye&&ye.terminal||!(Ce=_[Xe].childNodes)||!Ce.length?null:Bn(Ce,ye?(ye.transcludeOnThisElement||!ye.templateOnThisElement)&&ye.transclude:k),(ye||re)&&(ce.push(Xe,ye,re),ke=!0,De=De||ye),ee=null;return ke?ze:null;function ze(Ie,Ne,be,He){var Ve,ft,lt,at,Je,At,gt,Ot,fn;if(De){var cr=Ne.length;for(fn=new Array(cr),Je=0;Je<ce.length;Je+=3)gt=ce[Je],fn[gt]=Ne[gt]}else fn=Ne;for(Je=0,At=ce.length;Je<At;)lt=fn[ce[Je++]],Ve=ce[Je++],ft=ce[Je++],Ve?(Ve.scope?(at=Ie.$new(),it.$$addScopeInfo(S(lt),at)):at=Ie,Ve.transcludeOnThisElement?Ot=sn(Ie,Ve.transclude,He):!Ve.templateOnThisElement&&He?Ot=He:!He&&k?Ot=sn(Ie,k):Ot=null,Ve(ft,at,lt,be,Ot)):ft&&ft(Ie,lt.childNodes,void 0,He)}}function eo(_,k,N){var H=_[k],Z=H.parentNode,ee;if(H.nodeType===wn)for(;ee=Z?H.nextSibling:_[k+1],!(!ee||ee.nodeType!==wn);)H.nodeValue=H.nodeValue+ee.nodeValue,ee.parentNode&&ee.parentNode.removeChild(ee),N&&ee===_[k+1]&&_.splice(k+1,1)}function sn(_,k,N){function H(ce,Re,le,me,ye){return ce||(ce=_.$new(!1,ye),ce.$$transcluded=!0),k(ce,Re,{parentBoundTranscludeFn:N,transcludeControllers:le,futureParentElement:me})}var Z=H.$$slots=nt();for(var ee in k.$$slots)k.$$slots[ee]?Z[ee]=sn(_,k.$$slots[ee],N):Z[ee]=null;return H}function Sn(_,k,N,H,Z){var ee=_.nodeType,ce=N.$attr,Re,le,me;switch(ee){case mn:le=en(_),Ii(k,rn(le),\"E\",H,Z);for(var ye,Ce,re,ke,De,Xe=_.attributes,ze=0,Ie=Xe&&Xe.length;ze<Ie;ze++){var Ne=!1,be=!1,He=!1,Ve=!1,ft=!1,lt;ye=Xe[ze],Ce=ye.name,ke=ye.value,re=rn(Ce.toLowerCase()),(De=re.match(pt))?(He=De[1]===\"Attr\",Ve=De[1]===\"Prop\",ft=De[1]===\"On\",Ce=Ce.replace(ua,\"\").toLowerCase().substr(4+De[1].length).replace(/_(.)/g,function(at,Je){return Je.toUpperCase()})):(lt=re.match(bt))&&Ap(lt[1])&&(Ne=Ce,be=Ce.substr(0,Ce.length-5)+\"end\",Ce=Ce.substr(0,Ce.length-6)),Ve||ft?(N[re]=ke,ce[re]=ye.name,Ve?Pp(_,k,re,Ce):Rp(k,re,Ce)):(re=rn(Ce.toLowerCase()),ce[re]=Ce,(He||!N.hasOwnProperty(re))&&(N[re]=ke,ta(_,re)&&(N[re]=!0)),Mp(_,k,ke,re,He),Ii(k,re,\"A\",H,Z,Ne,be))}if(le===\"input\"&&_.getAttribute(\"type\")===\"hidden\"&&_.setAttribute(\"autocomplete\",\"off\"),!J)break;if(me=_.className,Y(me)&&(me=me.animVal),V(me)&&me!==\"\")for(;Re=l.exec(me);)re=rn(Re[2]),Ii(k,re,\"C\",H,Z)&&(N[re]=tt(Re[3])),me=me.substr(Re.index+Re[0].length);break;case wn:Tp(k,_.nodeValue);break;case Br:if(!ne)break;to(_,k,N,H,Z);break}return k.sort(_p),k}function to(_,k,N,H,Z){try{var ee=i.exec(_.nodeValue);if(ee){var ce=rn(ee[1]);Ii(k,ce,\"M\",H,Z)&&(N[ce]=tt(ee[2]))}}catch{}}function Kr(_,k,N){var H=[],Z=0;if(k&&_.hasAttribute&&_.hasAttribute(k))do{if(!_)throw ht(\"uterdir\",\"Unterminated attribute, found '{0}' but no matching '{1}' found.\",k,N);_.nodeType===mn&&(_.hasAttribute(k)&&Z++,_.hasAttribute(N)&&Z--),H.push(_),_=_.nextSibling}while(Z>0);else H.push(_);return S(H)}function wu(_,k,N){return function(Z,ee,ce,Re,le){return ee=Kr(ee[0],k,N),_(Z,ee,ce,Re,le)}}function no(_,k,N,H,Z,ee){var ce;return _?it(k,N,H,Z,ee):function(){return ce||(ce=it(k,N,H,Z,ee),k=N=ee=null),ce.apply(this,arguments)}}function Au(_,k,N,H,Z,ee,ce,Re,le){le=le||{};for(var me=-Number.MAX_VALUE,ye=le.newScopeDirective,Ce=le.controllerDirectives,re=le.newIsolateScopeDirective,ke=le.templateDirective,De=le.nonTlbTranscludeDirective,Xe=!1,ze=!1,Ie=le.hasElementTranscludeDirective,Ne=N.$$element=S(k),be,He,Ve,ft=ee,lt=H,at,Je=!1,At=!1,gt,Ot=0,fn=_.length;Ot<fn;Ot++){be=_[Ot];var cr=be.$$start,io=be.$$end;if(cr&&(Ne=Kr(k,cr,io)),Ve=void 0,me>be.priority)break;if(gt=be.scope,gt&&(be.templateUrl||(Y(gt)?(ur(\"new/isolated scope\",re||ye,be,Ne),re=be):ur(\"new/isolated scope\",re,be,Ne)),ye=ye||be),He=be.name,!Je&&(be.replace&&(be.templateUrl||be.template)||be.transclude&&!be.$$tlb)){for(var fr,Fp=Ot+1;fr=_[Fp++];)if(fr.transclude&&!fr.$$tlb||fr.replace&&(fr.templateUrl||fr.template)){At=!0;break}Je=!0}if(!be.templateUrl&&be.controller&&(Ce=Ce||nt(),ur(\"'\"+He+\"' controller\",Ce[He],be,Ne),Ce[He]=be),gt=be.transclude,gt)if(Xe=!0,be.$$tlb||(ur(\"transclusion\",De,be,Ne),De=be),gt===\"element\")Ie=!0,me=be.priority,Ve=Ne,Ne=N.$$element=S(it.$$createComment(He,N[He])),k=Ne[0],Ni(Z,Nr(Ve),k),lt=no(At,Ve,H,me,ft&&ft.name,{nonTlbTranscludeDirective:De});else{var bn=nt();if(!Y(gt))Ve=S(_s(k)).contents();else{Ve=c.document.createDocumentFragment();var xu=nt(),so=nt();M(gt,function(rt,Ke){var on=rt.charAt(0)===\"?\";rt=on?rt.substring(1):rt,xu[rt]=Ke,bn[Ke]=null,so[Ke]=on}),M(Ne.contents(),function(rt){var Ke=xu[rn(en(rt))];Ke?(so[Ke]=!0,bn[Ke]=bn[Ke]||c.document.createDocumentFragment(),bn[Ke].appendChild(rt)):Ve.appendChild(rt)}),M(so,function(rt,Ke){if(!rt)throw ht(\"reqslot\",\"Required transclusion slot `{0}` was not filled.\",Ke)});for(var oo in bn)if(bn[oo]){var Lp=S(bn[oo].childNodes);bn[oo]=no(At,Lp,H)}Ve=S(Ve.childNodes)}Ne.empty(),lt=no(At,Ve,H,void 0,void 0,{needsNewScope:be.$$isolateScope||be.$$newScope}),lt.$$slots=bn}if(be.template)if(ze=!0,ur(\"template\",ke,be,Ne),ke=be,gt=ve(be.template)?be.template(Ne,N):be.template,gt=wt(gt),be.replace){if(ft=be,As(gt)?Ve=[]:Ve=fa(ro(be.templateNamespace,tt(gt))),k=Ve[0],Ve.length!==1||k.nodeType!==mn)throw ht(\"tplrt\",\"Template for directive '{0}' must have exactly one root element. {1}\",He,\"\");Ni(Z,Ne,k);var Pu={$attr:{}},Ru=Sn(k,[],Pu),Dp=_.splice(Ot+1,_.length-(Ot+1));(re||ye)&&Su(Ru,re,ye),_=_.concat(Ru).concat(Dp),_u(N,Pu),fn=_.length}else Ne.html(gt);if(be.templateUrl)ze=!0,ur(\"template\",ke,be,Ne),ke=be,be.replace&&(ft=be),Vn=Sp(_.splice(Ot,_.length-Ot),Ne,N,Z,Xe&&lt,ce,Re,{controllerDirectives:Ce,newScopeDirective:ye!==be&&ye,newIsolateScopeDirective:re,templateDirective:ke,nonTlbTranscludeDirective:De}),fn=_.length;else if(be.compile)try{at=be.compile(Ne,N,lt);var ao=be.$$originalDirective||be;ve(at)?Mu(null,Kn(ao,at),cr,io):at&&Mu(Kn(ao,at.pre),Kn(ao,at.post),cr,io)}catch(rt){m(rt,un(Ne))}be.terminal&&(Vn.terminal=!0,me=Math.max(me,be.priority))}return Vn.scope=ye&&ye.scope===!0,Vn.transcludeOnThisElement=Xe,Vn.templateOnThisElement=ze,Vn.transclude=lt,le.hasElementTranscludeDirective=Ie,Vn;function Mu(rt,Ke,on,uo){rt&&(on&&(rt=wu(rt,on,uo)),rt.require=be.require,rt.directiveName=He,(re===be||be.$$isolateScope)&&(rt=Tu(rt,{isolateScope:!0})),ce.push(rt)),Ke&&(on&&(Ke=wu(Ke,on,uo)),Ke.require=be.require,Ke.directiveName=He,(re===be||be.$$isolateScope)&&(Ke=Tu(Ke,{isolateScope:!0})),Re.push(Ke))}function Vn(rt,Ke,on,uo,lr){var _n,Fu,Yt,ln,Qr,hn,hr,Mt,jn,co;k===on?(jn=N,Mt=N.$$element):(Mt=S(on),jn=new Ue(Mt,N)),Qr=Ke,re?ln=Ke.$new(!0):ye&&(Qr=Ke.$parent),lr&&(hr=Np,hr.$$boundTransclude=lr,hr.isSlotFilled=function(Ft){return!!lr.$$slots[Ft]}),Ce&&(hn=wp(Mt,jn,hr,Ce,ln,Ke,re)),re&&(it.$$addScopeInfo(Mt,ln,!0,!(ke&&(ke===re||ke===re.$$originalDirective))),it.$$addScopeClass(Mt,!0),ln.$$isolateBindings=re.$$isolateBindings,co=Ou(Ke,jn,ln,ln.$$isolateBindings,re),co.removeWatches&&ln.$on(\"$destroy\",co.removeWatches));for(var Lu in hn){var fo=Ce[Lu],ei=hn[Lu],Ip=fo.$$bindings.bindToController;ei.instance=ei(),Mt.data(\"$\"+fo.name+\"Controller\",ei.instance),ei.bindingInfo=Ou(Qr,jn,ei.instance,Ip,fo)}for(M(Ce,function(Ft,$t){var Lt=Ft.require;Ft.bindToController&&!oe(Lt)&&Y(Lt)&&Fe(hn[$t].instance,Zr($t,Lt,Mt,hn))}),M(hn,function(Ft){var $t=Ft.instance;if(ve($t.$onChanges))try{$t.$onChanges(Ft.bindingInfo.initialChanges)}catch(Lt){m(Lt)}if(ve($t.$onInit))try{$t.$onInit()}catch(Lt){m(Lt)}ve($t.$doCheck)&&(Qr.$watch(function(){$t.$doCheck()}),$t.$doCheck()),ve($t.$onDestroy)&&Qr.$on(\"$destroy\",function(){$t.$onDestroy()})}),_n=0,Fu=ce.length;_n<Fu;_n++)Yt=ce[_n],ku(Yt,Yt.isolateScope?ln:Ke,Mt,jn,Yt.require&&Zr(Yt.directiveName,Yt.require,Mt,hn),hr);var Ui=Ke;for(re&&(re.template||re.templateUrl===null)&&(Ui=ln),rt&&rt(Ui,on.childNodes,void 0,lr),_n=Re.length-1;_n>=0;_n--)Yt=Re[_n],ku(Yt,Yt.isolateScope?ln:Ke,Mt,jn,Yt.require&&Zr(Yt.directiveName,Yt.require,Mt,hn),hr);M(hn,function(Ft){var $t=Ft.instance;ve($t.$postLink)&&$t.$postLink()});function Np(Ft,$t,Lt,Bi){var lo;if(Vt(Ft)||(Bi=Lt,Lt=$t,$t=Ft,Ft=void 0),Ie&&(lo=hn),Lt||(Lt=Ie?Mt.parent():Mt),Bi){var ho=lr.$$slots[Bi];if(ho)return ho(Ft,$t,lo,Lt,Ui);if(he(ho))throw ht(\"noslot\",'No parent directive that requires a transclusion with slot name \"{0}\". Element: {1}',Bi,un(Mt))}else return lr(Ft,$t,lo,Lt,Ui)}}}function Zr(_,k,N,H){var Z;if(V(k)){var ee=k.match(a),ce=k.substring(ee[0].length),Re=ee[1]||ee[3],le=ee[2]===\"?\";if(Re===\"^^\"?N=N.parent():(Z=H&&H[ce],Z=Z&&Z.instance),!Z){var me=\"$\"+ce+\"Controller\";Re===\"^^\"&&N[0]&&N[0].nodeType===Cs?Z=null:Z=Re?N.inheritedData(me):N.data(me)}if(!Z&&!le)throw ht(\"ctreq\",\"Controller '{0}', required by directive '{1}', can't be found!\",ce,_)}else if(oe(k)){Z=[];for(var ye=0,Ce=k.length;ye<Ce;ye++)Z[ye]=Zr(_,k[ye],N,H)}else Y(k)&&(Z={},M(k,function(re,ke){Z[ke]=Zr(_,re,N,H)}));return Z||null}function wp(_,k,N,H,Z,ee,ce){var Re=nt();for(var le in H){var me=H[le],ye={$scope:me===ce||me.$$isolateScope?Z:ee,$element:_,$attrs:k,$transclude:N},Ce=me.controller;Ce===\"@\"&&(Ce=k[me.name]);var re=E(Ce,ye,!0,me.controllerAs);Re[me.name]=re,_.data(\"$\"+me.name+\"Controller\",re.instance)}return Re}function Su(_,k,N){for(var H=0,Z=_.length;H<Z;H++)_[H]=It(_[H],{$$isolateScope:k,$$newScope:N})}function Ii(_,k,N,H,Z,ee,ce){if(k===Z)return null;var Re=null;if(n.hasOwnProperty(k)){for(var le,me=A.get(k+r),ye=0,Ce=me.length;ye<Ce;ye++)if(le=me[ye],(he(H)||H>le.priority)&&le.restrict.indexOf(N)!==-1){if(ee&&(le=It(le,{$$start:ee,$$end:ce})),!le.$$bindings){var re=le.$$bindings=p(le,le.name);Y(re.isolateScope)&&(le.$$isolateBindings=re.isolateScope)}_.push(le),Re=le}}return Re}function Ap(_){if(n.hasOwnProperty(_)){for(var k,N=A.get(_+r),H=0,Z=N.length;H<Z;H++)if(k=N[H],k.multiElement)return!0}return!1}function _u(_,k){var N=k.$attr,H=_.$attr;M(_,function(Z,ee){ee.charAt(0)!==\"$\"&&(k[ee]&&k[ee]!==Z&&(Z.length?Z+=(ee===\"style\"?\";\":\" \")+k[ee]:Z=k[ee]),_.$set(ee,Z,!0,N[ee]))}),M(k,function(Z,ee){!_.hasOwnProperty(ee)&&ee.charAt(0)!==\"$\"&&(_[ee]=Z,ee!==\"class\"&&ee!==\"style\"&&(H[ee]=N[ee]))})}function Sp(_,k,N,H,Z,ee,ce,Re){var le=[],me,ye,Ce=k[0],re=_.shift(),ke=It(re,{templateUrl:null,transclude:null,replace:null,$$originalDirective:re}),De=ve(re.templateUrl)?re.templateUrl(k,N):re.templateUrl,Xe=re.templateNamespace;return k.empty(),$(De).then(function(ze){var Ie,Ne,be,He;if(ze=wt(ze),re.replace){if(As(ze)?be=[]:be=fa(ro(Xe,tt(ze))),Ie=be[0],be.length!==1||Ie.nodeType!==mn)throw ht(\"tplrt\",\"Template for directive '{0}' must have exactly one root element. {1}\",re.name,De);Ne={$attr:{}},Ni(H,k,Ie);var Ve=Sn(Ie,[],Ne);Y(re.scope)&&Su(Ve,!0),_=Ve.concat(_),_u(N,Ne)}else Ie=Ce,k.html(ze);for(_.unshift(ke),me=Au(_,Ie,N,Z,k,re,ee,ce,Re),M(H,function(Ot,fn){Ot===Ie&&(H[fn]=k[0])}),ye=Bn(k[0].childNodes,Z);le.length;){var ft=le.shift(),lt=le.shift(),at=le.shift(),Je=le.shift(),At=k[0];if(!ft.$$destroyed){if(lt!==Ce){var gt=lt.className;Re.hasElementTranscludeDirective&&re.replace||(At=_s(Ie)),Ni(at,S(lt),At),Ge(S(At),gt)}me.transcludeOnThisElement?He=sn(ft,me.transclude,Je):He=Je,me(ye,ft,At,H,He)}}le=null}).catch(function(ze){xe(ze)&&m(ze)}),function(Ie,Ne,be,He,Ve){var ft=Ve;Ne.$$destroyed||(le?le.push(Ne,be,He,ft):(me.transcludeOnThisElement&&(ft=sn(Ne,me.transclude,Ve)),me(ye,Ne,be,He,ft)))}}function _p(_,k){var N=k.priority-_.priority;return N!==0?N:_.name!==k.name?_.name<k.name?-1:1:_.index-k.index}function ur(_,k,N,H){function Z(ee){return ee?\" (module: \"+ee+\")\":\"\"}if(k)throw ht(\"multidir\",\"Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}\",k.name,Z(k.$$moduleName),N.name,Z(N.$$moduleName),_,un(H))}function Tp(_,k){var N=T(k,!0);N&&_.push({priority:0,compile:function(Z){var ee=Z.parent(),ce=!!ee.length;return ce&&it.$$addBindingClass(ee),function(le,me){var ye=me.parent();ce||it.$$addBindingClass(ye),it.$$addBindingInfo(ye,N.expressions),le.$watch(N,function(re){me[0].nodeValue=re})}}})}function ro(_,k){switch(_=pe(_||\"html\"),_){case\"svg\":case\"math\":var N=c.document.createElement(\"div\");return N.innerHTML=\"<\"+_+\">\"+k+\"</\"+_+\">\",N.childNodes[0].childNodes;default:return k}}function kp(_,k){if(k===\"srcdoc\")return B.HTML;if(k===\"src\"||k===\"ngSrc\")return[\"img\",\"video\",\"audio\",\"source\",\"track\"].indexOf(_)===-1?B.RESOURCE_URL:B.MEDIA_URL;if(k===\"xlinkHref\")return _===\"image\"?B.MEDIA_URL:_===\"a\"?B.URL:B.RESOURCE_URL;if(_===\"form\"&&k===\"action\"||_===\"base\"&&k===\"href\"||_===\"link\"&&k===\"href\")return B.RESOURCE_URL;if(_===\"a\"&&(k===\"href\"||k===\"ngHref\"))return B.URL}function Op(_,k){var N=k.toLowerCase();return U[_+\"|\"+N]||U[\"*|\"+N]}function xp(_){return Me(B.valueOf(_),\"ng-prop-srcset\")}function Pp(_,k,N,H){if(o.test(H))throw ht(\"nodomevents\",\"Property bindings for HTML DOM event properties are disallowed\");var Z=en(_),ee=Op(Z,H),ce=_t;H===\"srcset\"&&(Z===\"img\"||Z===\"source\")?ce=xp:ee&&(ce=B.getTrusted.bind(B,ee)),k.push({priority:100,compile:function(le,me){var ye=C(me[N]),Ce=C(me[N],function(ke){return B.valueOf(ke)});return{pre:function(ke,De){function Xe(){var ze=ye(ke);De[0][H]=ce(ze)}Xe(),ke.$watch(Ce,Xe)}}}})}function Rp(_,k,N){_.push(cu(C,O,m,k,N,!1))}function Mp(_,k,N,H,Z){var ee=en(_),ce=kp(ee,H),Re=!Z,le=u[H]||Z,me=T(N,Re,ce,le);if(!!me){if(H===\"multiple\"&&ee===\"select\")throw ht(\"selmulti\",\"Binding to the 'multiple' attribute is not supported. Element: {0}\",un(_));if(o.test(H))throw ht(\"nodomevents\",\"Interpolations for HTML DOM event attributes are disallowed\");k.push({priority:100,compile:function(){return{pre:function(Ce,re,ke){var De=ke.$$observers||(ke.$$observers=nt()),Xe=ke[H];Xe!==N&&(me=Xe&&T(Xe,!0,ce,le),N=Xe),me&&(ke[H]=me(Ce),(De[H]||(De[H]=[])).$$inter=!0,(ke.$$observers&&ke.$$observers[H].$$scope||Ce).$watch(me,function(Ie,Ne){H===\"class\"&&Ie!==Ne?ke.$updateClass(Ie,Ne):ke.$set(H,Ie)}))}}}})}}function Ni(_,k,N){var H=k[0],Z=k.length,ee=H.parentNode,ce,Re;if(_){for(ce=0,Re=_.length;ce<Re;ce++)if(_[ce]===H){_[ce++]=N;for(var le=ce,me=le+Z-1,ye=_.length;le<ye;le++,me++)me<ye?_[le]=_[me]:delete _[le];_.length-=Z-1,_.context===H&&(_.context=N);break}}ee&&ee.replaceChild(N,H);var Ce=c.document.createDocumentFragment();for(ce=0;ce<Z;ce++)Ce.appendChild(k[ce]);for(S.hasData(H)&&(S.data(N,S.data(H)),S(H).off(\"$destroy\")),S.cleanData(Ce.querySelectorAll(\"*\")),ce=1;ce<Z;ce++)delete k[ce];k[0]=N,k.length=1}function Tu(_,k){return Fe(function(){return _.apply(null,arguments)},_,k)}function ku(_,k,N,H,Z,ee){try{_(k,N,H,Z,ee)}catch(ce){m(ce,un(N))}}function qi(_,k){if(z)throw ht(\"missingattr\",\"Attribute '{0}' of '{1}' is non-optional and must be set!\",_,k)}function Ou(_,k,N,H,Z){var ee=[],ce={},Re;M(H,function(Ce,re){var ke=Ce.attrName,De=Ce.optional,Xe=Ce.mode,ze,Ie,Ne,be,He;switch(Xe){case\"@\":!De&&!$e.call(k,ke)&&(qi(ke,Z.name),N[re]=k[ke]=void 0),He=k.$observe(ke,function(at){if(V(at)||$n(at)){var Je=N[re];le(re,at,Je),N[re]=at}}),k.$$observers[ke].$$scope=_,ze=k[ke],V(ze)?N[re]=T(ze)(_):$n(ze)&&(N[re]=ze),ce[re]=new wi(xs,N[re]),ee.push(He);break;case\"=\":if(!$e.call(k,ke)){if(De)break;qi(ke,Z.name),k[ke]=void 0}if(De&&!k[ke])break;Ie=C(k[ke]),Ie.literal?be=tn:be=vs,Ne=Ie.assign||function(){throw ze=N[re]=Ie(_),ht(\"nonassign\",\"Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!\",k[ke],ke,Z.name)},ze=N[re]=Ie(_);var Ve=function(Je){return be(Je,N[re])||(be(Je,ze)?Ne(_,Je=N[re]):N[re]=Je),ze=Je,ze};Ve.$stateful=!0,Ce.collection?He=_.$watchCollection(k[ke],Ve):He=_.$watch(C(k[ke],Ve),null,Ie.literal),ee.push(He);break;case\"<\":if(!$e.call(k,ke)){if(De)break;qi(ke,Z.name),k[ke]=void 0}if(De&&!k[ke])break;Ie=C(k[ke]);var ft=Ie.literal,lt=N[re]=Ie(_);ce[re]=new wi(xs,N[re]),He=_[Ce.collection?\"$watchCollection\":\"$watch\"](Ie,function(Je,At){if(At===Je){if(At===lt||ft&&tn(At,lt))return;At=lt}le(re,Je,At),N[re]=Je}),ee.push(He);break;case\"&\":if(!De&&!$e.call(k,ke)&&qi(ke,Z.name),Ie=k.hasOwnProperty(ke)?C(k[ke]):we,Ie===we&&De)break;N[re]=function(at){return Ie(_,at)};break}});function le(ye,Ce,re){ve(N.$onChanges)&&!vs(Ce,re)&&(Te||(_.$$postDigest(Se),Te=[]),Re||(Re={},Te.push(me)),Re[ye]&&(re=Re[ye].previousValue),Re[ye]=new wi(re,Ce))}function me(){N.$onChanges(Re),Re=void 0}return{initialChanges:ce,removeWatches:ee.length&&function(){for(var Ce=0,re=ee.length;Ce<re;++Ce)ee[Ce]()}}}}]}function wi(e,t){this.previousValue=e,this.currentValue=t}wi.prototype.isFirstChange=function(){return this.previousValue===xs};var ua=/^((?:x|data)[:\\-_])/i,zl=/[:\\-_]+(.)/g;function rn(e){return e.replace(ua,\"\").replace(zl,function(t,n,r){return r?n.toUpperCase():n})}function q$(e,t,n,r){}function U$(e,t,n,r,i){}function ca(e,t){var n=\"\",r=e.split(/\\s+/),i=t.split(/\\s+/);e:for(var l=0;l<r.length;l++){for(var u=r[l],a=0;a<i.length;a++)if(u===i[a])continue e;n+=(n.length>0?\" \":\"\")+u}return n}function fa(e){e=S(e);var t=e.length;if(t<=1)return e;for(;t--;){var n=e[t];(n.nodeType===Br||n.nodeType===wn&&n.nodeValue.trim()===\"\")&&ge.call(e,t,1)}return e}var la=w(\"$controller\"),ha=/^(\\S+)(\\s+as\\s+([\\w$]+))?$/;function Gl(e,t){if(t&&V(t))return t;if(V(e)){var n=ha.exec(e);if(n)return n[3]}}function Xl(){var e={};this.has=function(t){return e.hasOwnProperty(t)},this.register=function(t,n){Qn(t,\"controller\"),Y(t)?Fe(e,t):e[t]=n},this.$get=[\"$injector\",function(t){return function(i,l,u,a){var o,h,d,p;if(u=u===!0,a&&V(a)&&(p=a),V(i)){if(h=i.match(ha),!h)throw la(\"ctrlfmt\",\"Badly formed controller string '{0}'. Must match `__name__ as __id__` or `__name__`.\",i);if(d=h[1],p=p||h[3],i=e.hasOwnProperty(d)?e[d]:Yf(l.$scope,d,!0),!i)throw la(\"ctrlreg\",\"The controller with the name '{0}' is not registered.\",d);fi(i,d,!0)}if(u){var g=(oe(i)?i[i.length-1]:i).prototype;return o=Object.create(g||null),p&&n(l,p,o,d||i.name),Fe(function(){var b=t.invoke(i,o,l,d);return b!==o&&(Y(b)||ve(b))&&(o=b,p&&n(l,p,o,d||i.name)),o},{instance:o,identifier:p})}return o=t.instantiate(i,l,d),p&&n(l,p,o,d||i.name),o};function n(r,i,l,u){if(!(r&&Y(r.$scope)))throw w(\"$controller\")(\"noscp\",\"Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.\",u,i);r.$scope[i]=l}}]}function Yl(){this.$get=[\"$window\",function(e){return S(e.document)}]}function Jl(){this.$get=[\"$document\",\"$rootScope\",function(e,t){var n=e[0],r=n&&n.hidden;e.on(\"visibilitychange\",i),t.$on(\"$destroy\",function(){e.off(\"visibilitychange\",i)});function i(){r=n.hidden}return function(){return r}}]}function Kl(){this.$get=[\"$log\",function(e){return function(t,n){e.error.apply(e,arguments)}}]}var Zl=function(){this.$get=[\"$document\",function(e){return function(t){return t?!t.nodeType&&t instanceof S&&(t=t[0]):t=e[0].body,t.offsetWidth+1}}]},da=\"application/json\",Ps={\"Content-Type\":da+\";charset=utf-8\"},Ql=/^\\[|^\\{(?!\\{)/,eh={\"[\":/]$/,\"{\":/}$/},th=/^\\)]\\}',?\\n/,Ai=w(\"$http\");function Rs(e){return Y(e)?Ee(e)?e.toISOString():qr(e):e}function nh(){this.$get=function(){return function(t){if(!t)return\"\";var n=[];return We(t,function(r,i){r===null||he(r)||ve(r)||(oe(r)?M(r,function(l){n.push(Gt(i)+\"=\"+Gt(Rs(l)))}):n.push(Gt(i)+\"=\"+Gt(Rs(r))))}),n.join(\"&\")}}}function rh(){this.$get=function(){return function(t){if(!t)return\"\";var n=[];return r(t,\"\",!0),n.join(\"&\");function r(i,l,u){oe(i)?M(i,function(a,o){r(a,l+\"[\"+(Y(a)?o:\"\")+\"]\")}):Y(i)&&!Ee(i)?We(i,function(a,o){r(a,l+(u?\"\":\"[\")+o+(u?\"\":\"]\"))}):(ve(i)&&(i=i()),n.push(Gt(l)+\"=\"+(i==null?\"\":Gt(Rs(i)))))}}}}function Ms(e,t){if(V(e)){var n=e.replace(th,\"\").trim();if(n){var r=t(\"Content-Type\"),i=r&&r.indexOf(da)===0;if(i||ih(n))try{e=Lo(n)}catch(l){if(!i)return e;throw Ai(\"baddata\",'Data must be a valid JSON object. Received: \"{0}\". Parse error: \"{1}\"',e,l)}}}return e}function ih(e){var t=e.match(Ql);return t&&eh[t[0]].test(e)}function pa(e){var t=nt(),n;function r(i,l){i&&(t[i]=t[i]?t[i]+\", \"+l:l)}return V(e)?M(e.split(`\n`),function(i){n=i.indexOf(\":\"),r(pe(tt(i.substr(0,n))),tt(i.substr(n+1)))}):Y(e)&&M(e,function(i,l){r(pe(l),tt(i))}),t}function va(e){var t;return function(n){if(t||(t=pa(e)),n){var r=t[pe(n)];return r===void 0&&(r=null),r}return t}}function ga(e,t,n,r){return ve(r)?r(e,t,n):(M(r,function(i){e=i(e,t,n)}),e)}function Fs(e){return 200<=e&&e<300}function sh(){var e=this.defaults={transformResponse:[Ms],transformRequest:[function(i){return Y(i)&&!ai(i)&&!Mf(i)&&!Rf(i)?qr(i):i}],headers:{common:{Accept:\"application/json, text/plain, */*\"},post:nn(Ps),put:nn(Ps),patch:nn(Ps)},xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",paramSerializer:\"$httpParamSerializer\",jsonpCallbackParam:\"callback\"},t=!1;this.useApplyAsync=function(i){return fe(i)?(t=!!i,this):t};var n=this.interceptors=[],r=this.xsrfTrustedOrigins=[];Object.defineProperty(this,\"xsrfWhitelistedOrigins\",{get:function(){return this.xsrfTrustedOrigins},set:function(i){this.xsrfTrustedOrigins=i}}),this.$get=[\"$browser\",\"$httpBackend\",\"$$cookieReader\",\"$cacheFactory\",\"$rootScope\",\"$q\",\"$injector\",\"$sce\",function(i,l,u,a,o,h,d,p){var g=a(\"$http\");e.paramSerializer=V(e.paramSerializer)?d.get(e.paramSerializer):e.paramSerializer;var y=[];M(n,function(A){y.unshift(V(A)?d.get(A):d.invoke(A))});var b=Qh(r);function D(A){if(!Y(A))throw w(\"$http\")(\"badreq\",\"Http request configuration must be an object.  Received: {0}\",A);if(!V(p.valueOf(A.url)))throw w(\"$http\")(\"badreq\",\"Http request configuration url must be a string or a $sce trusted object.  Received: {0}\",A.url);var T=Fe({method:\"get\",transformRequest:e.transformRequest,transformResponse:e.transformResponse,paramSerializer:e.paramSerializer,jsonpCallbackParam:e.jsonpCallbackParam},A);T.headers=R(A),T.method=Pe(T.method),T.paramSerializer=V(T.paramSerializer)?d.get(T.paramSerializer):T.paramSerializer,i.$$incOutstandingRequestCount(\"$http\");var m=[],$=[],C=h.resolve(T);return M(y,function(ne){(ne.request||ne.requestError)&&m.unshift(ne.request,ne.requestError),(ne.response||ne.responseError)&&$.push(ne.response,ne.responseError)}),C=E(C,m),C=C.then(W),C=E(C,$),C=C.finally(O),C;function E(ne,J){for(var ie=0,Te=J.length;ie<Te;){var Se=J[ie++],Me=J[ie++];ne=ne.then(Se,Me)}return J.length=0,ne}function O(){i.$$completeOutstandingRequest(we,\"$http\")}function B(ne,J){var ie,Te={};return M(ne,function(Se,Me){ve(Se)?(ie=Se(J),ie!=null&&(Te[Me]=ie)):Te[Me]=Se}),Te}function R(ne){var J=e.headers,ie=Fe({},ne.headers),Te,Se,Me;J=Fe({},J.common,J[pe(ne.method)]);e:for(Te in J){Se=pe(Te);for(Me in ie)if(pe(Me)===Se)continue e;ie[Te]=J[Te]}return B(ie,nn(ne))}function W(ne){var J=ne.headers,ie=ga(ne.data,va(J),void 0,ne.transformRequest);return he(ie)&&M(J,function(Te,Se){pe(Se)===\"content-type\"&&delete J[Se]}),he(ne.withCredentials)&&!he(e.withCredentials)&&(ne.withCredentials=e.withCredentials),L(ne,ie).then(K,K)}function K(ne){var J=Fe({},ne);return J.data=ga(ne.data,ne.headers,ne.status,T.transformResponse),Fs(ne.status)?J:h.reject(J)}}return D.pendingRequests=[],z(\"get\",\"delete\",\"head\",\"jsonp\"),I(\"post\",\"put\",\"patch\"),D.defaults=e,D;function z(A){M(arguments,function(T){D[T]=function(m,$){return D(Fe({},$||{},{method:T,url:m}))}})}function I(A){M(arguments,function(T){D[T]=function(m,$,C){return D(Fe({},C||{},{method:T,url:m,data:$}))}})}function L(A,T){var m=h.defer(),$=m.promise,C,E,O=A.headers,B=pe(A.method)===\"jsonp\",R=A.url;if(B?R=p.getTrustedResourceUrl(R):V(R)||(R=p.valueOf(R)),R=F(R,A.paramSerializer(A.params)),B&&(R=U(R,A.jsonpCallbackParam)),D.pendingRequests.push(A),$.then(Te,Te),(A.cache||e.cache)&&A.cache!==!1&&(A.method===\"GET\"||A.method===\"JSONP\")&&(C=Y(A.cache)?A.cache:Y(e.cache)?e.cache:g),C&&(E=C.get(R),fe(E)?ui(E)?E.then(ie,ie):oe(E)?J(E[1],E[0],nn(E[2]),E[3],E[4]):J(E,200,{},\"OK\",\"complete\"):C.put(R,$)),he(E)){var W=b(A.url)?u()[A.xsrfCookieName||e.xsrfCookieName]:void 0;W&&(O[A.xsrfHeaderName||e.xsrfHeaderName]=W),l(A.method,R,T,ne,O,A.timeout,A.withCredentials,A.responseType,K(A.eventHandlers),K(A.uploadEventHandlers))}return $;function K(Se){if(Se){var Me={};return M(Se,function(Ue,Be){Me[Be]=function(Ge){t?o.$applyAsync(ot):o.$$phase?ot():o.$apply(ot);function ot(){Ue(Ge)}}}),Me}}function ne(Se,Me,Ue,Be,Ge){C&&(Fs(Se)?C.put(R,[Se,Me,pa(Ue),Be,Ge]):C.remove(R));function ot(){J(Me,Se,Ue,Be,Ge)}t?o.$applyAsync(ot):(ot(),o.$$phase||o.$apply())}function J(Se,Me,Ue,Be,Ge){Me=Me>=-1?Me:0,(Fs(Me)?m.resolve:m.reject)({data:Se,status:Me,headers:va(Ue),config:A,statusText:Be,xhrStatus:Ge})}function ie(Se){J(Se.data,Se.status,nn(Se.headers()),Se.statusText,Se.xhrStatus)}function Te(){var Se=D.pendingRequests.indexOf(A);Se!==-1&&D.pendingRequests.splice(Se,1)}}function F(A,T){return T.length>0&&(A+=(A.indexOf(\"?\")===-1?\"?\":\"&\")+T),A}function U(A,T){var m=A.split(\"?\");if(m.length>2)throw Ai(\"badjsonp\",'Illegal use more than one \"?\", in url, \"{1}\"',A);var $=ms(m[1]);return M($,function(C,E){if(C===\"JSON_CALLBACK\")throw Ai(\"badjsonp\",'Illegal use of JSON_CALLBACK in url, \"{0}\"',A);if(E===T)throw Ai(\"badjsonp\",'Illegal use of callback param, \"{0}\", in url, \"{1}\"',T,A)}),A+=(A.indexOf(\"?\")===-1?\"?\":\"&\")+T+\"=JSON_CALLBACK\",A}}]}function oh(){this.$get=function(){return function(){return new c.XMLHttpRequest}}}function ah(){this.$get=[\"$browser\",\"$jsonpCallbacks\",\"$document\",\"$xhrFactory\",function(e,t,n,r){return uh(e,r,e.defer,t,n[0])}]}function uh(e,t,n,r,i){return function(u,a,o,h,d,p,g,y,b,D){if(a=a||e.url(),pe(u)===\"jsonp\")var z=r.createCallback(a),I=l(a,z,function(E,O){var B=E===200&&r.getResponse(z);C(h,E,B,\"\",O,\"complete\"),r.removeCallback(z)});else{var L=t(u,a),F=!1;L.open(u,a,!0),M(d,function(E,O){fe(E)&&L.setRequestHeader(O,E)}),L.onload=function(){var O=L.statusText||\"\",B=\"response\"in L?L.response:L.responseText,R=L.status===1223?204:L.status;R===0&&(R=B?200:Nt(a).protocol===\"file\"?404:0),C(h,R,B,L.getAllResponseHeaders(),O,\"complete\")};var U=function(){C(h,-1,null,null,\"\",\"error\")},A=function(){C(h,-1,null,null,\"\",F?\"timeout\":\"abort\")},T=function(){C(h,-1,null,null,\"\",\"timeout\")};if(L.onerror=U,L.ontimeout=T,L.onabort=A,M(b,function(E,O){L.addEventListener(O,E)}),M(D,function(E,O){L.upload.addEventListener(O,E)}),g&&(L.withCredentials=!0),y)try{L.responseType=y}catch(E){if(y!==\"json\")throw E}L.send(he(o)?null:o)}if(p>0)var m=n(function(){$(\"timeout\")},p);else ui(p)&&p.then(function(){$(fe(p.$$timeoutId)?\"timeout\":\"abort\")});function $(E){F=E===\"timeout\",I&&I(),L&&L.abort()}function C(E,O,B,R,W,K){fe(m)&&n.cancel(m),I=L=null,E(O,B,R,W,K)}};function l(u,a,o){u=u.replace(\"JSON_CALLBACK\",a);var h=i.createElement(\"script\"),d=null;return h.type=\"text/javascript\",h.src=u,h.async=!0,d=function(p){h.removeEventListener(\"load\",d),h.removeEventListener(\"error\",d),i.body.removeChild(h),h=null;var g=-1,y=\"unknown\";p&&(p.type===\"load\"&&!r.wasCalled(a)&&(p={type:\"error\"}),y=p.type,g=p.type===\"error\"?404:200),o&&o(g,y)},h.addEventListener(\"load\",d),h.addEventListener(\"error\",d),i.body.appendChild(h),d}}var Dn=ue.$interpolateMinErr=w(\"$interpolate\");Dn.throwNoconcat=function(e){throw Dn(\"noconcat\",`Error while interpolating: {0}\nStrict Contextual Escaping disallows interpolations that concatenate multiple expressions when a trusted value is required.  See http://docs.angularjs.org/api/ng.$sce`,e)},Dn.interr=function(e,t){return Dn(\"interr\",`Can't interpolate: {0}\n{1}`,e,t.toString())};function ch(){var e=\"{{\",t=\"}}\";this.startSymbol=function(n){return n?(e=n,this):e},this.endSymbol=function(n){return n?(t=n,this):t},this.$get=[\"$parse\",\"$exceptionHandler\",\"$sce\",function(n,r,i){var l=e.length,u=t.length,a=new RegExp(e.replace(/./g,h),\"g\"),o=new RegExp(t.replace(/./g,h),\"g\");function h(y){return\"\\\\\\\\\\\\\"+y}function d(y){return y.replace(a,e).replace(o,t)}function p(y,b,D,z){var I=y.$watch(function(F){return I(),z(F)},b,D);return I}function g(y,b,D,z){var I=D===i.URL||D===i.MEDIA_URL;if(!y.length||y.indexOf(e)===-1){if(b)return;var L=d(y);I&&(L=i.getTrusted(D,L));var F=st(L);return F.exp=y,F.expressions=[],F.$$watchDelegate=p,F}z=!!z;for(var U,A,T=0,m=[],$,C=y.length,E,O=[],B=[],R;T<C;)if((U=y.indexOf(e,T))!==-1&&(A=y.indexOf(t,U+l))!==-1)T!==U&&O.push(d(y.substring(T,U))),E=y.substring(U+l,A),m.push(E),T=A+u,B.push(O.length),O.push(\"\");else{T!==C&&O.push(d(y.substring(T)));break}R=O.length===1&&B.length===1;var W=I&&R?void 0:ne;if($=m.map(function(J){return n(J,W)}),!b||m.length){var K=function(J){for(var ie=0,Te=m.length;ie<Te;ie++){if(z&&he(J[ie]))return;O[B[ie]]=J[ie]}return I?i.getTrusted(D,R?O[0]:O.join(\"\")):(D&&O.length>1&&Dn.throwNoconcat(y),O.join(\"\"))};return Fe(function(ie){var Te=0,Se=m.length,Me=new Array(Se);try{for(;Te<Se;Te++)Me[Te]=$[Te](ie);return K(Me)}catch(Ue){r(Dn.interr(y,Ue))}},{exp:y,expressions:m,$$watchDelegate:function(J,ie){var Te;return J.$watchGroup($,function(Me,Ue){var Be=K(Me);ie.call(this,Be,Me!==Ue?Te:Be,J),Te=Be})}})}function ne(J){try{return J=D&&!I?i.getTrusted(D,J):i.valueOf(J),z&&!fe(J)?J:bs(J)}catch(ie){r(Dn.interr(y,ie))}}}return g.startSymbol=function(){return e},g.endSymbol=function(){return t},g}]}var fh=w(\"$interval\");function lh(){this.$get=[\"$$intervalFactory\",\"$window\",function(e,t){var n={},r=function(u,a,o){var h=t.setInterval(u,a);return n[h]=o,h},i=function(u){t.clearInterval(u),delete n[u]},l=e(r,i);return l.cancel=function(u){if(!u)return!1;if(!u.hasOwnProperty(\"$$intervalId\"))throw fh(\"badprom\",\"`$interval.cancel()` called with a promise that was not generated by `$interval()`.\");if(!n.hasOwnProperty(u.$$intervalId))return!1;var a=u.$$intervalId,o=n[a];return Ra(o.promise),o.reject(\"canceled\"),i(a),!0},l}]}function hh(){this.$get=[\"$browser\",\"$q\",\"$$q\",\"$rootScope\",function(e,t,n,r){return function(l,u){return function(o,h,d,p){var g=arguments.length>4,y=g?Nr(arguments,4):[],b=0,D=fe(p)&&!p,z=(D?n:t).defer(),I=z.promise;d=fe(d)?d:0;function L(){g?o.apply(null,y):o(b)}function F(){D?e.defer(L):r.$evalAsync(L),z.notify(b++),d>0&&b>=d&&(z.resolve(b),u(I.$$intervalId)),D||r.$apply()}return I.$$intervalId=l(F,h,z,D),I}}}]}var dh=function(){this.$get=function(){var e=ue.callbacks,t={};function n(r){var i=function(l){i.data=l,i.called=!0};return i.id=r,i}return{createCallback:function(r){var i=\"_\"+(e.$$counter++).toString(36),l=\"angular.callbacks.\"+i,u=n(i);return t[l]=e[i]=u,l},wasCalled:function(r){return t[r].called},getResponse:function(r){return t[r].data},removeCallback:function(r){var i=t[r];delete e[i.id],delete t[r]}}}},ph=/^([^?#]*)(\\?([^#]*))?(#(.*))?$/,vh={http:80,https:443,ftp:21},Wr=w(\"$location\");function gh(e){for(var t=e.split(\"/\"),n=t.length;n--;)t[n]=ys(t[n].replace(/%2F/g,\"/\"));return t.join(\"/\")}function $h(e,t){for(var n=e.split(\"/\"),r=n.length;r--;)n[r]=decodeURIComponent(n[r]),t&&(n[r]=n[r].replace(/\\//g,\"%2F\"));return n.join(\"/\")}function mh(e,t,n){var r=qf(t),i=n?\"#\"+ys(n):\"\",l=gh(e);return l+(r?\"?\"+r:\"\")+i}function $a(e,t){var n=Nt(e);t.$$protocol=n.protocol,t.$$host=n.hostname,t.$$port=Ye(n.port)||vh[n.protocol]||null}var yh=/^\\s*[\\\\/]{2,}/;function ma(e,t,n){if(yh.test(e))throw Wr(\"badpath\",'Invalid url \"{0}\".',e);var r=e.charAt(0)!==\"/\";r&&(e=\"/\"+e);var i=Nt(e),l=r&&i.pathname.charAt(0)===\"/\"?i.pathname.substring(1):i.pathname;t.$$path=$h(l,n),t.$$search=ms(i.search),t.$$hash=decodeURIComponent(i.hash),t.$$path&&t.$$path.charAt(0)!==\"/\"&&(t.$$path=\"/\"+t.$$path)}function Ls(e,t){return e.slice(0,t.length)===t}function yn(e,t){if(Ls(t,e))return t.substr(e.length)}function In(e){var t=e.indexOf(\"#\");return t===-1?e:e.substr(0,t)}function bh(e){return e.substr(0,In(e).lastIndexOf(\"/\")+1)}function Ch(e){return e.substring(0,e.indexOf(\"/\",e.indexOf(\"//\")+2))}function Ds(e,t,n){this.$$html5=!0,n=n||\"\",$a(e,this),this.$$parse=function(r){var i=yn(t,r);if(!V(i))throw Wr(\"ipthprfx\",'Invalid url \"{0}\", missing path prefix \"{1}\".',r,t);ma(i,this,!0),this.$$path||(this.$$path=\"/\"),this.$$compose()},this.$$normalizeUrl=function(r){return t+r.substr(1)},this.$$parseLinkUrl=function(r,i){if(i&&i[0]===\"#\")return this.hash(i.slice(1)),!0;var l,u,a;return fe(l=yn(e,r))?(u=l,n&&fe(l=yn(n,l))?a=t+(yn(\"/\",l)||l):a=e+u):fe(l=yn(t,r))?a=t+l:t===r+\"/\"&&(a=t),a&&this.$$parse(a),!!a}}function Is(e,t,n){$a(e,this),this.$$parse=function(r){var i=yn(e,r)||yn(t,r),l;!he(i)&&i.charAt(0)===\"#\"?(l=yn(n,i),he(l)&&(l=i)):this.$$html5?l=i:(l=\"\",he(i)&&(e=r,this.replace())),ma(l,this,!1),this.$$path=u(this.$$path,l,e),this.$$compose();function u(a,o,h){var d=/^\\/[A-Z]:(\\/.*)/,p;return Ls(o,h)&&(o=o.replace(h,\"\")),d.exec(o)?a:(p=d.exec(a),p?p[1]:a)}},this.$$normalizeUrl=function(r){return e+(r?n+r:\"\")},this.$$parseLinkUrl=function(r,i){return In(e)===In(r)?(this.$$parse(r),!0):!1}}function ya(e,t,n){this.$$html5=!0,Is.apply(this,arguments),this.$$parseLinkUrl=function(r,i){if(i&&i[0]===\"#\")return this.hash(i.slice(1)),!0;var l,u;return e===In(r)?l=r:(u=yn(t,r))?l=e+n+u:t===r+\"/\"&&(l=t),l&&this.$$parse(l),!!l},this.$$normalizeUrl=function(r){return e+n+r}}var Eh={$$absUrl:\"\",$$html5:!1,$$replace:!1,$$compose:function(){this.$$url=mh(this.$$path,this.$$search,this.$$hash),this.$$absUrl=this.$$normalizeUrl(this.$$url),this.$$urlUpdatedByLocation=!0},absUrl:Si(\"$$absUrl\"),url:function(e){if(he(e))return this.$$url;var t=ph.exec(e);return(t[1]||e===\"\")&&this.path(decodeURIComponent(t[1])),(t[2]||t[1]||e===\"\")&&this.search(t[3]||\"\"),this.hash(t[5]||\"\"),this},protocol:Si(\"$$protocol\"),host:Si(\"$$host\"),port:Si(\"$$port\"),path:ba(\"$$path\",function(e){return e=e!==null?e.toString():\"\",e.charAt(0)===\"/\"?e:\"/\"+e}),search:function(e,t){switch(arguments.length){case 0:return this.$$search;case 1:if(V(e)||de(e))e=e.toString(),this.$$search=ms(e);else if(Y(e))e=Rn(e,{}),M(e,function(n,r){n==null&&delete e[r]}),this.$$search=e;else throw Wr(\"isrcharg\",\"The first argument of the `$location#search()` call must be a string or an object.\");break;default:he(t)||t===null?delete this.$$search[e]:this.$$search[e]=t}return this.$$compose(),this},hash:ba(\"$$hash\",function(e){return e!==null?e.toString():\"\"}),replace:function(){return this.$$replace=!0,this}};M([ya,Is,Ds],function(e){e.prototype=Object.create(Eh),e.prototype.state=function(t){if(!arguments.length)return this.$$state;if(e!==Ds||!this.$$html5)throw Wr(\"nostate\",\"History API state support is available only in HTML5 mode and only in browsers supporting HTML5 History API\");return this.$$state=he(t)?null:t,this.$$urlUpdatedByLocation=!0,this}});function Si(e){return function(){return this[e]}}function ba(e,t){return function(n){return he(n)?this[e]:(this[e]=t(n),this.$$compose(),this)}}function wh(){var e=\"!\",t={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(n){return fe(n)?(e=n,this):e},this.html5Mode=function(n){return $n(n)?(t.enabled=n,this):Y(n)?($n(n.enabled)&&(t.enabled=n.enabled),$n(n.requireBase)&&(t.requireBase=n.requireBase),($n(n.rewriteLinks)||V(n.rewriteLinks))&&(t.rewriteLinks=n.rewriteLinks),this):t},this.$get=[\"$rootScope\",\"$browser\",\"$sniffer\",\"$rootElement\",\"$window\",function(n,r,i,l,u){var a,o,h=r.baseHref(),d=r.url(),p;if(t.enabled){if(!h&&t.requireBase)throw Wr(\"nobase\",\"$location in HTML5 mode requires a <base> tag to be present!\");p=Ch(d)+(h||\"/\"),o=i.history?Ds:ya}else p=In(d),o=Is;var g=bh(p);a=new o(p,g,\"#\"+e),a.$$parseLinkUrl(d,d),a.$$state=r.state();var y=/^\\s*(javascript|mailto):/i;function b(L,F){return L===F||Nt(L).href===Nt(F).href}function D(L,F,U){var A=a.url(),T=a.$$state;try{r.url(L,F,U),a.$$state=r.state()}catch(m){throw a.url(A),a.$$state=T,m}}l.on(\"click\",function(L){var F=t.rewriteLinks;if(!(!F||L.ctrlKey||L.metaKey||L.shiftKey||L.which===2||L.button===2)){for(var U=S(L.target);en(U[0])!==\"a\";)if(U[0]===l[0]||!(U=U.parent())[0])return;if(!(V(F)&&he(U.attr(F)))){var A=U.prop(\"href\"),T=U.attr(\"href\")||U.attr(\"xlink:href\");Y(A)&&A.toString()===\"[object SVGAnimatedString]\"&&(A=Nt(A.animVal).href),!y.test(A)&&A&&!U.attr(\"target\")&&!L.isDefaultPrevented()&&a.$$parseLinkUrl(A,T)&&(L.preventDefault(),a.absUrl()!==r.url()&&n.$apply())}}}),a.absUrl()!==d&&r.url(a.absUrl(),!0);var z=!0;return r.onUrlChange(function(L,F){if(!Ls(L,g)){u.location.href=L;return}n.$evalAsync(function(){var U=a.absUrl(),A=a.$$state,T;a.$$parse(L),a.$$state=F,T=n.$broadcast(\"$locationChangeStart\",L,U,F,A).defaultPrevented,a.absUrl()===L&&(T?(a.$$parse(U),a.$$state=A,D(U,!1,A)):(z=!1,I(U,A)))}),n.$$phase||n.$digest()}),n.$watch(function(){if(z||a.$$urlUpdatedByLocation){a.$$urlUpdatedByLocation=!1;var F=r.url(),U=a.absUrl(),A=r.state(),T=a.$$replace,m=!b(F,U)||a.$$html5&&i.history&&A!==a.$$state;(z||m)&&(z=!1,n.$evalAsync(function(){var $=a.absUrl(),C=n.$broadcast(\"$locationChangeStart\",$,F,a.$$state,A).defaultPrevented;a.absUrl()===$&&(C?(a.$$parse(F),a.$$state=A):(m&&D($,T,A===a.$$state?null:a.$$state),I(F,A)))}))}a.$$replace=!1}),a;function I(L,F){n.$broadcast(\"$locationChangeSuccess\",a.absUrl(),L,a.$$state,F)}}]}function Ah(){var e=!0,t=this;this.debugEnabled=function(n){return fe(n)?(e=n,this):e},this.$get=[\"$window\",function(n){var r=x||/\\bEdge\\//.test(n.navigator&&n.navigator.userAgent);return{log:l(\"log\"),info:l(\"info\"),warn:l(\"warn\"),error:l(\"error\"),debug:function(){var u=l(\"debug\");return function(){e&&u.apply(t,arguments)}}()};function i(u){return xe(u)&&(u.stack&&r?u=u.message&&u.stack.indexOf(u.message)===-1?\"Error: \"+u.message+`\n`+u.stack:u.stack:u.sourceURL&&(u=u.message+`\n`+u.sourceURL+\":\"+u.line)),u}function l(u){var a=n.console||{},o=a[u]||a.log||we;return function(){var h=[];return M(arguments,function(d){h.push(i(d))}),Function.prototype.apply.call(o,a,h)}}}]}var rr=w(\"$parse\"),Sh={}.constructor.prototype.valueOf;function Ca(e){return e+\"\"}var _i=nt();M(\"+ - * / % === !== == != < > <= >= && || ! = |\".split(\" \"),function(e){_i[e]=!0});var _h={n:`\n`,f:\"\\f\",r:\"\\r\",t:\"\t\",v:\"\\v\",\"'\":\"'\",'\"':'\"'},Ti=function(t){this.options=t};Ti.prototype={constructor:Ti,lex:function(e){for(this.text=e,this.index=0,this.tokens=[];this.index<this.text.length;){var t=this.text.charAt(this.index);if(t==='\"'||t===\"'\")this.readString(t);else if(this.isNumber(t)||t===\".\"&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdentifierStart(this.peekMultichar()))this.readIdent();else if(this.is(t,\"(){}[].,;:?\"))this.tokens.push({index:this.index,text:t}),this.index++;else if(this.isWhitespace(t))this.index++;else{var n=t+this.peek(),r=n+this.peek(2),i=_i[t],l=_i[n],u=_i[r];if(i||l||u){var a=u?r:l?n:t;this.tokens.push({index:this.index,text:a,operator:!0}),this.index+=a.length}else this.throwError(\"Unexpected next character \",this.index,this.index+1)}}return this.tokens},is:function(e,t){return t.indexOf(e)!==-1},peek:function(e){var t=e||1;return this.index+t<this.text.length?this.text.charAt(this.index+t):!1},isNumber:function(e){return\"0\"<=e&&e<=\"9\"&&typeof e==\"string\"},isWhitespace:function(e){return e===\" \"||e===\"\\r\"||e===\"\t\"||e===`\n`||e===\"\\v\"||e===\"\\xA0\"},isIdentifierStart:function(e){return this.options.isIdentifierStart?this.options.isIdentifierStart(e,this.codePointAt(e)):this.isValidIdentifierStart(e)},isValidIdentifierStart:function(e){return\"a\"<=e&&e<=\"z\"||\"A\"<=e&&e<=\"Z\"||e===\"_\"||e===\"$\"},isIdentifierContinue:function(e){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(e,this.codePointAt(e)):this.isValidIdentifierContinue(e)},isValidIdentifierContinue:function(e,t){return this.isValidIdentifierStart(e,t)||this.isNumber(e)},codePointAt:function(e){return e.length===1?e.charCodeAt(0):(e.charCodeAt(0)<<10)+e.charCodeAt(1)-56613888},peekMultichar:function(){var e=this.text.charAt(this.index),t=this.peek();if(!t)return e;var n=e.charCodeAt(0),r=t.charCodeAt(0);return n>=55296&&n<=56319&&r>=56320&&r<=57343?e+t:e},isExpOperator:function(e){return e===\"-\"||e===\"+\"||this.isNumber(e)},throwError:function(e,t,n){n=n||this.index;var r=fe(t)?\"s \"+t+\"-\"+this.index+\" [\"+this.text.substring(t,n)+\"]\":\" \"+n;throw rr(\"lexerr\",\"Lexer Error: {0} at column{1} in expression [{2}].\",e,r,this.text)},readNumber:function(){for(var e=\"\",t=this.index;this.index<this.text.length;){var n=pe(this.text.charAt(this.index));if(n===\".\"||this.isNumber(n))e+=n;else{var r=this.peek();if(n===\"e\"&&this.isExpOperator(r))e+=n;else if(this.isExpOperator(n)&&r&&this.isNumber(r)&&e.charAt(e.length-1)===\"e\")e+=n;else if(this.isExpOperator(n)&&(!r||!this.isNumber(r))&&e.charAt(e.length-1)===\"e\")this.throwError(\"Invalid exponent\");else break}this.index++}this.tokens.push({index:t,text:e,constant:!0,value:Number(e)})},readIdent:function(){var e=this.index;for(this.index+=this.peekMultichar().length;this.index<this.text.length;){var t=this.peekMultichar();if(!this.isIdentifierContinue(t))break;this.index+=t.length}this.tokens.push({index:e,text:this.text.slice(e,this.index),identifier:!0})},readString:function(e){var t=this.index;this.index++;for(var n=\"\",r=e,i=!1;this.index<this.text.length;){var l=this.text.charAt(this.index);if(r+=l,i){if(l===\"u\"){var u=this.text.substring(this.index+1,this.index+5);u.match(/[\\da-f]{4}/i)||this.throwError(\"Invalid unicode escape [\\\\u\"+u+\"]\"),this.index+=4,n+=String.fromCharCode(parseInt(u,16))}else{var a=_h[l];n=n+(a||l)}i=!1}else if(l===\"\\\\\")i=!0;else if(l===e){this.index++,this.tokens.push({index:t,text:r,constant:!0,value:n});return}else n+=l;this.index++}this.throwError(\"Unterminated quote\",t)}};var te=function(t,n){this.lexer=t,this.options=n};te.Program=\"Program\",te.ExpressionStatement=\"ExpressionStatement\",te.AssignmentExpression=\"AssignmentExpression\",te.ConditionalExpression=\"ConditionalExpression\",te.LogicalExpression=\"LogicalExpression\",te.BinaryExpression=\"BinaryExpression\",te.UnaryExpression=\"UnaryExpression\",te.CallExpression=\"CallExpression\",te.MemberExpression=\"MemberExpression\",te.Identifier=\"Identifier\",te.Literal=\"Literal\",te.ArrayExpression=\"ArrayExpression\",te.Property=\"Property\",te.ObjectExpression=\"ObjectExpression\",te.ThisExpression=\"ThisExpression\",te.LocalsExpression=\"LocalsExpression\",te.NGValueParameter=\"NGValueParameter\",te.prototype={ast:function(e){this.text=e,this.tokens=this.lexer.lex(e);var t=this.program();return this.tokens.length!==0&&this.throwError(\"is an unexpected token\",this.tokens[0]),t},program:function(){for(var e=[];;)if(this.tokens.length>0&&!this.peek(\"}\",\")\",\";\",\"]\")&&e.push(this.expressionStatement()),!this.expect(\";\"))return{type:te.Program,body:e}},expressionStatement:function(){return{type:te.ExpressionStatement,expression:this.filterChain()}},filterChain:function(){for(var e=this.expression();this.expect(\"|\");)e=this.filter(e);return e},expression:function(){return this.assignment()},assignment:function(){var e=this.ternary();if(this.expect(\"=\")){if(!_a(e))throw rr(\"lval\",\"Trying to assign a value to a non l-value\");e={type:te.AssignmentExpression,left:e,right:this.assignment(),operator:\"=\"}}return e},ternary:function(){var e=this.logicalOR(),t,n;return this.expect(\"?\")&&(t=this.expression(),this.consume(\":\"))?(n=this.expression(),{type:te.ConditionalExpression,test:e,alternate:t,consequent:n}):e},logicalOR:function(){for(var e=this.logicalAND();this.expect(\"||\");)e={type:te.LogicalExpression,operator:\"||\",left:e,right:this.logicalAND()};return e},logicalAND:function(){for(var e=this.equality();this.expect(\"&&\");)e={type:te.LogicalExpression,operator:\"&&\",left:e,right:this.equality()};return e},equality:function(){for(var e=this.relational(),t;t=this.expect(\"==\",\"!=\",\"===\",\"!==\");)e={type:te.BinaryExpression,operator:t.text,left:e,right:this.relational()};return e},relational:function(){for(var e=this.additive(),t;t=this.expect(\"<\",\">\",\"<=\",\">=\");)e={type:te.BinaryExpression,operator:t.text,left:e,right:this.additive()};return e},additive:function(){for(var e=this.multiplicative(),t;t=this.expect(\"+\",\"-\");)e={type:te.BinaryExpression,operator:t.text,left:e,right:this.multiplicative()};return e},multiplicative:function(){for(var e=this.unary(),t;t=this.expect(\"*\",\"/\",\"%\");)e={type:te.BinaryExpression,operator:t.text,left:e,right:this.unary()};return e},unary:function(){var e;return(e=this.expect(\"+\",\"-\",\"!\"))?{type:te.UnaryExpression,operator:e.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var e;this.expect(\"(\")?(e=this.filterChain(),this.consume(\")\")):this.expect(\"[\")?e=this.arrayDeclaration():this.expect(\"{\")?e=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?e=Rn(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?e={type:te.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?e=this.identifier():this.peek().constant?e=this.constant():this.throwError(\"not a primary expression\",this.peek());for(var t;t=this.expect(\"(\",\"[\",\".\");)t.text===\"(\"?(e={type:te.CallExpression,callee:e,arguments:this.parseArguments()},this.consume(\")\")):t.text===\"[\"?(e={type:te.MemberExpression,object:e,property:this.expression(),computed:!0},this.consume(\"]\")):t.text===\".\"?e={type:te.MemberExpression,object:e,property:this.identifier(),computed:!1}:this.throwError(\"IMPOSSIBLE\");return e},filter:function(e){for(var t=[e],n={type:te.CallExpression,callee:this.identifier(),arguments:t,filter:!0};this.expect(\":\");)t.push(this.expression());return n},parseArguments:function(){var e=[];if(this.peekToken().text!==\")\")do e.push(this.filterChain());while(this.expect(\",\"));return e},identifier:function(){var e=this.consume();return e.identifier||this.throwError(\"is not a valid identifier\",e),{type:te.Identifier,name:e.text}},constant:function(){return{type:te.Literal,value:this.consume().value}},arrayDeclaration:function(){var e=[];if(this.peekToken().text!==\"]\")do{if(this.peek(\"]\"))break;e.push(this.expression())}while(this.expect(\",\"));return this.consume(\"]\"),{type:te.ArrayExpression,elements:e}},object:function(){var e=[],t;if(this.peekToken().text!==\"}\")do{if(this.peek(\"}\"))break;t={type:te.Property,kind:\"init\"},this.peek().constant?(t.key=this.constant(),t.computed=!1,this.consume(\":\"),t.value=this.expression()):this.peek().identifier?(t.key=this.identifier(),t.computed=!1,this.peek(\":\")?(this.consume(\":\"),t.value=this.expression()):t.value=t.key):this.peek(\"[\")?(this.consume(\"[\"),t.key=this.expression(),this.consume(\"]\"),t.computed=!0,this.consume(\":\"),t.value=this.expression()):this.throwError(\"invalid key\",this.peek()),e.push(t)}while(this.expect(\",\"));return this.consume(\"}\"),{type:te.ObjectExpression,properties:e}},throwError:function(e,t){throw rr(\"syntax\",\"Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].\",t.text,e,t.index+1,this.text,this.text.substring(t.index))},consume:function(e){if(this.tokens.length===0)throw rr(\"ueoe\",\"Unexpected end of expression: {0}\",this.text);var t=this.expect(e);return t||this.throwError(\"is unexpected, expecting [\"+e+\"]\",this.peek()),t},peekToken:function(){if(this.tokens.length===0)throw rr(\"ueoe\",\"Unexpected end of expression: {0}\",this.text);return this.tokens[0]},peek:function(e,t,n,r){return this.peekAhead(0,e,t,n,r)},peekAhead:function(e,t,n,r,i){if(this.tokens.length>e){var l=this.tokens[e],u=l.text;if(u===t||u===n||u===r||u===i||!t&&!n&&!r&&!i)return l}return!1},expect:function(e,t,n,r){var i=this.peek(e,t,n,r);return i?(this.tokens.shift(),i):!1},selfReferential:{this:{type:te.ThisExpression},$locals:{type:te.LocalsExpression}}};function Th(e,t){return typeof e<\"u\"?e:t}function Ea(e,t){return typeof e>\"u\"?t:typeof t>\"u\"?e:e+t}function kh(e,t){var n=e(t);return!n.$stateful}var wa=1,Aa=2;function Oh(e,t){switch(e.type){case te.MemberExpression:if(e.computed)return!1;break;case te.UnaryExpression:return wa;case te.BinaryExpression:return e.operator!==\"+\"?wa:!1;case te.CallExpression:return!1}return t===void 0?Aa:t}function yt(e,t,n){var r,i,l,u=e.isPure=Oh(e,n);switch(e.type){case te.Program:r=!0,M(e.body,function(a){yt(a.expression,t,u),r=r&&a.expression.constant}),e.constant=r;break;case te.Literal:e.constant=!0,e.toWatch=[];break;case te.UnaryExpression:yt(e.argument,t,u),e.constant=e.argument.constant,e.toWatch=e.argument.toWatch;break;case te.BinaryExpression:yt(e.left,t,u),yt(e.right,t,u),e.constant=e.left.constant&&e.right.constant,e.toWatch=e.left.toWatch.concat(e.right.toWatch);break;case te.LogicalExpression:yt(e.left,t,u),yt(e.right,t,u),e.constant=e.left.constant&&e.right.constant,e.toWatch=e.constant?[]:[e];break;case te.ConditionalExpression:yt(e.test,t,u),yt(e.alternate,t,u),yt(e.consequent,t,u),e.constant=e.test.constant&&e.alternate.constant&&e.consequent.constant,e.toWatch=e.constant?[]:[e];break;case te.Identifier:e.constant=!1,e.toWatch=[e];break;case te.MemberExpression:yt(e.object,t,u),e.computed&&yt(e.property,t,u),e.constant=e.object.constant&&(!e.computed||e.property.constant),e.toWatch=e.constant?[]:[e];break;case te.CallExpression:l=e.filter?kh(t,e.callee.name):!1,r=l,i=[],M(e.arguments,function(a){yt(a,t,u),r=r&&a.constant,i.push.apply(i,a.toWatch)}),e.constant=r,e.toWatch=l?i:[e];break;case te.AssignmentExpression:yt(e.left,t,u),yt(e.right,t,u),e.constant=e.left.constant&&e.right.constant,e.toWatch=[e];break;case te.ArrayExpression:r=!0,i=[],M(e.elements,function(a){yt(a,t,u),r=r&&a.constant,i.push.apply(i,a.toWatch)}),e.constant=r,e.toWatch=i;break;case te.ObjectExpression:r=!0,i=[],M(e.properties,function(a){yt(a.value,t,u),r=r&&a.value.constant,i.push.apply(i,a.value.toWatch),a.computed&&(yt(a.key,t,!1),r=r&&a.key.constant,i.push.apply(i,a.key.toWatch))}),e.constant=r,e.toWatch=i;break;case te.ThisExpression:e.constant=!1,e.toWatch=[];break;case te.LocalsExpression:e.constant=!1,e.toWatch=[];break}}function Sa(e){if(e.length===1){var t=e[0].expression,n=t.toWatch;return n.length!==1||n[0]!==t?n:void 0}}function _a(e){return e.type===te.Identifier||e.type===te.MemberExpression}function Ta(e){if(e.body.length===1&&_a(e.body[0].expression))return{type:te.AssignmentExpression,left:e.body[0].expression,right:{type:te.NGValueParameter},operator:\"=\"}}function xh(e){return e.body.length===0||e.body.length===1&&(e.body[0].expression.type===te.Literal||e.body[0].expression.type===te.ArrayExpression||e.body[0].expression.type===te.ObjectExpression)}function Ph(e){return e.constant}function ka(e){this.$filter=e}ka.prototype={compile:function(e){var t=this;this.state={nextId:0,filters:{},fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]},yt(e,t.$filter);var n=\"\",r;if(this.stage=\"assign\",r=Ta(e)){this.state.computing=\"assign\";var i=this.nextId();this.recurse(r,i),this.return_(i),n=\"fn.assign=\"+this.generateFunction(\"assign\",\"s,v,l\")}var l=Sa(e.body);t.stage=\"inputs\",M(l,function(o,h){var d=\"fn\"+h;t.state[d]={vars:[],body:[],own:{}},t.state.computing=d;var p=t.nextId();t.recurse(o,p),t.return_(p),t.state.inputs.push({name:d,isPure:o.isPure}),o.watchId=h}),this.state.computing=\"fn\",this.stage=\"main\",this.recurse(e);var u='\"'+this.USE+\" \"+this.STRICT+`\";\n`+this.filterPrefix()+\"var fn=\"+this.generateFunction(\"fn\",\"s,l,a,i\")+n+this.watchFns()+\"return fn;\",a=new Function(\"$filter\",\"getStringValue\",\"ifDefined\",\"plus\",u)(this.$filter,Ca,Th,Ea);return this.state=this.stage=void 0,a},USE:\"use\",STRICT:\"strict\",watchFns:function(){var e=[],t=this.state.inputs,n=this;return M(t,function(r){e.push(\"var \"+r.name+\"=\"+n.generateFunction(r.name,\"s\")),r.isPure&&e.push(r.name,\".isPure=\"+JSON.stringify(r.isPure)+\";\")}),t.length&&e.push(\"fn.inputs=[\"+t.map(function(r){return r.name}).join(\",\")+\"];\"),e.join(\"\")},generateFunction:function(e,t){return\"function(\"+t+\"){\"+this.varsPrefix(e)+this.body(e)+\"};\"},filterPrefix:function(){var e=[],t=this;return M(this.state.filters,function(n,r){e.push(n+\"=$filter(\"+t.escape(r)+\")\")}),e.length?\"var \"+e.join(\",\")+\";\":\"\"},varsPrefix:function(e){return this.state[e].vars.length?\"var \"+this.state[e].vars.join(\",\")+\";\":\"\"},body:function(e){return this.state[e].body.join(\"\")},recurse:function(e,t,n,r,i,l){var u,a,o=this,h,d,p;if(r=r||we,!l&&fe(e.watchId)){t=t||this.nextId(),this.if_(\"i\",this.lazyAssign(t,this.computedMember(\"i\",e.watchId)),this.lazyRecurse(e,t,n,r,i,!0));return}switch(e.type){case te.Program:M(e.body,function(g,y){o.recurse(g.expression,void 0,void 0,function(b){a=b}),y!==e.body.length-1?o.current().body.push(a,\";\"):o.return_(a)});break;case te.Literal:d=this.escape(e.value),this.assign(t,d),r(t||d);break;case te.UnaryExpression:this.recurse(e.argument,void 0,void 0,function(g){a=g}),d=e.operator+\"(\"+this.ifDefined(a,0)+\")\",this.assign(t,d),r(d);break;case te.BinaryExpression:this.recurse(e.left,void 0,void 0,function(g){u=g}),this.recurse(e.right,void 0,void 0,function(g){a=g}),e.operator===\"+\"?d=this.plus(u,a):e.operator===\"-\"?d=this.ifDefined(u,0)+e.operator+this.ifDefined(a,0):d=\"(\"+u+\")\"+e.operator+\"(\"+a+\")\",this.assign(t,d),r(d);break;case te.LogicalExpression:t=t||this.nextId(),o.recurse(e.left,t),o.if_(e.operator===\"&&\"?t:o.not(t),o.lazyRecurse(e.right,t)),r(t);break;case te.ConditionalExpression:t=t||this.nextId(),o.recurse(e.test,t),o.if_(t,o.lazyRecurse(e.alternate,t),o.lazyRecurse(e.consequent,t)),r(t);break;case te.Identifier:t=t||this.nextId(),n&&(n.context=o.stage===\"inputs\"?\"s\":this.assign(this.nextId(),this.getHasOwnProperty(\"l\",e.name)+\"?l:s\"),n.computed=!1,n.name=e.name),o.if_(o.stage===\"inputs\"||o.not(o.getHasOwnProperty(\"l\",e.name)),function(){o.if_(o.stage===\"inputs\"||\"s\",function(){i&&i!==1&&o.if_(o.isNull(o.nonComputedMember(\"s\",e.name)),o.lazyAssign(o.nonComputedMember(\"s\",e.name),\"{}\")),o.assign(t,o.nonComputedMember(\"s\",e.name))})},t&&o.lazyAssign(t,o.nonComputedMember(\"l\",e.name))),r(t);break;case te.MemberExpression:u=n&&(n.context=this.nextId())||this.nextId(),t=t||this.nextId(),o.recurse(e.object,u,void 0,function(){o.if_(o.notNull(u),function(){e.computed?(a=o.nextId(),o.recurse(e.property,a),o.getStringValue(a),i&&i!==1&&o.if_(o.not(o.computedMember(u,a)),o.lazyAssign(o.computedMember(u,a),\"{}\")),d=o.computedMember(u,a),o.assign(t,d),n&&(n.computed=!0,n.name=a)):(i&&i!==1&&o.if_(o.isNull(o.nonComputedMember(u,e.property.name)),o.lazyAssign(o.nonComputedMember(u,e.property.name),\"{}\")),d=o.nonComputedMember(u,e.property.name),o.assign(t,d),n&&(n.computed=!1,n.name=e.property.name))},function(){o.assign(t,\"undefined\")}),r(t)},!!i);break;case te.CallExpression:t=t||this.nextId(),e.filter?(a=o.filter(e.callee.name),h=[],M(e.arguments,function(g){var y=o.nextId();o.recurse(g,y),h.push(y)}),d=a+\"(\"+h.join(\",\")+\")\",o.assign(t,d),r(t)):(a=o.nextId(),u={},h=[],o.recurse(e.callee,a,u,function(){o.if_(o.notNull(a),function(){M(e.arguments,function(g){o.recurse(g,e.constant?void 0:o.nextId(),void 0,function(y){h.push(y)})}),u.name?d=o.member(u.context,u.name,u.computed)+\"(\"+h.join(\",\")+\")\":d=a+\"(\"+h.join(\",\")+\")\",o.assign(t,d)},function(){o.assign(t,\"undefined\")}),r(t)}));break;case te.AssignmentExpression:a=this.nextId(),u={},this.recurse(e.left,void 0,u,function(){o.if_(o.notNull(u.context),function(){o.recurse(e.right,a),d=o.member(u.context,u.name,u.computed)+e.operator+a,o.assign(t,d),r(t||d)})},1);break;case te.ArrayExpression:h=[],M(e.elements,function(g){o.recurse(g,e.constant?void 0:o.nextId(),void 0,function(y){h.push(y)})}),d=\"[\"+h.join(\",\")+\"]\",this.assign(t,d),r(t||d);break;case te.ObjectExpression:h=[],p=!1,M(e.properties,function(g){g.computed&&(p=!0)}),p?(t=t||this.nextId(),this.assign(t,\"{}\"),M(e.properties,function(g){g.computed?(u=o.nextId(),o.recurse(g.key,u)):u=g.key.type===te.Identifier?g.key.name:\"\"+g.key.value,a=o.nextId(),o.recurse(g.value,a),o.assign(o.member(t,u,g.computed),a)})):(M(e.properties,function(g){o.recurse(g.value,e.constant?void 0:o.nextId(),void 0,function(y){h.push(o.escape(g.key.type===te.Identifier?g.key.name:\"\"+g.key.value)+\":\"+y)})}),d=\"{\"+h.join(\",\")+\"}\",this.assign(t,d)),r(t||d);break;case te.ThisExpression:this.assign(t,\"s\"),r(t||\"s\");break;case te.LocalsExpression:this.assign(t,\"l\"),r(t||\"l\");break;case te.NGValueParameter:this.assign(t,\"v\"),r(t||\"v\");break}},getHasOwnProperty:function(e,t){var n=e+\".\"+t,r=this.current().own;return r.hasOwnProperty(n)||(r[n]=this.nextId(!1,e+\"&&(\"+this.escape(t)+\" in \"+e+\")\")),r[n]},assign:function(e,t){if(!!e)return this.current().body.push(e,\"=\",t,\";\"),e},filter:function(e){return this.state.filters.hasOwnProperty(e)||(this.state.filters[e]=this.nextId(!0)),this.state.filters[e]},ifDefined:function(e,t){return\"ifDefined(\"+e+\",\"+this.escape(t)+\")\"},plus:function(e,t){return\"plus(\"+e+\",\"+t+\")\"},return_:function(e){this.current().body.push(\"return \",e,\";\")},if_:function(e,t,n){if(e===!0)t();else{var r=this.current().body;r.push(\"if(\",e,\"){\"),t(),r.push(\"}\"),n&&(r.push(\"else{\"),n(),r.push(\"}\"))}},not:function(e){return\"!(\"+e+\")\"},isNull:function(e){return e+\"==null\"},notNull:function(e){return e+\"!=null\"},nonComputedMember:function(e,t){var n=/^[$_a-zA-Z][$_a-zA-Z0-9]*$/,r=/[^$_a-zA-Z0-9]/g;return n.test(t)?e+\".\"+t:e+'[\"'+t.replace(r,this.stringEscapeFn)+'\"]'},computedMember:function(e,t){return e+\"[\"+t+\"]\"},member:function(e,t,n){return n?this.computedMember(e,t):this.nonComputedMember(e,t)},getStringValue:function(e){this.assign(e,\"getStringValue(\"+e+\")\")},lazyRecurse:function(e,t,n,r,i,l){var u=this;return function(){u.recurse(e,t,n,r,i,l)}},lazyAssign:function(e,t){var n=this;return function(){n.assign(e,t)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(e){return\"\\\\u\"+(\"0000\"+e.charCodeAt(0).toString(16)).slice(-4)},escape:function(e){if(V(e))return\"'\"+e.replace(this.stringEscapeRegex,this.stringEscapeFn)+\"'\";if(de(e))return e.toString();if(e===!0)return\"true\";if(e===!1)return\"false\";if(e===null)return\"null\";if(typeof e>\"u\")return\"undefined\";throw rr(\"esc\",\"IMPOSSIBLE\")},nextId:function(e,t){var n=\"v\"+this.state.nextId++;return e||this.current().vars.push(n+(t?\"=\"+t:\"\")),n},current:function(){return this.state[this.state.computing]}};function Oa(e){this.$filter=e}Oa.prototype={compile:function(e){var t=this;yt(e,t.$filter);var n,r;(n=Ta(e))&&(r=this.recurse(n));var i=Sa(e.body),l;i&&(l=[],M(i,function(o,h){var d=t.recurse(o);d.isPure=o.isPure,o.input=d,l.push(d),o.watchId=h}));var u=[];M(e.body,function(o){u.push(t.recurse(o.expression))});var a=e.body.length===0?we:e.body.length===1?u[0]:function(o,h){var d;return M(u,function(p){d=p(o,h)}),d};return r&&(a.assign=function(o,h,d){return r(o,d,h)}),l&&(a.inputs=l),a},recurse:function(e,t,n){var r,i,l=this,u;if(e.input)return this.inputs(e.input,e.watchId);switch(e.type){case te.Literal:return this.value(e.value,t);case te.UnaryExpression:return i=this.recurse(e.argument),this[\"unary\"+e.operator](i,t);case te.BinaryExpression:return r=this.recurse(e.left),i=this.recurse(e.right),this[\"binary\"+e.operator](r,i,t);case te.LogicalExpression:return r=this.recurse(e.left),i=this.recurse(e.right),this[\"binary\"+e.operator](r,i,t);case te.ConditionalExpression:return this[\"ternary?:\"](this.recurse(e.test),this.recurse(e.alternate),this.recurse(e.consequent),t);case te.Identifier:return l.identifier(e.name,t,n);case te.MemberExpression:return r=this.recurse(e.object,!1,!!n),e.computed||(i=e.property.name),e.computed&&(i=this.recurse(e.property)),e.computed?this.computedMember(r,i,t,n):this.nonComputedMember(r,i,t,n);case te.CallExpression:return u=[],M(e.arguments,function(a){u.push(l.recurse(a))}),e.filter&&(i=this.$filter(e.callee.name)),e.filter||(i=this.recurse(e.callee,!0)),e.filter?function(a,o,h,d){for(var p=[],g=0;g<u.length;++g)p.push(u[g](a,o,h,d));var y=i.apply(void 0,p,d);return t?{context:void 0,name:void 0,value:y}:y}:function(a,o,h,d){var p=i(a,o,h,d),g;if(p.value!=null){for(var y=[],b=0;b<u.length;++b)y.push(u[b](a,o,h,d));g=p.value.apply(p.context,y)}return t?{value:g}:g};case te.AssignmentExpression:return r=this.recurse(e.left,!0,1),i=this.recurse(e.right),function(a,o,h,d){var p=r(a,o,h,d),g=i(a,o,h,d);return p.context[p.name]=g,t?{value:g}:g};case te.ArrayExpression:return u=[],M(e.elements,function(a){u.push(l.recurse(a))}),function(a,o,h,d){for(var p=[],g=0;g<u.length;++g)p.push(u[g](a,o,h,d));return t?{value:p}:p};case te.ObjectExpression:return u=[],M(e.properties,function(a){a.computed?u.push({key:l.recurse(a.key),computed:!0,value:l.recurse(a.value)}):u.push({key:a.key.type===te.Identifier?a.key.name:\"\"+a.key.value,computed:!1,value:l.recurse(a.value)})}),function(a,o,h,d){for(var p={},g=0;g<u.length;++g)u[g].computed?p[u[g].key(a,o,h,d)]=u[g].value(a,o,h,d):p[u[g].key]=u[g].value(a,o,h,d);return t?{value:p}:p};case te.ThisExpression:return function(a){return t?{value:a}:a};case te.LocalsExpression:return function(a,o){return t?{value:o}:o};case te.NGValueParameter:return function(a,o,h){return t?{value:h}:h}}},\"unary+\":function(e,t){return function(n,r,i,l){var u=e(n,r,i,l);return fe(u)?u=+u:u=0,t?{value:u}:u}},\"unary-\":function(e,t){return function(n,r,i,l){var u=e(n,r,i,l);return fe(u)?u=-u:u=-0,t?{value:u}:u}},\"unary!\":function(e,t){return function(n,r,i,l){var u=!e(n,r,i,l);return t?{value:u}:u}},\"binary+\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u),o=t(r,i,l,u),h=Ea(a,o);return n?{value:h}:h}},\"binary-\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u),o=t(r,i,l,u),h=(fe(a)?a:0)-(fe(o)?o:0);return n?{value:h}:h}},\"binary*\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u)*t(r,i,l,u);return n?{value:a}:a}},\"binary/\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u)/t(r,i,l,u);return n?{value:a}:a}},\"binary%\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u)%t(r,i,l,u);return n?{value:a}:a}},\"binary===\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u)===t(r,i,l,u);return n?{value:a}:a}},\"binary!==\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u)!==t(r,i,l,u);return n?{value:a}:a}},\"binary==\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u)==t(r,i,l,u);return n?{value:a}:a}},\"binary!=\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u)!=t(r,i,l,u);return n?{value:a}:a}},\"binary<\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u)<t(r,i,l,u);return n?{value:a}:a}},\"binary>\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u)>t(r,i,l,u);return n?{value:a}:a}},\"binary<=\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u)<=t(r,i,l,u);return n?{value:a}:a}},\"binary>=\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u)>=t(r,i,l,u);return n?{value:a}:a}},\"binary&&\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u)&&t(r,i,l,u);return n?{value:a}:a}},\"binary||\":function(e,t,n){return function(r,i,l,u){var a=e(r,i,l,u)||t(r,i,l,u);return n?{value:a}:a}},\"ternary?:\":function(e,t,n,r){return function(i,l,u,a){var o=e(i,l,u,a)?t(i,l,u,a):n(i,l,u,a);return r?{value:o}:o}},value:function(e,t){return function(){return t?{context:void 0,name:void 0,value:e}:e}},identifier:function(e,t,n){return function(r,i,l,u){var a=i&&e in i?i:r;n&&n!==1&&a&&a[e]==null&&(a[e]={});var o=a?a[e]:void 0;return t?{context:a,name:e,value:o}:o}},computedMember:function(e,t,n,r){return function(i,l,u,a){var o=e(i,l,u,a),h,d;return o!=null&&(h=t(i,l,u,a),h=Ca(h),r&&r!==1&&o&&!o[h]&&(o[h]={}),d=o[h]),n?{context:o,name:h,value:d}:d}},nonComputedMember:function(e,t,n,r){return function(i,l,u,a){var o=e(i,l,u,a);r&&r!==1&&o&&o[t]==null&&(o[t]={});var h=o?.[t];return n?{context:o,name:t,value:h}:h}},inputs:function(e,t){return function(n,r,i,l){return l?l[t]:e(n,r,i)}}};function ki(e,t,n){this.ast=new te(e,n),this.astCompiler=n.csp?new Oa(t):new ka(t)}ki.prototype={constructor:ki,parse:function(e){var t=this.getAst(e),n=this.astCompiler.compile(t.ast);return n.literal=xh(t.ast),n.constant=Ph(t.ast),n.oneTime=t.oneTime,n},getAst:function(e){var t=!1;return e=e.trim(),e.charAt(0)===\":\"&&e.charAt(1)===\":\"&&(t=!0,e=e.substring(2)),{ast:this.ast.ast(e),oneTime:t}}};function Ns(e){return ve(e.valueOf)?e.valueOf():Sh.call(e)}function Rh(){var e=nt(),t={true:!0,false:!1,null:null,undefined:void 0},n,r;this.addLiteral=function(i,l){t[i]=l},this.setIdentifierFns=function(i,l){return n=i,r=l,this},this.$get=[\"$filter\",function(i){var l=Mn().noUnsafeEval,u={csp:l,literals:Rn(t),isIdentifierStart:ve(n)&&n,isIdentifierContinue:ve(r)&&r};return a.$$getAst=o,a;function a(I,L){var F,U;switch(typeof I){case\"string\":if(I=I.trim(),U=I,F=e[U],!F){var A=new Ti(u),T=new ki(A,i,u);F=T.parse(I),e[U]=b(F)}return z(F,L);case\"function\":return z(I,L);default:return z(we,L)}}function o(I){var L=new Ti(u),F=new ki(L,i,u);return F.getAst(I).ast}function h(I,L,F){return I==null||L==null?I===L:typeof I==\"object\"&&(I=Ns(I),typeof I==\"object\"&&!F)?!1:I===L||I!==I&&L!==L}function d(I,L,F,U,A){var T=U.inputs,m;if(T.length===1){var $=h;return T=T[0],I.$watch(function(W){var K=T(W);return h(K,$,T.isPure)||(m=U(W,void 0,void 0,[K]),$=K&&Ns(K)),m},L,F,A)}for(var C=[],E=[],O=0,B=T.length;O<B;O++)C[O]=h,E[O]=null;return I.$watch(function(W){for(var K=!1,ne=0,J=T.length;ne<J;ne++){var ie=T[ne](W);(K||(K=!h(ie,C[ne],T[ne].isPure)))&&(E[ne]=ie,C[ne]=ie&&Ns(ie))}return K&&(m=U(W,void 0,void 0,E)),m},L,F,A)}function p(I,L,F,U,A){var T=U.literal?g:fe,m,$,C=U.$$intercepted||U,E=U.$$interceptor||_t,O=U.inputs&&!C.inputs;return R.literal=U.literal,R.constant=U.constant,R.inputs=U.inputs,b(R),m=I.$watch(R,L,F,A),m;function B(){T($)&&m()}function R(W,K,ne,J){return $=O&&J?J[0]:C(W,K,ne,J),T($)&&W.$$postDigest(B),E($)}}function g(I){var L=!0;return M(I,function(F){fe(F)||(L=!1)}),L}function y(I,L,F,U){var A=I.$watch(function(m){return A(),U(m)},L,F);return A}function b(I){return I.constant?I.$$watchDelegate=y:I.oneTime?I.$$watchDelegate=p:I.inputs&&(I.$$watchDelegate=d),I}function D(I,L){function F(U){return L(I(U))}return F.$stateful=I.$stateful||L.$stateful,F.$$pure=I.$$pure&&L.$$pure,F}function z(I,L){if(!L)return I;I.$$interceptor&&(L=D(I.$$interceptor,L),I=I.$$intercepted);var F=!1,U=function(T,m,$,C){var E=F&&C?C[0]:I(T,m,$,C);return L(E)};return U.$$intercepted=I,U.$$interceptor=L,U.literal=I.literal,U.oneTime=I.oneTime,U.constant=I.constant,L.$stateful||(F=!I.inputs,U.inputs=I.inputs?I.inputs:[I],L.$$pure||(U.inputs=U.inputs.map(function(A){return A.isPure===Aa?function(m){return A(m)}:A}))),b(U)}}]}function Mh(){var e=!0;this.$get=[\"$rootScope\",\"$exceptionHandler\",function(t,n){return xa(function(r){t.$evalAsync(r)},n,e)}],this.errorOnUnhandledRejections=function(t){return fe(t)?(e=t,this):e}}function Fh(){var e=!0;this.$get=[\"$browser\",\"$exceptionHandler\",function(t,n){return xa(function(r){t.defer(r)},n,e)}],this.errorOnUnhandledRejections=function(t){return fe(t)?(e=t,this):e}}function xa(e,t,n){var r=w(\"$q\",TypeError),i=0,l=[];function u(){return new a}function a(){var $=this.promise=new o;this.resolve=function(C){g($,C)},this.reject=function(C){b($,C)},this.notify=function(C){z($,C)}}function o(){this.$$state={status:0}}Fe(o.prototype,{then:function($,C,E){if(he($)&&he(C)&&he(E))return this;var O=new o;return this.$$state.pending=this.$$state.pending||[],this.$$state.pending.push([O,$,C,E]),this.$$state.status>0&&p(this.$$state),O},catch:function($){return this.then(null,$)},finally:function($,C){return this.then(function(E){return L(E,U,$)},function(E){return L(E,I,$)},C)}});function h($){var C,E,O;O=$.pending,$.processScheduled=!1,$.pending=void 0;try{for(var B=0,R=O.length;B<R;++B){qs($),E=O[B][0],C=O[B][$.status];try{ve(C)?g(E,C($.value)):$.status===1?g(E,$.value):b(E,$.value)}catch(W){b(E,W),W&&W.$$passToExceptionHandler===!0&&t(W)}}}finally{--i,n&&i===0&&e(d)}}function d(){for(;!i&&l.length;){var $=l.shift();if(!Pa($)){qs($);var C=\"Possibly unhandled rejection: \"+Bo($.value);xe($.value)?t($.value,C):t(C)}}}function p($){n&&!$.pending&&$.status===2&&!Pa($)&&(i===0&&l.length===0&&e(d),l.push($)),!($.processScheduled||!$.pending)&&($.processScheduled=!0,++i,e(function(){h($)}))}function g($,C){$.$$state.status||(C===$?D($,r(\"qcycle\",\"Expected promise to be resolved with value other than itself '{0}'\",C)):y($,C))}function y($,C){var E,O=!1;try{(Y(C)||ve(C))&&(E=C.then),ve(E)?($.$$state.status=-1,E.call(C,B,R,W)):($.$$state.value=C,$.$$state.status=1,p($.$$state))}catch(K){R(K)}function B(K){O||(O=!0,y($,K))}function R(K){O||(O=!0,D($,K))}function W(K){z($,K)}}function b($,C){$.$$state.status||D($,C)}function D($,C){$.$$state.value=C,$.$$state.status=2,p($.$$state)}function z($,C){var E=$.$$state.pending;$.$$state.status<=0&&E&&E.length&&e(function(){for(var O,B,R=0,W=E.length;R<W;R++){B=E[R][0],O=E[R][3];try{z(B,ve(O)?O(C):C)}catch(K){t(K)}}})}function I($){var C=new o;return b(C,$),C}function L($,C,E){var O=null;try{ve(E)&&(O=E())}catch(B){return I(B)}return ui(O)?O.then(function(){return C($)},I):C($)}function F($,C,E,O){var B=new o;return g(B,$),B.then(C,E,O)}var U=F;function A($){var C=new o,E=0,O=oe($)?[]:{};return M($,function(B,R){E++,F(B).then(function(W){O[R]=W,--E||g(C,O)},function(W){b(C,W)})}),E===0&&g(C,O),C}function T($){var C=u();return M($,function(E){F(E).then(C.resolve,C.reject)}),C.promise}function m($){if(!ve($))throw r(\"norslvr\",\"Expected resolverFn, got '{0}'\",$);var C=new o;function E(B){g(C,B)}function O(B){b(C,B)}return $(E,O),C}return m.prototype=o.prototype,m.defer=u,m.reject=I,m.when=F,m.resolve=U,m.all=A,m.race=T,m}function Pa(e){return!!e.pur}function qs(e){e.pur=!0}function Ra(e){e.$$state&&qs(e.$$state)}function Lh(){this.$get=[\"$window\",\"$timeout\",function(e,t){var n=e.requestAnimationFrame||e.webkitRequestAnimationFrame,r=e.cancelAnimationFrame||e.webkitCancelAnimationFrame||e.webkitCancelRequestAnimationFrame,i=!!n,l=i?function(u){var a=n(u);return function(){r(a)}}:function(u){var a=t(u,16.66,!1);return function(){t.cancel(a)}};return l.supported=i,l}]}function Dh(){var e=10,t=w(\"$rootScope\"),n=null,r=null;this.digestTtl=function(l){return arguments.length&&(e=l),e};function i(l){function u(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$id=vt(),this.$$ChildScope=null,this.$$suspended=!1}return u.prototype=l,u}this.$get=[\"$exceptionHandler\",\"$parse\",\"$browser\",function(l,u,a){function o(m){m.currentScope.$$destroyed=!0}function h(m){x===9&&(m.$$childHead&&h(m.$$childHead),m.$$nextSibling&&h(m.$$nextSibling)),m.$parent=m.$$nextSibling=m.$$prevSibling=m.$$childHead=m.$$childTail=m.$root=m.$$watchers=null}function d(){this.$id=vt(),this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null,this.$root=this,this.$$destroyed=!1,this.$$suspended=!1,this.$$listeners={},this.$$listenerCount={},this.$$watchersCount=0,this.$$isolateBindings=null}d.prototype={constructor:d,$new:function(m,$){var C;return $=$||this,m?(C=new d,C.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=i(this)),C=new this.$$ChildScope),C.$parent=$,C.$$prevSibling=$.$$childTail,$.$$childHead?($.$$childTail.$$nextSibling=C,$.$$childTail=C):$.$$childHead=$.$$childTail=C,(m||$!==this)&&C.$on(\"$destroy\",o),C},$watch:function(m,$,C,E){var O=u(m),B=ve($)?$:we;if(O.$$watchDelegate)return O.$$watchDelegate(this,B,C,O,m);var R=this,W=R.$$watchers,K={fn:B,last:U,get:O,exp:E||m,eq:!!C};return n=null,W||(W=R.$$watchers=[],W.$$digestWatchIndex=-1),W.unshift(K),W.$$digestWatchIndex++,L(this,1),function(){var J=Dr(W,K);J>=0&&(L(R,-1),J<W.$$digestWatchIndex&&W.$$digestWatchIndex--),n=null}},$watchGroup:function(m,$){var C=new Array(m.length),E=new Array(m.length),O=[],B=this,R=!1,W=!0;if(!m.length){var K=!0;return B.$evalAsync(function(){K&&$(E,E,B)}),function(){K=!1}}if(m.length===1)return this.$watch(m[0],function(ie,Te,Se){E[0]=ie,C[0]=Te,$(E,ie===Te?E:C,Se)});M(m,function(J,ie){var Te=B.$watch(J,function(Me){E[ie]=Me,R||(R=!0,B.$evalAsync(ne))});O.push(Te)});function ne(){R=!1;try{W?(W=!1,$(E,E,B)):$(E,C,B)}finally{for(var J=0;J<m.length;J++)C[J]=E[J]}}return function(){for(;O.length;)O.shift()()}},$watchCollection:function(m,$){Se.$$pure=u(m).literal,Se.$stateful=!Se.$$pure;var C=this,E,O,B,R=$.length>1,W=0,K=u(m,Se),ne=[],J={},ie=!0,Te=0;function Se(Ue){E=Ue;var Be,Ge,ot,et,wt;if(!he(E)){if(!Y(E))O!==E&&(O=E,W++);else if(Le(E)){O!==ne&&(O=ne,Te=O.length=0,W++),Be=E.length,Te!==Be&&(W++,O.length=Te=Be);for(var pt=0;pt<Be;pt++)wt=O[pt],et=E[pt],ot=wt!==wt&&et!==et,!ot&&wt!==et&&(W++,O[pt]=et)}else{O!==J&&(O=J={},Te=0,W++),Be=0;for(Ge in E)$e.call(E,Ge)&&(Be++,et=E[Ge],wt=O[Ge],Ge in O?(ot=wt!==wt&&et!==et,!ot&&wt!==et&&(W++,O[Ge]=et)):(Te++,O[Ge]=et,W++));if(Te>Be){W++;for(Ge in O)$e.call(E,Ge)||(Te--,delete O[Ge])}}return W}}function Me(){if(ie?(ie=!1,$(E,E,C)):$(E,B,C),R)if(!Y(E))B=E;else if(Le(E)){B=new Array(E.length);for(var Ue=0;Ue<E.length;Ue++)B[Ue]=E[Ue]}else{B={};for(var Be in E)$e.call(E,Be)&&(B[Be]=E[Be])}}return this.$watch(K,Me)},$digest:function(){var m,$,C,E,O,B,R,W=e,K,ne,J=g.length?p:this,ie=[],Te,Se;z(\"$digest\"),a.$$checkUrlChange(),this===p&&r!==null&&(a.defer.cancel(r),A()),n=null;do{R=!1,ne=J;for(var Me=0;Me<g.length;Me++){try{Se=g[Me],E=Se.fn,E(Se.scope,Se.locals)}catch(Ue){l(Ue)}n=null}g.length=0;e:do{if(B=!ne.$$suspended&&ne.$$watchers)for(B.$$digestWatchIndex=B.length;B.$$digestWatchIndex--;)try{if(m=B[B.$$digestWatchIndex],m){if(O=m.get,($=O(ne))!==(C=m.last)&&!(m.eq?tn($,C):je($)&&je(C)))R=!0,n=m,m.last=m.eq?Rn($,null):$,E=m.fn,E($,C===U?$:C,ne),W<5&&(Te=4-W,ie[Te]||(ie[Te]=[]),ie[Te].push({msg:ve(m.exp)?\"fn: \"+(m.exp.name||m.exp.toString()):m.exp,newVal:$,oldVal:C}));else if(m===n){R=!1;break e}}}catch(Ue){l(Ue)}if(!(K=!ne.$$suspended&&ne.$$watchersCount&&ne.$$childHead||ne!==J&&ne.$$nextSibling))for(;ne!==J&&!(K=ne.$$nextSibling);)ne=ne.$parent}while(ne=K);if((R||g.length)&&!W--)throw I(),t(\"infdig\",`{0} $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: {1}`,e,ie)}while(R||g.length);for(I();D<y.length;)try{y[D++]()}catch(Ue){l(Ue)}y.length=D=0,a.$$checkUrlChange()},$suspend:function(){this.$$suspended=!0},$isSuspended:function(){return this.$$suspended},$resume:function(){this.$$suspended=!1},$destroy:function(){if(!this.$$destroyed){var m=this.$parent;this.$broadcast(\"$destroy\"),this.$$destroyed=!0,this===p&&a.$$applicationDestroyed(),L(this,-this.$$watchersCount);for(var $ in this.$$listenerCount)F(this,this.$$listenerCount[$],$);m&&m.$$childHead===this&&(m.$$childHead=this.$$nextSibling),m&&m.$$childTail===this&&(m.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=we,this.$on=this.$watch=this.$watchGroup=function(){return we},this.$$listeners={},this.$$nextSibling=null,h(this)}},$eval:function(m,$){return u(m)(this,$)},$evalAsync:function(m,$){!p.$$phase&&!g.length&&a.defer(function(){g.length&&p.$digest()},null,\"$evalAsync\"),g.push({scope:this,fn:u(m),locals:$})},$$postDigest:function(m){y.push(m)},$apply:function(m){try{z(\"$apply\");try{return this.$eval(m)}finally{I()}}catch($){l($)}finally{try{p.$digest()}catch($){throw l($),$}}},$applyAsync:function(m){var $=this;m&&b.push(C),m=u(m),T();function C(){$.$eval(m)}},$on:function(m,$){var C=this.$$listeners[m];C||(this.$$listeners[m]=C=[]),C.push($);var E=this;do E.$$listenerCount[m]||(E.$$listenerCount[m]=0),E.$$listenerCount[m]++;while(E=E.$parent);var O=this;return function(){var B=C.indexOf($);B!==-1&&(delete C[B],F(O,1,m))}},$emit:function(m,$){var C=[],E,O=this,B=!1,R={name:m,targetScope:O,stopPropagation:function(){B=!0},preventDefault:function(){R.defaultPrevented=!0},defaultPrevented:!1},W=Ir([R],arguments,1),K,ne;do{for(E=O.$$listeners[m]||C,R.currentScope=O,K=0,ne=E.length;K<ne;K++){if(!E[K]){E.splice(K,1),K--,ne--;continue}try{E[K].apply(null,W)}catch(J){l(J)}}if(B)break;O=O.$parent}while(O);return R.currentScope=null,R},$broadcast:function(m,$){var C=this,E=C,O=C,B={name:m,targetScope:C,preventDefault:function(){B.defaultPrevented=!0},defaultPrevented:!1};if(!C.$$listenerCount[m])return B;for(var R=Ir([B],arguments,1),W,K,ne;E=O;){for(B.currentScope=E,W=E.$$listeners[m]||[],K=0,ne=W.length;K<ne;K++){if(!W[K]){W.splice(K,1),K--,ne--;continue}try{W[K].apply(null,R)}catch(J){l(J)}}if(!(O=E.$$listenerCount[m]&&E.$$childHead||E!==C&&E.$$nextSibling))for(;E!==C&&!(O=E.$$nextSibling);)E=E.$parent}return B.currentScope=null,B}};var p=new d,g=p.$$asyncQueue=[],y=p.$$postDigestQueue=[],b=p.$$applyAsyncQueue=[],D=0;return p;function z(m){if(p.$$phase)throw t(\"inprog\",\"{0} already in progress\",p.$$phase);p.$$phase=m}function I(){p.$$phase=null}function L(m,$){do m.$$watchersCount+=$;while(m=m.$parent)}function F(m,$,C){do m.$$listenerCount[C]-=$,m.$$listenerCount[C]===0&&delete m.$$listenerCount[C];while(m=m.$parent)}function U(){}function A(){for(;b.length;)try{b.shift()()}catch(m){l(m)}r=null}function T(){r===null&&(r=a.defer(function(){p.$apply(A)},null,\"$applyAsync\"))}}]}function Ih(){var e=/^\\s*(https?|s?ftp|mailto|tel|file):/,t=/^\\s*((https?|ftp|file|blob):|data:image\\/)/;this.aHrefSanitizationTrustedUrlList=function(n){return fe(n)?(e=n,this):e},this.imgSrcSanitizationTrustedUrlList=function(n){return fe(n)?(t=n,this):t},this.$get=function(){return function(r,i){var l=i?t:e,u=Nt(r&&r.trim()).href;return u!==\"\"&&!u.match(l)?\"unsafe:\"+u:r}}}var An=w(\"$sce\"),dt={HTML:\"html\",CSS:\"css\",MEDIA_URL:\"mediaUrl\",URL:\"url\",RESOURCE_URL:\"resourceUrl\",JS:\"js\"},Nh=/_([a-z])/g;function Us(e){return e.replace(Nh,Vo)}function qh(e){if(e===\"self\")return e;if(V(e)){if(e.indexOf(\"***\")>-1)throw An(\"iwcard\",\"Illegal sequence *** in string matcher.  String: {0}\",e);return e=Mo(e).replace(/\\\\\\*\\\\\\*/g,\".*\").replace(/\\\\\\*/g,\"[^:/.?&;]*\"),new RegExp(\"^\"+e+\"$\")}else{if(Tt(e))return new RegExp(\"^\"+e.source+\"$\");throw An(\"imatcher\",'Matchers may only be \"self\", string patterns or RegExp objects')}}function Ma(e){var t=[];return fe(e)&&M(e,function(n){t.push(qh(n))}),t}function Uh(){this.SCE_CONTEXTS=dt;var e=[\"self\"],t=[];this.trustedResourceUrlList=function(n){return arguments.length&&(e=Ma(n)),e},Object.defineProperty(this,\"resourceUrlWhitelist\",{get:function(){return this.trustedResourceUrlList},set:function(n){this.trustedResourceUrlList=n}}),this.bannedResourceUrlList=function(n){return arguments.length&&(t=Ma(n)),t},Object.defineProperty(this,\"resourceUrlBlacklist\",{get:function(){return this.bannedResourceUrlList},set:function(n){this.bannedResourceUrlList=n}}),this.$get=[\"$injector\",\"$$sanitizeUri\",function(n,r){var i=function(b){throw An(\"unsafe\",\"Attempting to use an unsafe value in a safe context.\")};n.has(\"$sanitize\")&&(i=n.get(\"$sanitize\"));function l(y,b){return y===\"self\"?Kh(b)||Zh(b):!!y.exec(b.href)}function u(y){var b=Nt(y.toString()),D,z,I=!1;for(D=0,z=e.length;D<z;D++)if(l(e[D],b)){I=!0;break}if(I){for(D=0,z=t.length;D<z;D++)if(l(t[D],b)){I=!1;break}}return I}function a(y){var b=function(z){this.$$unwrapTrustedValue=function(){return z}};return y&&(b.prototype=new y),b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()},b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()},b}var o=a(),h={};h[dt.HTML]=a(o),h[dt.CSS]=a(o),h[dt.MEDIA_URL]=a(o),h[dt.URL]=a(h[dt.MEDIA_URL]),h[dt.JS]=a(o),h[dt.RESOURCE_URL]=a(h[dt.URL]);function d(y,b){var D=h.hasOwnProperty(y)?h[y]:null;if(!D)throw An(\"icontext\",\"Attempted to trust a value in invalid context. Context: {0}; Value: {1}\",y,b);if(b===null||he(b)||b===\"\")return b;if(typeof b!=\"string\")throw An(\"itype\",\"Attempted to trust a non-string value in a content requiring a string: Context: {0}\",y);return new D(b)}function p(y){return y instanceof o?y.$$unwrapTrustedValue():y}function g(y,b){if(b===null||he(b)||b===\"\")return b;var D=h.hasOwnProperty(y)?h[y]:null;if(D&&b instanceof D)return b.$$unwrapTrustedValue();if(ve(b.$$unwrapTrustedValue)&&(b=b.$$unwrapTrustedValue()),y===dt.MEDIA_URL||y===dt.URL)return r(b.toString(),y===dt.MEDIA_URL);if(y===dt.RESOURCE_URL){if(u(b))return b;throw An(\"insecurl\",\"Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}\",b.toString())}else if(y===dt.HTML)return i(b);throw An(\"unsafe\",\"Attempting to use an unsafe value in a safe context.\")}return{trustAs:d,getTrusted:g,valueOf:p}}]}function Bh(){var e=!0;this.enabled=function(t){return arguments.length&&(e=!!t),e},this.$get=[\"$parse\",\"$sceDelegate\",function(t,n){if(e&&x<8)throw An(\"iequirks\",\"Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks mode.  You can fix this by adding the text <!doctype html> to the top of your HTML document.  See http://docs.angularjs.org/api/ng.$sce for more information.\");var r=nn(dt);r.isEnabled=function(){return e},r.trustAs=n.trustAs,r.getTrusted=n.getTrusted,r.valueOf=n.valueOf,e||(r.trustAs=r.getTrusted=function(a,o){return o},r.valueOf=_t),r.parseAs=function(o,h){var d=t(h);return d.literal&&d.constant?d:t(h,function(p){return r.getTrusted(o,p)})};var i=r.parseAs,l=r.getTrusted,u=r.trustAs;return M(dt,function(a,o){var h=pe(o);r[Us(\"parse_as_\"+h)]=function(d){return i(a,d)},r[Us(\"get_trusted_\"+h)]=function(d){return l(a,d)},r[Us(\"trust_as_\"+h)]=function(d){return u(a,d)}}),r}]}function Vh(){this.$get=[\"$window\",\"$document\",function(e,t){var n={},r=e.nw&&e.nw.process,i=!r&&e.chrome&&(e.chrome.app&&e.chrome.app.runtime||!e.chrome.app&&e.chrome.runtime&&e.chrome.runtime.id),l=!i&&e.history&&e.history.pushState,u=Ye((/android (\\d+)/.exec(pe((e.navigator||{}).userAgent))||[])[1]),a=/Boxee/i.test((e.navigator||{}).userAgent),o=t[0]||{},h=o.body&&o.body.style,d=!1,p=!1;return h&&(d=\"transition\"in h||\"webkitTransition\"in h,p=\"animation\"in h||\"webkitAnimation\"in h),{history:!!(l&&!(u<4)&&!a),hasEvent:function(g){if(g===\"input\"&&x)return!1;if(he(n[g])){var y=o.createElement(\"div\");n[g]=\"on\"+g in y}return n[g]},csp:Mn(),transitions:d,animations:p,android:u}}]}function jh(){this.$get=st(function(e){return new Hh(e)})}function Hh(e){var t=this,n={},r=[],i=t.ALL_TASKS_TYPE=\"$$all$$\",l=t.DEFAULT_TASK_TYPE=\"$$default$$\";t.completeTask=u,t.incTaskCount=d,t.notifyWhenNoPendingTasks=p;function u(g,y){y=y||l;try{g()}finally{a(y);var b=n[y],D=n[i];if(!D||!b)for(var z=D?h:o,I;I=z(y);)try{I()}catch(L){e.error(L)}}}function a(g){g=g||l,n[g]&&(n[g]--,n[i]--)}function o(){var g=r.pop();return g&&g.cb}function h(g){for(var y=r.length-1;y>=0;--y){var b=r[y];if(b.type===g)return r.splice(y,1),b.cb}}function d(g){g=g||l,n[g]=(n[g]||0)+1,n[i]=(n[i]||0)+1}function p(g,y){y=y||i,n[y]?r.push({type:y,cb:g}):g()}}var Wh=w(\"$templateRequest\");function zh(){var e;this.httpOptions=function(t){return t?(e=t,this):e},this.$get=[\"$exceptionHandler\",\"$templateCache\",\"$http\",\"$q\",\"$sce\",function(t,n,r,i,l){function u(a,o){u.totalPendingRequests++,(!V(a)||he(n.get(a)))&&(a=l.getTrustedResourceUrl(a));var h=r.defaults&&r.defaults.transformResponse;return oe(h)?h=h.filter(function(p){return p!==Ms}):h===Ms&&(h=null),r.get(a,Fe({cache:n,transformResponse:h},e)).finally(function(){u.totalPendingRequests--}).then(function(p){return n.put(a,p.data)},d);function d(p){return o||(p=Wh(\"tpload\",\"Failed to load template: {0} (HTTP status: {1} {2})\",a,p.status,p.statusText),t(p)),i.reject(p)}}return u.totalPendingRequests=0,u}]}function Gh(){this.$get=[\"$rootScope\",\"$browser\",\"$location\",function(e,t,n){var r={};return r.findBindings=function(i,l,u){var a=i.getElementsByClassName(\"ng-binding\"),o=[];return M(a,function(h){var d=ue.element(h).data(\"$binding\");d&&M(d,function(p){if(u){var g=new RegExp(\"(^|\\\\s)\"+Mo(l)+\"(\\\\s|\\\\||$)\");g.test(p)&&o.push(h)}else p.indexOf(l)!==-1&&o.push(h)})}),o},r.findModels=function(i,l,u){for(var a=[\"ng-\",\"data-ng-\",\"ng\\\\:\"],o=0;o<a.length;++o){var h=u?\"=\":\"*=\",d=\"[\"+a[o]+\"model\"+h+'\"'+l+'\"]',p=i.querySelectorAll(d);if(p.length)return p}},r.getLocation=function(){return n.url()},r.setLocation=function(i){i!==n.url()&&(n.url(i),e.$digest())},r.whenStable=function(i){t.notifyWhenNoOutstandingRequests(i)},r}]}var Xh=w(\"$timeout\");function Yh(){this.$get=[\"$rootScope\",\"$browser\",\"$q\",\"$$q\",\"$exceptionHandler\",function(e,t,n,r,i){var l={};function u(a,o,h){ve(a)||(h=o,o=a,a=we);var d=Nr(arguments,3),p=fe(h)&&!h,g=(p?r:n).defer(),y=g.promise,b;return b=t.defer(function(){try{g.resolve(a.apply(null,d))}catch(D){g.reject(D),i(D)}finally{delete l[y.$$timeoutId]}p||e.$apply()},o,\"$timeout\"),y.$$timeoutId=b,l[b]=g,y}return u.cancel=function(a){if(!a)return!1;if(!a.hasOwnProperty(\"$$timeoutId\"))throw Xh(\"badprom\",\"`$timeout.cancel()` called with a promise that was not generated by `$timeout()`.\");if(!l.hasOwnProperty(a.$$timeoutId))return!1;var o=a.$$timeoutId,h=l[o];return Ra(h.promise),h.reject(\"canceled\"),delete l[o],t.defer.cancel(o)},u}]}var Et=c.document.createElement(\"a\"),Fa=Nt(c.location.href),ir;Et.href=\"http://[::1]\";var Jh=Et.hostname===\"[::1]\";function Nt(e){if(!V(e))return e;var t=e;x&&(Et.setAttribute(\"href\",t),t=Et.href),Et.setAttribute(\"href\",t);var n=Et.hostname;return!Jh&&n.indexOf(\":\")>-1&&(n=\"[\"+n+\"]\"),{href:Et.href,protocol:Et.protocol?Et.protocol.replace(/:$/,\"\"):\"\",host:Et.host,search:Et.search?Et.search.replace(/^\\?/,\"\"):\"\",hash:Et.hash?Et.hash.replace(/^#/,\"\"):\"\",hostname:n,port:Et.port,pathname:Et.pathname.charAt(0)===\"/\"?Et.pathname:\"/\"+Et.pathname}}function Kh(e){return Bs(e,Fa)}function Zh(e){return Bs(e,ed())}function Qh(e){var t=[Fa].concat(e.map(Nt));return function(r){var i=Nt(r);return t.some(Bs.bind(null,i))}}function Bs(e,t){return e=Nt(e),t=Nt(t),e.protocol===t.protocol&&e.host===t.host}function ed(){return c.document.baseURI?c.document.baseURI:(ir||(ir=c.document.createElement(\"a\"),ir.href=\".\",ir=ir.cloneNode(!1)),ir.href)}function td(){this.$get=st(c)}function La(e){var t=e[0]||{},n={},r=\"\";function i(u){try{return u.cookie||\"\"}catch{return\"\"}}function l(u){try{return decodeURIComponent(u)}catch{return u}}return function(){var u,a,o,h,d,p=i(t);if(p!==r)for(r=p,u=r.split(\"; \"),n={},o=0;o<u.length;o++)a=u[o],h=a.indexOf(\"=\"),h>0&&(d=l(a.substring(0,h)),he(n[d])&&(n[d]=l(a.substring(h+1))));return n}}La.$inject=[\"$document\"];function nd(){this.$get=La}Da.$inject=[\"$provide\"];function Da(e){var t=\"Filter\";function n(r,i){if(Y(r)){var l={};return M(r,function(u,a){l[a]=n(a,u)}),l}else return e.factory(r+t,i)}this.register=n,this.$get=[\"$injector\",function(r){return function(i){return r.get(i+t)}}],n(\"currency\",qa),n(\"date\",Ha),n(\"filter\",rd),n(\"json\",pd),n(\"limitTo\",$d),n(\"lowercase\",vd),n(\"number\",Ua),n(\"orderBy\",Wa),n(\"uppercase\",gd)}function rd(){return function(e,t,n,r){if(!Le(e)){if(e==null)return e;throw w(\"filter\")(\"notarray\",\"Expected array but received: {0}\",e)}r=r||\"$\";var i=Vs(t),l,u;switch(i){case\"function\":l=t;break;case\"boolean\":case\"null\":case\"number\":case\"string\":u=!0;case\"object\":l=id(t,n,r,u);break;default:return e}return Array.prototype.filter.call(e,l)}}function id(e,t,n,r){var i=Y(e)&&n in e,l;return t===!0?t=tn:ve(t)||(t=function(u,a){return he(u)?!1:u===null||a===null?u===a:Y(a)||Y(u)&&!zt(u)?!1:(u=pe(\"\"+u),a=pe(\"\"+a),u.indexOf(a)!==-1)}),l=function(u){return i&&!Y(u)?Nn(u,e[n],t,n,!1):Nn(u,e,t,n,r)},l}function Nn(e,t,n,r,i,l){var u=Vs(e),a=Vs(t);if(a===\"string\"&&t.charAt(0)===\"!\")return!Nn(e,t.substring(1),n,r,i);if(oe(e))return e.some(function(g){return Nn(g,t,n,r,i)});switch(u){case\"object\":var o;if(i){for(o in e)if(o.charAt&&o.charAt(0)!==\"$\"&&Nn(e[o],t,n,r,!0))return!0;return l?!1:Nn(e,t,n,r,!1)}else if(a===\"object\"){for(o in t){var h=t[o];if(!(ve(h)||he(h))){var d=o===r,p=d?e:e[o];if(!Nn(p,h,n,r,d,d))return!1}}return!0}else return n(e,t);case\"function\":return!1;default:return n(e,t)}}function Vs(e){return e===null?\"null\":typeof e}var Ia=22,Na=\".\",js=\"0\";qa.$inject=[\"$locale\"];function qa(e){var t=e.NUMBER_FORMATS;return function(n,r,i){he(r)&&(r=t.CURRENCY_SYM),he(i)&&(i=t.PATTERNS[1].maxFrac);var l=r?/\\u00A4/g:/\\s*\\u00A4\\s*/g;return n==null?n:Ba(n,t.PATTERNS[1],t.GROUP_SEP,t.DECIMAL_SEP,i).replace(l,r)}}Ua.$inject=[\"$locale\"];function Ua(e){var t=e.NUMBER_FORMATS;return function(n,r){return n==null?n:Ba(n,t.PATTERNS[0],t.GROUP_SEP,t.DECIMAL_SEP,r)}}function sd(e){var t=0,n,r,i,l,u;for((r=e.indexOf(Na))>-1&&(e=e.replace(Na,\"\")),(i=e.search(/e/i))>0?(r<0&&(r=i),r+=+e.slice(i+1),e=e.substring(0,i)):r<0&&(r=e.length),i=0;e.charAt(i)===js;i++);if(i===(u=e.length))n=[0],r=1;else{for(u--;e.charAt(u)===js;)u--;for(r-=i,n=[],l=0;i<=u;i++,l++)n[l]=+e.charAt(i)}return r>Ia&&(n=n.splice(0,Ia-1),t=r-1,r=1),{d:n,e:t,i:r}}function od(e,t,n,r){var i=e.d,l=i.length-e.i;t=he(t)?Math.min(Math.max(n,l),r):+t;var u=t+e.i,a=i[u];if(u>0){i.splice(Math.max(e.i,u));for(var o=u;o<i.length;o++)i[o]=0}else{l=Math.max(0,l),e.i=1,i.length=Math.max(1,u=t+1),i[0]=0;for(var h=1;h<u;h++)i[h]=0}if(a>=5)if(u-1<0){for(var d=0;d>u;d--)i.unshift(0),e.i++;i.unshift(1),e.i++}else i[u-1]++;for(;l<Math.max(0,t);l++)i.push(0);var p=i.reduceRight(function(g,y,b,D){return y=y+g,D[b]=y%10,Math.floor(y/10)},0);p&&(i.unshift(p),e.i++)}function Ba(e,t,n,r,i){if(!(V(e)||de(e))||isNaN(e))return\"\";var l=!isFinite(e),u=!1,a=Math.abs(e)+\"\",o=\"\",h;if(l)o=\"\\u221E\";else{h=sd(a),od(h,i,t.minFrac,t.maxFrac);var d=h.d,p=h.i,g=h.e,y=[];for(u=d.reduce(function(D,z){return D&&!z},!0);p<0;)d.unshift(0),p++;p>0?y=d.splice(p,d.length):(y=d,d=[0]);var b=[];for(d.length>=t.lgSize&&b.unshift(d.splice(-t.lgSize,d.length).join(\"\"));d.length>t.gSize;)b.unshift(d.splice(-t.gSize,d.length).join(\"\"));d.length&&b.unshift(d.join(\"\")),o=b.join(n),y.length&&(o+=r+y.join(\"\")),g&&(o+=\"e+\"+g)}return e<0&&!u?t.negPre+o+t.negSuf:t.posPre+o+t.posSuf}function Oi(e,t,n,r){var i=\"\";for((e<0||r&&e<=0)&&(r?e=-e+1:(e=-e,i=\"-\")),e=\"\"+e;e.length<t;)e=js+e;return n&&(e=e.substr(e.length-t)),i+e}function kt(e,t,n,r,i){return n=n||0,function(l){var u=l[\"get\"+e]();return(n>0||u>-n)&&(u+=n),u===0&&n===-12&&(u=12),Oi(u,t,r,i)}}function zr(e,t,n){return function(r,i){var l=r[\"get\"+e](),u=(n?\"STANDALONE\":\"\")+(t?\"SHORT\":\"\"),a=Pe(u+e);return i[a][l]}}function ad(e,t,n){var r=-1*n,i=r>=0?\"+\":\"\";return i+=Oi(Math[r>0?\"floor\":\"ceil\"](r/60),2)+Oi(Math.abs(r%60),2),i}function Va(e){var t=new Date(e,0,1).getDay();return new Date(e,0,(t<=4?5:12)-t)}function ud(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate()+(4-e.getDay()))}function ja(e){return function(t){var n=Va(t.getFullYear()),r=ud(t),i=+r-+n,l=1+Math.round(i/6048e5);return Oi(l,e)}}function cd(e,t){return e.getHours()<12?t.AMPMS[0]:t.AMPMS[1]}function Hs(e,t){return e.getFullYear()<=0?t.ERAS[0]:t.ERAS[1]}function fd(e,t){return e.getFullYear()<=0?t.ERANAMES[0]:t.ERANAMES[1]}var ld={yyyy:kt(\"FullYear\",4,0,!1,!0),yy:kt(\"FullYear\",2,0,!0,!0),y:kt(\"FullYear\",1,0,!1,!0),MMMM:zr(\"Month\"),MMM:zr(\"Month\",!0),MM:kt(\"Month\",2,1),M:kt(\"Month\",1,1),LLLL:zr(\"Month\",!1,!0),dd:kt(\"Date\",2),d:kt(\"Date\",1),HH:kt(\"Hours\",2),H:kt(\"Hours\",1),hh:kt(\"Hours\",2,-12),h:kt(\"Hours\",1,-12),mm:kt(\"Minutes\",2),m:kt(\"Minutes\",1),ss:kt(\"Seconds\",2),s:kt(\"Seconds\",1),sss:kt(\"Milliseconds\",3),EEEE:zr(\"Day\"),EEE:zr(\"Day\",!0),a:cd,Z:ad,ww:ja(2),w:ja(1),G:Hs,GG:Hs,GGG:Hs,GGGG:fd},hd=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))([\\s\\S]*)/,dd=/^-?\\d+$/;Ha.$inject=[\"$locale\"];function Ha(e){var t=/^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;function n(r){var i;if(i=r.match(t)){var l=new Date(0),u=0,a=0,o=i[8]?l.setUTCFullYear:l.setFullYear,h=i[8]?l.setUTCHours:l.setHours;i[9]&&(u=Ye(i[9]+i[10]),a=Ye(i[9]+i[11])),o.call(l,Ye(i[1]),Ye(i[2])-1,Ye(i[3]));var d=Ye(i[4]||0)-u,p=Ye(i[5]||0)-a,g=Ye(i[6]||0),y=Math.round(parseFloat(\"0.\"+(i[7]||0))*1e3);return h.call(l,d,p,g,y),l}return r}return function(r,i,l){var u=\"\",a=[],o,h;if(i=i||\"mediumDate\",i=e.DATETIME_FORMATS[i]||i,V(r)&&(r=dd.test(r)?Ye(r):n(r)),de(r)&&(r=new Date(r)),!Ee(r)||!isFinite(r.getTime()))return r;for(;i;)h=hd.exec(i),h?(a=Ir(a,h,1),i=a.pop()):(a.push(i),i=null);var d=r.getTimezoneOffset();return l&&(d=gs(l,d),r=$s(r,l,!0)),M(a,function(p){o=ld[p],u+=o?o(r,e.DATETIME_FORMATS,d):p===\"''\"?\"'\":p.replace(/(^'|'$)/g,\"\").replace(/''/g,\"'\")}),u}}function pd(){return function(e,t){return he(t)&&(t=2),qr(e,t)}}var vd=st(pe),gd=st(Pe);function $d(){return function(e,t,n){return Math.abs(Number(t))===1/0?t=Number(t):t=Ye(t),je(t)||(de(e)&&(e=e.toString()),!Le(e))?e:(n=!n||isNaN(n)?0:Ye(n),n=n<0?Math.max(0,e.length+n):n,t>=0?Ws(e,n,n+t):n===0?Ws(e,t,e.length):Ws(e,Math.max(0,n+t),n))}}function Ws(e,t,n){return V(e)?e.slice(t,n):se.call(e,t,n)}Wa.$inject=[\"$parse\"];function Wa(e){return function(u,a,o,h){if(u==null)return u;if(!Le(u))throw w(\"orderBy\")(\"notarray\",\"Expected array but received: {0}\",u);oe(a)||(a=[a]),a.length===0&&(a=[\"+\"]);var d=t(a),p=o?-1:1,g=ve(h)?h:l,y=Array.prototype.map.call(u,b);return y.sort(D),u=y.map(function(z){return z.value}),u;function b(z,I){return{value:z,tieBreaker:{value:I,type:\"number\",index:I},predicateValues:d.map(function(L){return i(L.get(z),I)})}}function D(z,I){for(var L=0,F=d.length;L<F;L++){var U=g(z.predicateValues[L],I.predicateValues[L]);if(U)return U*d[L].descending*p}return(g(z.tieBreaker,I.tieBreaker)||l(z.tieBreaker,I.tieBreaker))*p}};function t(u){return u.map(function(a){var o=1,h=_t;if(ve(a))h=a;else if(V(a)&&((a.charAt(0)===\"+\"||a.charAt(0)===\"-\")&&(o=a.charAt(0)===\"-\"?-1:1,a=a.substring(1)),a!==\"\"&&(h=e(a),h.constant))){var d=h();h=function(p){return p[d]}}return{get:h,descending:o}})}function n(u){switch(typeof u){case\"number\":case\"boolean\":case\"string\":return!0;default:return!1}}function r(u){return ve(u.valueOf)&&(u=u.valueOf(),n(u))||zt(u)&&(u=u.toString(),n(u)),u}function i(u,a){var o=typeof u;return u===null?o=\"null\":o===\"object\"&&(u=r(u)),{value:u,type:o,index:a}}function l(u,a){var o=0,h=u.type,d=a.type;if(h===d){var p=u.value,g=a.value;h===\"string\"?(p=p.toLowerCase(),g=g.toLowerCase()):h===\"object\"&&(Y(p)&&(p=u.index),Y(g)&&(g=a.index)),p!==g&&(o=p<g?-1:1)}else o=h===\"undefined\"?1:d===\"undefined\"?-1:h===\"null\"?1:d===\"null\"||h<d?-1:1;return o}}function sr(e){return ve(e)&&(e={link:e}),e.restrict=e.restrict||\"AC\",st(e)}var md=st({restrict:\"E\",compile:function(e,t){if(!t.href&&!t.xlinkHref)return function(n,r){if(r[0].nodeName.toLowerCase()===\"a\"){var i=P.call(r.prop(\"href\"))===\"[object SVGAnimatedString]\"?\"xlink:href\":\"href\";r.on(\"click\",function(l){r.attr(i)||l.preventDefault()})}}}}),xi={};M(Ci,function(e,t){if(e===\"multiple\")return;function n(l,u,a){l.$watch(a[r],function(h){a.$set(t,!!h)})}var r=rn(\"ng-\"+t),i=n;e===\"checked\"&&(i=function(l,u,a){a.ngModel!==a[r]&&n(l,u,a)}),xi[r]=function(){return{restrict:\"A\",priority:100,link:i}}}),M(ea,function(e,t){xi[t]=function(){return{priority:100,link:function(n,r,i){if(t===\"ngPattern\"&&i.ngPattern.charAt(0)===\"/\"){var l=i.ngPattern.match(q);if(l){i.$set(\"ngPattern\",new RegExp(l[1],l[2]));return}}n.$watch(i[t],function(a){i.$set(t,a)})}}}}),M([\"src\",\"srcset\",\"href\"],function(e){var t=rn(\"ng-\"+e);xi[t]=[\"$sce\",function(n){return{priority:99,link:function(r,i,l){var u=e,a=e;e===\"href\"&&P.call(i.prop(\"href\"))===\"[object SVGAnimatedString]\"&&(a=\"xlinkHref\",l.$attr[a]=\"xlink:href\",u=null),l.$set(t,n.getTrustedMediaUrl(l[t])),l.$observe(t,function(o){if(!o){e===\"href\"&&l.$set(a,null);return}l.$set(a,o),x&&u&&i.prop(u,l[a])})}}}]});var Gr={$addControl:we,$getControls:st([]),$$renameControl:yd,$removeControl:we,$setValidity:we,$setDirty:we,$setPristine:we,$setSubmitted:we,$$setSubmitted:we},za=\"ng-pending\",Ga=\"ng-submitted\";function yd(e,t){e.$name=t}Pi.$inject=[\"$element\",\"$attrs\",\"$scope\",\"$animate\",\"$interpolate\"];function Pi(e,t,n,r,i){this.$$controls=[],this.$error={},this.$$success={},this.$pending=void 0,this.$name=i(t.name||t.ngForm||\"\")(n),this.$dirty=!1,this.$pristine=!0,this.$valid=!0,this.$invalid=!1,this.$submitted=!1,this.$$parentForm=Gr,this.$$element=e,this.$$animate=r,Ya(this)}Pi.prototype={$rollbackViewValue:function(){M(this.$$controls,function(e){e.$rollbackViewValue()})},$commitViewValue:function(){M(this.$$controls,function(e){e.$commitViewValue()})},$addControl:function(e){Qn(e.$name,\"input\"),this.$$controls.push(e),e.$name&&(this[e.$name]=e),e.$$parentForm=this},$getControls:function(){return nn(this.$$controls)},$$renameControl:function(e,t){var n=e.$name;this[n]===e&&delete this[n],this[t]=e,e.$name=t},$removeControl:function(e){e.$name&&this[e.$name]===e&&delete this[e.$name],M(this.$pending,function(t,n){this.$setValidity(n,null,e)},this),M(this.$error,function(t,n){this.$setValidity(n,null,e)},this),M(this.$$success,function(t,n){this.$setValidity(n,null,e)},this),Dr(this.$$controls,e),e.$$parentForm=Gr},$setDirty:function(){this.$$animate.removeClass(this.$$element,ar),this.$$animate.addClass(this.$$element,Mi),this.$dirty=!0,this.$pristine=!1,this.$$parentForm.$setDirty()},$setPristine:function(){this.$$animate.setClass(this.$$element,ar,Mi+\" \"+Ga),this.$dirty=!1,this.$pristine=!0,this.$submitted=!1,M(this.$$controls,function(e){e.$setPristine()})},$setUntouched:function(){M(this.$$controls,function(e){e.$setUntouched()})},$setSubmitted:function(){for(var e=this;e.$$parentForm&&e.$$parentForm!==Gr;)e=e.$$parentForm;e.$$setSubmitted()},$$setSubmitted:function(){this.$$animate.addClass(this.$$element,Ga),this.$submitted=!0,M(this.$$controls,function(e){e.$$setSubmitted&&e.$$setSubmitted()})}},Ja({clazz:Pi,set:function(e,t,n){var r=e[t];if(!r)e[t]=[n];else{var i=r.indexOf(n);i===-1&&r.push(n)}},unset:function(e,t,n){var r=e[t];!r||(Dr(r,n),r.length===0&&delete e[t])}});var Xa=function(e){return[\"$timeout\",\"$parse\",function(t,n){var r={name:\"form\",restrict:e?\"EAC\":\"E\",require:[\"form\",\"^^?form\"],controller:Pi,compile:function(u,a){u.addClass(ar).addClass(Yr);var o=a.name?\"name\":e&&a.ngForm?\"ngForm\":!1;return{pre:function(d,p,g,y){var b=y[0];if(!(\"action\"in g)){var D=function(L){d.$apply(function(){b.$commitViewValue(),b.$setSubmitted()}),L.preventDefault()};p[0].addEventListener(\"submit\",D),p.on(\"$destroy\",function(){t(function(){p[0].removeEventListener(\"submit\",D)},0,!1)})}var z=y[1]||b.$$parentForm;z.$addControl(b);var I=o?i(b.$name):we;o&&(I(d,b),g.$observe(o,function(L){b.$name!==L&&(I(d,void 0),b.$$parentForm.$$renameControl(b,L),I=i(b.$name),I(d,b))})),p.on(\"$destroy\",function(){b.$$parentForm.$removeControl(b),I(d,void 0),Fe(b,Gr)})}}}};return r;function i(l){return l===\"\"?n('this[\"\"]').assign:n(l).assign||we}}]},bd=Xa(),Cd=Xa(!0);function Ya(e){e.$$classCache={},e.$$classCache[fu]=!(e.$$classCache[Yr]=e.$$element.hasClass(Yr))}function Ja(e){var t=e.clazz,n=e.set,r=e.unset;t.prototype.$setValidity=function(o,h,d){he(h)?i(this,\"$pending\",o,d):l(this,\"$pending\",o,d),$n(h)?h?(r(this.$error,o,d),n(this.$$success,o,d)):(n(this.$error,o,d),r(this.$$success,o,d)):(r(this.$error,o,d),r(this.$$success,o,d)),this.$pending?(u(this,za,!0),this.$valid=this.$invalid=void 0,a(this,\"\",null)):(u(this,za,!1),this.$valid=Ka(this.$error),this.$invalid=!this.$valid,a(this,\"\",this.$valid));var p;this.$pending&&this.$pending[o]?p=void 0:this.$error[o]?p=!1:this.$$success[o]?p=!0:p=null,a(this,o,p),this.$$parentForm.$setValidity(o,p,this)};function i(o,h,d,p){o[h]||(o[h]={}),n(o[h],d,p)}function l(o,h,d,p){o[h]&&r(o[h],d,p),Ka(o[h])&&(o[h]=void 0)}function u(o,h,d){d&&!o.$$classCache[h]?(o.$$animate.addClass(o.$$element,h),o.$$classCache[h]=!0):!d&&o.$$classCache[h]&&(o.$$animate.removeClass(o.$$element,h),o.$$classCache[h]=!1)}function a(o,h,d){h=h?\"-\"+qo(h,\"-\"):\"\",u(o,Yr+h,d===!0),u(o,fu+h,d===!1)}}function Ka(e){if(e){for(var t in e)if(e.hasOwnProperty(t))return!1}return!0}var Ed=/^\\d{4,}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+(?:[+-][0-2]\\d:[0-5]\\d|Z)$/,wd=/^[a-z][a-z\\d.+-]*:\\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\\s:/?#]+|\\[[a-f\\d:]+])(?::\\d+)?(?:\\/[^?#]*)?(?:\\?[^#]*)?(?:#.*)?$/i,Ad=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,Sd=/^\\s*(-|\\+)?(\\d+|(\\d*(\\.\\d*)))([eE][+-]?\\d+)?\\s*$/,Za=/^(\\d{4,})-(\\d{2})-(\\d{2})$/,Qa=/^(\\d{4,})-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/,zs=/^(\\d{4,})-W(\\d\\d)$/,eu=/^(\\d{4,})-(\\d\\d)$/,tu=/^(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/,_d=\"keydown wheel mousedown\",nu=nt();M(\"date,datetime-local,month,time,week\".split(\",\"),function(e){nu[e]=!0});var ru={text:Td,date:Xr(\"date\",Za,Ri(Za,[\"yyyy\",\"MM\",\"dd\"]),\"yyyy-MM-dd\"),\"datetime-local\":Xr(\"datetimelocal\",Qa,Ri(Qa,[\"yyyy\",\"MM\",\"dd\",\"HH\",\"mm\",\"ss\",\"sss\"]),\"yyyy-MM-ddTHH:mm:ss.sss\"),time:Xr(\"time\",tu,Ri(tu,[\"HH\",\"mm\",\"ss\",\"sss\"]),\"HH:mm:ss.sss\"),week:Xr(\"week\",zs,kd,\"yyyy-Www\"),month:Xr(\"month\",eu,Ri(eu,[\"yyyy\",\"MM\"]),\"yyyy-MM\"),number:Od,url:Pd,email:Rd,radio:Md,range:xd,checkbox:Fd,hidden:we,button:we,submit:we,reset:we,file:we};function Gs(e){e.$formatters.push(function(t){return e.$isEmpty(t)?t:t.toString()})}function Td(e,t,n,r,i,l){or(e,t,n,r,i,l),Gs(r)}function or(e,t,n,r,i,l){var u=pe(t[0].type);if(!i.android){var a=!1;t.on(\"compositionstart\",function(){a=!0}),t.on(\"compositionupdate\",function(p){(he(p.data)||p.data===\"\")&&(a=!1)}),t.on(\"compositionend\",function(){a=!1,h()})}var o,h=function(p){if(o&&(l.defer.cancel(o),o=null),!a){var g=t.val(),y=p&&p.type;u!==\"password\"&&(!n.ngTrim||n.ngTrim!==\"false\")&&(g=tt(g)),(r.$viewValue!==g||g===\"\"&&r.$$hasNativeValidators)&&r.$setViewValue(g,y)}};if(i.hasEvent(\"input\"))t.on(\"input\",h);else{var d=function(p,g,y){o||(o=l.defer(function(){o=null,(!g||g.value!==y)&&h(p)}))};t.on(\"keydown\",function(p){var g=p.keyCode;g===91||15<g&&g<19||37<=g&&g<=40||d(p,this,this.value)}),i.hasEvent(\"paste\")&&t.on(\"paste cut drop\",d)}t.on(\"change\",h),nu[u]&&r.$$hasNativeValidators&&u===n.type&&t.on(_d,function(p){if(!o){var g=this[ae],y=g.badInput,b=g.typeMismatch;o=l.defer(function(){o=null,(g.badInput!==y||g.typeMismatch!==b)&&h(p)})}}),r.$render=function(){var p=r.$isEmpty(r.$viewValue)?\"\":r.$viewValue;t.val()!==p&&t.val(p)}}function kd(e,t){if(Ee(e))return e;if(V(e)){zs.lastIndex=0;var n=zs.exec(e);if(n){var r=+n[1],i=+n[2],l=0,u=0,a=0,o=0,h=Va(r),d=(i-1)*7;return t&&(l=t.getHours(),u=t.getMinutes(),a=t.getSeconds(),o=t.getMilliseconds()),new Date(r,0,h.getDate()+d,l,u,a,o)}}return NaN}function Ri(e,t){return function(n,r){var i,l;if(Ee(n))return n;if(V(n)){if(n.charAt(0)==='\"'&&n.charAt(n.length-1)==='\"'&&(n=n.substring(1,n.length-1)),Ed.test(n))return new Date(n);if(e.lastIndex=0,i=e.exec(n),i){i.shift(),r?l={yyyy:r.getFullYear(),MM:r.getMonth()+1,dd:r.getDate(),HH:r.getHours(),mm:r.getMinutes(),ss:r.getSeconds(),sss:r.getMilliseconds()/1e3}:l={yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},M(i,function(a,o){o<t.length&&(l[t[o]]=+a)});var u=new Date(l.yyyy,l.MM-1,l.dd,l.HH,l.mm,l.ss||0,l.sss*1e3||0);return l.yyyy<100&&u.setFullYear(l.yyyy),u}}return NaN}}function Xr(e,t,n,r){return function(l,u,a,o,h,d,p,g){Xs(l,u,a,o,e),or(l,u,a,o,h,d);var y=e===\"time\"||e===\"datetimelocal\",b,D;if(o.$parsers.push(function($){if(o.$isEmpty($))return null;if(t.test($))return T($,b);o.$$parserName=e}),o.$formatters.push(function($){if($&&!Ee($))throw Jr(\"datefmt\",\"Expected `{0}` to be a date\",$);if(U($)){b=$;var C=o.$options.getOption(\"timezone\");return C&&(D=C,b=$s(b,C,!0)),m($,C)}else return b=null,D=null,\"\"}),fe(a.min)||a.ngMin){var z=a.min||g(a.ngMin)(l),I=A(z);o.$validators.min=function($){return!U($)||he(I)||n($)>=I},a.$observe(\"min\",function($){$!==z&&(I=A($),z=$,o.$validate())})}if(fe(a.max)||a.ngMax){var L=a.max||g(a.ngMax)(l),F=A(L);o.$validators.max=function($){return!U($)||he(F)||n($)<=F},a.$observe(\"max\",function($){$!==L&&(F=A($),L=$,o.$validate())})}function U($){return $&&!($.getTime&&$.getTime()!==$.getTime())}function A($){return fe($)&&!Ee($)?T($)||void 0:$}function T($,C){var E=o.$options.getOption(\"timezone\");D&&D!==E&&(C=Do(C,gs(D)));var O=n($,C);return!isNaN(O)&&E&&(O=$s(O,E)),O}function m($,C){var E=r;y&&V(o.$options.getOption(\"timeSecondsFormat\"))&&(E=r.replace(\"ss.sss\",o.$options.getOption(\"timeSecondsFormat\")).replace(/:$/,\"\"));var O=p(\"date\")($,E,C);return y&&o.$options.getOption(\"timeStripZeroSeconds\")&&(O=O.replace(/(?::00)?(?:\\.000)?$/,\"\")),O}}}function Xs(e,t,n,r,i){var l=t[0],u=r.$$hasNativeValidators=Y(l.validity);u&&r.$parsers.push(function(a){var o=t.prop(ae)||{};if(o.badInput||o.typeMismatch){r.$$parserName=i;return}return a})}function iu(e){e.$parsers.push(function(t){if(e.$isEmpty(t))return null;if(Sd.test(t))return parseFloat(t);e.$$parserName=\"number\"}),e.$formatters.push(function(t){if(!e.$isEmpty(t)){if(!de(t))throw Jr(\"numfmt\",\"Expected `{0}` to be a number\",t);t=t.toString()}return t})}function Xt(e){return fe(e)&&!de(e)&&(e=parseFloat(e)),je(e)?void 0:e}function Ys(e){return(e|0)===e}function Js(e){var t=e.toString(),n=t.indexOf(\".\");if(n===-1){if(-1<e&&e<1){var r=/e-(\\d+)$/.exec(t);if(r)return Number(r[1])}return 0}return t.length-n-1}function su(e,t,n){var r=Number(e),i=!Ys(r),l=!Ys(t),u=!Ys(n);if(i||l||u){var a=i?Js(r):0,o=l?Js(t):0,h=u?Js(n):0,d=Math.max(a,o,h),p=Math.pow(10,d);r=r*p,t=t*p,n=n*p,i&&(r=Math.round(r)),l&&(t=Math.round(t)),u&&(n=Math.round(n))}return(r-t)%n===0}function Od(e,t,n,r,i,l,u,a){Xs(e,t,n,r,\"number\"),iu(r),or(e,t,n,r,i,l);var o;if(fe(n.min)||n.ngMin){var h=n.min||a(n.ngMin)(e);o=Xt(h),r.$validators.min=function(b,D){return r.$isEmpty(D)||he(o)||D>=o},n.$observe(\"min\",function(b){b!==h&&(o=Xt(b),h=b,r.$validate())})}if(fe(n.max)||n.ngMax){var d=n.max||a(n.ngMax)(e),p=Xt(d);r.$validators.max=function(b,D){return r.$isEmpty(D)||he(p)||D<=p},n.$observe(\"max\",function(b){b!==d&&(p=Xt(b),d=b,r.$validate())})}if(fe(n.step)||n.ngStep){var g=n.step||a(n.ngStep)(e),y=Xt(g);r.$validators.step=function(b,D){return r.$isEmpty(D)||he(y)||su(D,o||0,y)},n.$observe(\"step\",function(b){b!==g&&(y=Xt(b),g=b,r.$validate())})}}function xd(e,t,n,r,i,l){Xs(e,t,n,r,\"range\"),iu(r),or(e,t,n,r,i,l);var u=r.$$hasNativeValidators&&t[0].type===\"range\",a=u?0:void 0,o=u?100:void 0,h=u?1:void 0,d=t[0].validity,p=fe(n.min),g=fe(n.max),y=fe(n.step),b=r.$render;r.$render=u&&fe(d.rangeUnderflow)&&fe(d.rangeOverflow)?function(){b(),r.$setViewValue(t.val())}:b,p&&(a=Xt(n.min),r.$validators.min=u?function(){return!0}:function(U,A){return r.$isEmpty(A)||he(a)||A>=a},D(\"min\",z)),g&&(o=Xt(n.max),r.$validators.max=u?function(){return!0}:function(U,A){return r.$isEmpty(A)||he(o)||A<=o},D(\"max\",I)),y&&(h=Xt(n.step),r.$validators.step=u?function(){return!d.stepMismatch}:function(U,A){return r.$isEmpty(A)||he(h)||su(A,a||0,h)},D(\"step\",L));function D(F,U){t.attr(F,n[F]);var A=n[F];n.$observe(F,function(m){m!==A&&(A=m,U(m))})}function z(F){if(a=Xt(F),!je(r.$modelValue))if(u){var U=t.val();a>U&&(U=a,t.val(U)),r.$setViewValue(U)}else r.$validate()}function I(F){if(o=Xt(F),!je(r.$modelValue))if(u){var U=t.val();o<U&&(t.val(o),U=o<a?a:o),r.$setViewValue(U)}else r.$validate()}function L(F){h=Xt(F),!je(r.$modelValue)&&(u?r.$viewValue!==t.val()&&r.$setViewValue(t.val()):r.$validate())}}function Pd(e,t,n,r,i,l){or(e,t,n,r,i,l),Gs(r),r.$validators.url=function(u,a){var o=u||a;return r.$isEmpty(o)||wd.test(o)}}function Rd(e,t,n,r,i,l){or(e,t,n,r,i,l),Gs(r),r.$validators.email=function(u,a){var o=u||a;return r.$isEmpty(o)||Ad.test(o)}}function Md(e,t,n,r){var i=!n.ngTrim||tt(n.ngTrim)!==\"false\";he(n.name)&&t.attr(\"name\",vt());var l=function(u){var a;t[0].checked&&(a=n.value,i&&(a=tt(a)),r.$setViewValue(a,u&&u.type))};t.on(\"change\",l),r.$render=function(){var u=n.value;i&&(u=tt(u)),t[0].checked=u===r.$viewValue},n.$observe(\"value\",r.$render)}function ou(e,t,n,r,i){var l;if(fe(r)){if(l=e(r),!l.constant)throw Jr(\"constexpr\",\"Expected constant expression for `{0}`, but saw `{1}`.\",n,r);return l(t)}return i}function Fd(e,t,n,r,i,l,u,a){var o=ou(a,e,\"ngTrueValue\",n.ngTrueValue,!0),h=ou(a,e,\"ngFalseValue\",n.ngFalseValue,!1),d=function(p){r.$setViewValue(t[0].checked,p&&p.type)};t.on(\"change\",d),r.$render=function(){t[0].checked=r.$viewValue},r.$isEmpty=function(p){return p===!1},r.$formatters.push(function(p){return tn(p,o)}),r.$parsers.push(function(p){return p?o:h})}var au=[\"$browser\",\"$sniffer\",\"$filter\",\"$parse\",function(e,t,n,r){return{restrict:\"E\",require:[\"?ngModel\"],link:{pre:function(i,l,u,a){a[0]&&(ru[pe(u.type)]||ru.text)(i,l,u,a[0],t,e,n,r)}}}}],Ld=function(){var e={configurable:!0,enumerable:!1,get:function(){return this.getAttribute(\"value\")||\"\"},set:function(t){this.setAttribute(\"value\",t)}};return{restrict:\"E\",priority:200,compile:function(t,n){if(pe(n.type)===\"hidden\")return{pre:function(r,i,l,u){var a=i[0];a.parentNode&&a.parentNode.insertBefore(a,a.nextSibling),Object.defineProperty&&Object.defineProperty(a,\"value\",e)}}}}},Dd=/^(true|false|\\d+)$/,Id=function(){function e(t,n,r){var i=fe(r)?r:x===9?\"\":null;t.prop(\"value\",i),n.$set(\"value\",r)}return{restrict:\"A\",priority:100,compile:function(t,n){return Dd.test(n.ngValue)?function(i,l,u){var a=i.$eval(u.ngValue);e(l,u,a)}:function(i,l,u){i.$watch(u.ngValue,function(o){e(l,u,o)})}}}},Nd=[\"$compile\",function(e){return{restrict:\"AC\",compile:function(n){return e.$$addBindingClass(n),function(i,l,u){e.$$addBindingInfo(l,u.ngBind),l=l[0],i.$watch(u.ngBind,function(o){l.textContent=bs(o)})}}}}],qd=[\"$interpolate\",\"$compile\",function(e,t){return{compile:function(r){return t.$$addBindingClass(r),function(l,u,a){var o=e(u.attr(a.$attr.ngBindTemplate));t.$$addBindingInfo(u,o.expressions),u=u[0],a.$observe(\"ngBindTemplate\",function(h){u.textContent=he(h)?\"\":h})}}}}],Ud=[\"$sce\",\"$parse\",\"$compile\",function(e,t,n){return{restrict:\"A\",compile:function(i,l){var u=t(l.ngBindHtml),a=t(l.ngBindHtml,function(h){return e.valueOf(h)});return n.$$addBindingClass(i),function(h,d,p){n.$$addBindingInfo(d,p.ngBindHtml),h.$watch(a,function(){var y=u(h);d.html(e.getTrustedHtml(y)||\"\")})}}}}],Bd=st({restrict:\"A\",require:\"ngModel\",link:function(e,t,n,r){r.$viewChangeListeners.push(function(){e.$eval(n.ngChange)})}});function Ks(e,t){e=\"ngClass\"+e;var n;return[\"$parse\",function(u){return{restrict:\"AC\",link:function(a,o,h){var d=o.data(\"$classCounts\"),p=!0,g;d||(d=nt(),o.data(\"$classCounts\",d)),e!==\"ngClass\"&&(n||(n=u(\"$index\",function(U){return U&1})),a.$watch(n,I)),a.$watch(u(h[e],l),L);function y(F){F=z(i(F),1),h.$addClass(F)}function b(F){F=z(i(F),-1),h.$removeClass(F)}function D(F,U){var A=i(F),T=i(U),m=r(A,T),$=r(T,A),C=z(m,-1),E=z($,1);h.$addClass(E),h.$removeClass(C)}function z(F,U){var A=[];return M(F,function(T){(U>0||d[T])&&(d[T]=(d[T]||0)+U,d[T]===+(U>0)&&A.push(T))}),A.join(\" \")}function I(F){F===t?y(g):b(g),p=F}function L(F){p===t&&D(g,F),g=F}}}}];function r(u,a){if(!u||!u.length)return[];if(!a||!a.length)return u;var o=[];e:for(var h=0;h<u.length;h++){for(var d=u[h],p=0;p<a.length;p++)if(d===a[p])continue e;o.push(d)}return o}function i(u){return u&&u.split(\" \")}function l(u){if(!u)return u;var a=u;return oe(u)?a=u.map(l).join(\" \"):Y(u)?a=Object.keys(u).filter(function(o){return u[o]}).join(\" \"):V(u)||(a=u+\"\"),a}}var Vd=Ks(\"\",!0),jd=Ks(\"Odd\",0),Hd=Ks(\"Even\",1),Wd=sr({compile:function(e,t){t.$set(\"ngCloak\",void 0),e.removeClass(\"ng-cloak\")}}),zd=[function(){return{restrict:\"A\",scope:!0,controller:\"@\",priority:500}}],uu={},Gd={blur:!0,focus:!0};M(\"click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste\".split(\" \"),function(e){var t=rn(\"ng-\"+e);uu[t]=[\"$parse\",\"$rootScope\",\"$exceptionHandler\",function(n,r,i){return cu(n,r,i,t,e,Gd[e])}]});function cu(e,t,n,r,i,l){return{restrict:\"A\",compile:function(u,a){var o=e(a[r]);return function(d,p){p.on(i,function(g){var y=function(){o(d,{$event:g})};if(!t.$$phase)d.$apply(y);else if(l)d.$evalAsync(y);else try{y()}catch(b){n(b)}})}}}}var Xd=[\"$animate\",\"$compile\",function(e,t){return{multiElement:!0,transclude:\"element\",priority:600,terminal:!0,restrict:\"A\",$$tlb:!0,link:function(n,r,i,l,u){var a,o,h;n.$watch(i.ngIf,function(p){p?o||u(function(g,y){o=y,g[g.length++]=t.$$createComment(\"end ngIf\",i.ngIf),a={clone:g},e.enter(g,r.parent(),r)}):(h&&(h.remove(),h=null),o&&(o.$destroy(),o=null),a&&(h=li(a.clone),e.leave(h).done(function(g){g!==!1&&(h=null)}),a=null))})}}}],Yd=[\"$templateRequest\",\"$anchorScroll\",\"$animate\",function(e,t,n){return{restrict:\"ECA\",priority:400,terminal:!0,transclude:\"element\",controller:ue.noop,compile:function(r,i){var l=i.ngInclude||i.src,u=i.onload||\"\",a=i.autoscroll;return function(o,h,d,p,g){var y=0,b,D,z,I=function(){D&&(D.remove(),D=null),b&&(b.$destroy(),b=null),z&&(n.leave(z).done(function(L){L!==!1&&(D=null)}),D=z,z=null)};o.$watch(l,function(F){var U=function(T){T!==!1&&fe(a)&&(!a||o.$eval(a))&&t()},A=++y;F?(e(F,!0).then(function(T){if(!o.$$destroyed&&A===y){var m=o.$new();p.template=T;var $=g(m,function(C){I(),n.enter(C,null,h).done(U)});b=m,z=$,b.$emit(\"$includeContentLoaded\",F),o.$eval(u)}},function(){o.$$destroyed||A===y&&(I(),o.$emit(\"$includeContentError\",F))}),o.$emit(\"$includeContentRequested\",F)):(I(),p.template=null)})}}}}],Jd=[\"$compile\",function(e){return{restrict:\"ECA\",priority:-400,require:\"ngInclude\",link:function(t,n,r,i){if(P.call(n[0]).match(/SVG/)){n.empty(),e(zo(i.template,c.document).childNodes)(t,function(u){n.append(u)},{futureParentElement:n});return}n.html(i.template),e(n.contents())(t)}}}],Kd=sr({priority:450,compile:function(){return{pre:function(e,t,n){e.$eval(n.ngInit)}}}}),Zd=function(){return{restrict:\"A\",priority:100,require:\"ngModel\",link:function(e,t,n,r){var i=n.ngList||\", \",l=n.ngTrim!==\"false\",u=l?tt(i):i,a=function(o){if(!he(o)){var h=[];return o&&M(o.split(u),function(d){d&&h.push(l?tt(d):d)}),h}};r.$parsers.push(a),r.$formatters.push(function(o){if(oe(o))return o.join(i)}),r.$isEmpty=function(o){return!o||!o.length}}}},Yr=\"ng-valid\",fu=\"ng-invalid\",ar=\"ng-pristine\",Mi=\"ng-dirty\",Zs=\"ng-untouched\",lu=\"ng-touched\",hu=\"ng-empty\",du=\"ng-not-empty\",Jr=w(\"ngModel\");Fi.$inject=[\"$scope\",\"$exceptionHandler\",\"$attrs\",\"$element\",\"$parse\",\"$animate\",\"$timeout\",\"$q\",\"$interpolate\"];function Fi(e,t,n,r,i,l,u,a,o){this.$viewValue=Number.NaN,this.$modelValue=Number.NaN,this.$$rawModelValue=void 0,this.$validators={},this.$asyncValidators={},this.$parsers=[],this.$formatters=[],this.$viewChangeListeners=[],this.$untouched=!0,this.$touched=!1,this.$pristine=!0,this.$dirty=!1,this.$valid=!0,this.$invalid=!1,this.$error={},this.$$success={},this.$pending=void 0,this.$name=o(n.name||\"\",!1)(e),this.$$parentForm=Gr,this.$options=Li,this.$$updateEvents=\"\",this.$$updateEventHandler=this.$$updateEventHandler.bind(this),this.$$parsedNgModel=i(n.ngModel),this.$$parsedNgModelAssign=this.$$parsedNgModel.assign,this.$$ngModelGet=this.$$parsedNgModel,this.$$ngModelSet=this.$$parsedNgModelAssign,this.$$pendingDebounce=null,this.$$parserValid=void 0,this.$$parserName=\"parse\",this.$$currentValidationRunId=0,this.$$scope=e,this.$$rootScope=e.$root,this.$$attr=n,this.$$element=r,this.$$animate=l,this.$$timeout=u,this.$$parse=i,this.$$q=a,this.$$exceptionHandler=t,Ya(this),Qd(this)}Fi.prototype={$$initGetterSetters:function(){if(this.$options.getOption(\"getterSetter\")){var e=this.$$parse(this.$$attr.ngModel+\"()\"),t=this.$$parse(this.$$attr.ngModel+\"($$$p)\");this.$$ngModelGet=function(n){var r=this.$$parsedNgModel(n);return ve(r)&&(r=e(n)),r},this.$$ngModelSet=function(n,r){ve(this.$$parsedNgModel(n))?t(n,{$$$p:r}):this.$$parsedNgModelAssign(n,r)}}else if(!this.$$parsedNgModel.assign)throw Jr(\"nonassign\",\"Expression '{0}' is non-assignable. Element: {1}\",this.$$attr.ngModel,un(this.$$element))},$render:we,$isEmpty:function(e){return he(e)||e===\"\"||e===null||e!==e},$$updateEmptyClasses:function(e){this.$isEmpty(e)?(this.$$animate.removeClass(this.$$element,du),this.$$animate.addClass(this.$$element,hu)):(this.$$animate.removeClass(this.$$element,hu),this.$$animate.addClass(this.$$element,du))},$setPristine:function(){this.$dirty=!1,this.$pristine=!0,this.$$animate.removeClass(this.$$element,Mi),this.$$animate.addClass(this.$$element,ar)},$setDirty:function(){this.$dirty=!0,this.$pristine=!1,this.$$animate.removeClass(this.$$element,ar),this.$$animate.addClass(this.$$element,Mi),this.$$parentForm.$setDirty()},$setUntouched:function(){this.$touched=!1,this.$untouched=!0,this.$$animate.setClass(this.$$element,Zs,lu)},$setTouched:function(){this.$touched=!0,this.$untouched=!1,this.$$animate.setClass(this.$$element,lu,Zs)},$rollbackViewValue:function(){this.$$timeout.cancel(this.$$pendingDebounce),this.$viewValue=this.$$lastCommittedViewValue,this.$render()},$validate:function(){if(!je(this.$modelValue)){var e=this.$$lastCommittedViewValue,t=this.$$rawModelValue,n=this.$valid,r=this.$modelValue,i=this.$options.getOption(\"allowInvalid\"),l=this;this.$$runValidators(t,e,function(u){!i&&n!==u&&(l.$modelValue=u?t:void 0,l.$modelValue!==r&&l.$$writeModelToScope())})}},$$runValidators:function(e,t,n){this.$$currentValidationRunId++;var r=this.$$currentValidationRunId,i=this;if(!l()){h(!1);return}if(!u()){h(!1);return}a();function l(){var d=i.$$parserName;if(he(i.$$parserValid))o(d,null);else return i.$$parserValid||(M(i.$validators,function(p,g){o(g,null)}),M(i.$asyncValidators,function(p,g){o(g,null)})),o(d,i.$$parserValid),i.$$parserValid;return!0}function u(){var d=!0;return M(i.$validators,function(p,g){var y=Boolean(p(e,t));d=d&&y,o(g,y)}),d?!0:(M(i.$asyncValidators,function(p,g){o(g,null)}),!1)}function a(){var d=[],p=!0;M(i.$asyncValidators,function(g,y){var b=g(e,t);if(!ui(b))throw Jr(\"nopromise\",\"Expected asynchronous validator to return a promise but got '{0}' instead.\",b);o(y,void 0),d.push(b.then(function(){o(y,!0)},function(){p=!1,o(y,!1)}))}),d.length?i.$$q.all(d).then(function(){h(p)},we):h(!0)}function o(d,p){r===i.$$currentValidationRunId&&i.$setValidity(d,p)}function h(d){r===i.$$currentValidationRunId&&n(d)}},$commitViewValue:function(){var e=this.$viewValue;this.$$timeout.cancel(this.$$pendingDebounce),!(this.$$lastCommittedViewValue===e&&(e!==\"\"||!this.$$hasNativeValidators))&&(this.$$updateEmptyClasses(e),this.$$lastCommittedViewValue=e,this.$pristine&&this.$setDirty(),this.$$parseAndValidate())},$$parseAndValidate:function(){var e=this.$$lastCommittedViewValue,t=e,n=this;if(this.$$parserValid=he(t)?void 0:!0,this.$setValidity(this.$$parserName,null),this.$$parserName=\"parse\",this.$$parserValid){for(var r=0;r<this.$parsers.length;r++)if(t=this.$parsers[r](t),he(t)){this.$$parserValid=!1;break}}je(this.$modelValue)&&(this.$modelValue=this.$$ngModelGet(this.$$scope));var i=this.$modelValue,l=this.$options.getOption(\"allowInvalid\");this.$$rawModelValue=t,l&&(this.$modelValue=t,u()),this.$$runValidators(t,this.$$lastCommittedViewValue,function(a){l||(n.$modelValue=a?t:void 0,u())});function u(){n.$modelValue!==i&&n.$$writeModelToScope()}},$$writeModelToScope:function(){this.$$ngModelSet(this.$$scope,this.$modelValue),M(this.$viewChangeListeners,function(e){try{e()}catch(t){this.$$exceptionHandler(t)}},this)},$setViewValue:function(e,t){this.$viewValue=e,this.$options.getOption(\"updateOnDefault\")&&this.$$debounceViewValueCommit(t)},$$debounceViewValueCommit:function(e){var t=this.$options.getOption(\"debounce\");de(t[e])?t=t[e]:de(t.default)&&this.$options.getOption(\"updateOn\").indexOf(e)===-1?t=t.default:de(t[\"*\"])&&(t=t[\"*\"]),this.$$timeout.cancel(this.$$pendingDebounce);var n=this;t>0?this.$$pendingDebounce=this.$$timeout(function(){n.$commitViewValue()},t):this.$$rootScope.$$phase?this.$commitViewValue():this.$$scope.$apply(function(){n.$commitViewValue()})},$overrideModelOptions:function(e){this.$options=this.$options.createChild(e),this.$$setUpdateOnEvents()},$processModelValue:function(){var e=this.$$format();this.$viewValue!==e&&(this.$$updateEmptyClasses(e),this.$viewValue=this.$$lastCommittedViewValue=e,this.$render(),this.$$runValidators(this.$modelValue,this.$viewValue,we))},$$format:function(){for(var e=this.$formatters,t=e.length,n=this.$modelValue;t--;)n=e[t](n);return n},$$setModelValue:function(e){this.$modelValue=this.$$rawModelValue=e,this.$$parserValid=void 0,this.$processModelValue()},$$setUpdateOnEvents:function(){this.$$updateEvents&&this.$$element.off(this.$$updateEvents,this.$$updateEventHandler),this.$$updateEvents=this.$options.getOption(\"updateOn\"),this.$$updateEvents&&this.$$element.on(this.$$updateEvents,this.$$updateEventHandler)},$$updateEventHandler:function(e){this.$$debounceViewValueCommit(e&&e.type)}};function Qd(e){e.$$scope.$watch(function(n){var r=e.$$ngModelGet(n);return r!==e.$modelValue&&(e.$modelValue===e.$modelValue||r===r)&&e.$$setModelValue(r),r})}Ja({clazz:Fi,set:function(e,t){e[t]=!0},unset:function(e,t){delete e[t]}});var ep=[\"$rootScope\",function(e){return{restrict:\"A\",require:[\"ngModel\",\"^?form\",\"^?ngModelOptions\"],controller:Fi,priority:1,compile:function(n){return n.addClass(ar).addClass(Zs).addClass(Yr),{pre:function(i,l,u,a){var o=a[0],h=a[1]||o.$$parentForm,d=a[2];d&&(o.$options=d.$options),o.$$initGetterSetters(),h.$addControl(o),u.$observe(\"name\",function(p){o.$name!==p&&o.$$parentForm.$$renameControl(o,p)}),i.$on(\"$destroy\",function(){o.$$parentForm.$removeControl(o)})},post:function(i,l,u,a){var o=a[0];o.$$setUpdateOnEvents();function h(){o.$setTouched()}l.on(\"blur\",function(){o.$touched||(e.$$phase?i.$evalAsync(h):i.$apply(h))})}}}}}],Li,tp=/(\\s+|^)default(\\s+|$)/;function Qs(e){this.$$options=e}Qs.prototype={getOption:function(e){return this.$$options[e]},createChild:function(e){var t=!1;return e=Fe({},e),M(e,function(n,r){n===\"$inherit\"?r===\"*\"?t=!0:(e[r]=this.$$options[r],r===\"updateOn\"&&(e.updateOnDefault=this.$$options.updateOnDefault)):r===\"updateOn\"&&(e.updateOnDefault=!1,e[r]=tt(n.replace(tp,function(){return e.updateOnDefault=!0,\" \"})))},this),t&&(delete e[\"*\"],pu(e,this.$$options)),pu(e,Li.$$options),new Qs(e)}},Li=new Qs({updateOn:\"\",updateOnDefault:!0,debounce:0,getterSetter:!1,allowInvalid:!1,timezone:null});var np=function(){e.$inject=[\"$attrs\",\"$scope\"];function e(t,n){this.$$attrs=t,this.$$scope=n}return e.prototype={$onInit:function(){var t=this.parentCtrl?this.parentCtrl.$options:Li,n=this.$$scope.$eval(this.$$attrs.ngModelOptions);this.$options=t.createChild(n)}},{restrict:\"A\",priority:10,require:{parentCtrl:\"?^^ngModelOptions\"},bindToController:!0,controller:e}};function pu(e,t){M(t,function(n,r){fe(e[r])||(e[r]=n)})}var rp=sr({terminal:!0,priority:1e3}),ip=w(\"ngOptions\"),sp=/^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+group\\s+by\\s+([\\s\\S]+?))?(?:\\s+disable\\s+when\\s+([\\s\\S]+?))?\\s+for\\s+(?:([$\\w][$\\w]*)|(?:\\(\\s*([$\\w][$\\w]*)\\s*,\\s*([$\\w][$\\w]*)\\s*\\)))\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?$/,op=[\"$compile\",\"$document\",\"$parse\",function(e,t,n){function r(a,o,h){var d=a.match(sp);if(!d)throw ip(\"iexp\",\"Expected expression in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '{0}'. Element: {1}\",a,un(o));var p=d[5]||d[7],g=d[6],y=/ as /.test(d[0])&&d[1],b=d[9],D=n(d[2]?d[1]:p),z=y&&n(y),I=z||D,L=b&&n(b),F=b?function(R,W){return L(h,W)}:function(W){return nr(W)},U=function(R,W){return F(R,E(R,W))},A=n(d[2]||d[1]),T=n(d[3]||\"\"),m=n(d[4]||\"\"),$=n(d[8]),C={},E=g?function(R,W){return C[g]=W,C[p]=R,C}:function(R){return C[p]=R,C};function O(R,W,K,ne,J){this.selectValue=R,this.viewValue=W,this.label=K,this.group=ne,this.disabled=J}function B(R){var W;if(!g&&Le(R))W=R;else{W=[];for(var K in R)R.hasOwnProperty(K)&&K.charAt(0)!==\"$\"&&W.push(K)}return W}return{trackBy:b,getTrackByValue:U,getWatchables:n($,function(R){var W=[];R=R||[];for(var K=B(R),ne=K.length,J=0;J<ne;J++){var ie=R===K?J:K[J],Te=R[ie],Se=E(Te,ie),Me=F(Te,Se);if(W.push(Me),d[2]||d[1]){var Ue=A(h,Se);W.push(Ue)}if(d[4]){var Be=m(h,Se);W.push(Be)}}return W}),getOptions:function(){for(var R=[],W={},K=$(h)||[],ne=B(K),J=ne.length,ie=0;ie<J;ie++){var Te=K===ne?ie:ne[ie],Se=K[Te],Me=E(Se,Te),Ue=I(h,Me),Be=F(Ue,Me),Ge=A(h,Me),ot=T(h,Me),et=m(h,Me),wt=new O(Be,Ue,Ge,ot,et);R.push(wt),W[Be]=wt}return{items:R,selectValueMap:W,getOptionFromViewValue:function(pt){return W[U(pt)]},getViewValueFromOption:function(pt){return b?Rn(pt.viewValue):pt.viewValue}}}}}var i=c.document.createElement(\"option\"),l=c.document.createElement(\"optgroup\");function u(a,o,h,d){for(var p=d[0],g=d[1],y=h.multiple,b=0,D=o.children(),z=D.length;b<z;b++)if(D[b].value===\"\"){p.hasEmptyOption=!0,p.emptyOption=D.eq(b);break}o.empty();var I=!!p.emptyOption,L=S(i.cloneNode(!1));L.val(\"?\");var F,U=r(h.ngOptions,o,a),A=t[0].createDocumentFragment();p.generateUnknownOptionValue=function(E){return\"?\"},y?(p.writeValue=function(O){if(!!F){var B=O&&O.map(m)||[];F.items.forEach(function(R){R.element.selected&&!ps(B,R)&&(R.element.selected=!1)})}},p.readValue=function(){var O=o.val()||[],B=[];return M(O,function(R){var W=F.selectValueMap[R];W&&!W.disabled&&B.push(F.getViewValueFromOption(W))}),B},U.trackBy&&a.$watchCollection(function(){if(oe(g.$viewValue))return g.$viewValue.map(function(E){return U.getTrackByValue(E)})},function(){g.$render()})):(p.writeValue=function(O){if(!!F){var B=o[0].options[o[0].selectedIndex],R=F.getOptionFromViewValue(O);B&&B.removeAttribute(\"selected\"),R?(o[0].value!==R.selectValue&&(p.removeUnknownOption(),o[0].value=R.selectValue,R.element.selected=!0),R.element.setAttribute(\"selected\",\"selected\")):p.selectUnknownOrEmptyOption(O)}},p.readValue=function(){var O=F.selectValueMap[o.val()];return O&&!O.disabled?(p.unselectEmptyOption(),p.removeUnknownOption(),F.getViewValueFromOption(O)):null},U.trackBy&&a.$watch(function(){return U.getTrackByValue(g.$viewValue)},function(){g.$render()})),I&&(e(p.emptyOption)(a),o.prepend(p.emptyOption),p.emptyOption[0].nodeType===Br?(p.hasEmptyOption=!1,p.registerOption=function(E,O){O.val()===\"\"&&(p.hasEmptyOption=!0,p.emptyOption=O,p.emptyOption.removeClass(\"ng-scope\"),g.$render(),O.on(\"$destroy\",function(){var B=p.$isEmptyOptionSelected();p.hasEmptyOption=!1,p.emptyOption=void 0,B&&g.$render()}))}):p.emptyOption.removeClass(\"ng-scope\")),a.$watchCollection(U.getWatchables,C);function T(E,O){var B=i.cloneNode(!1);O.appendChild(B),$(E,B)}function m(E){var O=F.getOptionFromViewValue(E),B=O&&O.element;return B&&!B.selected&&(B.selected=!0),O}function $(E,O){E.element=O,O.disabled=E.disabled,E.label!==O.label&&(O.label=E.label,O.textContent=E.label),O.value=E.selectValue}function C(){var E=F&&p.readValue();if(F)for(var O=F.items.length-1;O>=0;O--){var B=F.items[O];fe(B.group)?bi(B.element.parentNode):bi(B.element)}F=U.getOptions();var R={};if(F.items.forEach(function(J){var ie;fe(J.group)?(ie=R[J.group],ie||(ie=l.cloneNode(!1),A.appendChild(ie),ie.label=J.group===null?\"null\":J.group,R[J.group]=ie),T(J,ie)):T(J,A)}),o[0].appendChild(A),g.$render(),!g.$isEmpty(E)){var W=p.readValue(),K=U.trackBy||y;(K?!tn(E,W):E!==W)&&(g.$setViewValue(W),g.$render())}}}return{restrict:\"A\",terminal:!0,require:[\"select\",\"ngModel\"],link:{pre:function(o,h,d,p){p[0].registerOption=we},post:u}}}],ap=[\"$locale\",\"$interpolate\",\"$log\",function(e,t,n){var r=/{}/g,i=/^when(Minus)?(.+)$/;return{link:function(l,u,a){var o=a.count,h=a.$attr.when&&u.attr(a.$attr.when),d=a.offset||0,p=l.$eval(h)||{},g={},y=t.startSymbol(),b=t.endSymbol(),D=y+o+\"-\"+d+b,z=ue.noop,I;M(a,function(F,U){var A=i.exec(U);if(A){var T=(A[1]?\"-\":\"\")+pe(A[2]);p[T]=u.attr(a.$attr[U])}}),M(p,function(F,U){g[U]=t(F.replace(r,D))}),l.$watch(o,function(U){var A=parseFloat(U),T=je(A);if(!T&&!(A in p)&&(A=e.pluralCat(A-d)),A!==I&&!(T&&je(I))){z();var m=g[A];he(m)?(U!=null&&n.debug(\"ngPluralize: no rule defined for '\"+A+\"' in \"+h),z=we,L()):z=l.$watch(m,L),I=A}});function L(F){u.text(F||\"\")}}}}],vu=w(\"ngRef\"),up=[\"$parse\",function(e){return{priority:-1,restrict:\"A\",compile:function(t,n){var r=rn(en(t)),i=e(n.ngRef),l=i.assign||function(){throw vu(\"nonassign\",'Expression in ngRef=\"{0}\" is non-assignable!',n.ngRef)};return function(u,a,o){var h;if(o.hasOwnProperty(\"ngRefRead\")){if(o.ngRefRead===\"$element\")h=a;else if(h=a.data(\"$\"+o.ngRefRead+\"Controller\"),!h)throw vu(\"noctrl\",'The controller for ngRefRead=\"{0}\" could not be found on ngRef=\"{1}\"',o.ngRefRead,n.ngRef)}else h=a.data(\"$\"+r+\"Controller\");h=h||a,l(u,h),a.on(\"$destroy\",function(){i(u)===h&&l(u,null)})}}}}],cp=[\"$parse\",\"$animate\",\"$compile\",function(e,t,n){var r=\"$$NG_REMOVED\",i=w(\"ngRepeat\"),l=function(d,p,g,y,b,D,z){d[g]=y,b&&(d[b]=D),d.$index=p,d.$first=p===0,d.$last=p===z-1,d.$middle=!(d.$first||d.$last),d.$odd=!(d.$even=(p&1)===0)},u=function(d){return d.clone[0]},a=function(d){return d.clone[d.clone.length-1]},o=function(d,p,g){return nr(g)},h=function(d,p){return p};return{restrict:\"A\",multiElement:!0,transclude:\"element\",priority:1e3,terminal:!0,$$tlb:!0,compile:function(p,g){var y=g.ngRepeat,b=n.$$createComment(\"end ngRepeat\",y),D=y.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/);if(!D)throw i(\"iexp\",\"Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.\",y);var z=D[1],I=D[2],L=D[3],F=D[4];if(D=z.match(/^(?:(\\s*[$\\w]+)|\\(\\s*([$\\w]+)\\s*,\\s*([$\\w]+)\\s*\\))$/),!D)throw i(\"iidexp\",\"'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.\",z);var U=D[3]||D[1],A=D[2];if(L&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(L)||/^(null|undefined|this|\\$index|\\$first|\\$middle|\\$last|\\$even|\\$odd|\\$parent|\\$root|\\$id)$/.test(L)))throw i(\"badident\",\"alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.\",L);var T;if(F){var m={$id:nr},$=e(F);T=function(C,E,O,B){return A&&(m[A]=E),m[U]=O,m.$index=B,$(C,m)}}return function(E,O,B,R,W){var K=nt();E.$watchCollection(I,function(J){var ie,Te,Se=O[0],Me,Ue=nt(),Be,Ge,ot,et,wt,pt,bt,it,Un;if(L&&(E[L]=J),Le(J))pt=J,wt=T||o;else{wt=T||h,pt=[];for(var Bn in J)$e.call(J,Bn)&&Bn.charAt(0)!==\"$\"&&pt.push(Bn)}for(Be=pt.length,it=new Array(Be),ie=0;ie<Be;ie++)if(Ge=J===pt?ie:pt[ie],ot=J[Ge],et=wt(E,Ge,ot,ie),K[et])bt=K[et],delete K[et],Ue[et]=bt,it[ie]=bt;else{if(Ue[et])throw M(it,function(sn){sn&&sn.scope&&(K[sn.id]=sn)}),i(\"dupes\",\"Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}\",y,et,ot);it[ie]={id:et,scope:void 0,clone:void 0},Ue[et]=!0}m&&(m[U]=void 0);for(var eo in K){if(bt=K[eo],Un=li(bt.clone),t.leave(Un),Un[0].parentNode)for(ie=0,Te=Un.length;ie<Te;ie++)Un[ie][r]=!0;bt.scope.$destroy()}for(ie=0;ie<Be;ie++)if(Ge=J===pt?ie:pt[ie],ot=J[Ge],bt=it[ie],bt.scope){Me=Se;do Me=Me.nextSibling;while(Me&&Me[r]);u(bt)!==Me&&t.move(li(bt.clone),null,Se),Se=a(bt),l(bt.scope,ie,U,ot,A,Ge,Be)}else W(function(Sn,to){bt.scope=to;var Kr=b.cloneNode(!1);Sn[Sn.length++]=Kr,t.enter(Sn,null,Se),Se=Kr,bt.clone=Sn,Ue[bt.id]=bt,l(bt.scope,ie,U,ot,A,Ge,Be)});K=Ue})}}}}],gu=\"ng-hide\",$u=\"ng-hide-animate\",fp=[\"$animate\",function(e){return{restrict:\"A\",multiElement:!0,link:function(t,n,r){t.$watch(r.ngShow,function(l){e[l?\"removeClass\":\"addClass\"](n,gu,{tempClasses:$u})})}}}],lp=[\"$animate\",function(e){return{restrict:\"A\",multiElement:!0,link:function(t,n,r){t.$watch(r.ngHide,function(l){e[l?\"addClass\":\"removeClass\"](n,gu,{tempClasses:$u})})}}}],hp=sr(function(e,t,n){e.$watchCollection(n.ngStyle,function(i,l){l&&i!==l&&M(l,function(u,a){t.css(a,\"\")}),i&&t.css(i)})}),dp=[\"$animate\",\"$compile\",function(e,t){return{require:\"ngSwitch\",controller:[\"$scope\",function(){this.cases={}}],link:function(n,r,i,l){var u=i.ngSwitch||i.on,a=[],o=[],h=[],d=[],p=function(g,y){return function(b){b!==!1&&g.splice(y,1)}};n.$watch(u,function(y){for(var b,D;h.length;)e.cancel(h.pop());for(b=0,D=d.length;b<D;++b){var z=li(o[b].clone);d[b].$destroy();var I=h[b]=e.leave(z);I.done(p(h,b))}o.length=0,d.length=0,(a=l.cases[\"!\"+y]||l.cases[\"?\"])&&M(a,function(L){L.transclude(function(F,U){d.push(U);var A=L.element;F[F.length++]=t.$$createComment(\"end ngSwitchWhen\");var T={clone:F};o.push(T),e.enter(F,A.parent(),A)})})})}}}],pp=sr({transclude:\"element\",priority:1200,require:\"^ngSwitch\",multiElement:!0,link:function(e,t,n,r,i){var l=n.ngSwitchWhen.split(n.ngSwitchWhenSeparator).sort().filter(function(u,a,o){return o[a-1]!==u});M(l,function(u){r.cases[\"!\"+u]=r.cases[\"!\"+u]||[],r.cases[\"!\"+u].push({transclude:i,element:t})})}}),vp=sr({transclude:\"element\",priority:1200,require:\"^ngSwitch\",multiElement:!0,link:function(e,t,n,r,i){r.cases[\"?\"]=r.cases[\"?\"]||[],r.cases[\"?\"].push({transclude:i,element:t})}}),gp=w(\"ngTransclude\"),$p=[\"$compile\",function(e){return{restrict:\"EAC\",compile:function(n){var r=e(n.contents());return n.empty(),function(l,u,a,o,h){if(!h)throw gp(\"orphan\",\"Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}\",un(u));a.ngTransclude===a.$attr.ngTransclude&&(a.ngTransclude=\"\");var d=a.ngTransclude||a.ngTranscludeSlot;h(p,null,d),d&&!h.isSlotFilled(d)&&g();function p(b,D){b.length&&y(b)?u.append(b):(g(),D.$destroy())}function g(){r(l,function(b){u.append(b)})}function y(b){for(var D=0,z=b.length;D<z;D++){var I=b[D];if(I.nodeType!==wn||I.nodeValue.trim())return!0}}}}}}],mp=[\"$templateCache\",function(e){return{restrict:\"E\",terminal:!0,compile:function(t,n){if(n.type===\"text/ng-template\"){var r=n.id,i=t[0].text;e.put(r,i)}}}}],yp={$setViewValue:we,$render:we};function qn(e,t){e.prop(\"selected\",t),e.attr(\"selected\",t)}var bp=[\"$element\",\"$scope\",function(e,t){var n=this,r=new Ei;n.selectValueMap={},n.ngModelCtrl=yp,n.multiple=!1,n.unknownOption=S(c.document.createElement(\"option\")),n.hasEmptyOption=!1,n.emptyOption=void 0,n.renderUnknownOption=function(o){var h=n.generateUnknownOptionValue(o);n.unknownOption.val(h),e.prepend(n.unknownOption),qn(n.unknownOption,!0),e.val(h)},n.updateUnknownOption=function(o){var h=n.generateUnknownOptionValue(o);n.unknownOption.val(h),qn(n.unknownOption,!0),e.val(h)},n.generateUnknownOptionValue=function(o){return\"? \"+nr(o)+\" ?\"},n.removeUnknownOption=function(){n.unknownOption.parent()&&n.unknownOption.remove()},n.selectEmptyOption=function(){n.emptyOption&&(e.val(\"\"),qn(n.emptyOption,!0))},n.unselectEmptyOption=function(){n.hasEmptyOption&&qn(n.emptyOption,!1)},t.$on(\"$destroy\",function(){n.renderUnknownOption=we}),n.readValue=function(){var h=e.val(),d=h in n.selectValueMap?n.selectValueMap[h]:h;return n.hasOption(d)?d:null},n.writeValue=function(h){var d=e[0].options[e[0].selectedIndex];if(d&&qn(S(d),!1),n.hasOption(h)){n.removeUnknownOption();var p=nr(h);e.val(p in n.selectValueMap?p:h);var g=e[0].options[e[0].selectedIndex];qn(S(g),!0)}else n.selectUnknownOrEmptyOption(h)},n.addOption=function(o,h){if(h[0].nodeType!==Br){Qn(o,'\"option value\"'),o===\"\"&&(n.hasEmptyOption=!0,n.emptyOption=h);var d=r.get(o)||0;r.set(o,d+1),l()}},n.removeOption=function(o){var h=r.get(o);h&&(h===1?(r.delete(o),o===\"\"&&(n.hasEmptyOption=!1,n.emptyOption=void 0)):r.set(o,h-1))},n.hasOption=function(o){return!!r.get(o)},n.$hasEmptyOption=function(){return n.hasEmptyOption},n.$isUnknownOptionSelected=function(){return e[0].options[0]===n.unknownOption[0]},n.$isEmptyOptionSelected=function(){return n.hasEmptyOption&&e[0].options[e[0].selectedIndex]===n.emptyOption[0]},n.selectUnknownOrEmptyOption=function(o){o==null&&n.emptyOption?(n.removeUnknownOption(),n.selectEmptyOption()):n.unknownOption.parent().length?n.updateUnknownOption(o):n.renderUnknownOption(o)};var i=!1;function l(){i||(i=!0,t.$$postDigest(function(){i=!1,n.ngModelCtrl.$render()}))}var u=!1;function a(o){u||(u=!0,t.$$postDigest(function(){t.$$destroyed||(u=!1,n.ngModelCtrl.$setViewValue(n.readValue()),o&&n.ngModelCtrl.$render())}))}n.registerOption=function(o,h,d,p,g){if(d.$attr.ngValue){var y,b;d.$observe(\"value\",function(z){var I,L=h.prop(\"selected\");fe(b)&&(n.removeOption(y),delete n.selectValueMap[b],I=!0),b=nr(z),y=z,n.selectValueMap[b]=z,n.addOption(z,h),h.attr(\"value\",b),I&&L&&a()})}else p?d.$observe(\"value\",function(z){n.readValue();var I,L=h.prop(\"selected\");fe(y)&&(n.removeOption(y),I=!0),y=z,n.addOption(z,h),I&&L&&a()}):g?o.$watch(g,function(z,I){d.$set(\"value\",z);var L=h.prop(\"selected\");I!==z&&n.removeOption(I),n.addOption(z,h),I&&L&&a()}):n.addOption(d.value,h);d.$observe(\"disabled\",function(D){(D===\"true\"||D&&h.prop(\"selected\"))&&(n.multiple?a(!0):(n.ngModelCtrl.$setViewValue(null),n.ngModelCtrl.$render()))}),h.on(\"$destroy\",function(){var D=n.readValue(),z=d.value;n.removeOption(z),l(),(n.multiple&&D&&D.indexOf(z)!==-1||D===z)&&a(!0)})}}],Cp=function(){return{restrict:\"E\",require:[\"select\",\"?ngModel\"],controller:bp,priority:1,link:{pre:e,post:t}};function e(n,r,i,l){var u=l[0],a=l[1];if(!a){u.registerOption=we;return}if(u.ngModelCtrl=a,r.on(\"change\",function(){u.removeUnknownOption(),n.$apply(function(){a.$setViewValue(u.readValue())})}),i.multiple){u.multiple=!0,u.readValue=function(){var p=[];return M(r.find(\"option\"),function(g){if(g.selected&&!g.disabled){var y=g.value;p.push(y in u.selectValueMap?u.selectValueMap[y]:y)}}),p},u.writeValue=function(p){M(r.find(\"option\"),function(g){var y=!!p&&(ps(p,g.value)||ps(p,u.selectValueMap[g.value])),b=g.selected;y!==b&&qn(S(g),y)})};var o,h=NaN;n.$watch(function(){h===a.$viewValue&&!tn(o,a.$viewValue)&&(o=nn(a.$viewValue),a.$render()),h=a.$viewValue}),a.$isEmpty=function(d){return!d||d.length===0}}}function t(n,r,i,l){var u=l[1];if(!!u){var a=l[0];u.$render=function(){a.writeValue(u.$viewValue)}}}},Ep=[\"$interpolate\",function(e){return{restrict:\"E\",priority:100,compile:function(t,n){var r,i;return fe(n.ngValue)||(fe(n.value)?r=e(n.value,!0):(i=e(t.text(),!0),i||n.$set(\"value\",t.text()))),function(l,u,a){var o=\"$selectController\",h=u.parent(),d=h.data(o)||h.parent().data(o);d&&d.registerOption(l,u,a,r,i)}}}}],mu=[\"$parse\",function(e){return{restrict:\"A\",require:\"?ngModel\",link:function(t,n,r,i){if(!!i){var l=r.hasOwnProperty(\"required\")||e(r.ngRequired)(t);r.ngRequired||(r.required=!0),i.$validators.required=function(u,a){return!l||!i.$isEmpty(a)},r.$observe(\"required\",function(u){l!==u&&(l=u,i.$validate())})}}}}],yu=[\"$parse\",function(e){return{restrict:\"A\",require:\"?ngModel\",compile:function(t,n){var r,i;return n.ngPattern&&(r=n.ngPattern,n.ngPattern.charAt(0)===\"/\"&&q.test(n.ngPattern)?i=function(){return n.ngPattern}:i=e(n.ngPattern)),function(l,u,a,o){if(!!o){var h=a.pattern;a.ngPattern?h=i(l):r=a.pattern;var d=Eu(h,r,u);a.$observe(\"pattern\",function(p){var g=d;d=Eu(p,r,u),(g&&g.toString())!==(d&&d.toString())&&o.$validate()}),o.$validators.pattern=function(p,g){return o.$isEmpty(g)||he(d)||d.test(g)}}}}}}],bu=[\"$parse\",function(e){return{restrict:\"A\",require:\"?ngModel\",link:function(t,n,r,i){if(!!i){var l=r.maxlength||e(r.ngMaxlength)(t),u=Di(l);r.$observe(\"maxlength\",function(a){l!==a&&(u=Di(a),l=a,i.$validate())}),i.$validators.maxlength=function(a,o){return u<0||i.$isEmpty(o)||o.length<=u}}}}}],Cu=[\"$parse\",function(e){return{restrict:\"A\",require:\"?ngModel\",link:function(t,n,r,i){if(!!i){var l=r.minlength||e(r.ngMinlength)(t),u=Di(l)||-1;r.$observe(\"minlength\",function(a){l!==a&&(u=Di(a)||-1,l=a,i.$validate())}),i.$validators.minlength=function(a,o){return i.$isEmpty(o)||o.length>=u}}}}}];function Eu(e,t,n){if(!!e){if(V(e)&&(e=new RegExp(\"^\"+e+\"$\")),!e.test)throw w(\"ngPattern\")(\"noregexp\",\"Expected {0} to be a RegExp but was {1}. Element: {2}\",t,e,un(n));return e}}function Di(e){var t=Ye(e);return je(t)?-1:t}if(c.angular.bootstrap){c.console&&console.log(\"WARNING: Tried to load AngularJS more than once.\");return}Gf(),el(ue),ue.module(\"ngLocale\",[],[\"$provide\",function(e){var t={ZERO:\"zero\",ONE:\"one\",TWO:\"two\",FEW:\"few\",MANY:\"many\",OTHER:\"other\"};function n(i){i=i+\"\";var l=i.indexOf(\".\");return l==-1?0:i.length-l-1}function r(i,l){var u=l;u===void 0&&(u=Math.min(n(i),3));var a=Math.pow(10,u),o=(i*a|0)%a;return{v:u,f:o}}e.value(\"$locale\",{DATETIME_FORMATS:{AMPMS:[\"AM\",\"PM\"],DAY:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],ERANAMES:[\"Before Christ\",\"Anno Domini\"],ERAS:[\"BC\",\"AD\"],FIRSTDAYOFWEEK:6,MONTH:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],SHORTDAY:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],SHORTMONTH:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],STANDALONEMONTH:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],WEEKENDRANGE:[5,6],fullDate:\"EEEE, MMMM d, y\",longDate:\"MMMM d, y\",medium:\"MMM d, y h:mm:ss a\",mediumDate:\"MMM d, y\",mediumTime:\"h:mm:ss a\",short:\"M/d/yy h:mm a\",shortDate:\"M/d/yy\",shortTime:\"h:mm a\"},NUMBER_FORMATS:{CURRENCY_SYM:\"$\",DECIMAL_SEP:\".\",GROUP_SEP:\",\",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:\"-\",negSuf:\"\",posPre:\"\",posSuf:\"\"},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:\"-\\xA4\",negSuf:\"\",posPre:\"\\xA4\",posSuf:\"\"}]},id:\"en-us\",localeID:\"en_US\",pluralCat:function(i,l){var u=i|0,a=r(i,l);return u==1&&a.v==0?t.ONE:t.OTHER}})}]),S(function(){jf(c.document,No)})})(window);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend(window.angular.element(\"<style>\").text('@charset \"UTF-8\";[ng\\\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}'))});var Nu=_e((H$,Iu)=>{Du();Iu.exports=angular});var qu=_e(()=>{(function(c,s){\"use strict\";function f(P,G){if(w(P)){G=G||[];for(var X=0,ue=P.length;X<ue;X++)G[X]=P[X]}else if(q(P)){G=G||{};for(var Oe in P)Oe.charAt(0)===\"$\"&&Oe.charAt(1)===\"$\"||(G[Oe]=P[Oe])}return G||P}function v(P,G){var X=[],ue=P.replace(/([().])/g,\"\\\\$1\").replace(/(\\/)?:(\\w+)(\\*\\?|[?*])?/g,function(Oe,qe,Le,M){var We=M===\"?\"||M===\"*?\",Ze=M===\"*\"||M===\"*?\";return X.push({name:Le,optional:We}),qe=qe||\"\",(We?\"(?:\"+qe:qe+\"(?:\")+(Ze?\"(.+?)\":\"([^/]+)\")+(We?\"?)?\":\")\")}).replace(/([/$*])/g,\"\\\\$1\");return G.ignoreTrailingSlashes&&(ue=ue.replace(/\\/+$/,\"\")+\"/*\"),{keys:X,regexp:new RegExp(\"^\"+ue+\"(?:[?#]|$)\",G.caseInsensitiveMatch?\"i\":\"\")}}var w,q,ae,$e,pe=s.module(\"ngRoute\",[]).info({angularVersion:\"1.8.2\"}).provider(\"$route\",S).run(Q),Pe=s.$$minErr(\"ngRoute\"),x;function S(){w=s.isArray,q=s.isObject,ae=s.isDefined,$e=s.noop;function P(X,ue){return s.extend(Object.create(X),ue)}var G={};this.when=function(X,ue){var Oe=f(ue);if(s.isUndefined(Oe.reloadOnUrl)&&(Oe.reloadOnUrl=!0),s.isUndefined(Oe.reloadOnSearch)&&(Oe.reloadOnSearch=!0),s.isUndefined(Oe.caseInsensitiveMatch)&&(Oe.caseInsensitiveMatch=this.caseInsensitiveMatch),G[X]=s.extend(Oe,{originalPath:X},X&&v(X,Oe)),X){var qe=X[X.length-1]===\"/\"?X.substr(0,X.length-1):X+\"/\";G[qe]=s.extend({originalPath:X,redirectTo:X},v(qe,Oe))}return this},this.caseInsensitiveMatch=!1,this.otherwise=function(X){return typeof X==\"string\"&&(X={redirectTo:X}),this.when(null,X),this},x=!0,this.eagerInstantiationEnabled=function(ue){return ae(ue)?(x=ue,this):x},this.$get=[\"$rootScope\",\"$location\",\"$routeParams\",\"$q\",\"$injector\",\"$templateRequest\",\"$sce\",\"$browser\",function(X,ue,Oe,qe,Le,M,We,Ze){var vt=!1,Qe,Ct,Fe={routes:G,reload:function(){vt=!0;var Y={defaultPrevented:!1,preventDefault:function(){this.defaultPrevented=!0,vt=!1}};X.$evalAsync(function(){Ye(Y),Y.defaultPrevented||je()})},updateParams:function(Y){if(this.current&&this.current.$$route)Y=s.extend({},this.current.params,Y),ue.path(fe(this.current.$$route.originalPath,Y)),ue.search(Y);else throw Pe(\"norout\",\"Tried updating route with no current route\")}};return X.$on(\"$locationChangeStart\",Ye),X.$on(\"$locationChangeSuccess\",je),Fe;function Bt(Y,Ae){var V=Ae.keys,de={};if(!Ae.regexp)return null;var Ee=Ae.regexp.exec(Y);if(!Ee)return null;for(var oe=1,xe=Ee.length;oe<xe;++oe){var ve=V[oe-1],Tt=Ee[oe];ve&&Tt&&(de[ve.name]=Tt)}return de}function Ye(Y){var Ae=Fe.current;Qe=zt(),Ct=he(Qe,Ae),!Ct&&(Ae||Qe)&&X.$broadcast(\"$routeChangeStart\",Qe,Ae).defaultPrevented&&Y&&Y.preventDefault()}function je(){var Y=Fe.current,Ae=Qe;if(Ct)Y.params=Ae.params,s.copy(Y.params,Oe),X.$broadcast(\"$routeUpdate\",Y);else if(Ae||Y){vt=!1,Fe.current=Ae;var V=qe.resolve(Ae);Ze.$$incOutstandingRequestCount(\"$route\"),V.then(It).then(we).then(function(de){return de&&V.then(_t).then(function(Ee){Ae===Fe.current&&(Ae&&(Ae.locals=Ee,s.copy(Ae.params,Oe)),X.$broadcast(\"$routeChangeSuccess\",Ae,Y))})}).catch(function(de){Ae===Fe.current&&X.$broadcast(\"$routeChangeError\",Ae,Y,de)}).finally(function(){Ze.$$completeOutstandingRequest($e,\"$route\")})}}function It(Y){var Ae={route:Y,hasRedirection:!1};if(Y){if(Y.redirectTo)if(s.isString(Y.redirectTo))Ae.path=fe(Y.redirectTo,Y.params),Ae.search=Y.params,Ae.hasRedirection=!0;else{var V=ue.path(),de=ue.search(),Ee=Y.redirectTo(Y.pathParams,V,de);s.isDefined(Ee)&&(Ae.url=Ee,Ae.hasRedirection=!0)}else if(Y.resolveRedirectTo)return qe.resolve(Le.invoke(Y.resolveRedirectTo)).then(function(oe){return s.isDefined(oe)&&(Ae.url=oe,Ae.hasRedirection=!0),Ae})}return Ae}function we(Y){var Ae=!0;if(Y.route!==Fe.current)Ae=!1;else if(Y.hasRedirection){var V=ue.url(),de=Y.url;de?ue.url(de).replace():de=ue.path(Y.path).search(Y.search).replace().url(),de!==V&&(Ae=!1)}return Ae}function _t(Y){if(Y){var Ae=s.extend({},Y.resolve);s.forEach(Ae,function(de,Ee){Ae[Ee]=s.isString(de)?Le.get(de):Le.invoke(de,null,null,Ee)});var V=st(Y);return s.isDefined(V)&&(Ae.$template=V),qe.all(Ae)}}function st(Y){var Ae,V;return s.isDefined(Ae=Y.template)?s.isFunction(Ae)&&(Ae=Ae(Y.params)):s.isDefined(V=Y.templateUrl)&&(s.isFunction(V)&&(V=V(Y.params)),s.isDefined(V)&&(Y.loadedTemplateUrl=We.valueOf(V),Ae=M(V))),Ae}function zt(){var Y,Ae;return s.forEach(G,function(V,de){!Ae&&(Y=Bt(ue.path(),V))&&(Ae=P(V,{params:s.extend({},ue.search(),Y),pathParams:Y}),Ae.$$route=V)}),Ae||G[null]&&P(G[null],{params:{},pathParams:{}})}function he(Y,Ae){return!vt&&Y&&Ae&&Y.$$route===Ae.$$route&&(!Y.reloadOnUrl||!Y.reloadOnSearch&&s.equals(Y.pathParams,Ae.pathParams))}function fe(Y,Ae){var V=[];return s.forEach((Y||\"\").split(\":\"),function(de,Ee){if(Ee===0)V.push(de);else{var oe=de.match(/(\\w+)(?:[?*])?(.*)/),xe=oe[1];V.push(Ae[xe]),V.push(oe[2]||\"\"),delete Ae[xe]}}),V.join(\"\")}}]}Q.$inject=[\"$injector\"];function Q(P){x&&P.get(\"$route\")}pe.provider(\"$routeParams\",se);function se(){this.$get=function(){return{}}}pe.directive(\"ngView\",ge),pe.directive(\"ngView\",j),ge.$inject=[\"$route\",\"$anchorScroll\",\"$animate\"];function ge(P,G,X){return{restrict:\"ECA\",terminal:!0,priority:400,transclude:\"element\",link:function(ue,Oe,qe,Le,M){var We,Ze,vt,Qe=qe.autoscroll,Ct=qe.onload||\"\";ue.$on(\"$routeChangeSuccess\",Bt),Bt();function Fe(){vt&&(X.cancel(vt),vt=null),We&&(We.$destroy(),We=null),Ze&&(vt=X.leave(Ze),vt.done(function(Ye){Ye!==!1&&(vt=null)}),Ze=null)}function Bt(){var Ye=P.current&&P.current.locals,je=Ye&&Ye.$template;if(s.isDefined(je)){var It=ue.$new(),we=P.current,_t=M(It,function(st){X.enter(st,null,Ze||Oe).done(function(he){he!==!1&&s.isDefined(Qe)&&(!Qe||ue.$eval(Qe))&&G()}),Fe()});Ze=_t,We=we.scope=It,We.$emit(\"$viewContentLoaded\"),We.$eval(Ct)}else Fe()}}}}j.$inject=[\"$compile\",\"$controller\",\"$route\"];function j(P,G,X){return{restrict:\"ECA\",priority:-400,link:function(ue,Oe){var qe=X.current,Le=qe.locals;Oe.html(Le.$template);var M=P(Oe.contents());if(qe.controller){Le.$scope=ue;var We=G(qe.controller,Le);qe.controllerAs&&(ue[qe.controllerAs]=We),Oe.data(\"$ngControllerController\",We),Oe.children().data(\"$ngControllerController\",We)}ue[qe.resolveAs||\"$resolve\"]=Le,M(ue)}}}})(window,window.angular)});var Bu=_e((G$,Uu)=>{qu();Uu.exports=\"ngRoute\"});var Vu=_e(()=>{(function(c,s){\"use strict\";var f=s.$$minErr(\"$sanitize\"),v,w,q,ae,$e,pe,Pe,x,S,Q;function se(){var j=!1,P=!1;this.$get=[\"$$sanitizeUri\",function(V){return j=!0,P&&w(Qe,Ze),function(de){var Ee=[];return S(de,Q(Ee,function(oe,xe){return!/^unsafe:/.test(V(oe,xe))})),Ee.join(\"\")}}],this.enableSvg=function(V){return $e(V)?(P=V,this):P},this.addValidElements=function(V){return j||(ae(V)&&(V={htmlElements:V}),we(Ze,V.svgElements),we(ue,V.htmlVoidElements),we(Qe,V.htmlVoidElements),we(Qe,V.htmlElements)),this},this.addValidAttrs=function(V){return j||w(Ye,It(V,!0)),this},v=s.bind,w=s.extend,q=s.forEach,ae=s.isArray,$e=s.isDefined,pe=s.$$lowercase,Pe=s.noop,S=st,Q=fe,x=c.Node.prototype.contains||function(V){return!!(this.compareDocumentPosition(V)&16)};var G=/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g,X=/([^#-~ |!])/g,ue=je(\"area,br,col,hr,img,wbr\"),Oe=je(\"colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr\"),qe=je(\"rp,rt\"),Le=w({},qe,Oe),M=w({},Oe,je(\"address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,section,table,ul\")),We=w({},qe,je(\"a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var\")),Ze=je(\"circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,radialGradient,rect,stop,svg,switch,text,title,tspan\"),vt=je(\"script,style\"),Qe=w({},ue,M,We,Le),Ct=je(\"background,cite,href,longdesc,src,xlink:href,xml:base\"),Fe=je(\"abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,valign,value,vspace,width\"),Bt=je(\"accent-height,accumulate,additive,alphabetic,arabic-form,ascent,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan\",!0),Ye=w({},Ct,Bt,Fe);function je(V,de){return It(V.split(\",\"),de)}function It(V,de){var Ee={},oe;for(oe=0;oe<V.length;oe++)Ee[de?pe(V[oe]):V[oe]]=!0;return Ee}function we(V,de){de&&de.length&&w(V,It(de))}var _t=function(V,de){if(xe())return ve;if(!de||!de.implementation)throw f(\"noinert\",\"Can't create an inert html document\");var Ee=de.implementation.createHTMLDocument(\"inert\"),oe=(Ee.documentElement||Ee.getDocumentElement()).querySelector(\"body\");return Tt;function xe(){try{return!!ve(\"\")}catch{return!1}}function ve(Rt){Rt=\"<remove></remove>\"+Rt;try{var Vt=new V.DOMParser().parseFromString(Rt,\"text/html\").body;return Vt.firstChild.remove(),Vt}catch{return}}function Tt(Rt){return oe.innerHTML=Rt,de.documentMode&&Y(oe),oe}}(c,c.document);function st(V,de){V==null?V=\"\":typeof V!=\"string\"&&(V=\"\"+V);var Ee=_t(V);if(!Ee)return\"\";var oe=5;do{if(oe===0)throw f(\"uinput\",\"Failed to sanitize html because the input is unstable\");oe--,V=Ee.innerHTML,Ee=_t(V)}while(V!==Ee.innerHTML);for(var xe=Ee.firstChild;xe;){switch(xe.nodeType){case 1:de.start(xe.nodeName.toLowerCase(),zt(xe.attributes));break;case 3:de.chars(xe.textContent);break}var ve;if(!(ve=xe.firstChild)&&(xe.nodeType===1&&de.end(xe.nodeName.toLowerCase()),ve=Ae(\"nextSibling\",xe),!ve))for(;ve==null&&(xe=Ae(\"parentNode\",xe),xe!==Ee);)ve=Ae(\"nextSibling\",xe),xe.nodeType===1&&de.end(xe.nodeName.toLowerCase());xe=ve}for(;xe=Ee.firstChild;)Ee.removeChild(xe)}function zt(V){for(var de={},Ee=0,oe=V.length;Ee<oe;Ee++){var xe=V[Ee];de[xe.name]=xe.value}return de}function he(V){return V.replace(/&/g,\"&amp;\").replace(G,function(de){var Ee=de.charCodeAt(0),oe=de.charCodeAt(1);return\"&#\"+((Ee-55296)*1024+(oe-56320)+65536)+\";\"}).replace(X,function(de){return\"&#\"+de.charCodeAt(0)+\";\"}).replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")}function fe(V,de){var Ee=!1,oe=v(V,V.push);return{start:function(xe,ve){xe=pe(xe),!Ee&&vt[xe]&&(Ee=xe),!Ee&&Qe[xe]===!0&&(oe(\"<\"),oe(xe),q(ve,function(Tt,Rt){var Vt=pe(Rt),ai=xe===\"img\"&&Vt===\"src\"||Vt===\"background\";Ye[Vt]===!0&&(Ct[Vt]!==!0||de(Tt,ai))&&(oe(\" \"),oe(Rt),oe('=\"'),oe(he(Tt)),oe('\"'))}),oe(\">\"))},end:function(xe){xe=pe(xe),!Ee&&Qe[xe]===!0&&ue[xe]!==!0&&(oe(\"</\"),oe(xe),oe(\">\")),xe==Ee&&(Ee=!1)},chars:function(xe){Ee||oe(he(xe))}}}function Y(V){for(;V;){if(V.nodeType===c.Node.ELEMENT_NODE)for(var de=V.attributes,Ee=0,oe=de.length;Ee<oe;Ee++){var xe=de[Ee],ve=xe.name.toLowerCase();(ve===\"xmlns:ns1\"||ve.lastIndexOf(\"ns1:\",0)===0)&&(V.removeAttributeNode(xe),Ee--,oe--)}var Tt=V.firstChild;Tt&&Y(Tt),V=Ae(\"nextSibling\",V)}}function Ae(V,de){var Ee=de[V];if(Ee&&x.call(de,Ee))throw f(\"elclob\",\"Failed to sanitize html because the element is clobbered: {0}\",de.outerHTML||de.outerText);return Ee}}function ge(j){var P=[],G=Q(P,Pe);return G.chars(j),P.join(\"\")}s.module(\"ngSanitize\",[]).provider(\"$sanitize\",se).info({angularVersion:\"1.8.2\"}),s.module(\"ngSanitize\").filter(\"linky\",[\"$sanitize\",function(j){var P=/((s?ftp|https?):\\/\\/|(www\\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\\S*[^\\s.;,(){}<>\"\\u201d\\u2019]/i,G=/^mailto:/i,X=s.$$minErr(\"linky\"),ue=s.isDefined,Oe=s.isFunction,qe=s.isObject,Le=s.isString;return function(M,We,Ze){if(M==null||M===\"\")return M;if(!Le(M))throw X(\"notstring\",\"Expected string but received: {0}\",M);for(var vt=Oe(Ze)?Ze:qe(Ze)?function(){return Ze}:function(){return{}},Qe,Ct=M,Fe=[],Bt,Ye;Qe=Ct.match(P);)Bt=Qe[0],!Qe[2]&&!Qe[4]&&(Bt=(Qe[3]?\"http://\":\"mailto:\")+Bt),Ye=Qe.index,je(Ct.substr(0,Ye)),It(Bt,Qe[0].replace(G,\"\")),Ct=Ct.substring(Ye+Qe[0].length);return je(Ct),j(Fe.join(\"\"));function je(we){!we||Fe.push(ge(we))}function It(we,_t){var st,zt=vt(we);Fe.push(\"<a \");for(st in zt)Fe.push(st+'=\"'+zt[st]+'\" ');ue(We)&&!(\"target\"in zt)&&Fe.push('target=\"',We,'\" '),Fe.push('href=\"',we.replace(/\"/g,\"&quot;\"),'\">'),je(_t),Fe.push(\"</a>\")}}}])})(window,window.angular)});var Hu=_e((J$,ju)=>{Vu();ju.exports=\"ngSanitize\"});var Wu=_e(()=>{(function(c,s){\"use strict\";var f=s.module(\"ngTouch\",[]);f.info({angularVersion:\"1.8.2\"});function v(q){return s.$$lowercase(q.nodeName||q[0]&&q[0].nodeName)}f.factory(\"$swipe\",[function(){var q=10,ae={mouse:{start:\"mousedown\",move:\"mousemove\",end:\"mouseup\"},touch:{start:\"touchstart\",move:\"touchmove\",end:\"touchend\",cancel:\"touchcancel\"},pointer:{start:\"pointerdown\",move:\"pointermove\",end:\"pointerup\",cancel:\"pointercancel\"}};function $e(Pe){var x=Pe.originalEvent||Pe,S=x.touches&&x.touches.length?x.touches:[x],Q=x.changedTouches&&x.changedTouches[0]||S[0];return{x:Q.clientX,y:Q.clientY}}function pe(Pe,x){var S=[];return s.forEach(Pe,function(Q){var se=ae[Q][x];se&&S.push(se)}),S.join(\" \")}return{bind:function(Pe,x,S){var Q,se,ge,j,P=!1;S=S||[\"mouse\",\"touch\",\"pointer\"],Pe.on(pe(S,\"start\"),function(X){ge=$e(X),P=!0,Q=0,se=0,j=ge,x.start&&x.start(ge,X)});var G=pe(S,\"cancel\");G&&Pe.on(G,function(X){P=!1,x.cancel&&x.cancel(X)}),Pe.on(pe(S,\"move\"),function(X){if(!!P&&!!ge){var ue=$e(X);if(Q+=Math.abs(ue.x-j.x),se+=Math.abs(ue.y-j.y),j=ue,!(Q<q&&se<q))if(se>Q){P=!1,x.cancel&&x.cancel(X);return}else X.preventDefault(),x.move&&x.move(ue,X)}}),Pe.on(pe(S,\"end\"),function(X){!P||(P=!1,x.end&&x.end($e(X),X))})}}}]);function w(q,ae,$e){f.directive(q,[\"$parse\",\"$swipe\",function(pe,Pe){var x=75,S=.3,Q=30;return function(se,ge,j){var P=pe(j[q]),G,X;function ue(qe){if(!G)return!1;var Le=Math.abs(qe.y-G.y),M=(qe.x-G.x)*ae;return X&&Le<x&&M>0&&M>Q&&Le/M<S}var Oe=[\"touch\"];s.isDefined(j.ngSwipeDisableMouse)||Oe.push(\"mouse\"),Pe.bind(ge,{start:function(qe,Le){G=qe,X=!0},cancel:function(qe){X=!1},end:function(qe,Le){ue(qe)&&se.$apply(function(){ge.triggerHandler($e),P(se,{$event:Le})})}},Oe)}}])}w(\"ngSwipeLeft\",-1,\"swipeleft\"),w(\"ngSwipeRight\",1,\"swiperight\")})(window,window.angular)});var Gu=_e((Q$,zu)=>{Wu();zu.exports=\"ngTouch\"});var Hn=_e((em,Xu)=>{Xu.exports=window.angular});var Yu=_e(()=>{var qp=Hn();qp.module(\"bsDisconnect\",[]).directive(\"disconnectElem\",function(){return{restrict:\"E\",scope:{},template:`<section bs-overlay ng-class=\"{'active': ui.visible}\">\n    <p><icon icon=\"block\"></icon></p>\n    <h1>{{ui.heading}} {{ui.message}}</h1>\n    <p>Possible reasons are:</p>\n    <ul bs-list>\n        <li>1. Your process was exited by another tool</li>\n    </ul>\n    <p>You should check your terminal window to see what happened. <br/>(Or simply try reloading this page.)</p>\n</section>`,controller:[\"$scope\",\"$rootScope\",\"$window\",Up]}});function Up(c,s,f){let v=\"Browsersync\",w=\"Disconnected\";c._disconnected=!1,c.ui={visible:!1,heading:v,message:w},c.socketEvents={connection:function(){c._disconnected&&f.location.reload(!0),c.ui.visible=!1,c.$digest()},disconnect:function(){c._disconnected=!0,c.ui.visible=!0,c.$digest()}},s.$on(\"ui:connection\",c.socketEvents.connection),s.$on(\"ui:disconnect\",c.socketEvents.disconnect)}});var Ju=_e(()=>{var Bp=Hn();Bp.module(\"bsNotify\",[]).directive(\"notifyElem\",function(){return{restrict:\"E\",scope:{},template:`<div bs-notify ng-class=\"{'active': ui.visible}\">\n    <p class=\"notification__text\">{{ui.heading}} <span class=\"color--lime\">{{ui.message}}</span></p>\n</div>`,controller:[\"$scope\",\"$rootScope\",Vp]}});function Vp(c,s){var f=\"info\",v=\"Browsersync:\",w=\"Welcome to Browsersync\",q=2e3;c.ui={status:f,heading:v,message:w},c.show=function(ae,$e){$e=$e||{},c._timer&&clearTimeout(c._timer),c._timer=window.setTimeout(c.reset,$e.timeout||q),c.ui.visible=!0,c.ui.status=$e.status||f,c.ui.heading=$e.heading||v,c.ui.message=$e.message||v},c.reset=function(){c.ui.visible=!1,c.$digest()},s.$on(\"notify:flash\",c.show)}});var Ku=_e(()=>{var jp=Hn();jp.module(\"bsHistory\",[\"bsSocket\"]).service(\"History\",[\"Socket\",Hp]);function Hp(c){var s=[],f=[];return c.on(\"ui:history:update\",function(v){f.forEach(function(w){w(v)})}),{visited:s,updateHistory:function(v){s=v},get:function(){return c.getData(\"visited\")},remove:function(v){c.emit(\"ui\",{namespace:\"history\",event:\"remove\",data:v})},clear:function(){c.emit(\"ui\",{namespace:\"history\",event:\"clear\"})},on:function(v,w){f.push(w)},off:function(v){var w=f.indexOf(v);w>-1&&(f=f.splice(w,1))}}}});var Zu=_e(()=>{var Wp=Hn();Wp.module(\"bsClients\",[\"bsSocket\"]).service(\"Clients\",[\"Socket\",zp]);function zp(c){var s={reloadAll:function(){c.clientEvent(\"browser:reload\")},sendAllTo:function(f){c.emit(\"ui\",{namespace:\"history\",event:\"sendAllTo\",data:{path:f}})},scrollAllTo:function(){c.clientEvent(\"scroll\",{position:{raw:0,proportional:0},override:!0})},highlight:function(f){c.emit(\"ui:highlight\",f)}};return s}});var po=_e(Tn=>{\"use strict\";Object.defineProperty(Tn,\"__esModule\",{value:!0});Tn.ERROR_PACKET=Tn.PACKET_TYPES_REVERSE=Tn.PACKET_TYPES=void 0;var dn=Object.create(null);Tn.PACKET_TYPES=dn;dn.open=\"0\";dn.close=\"1\";dn.ping=\"2\";dn.pong=\"3\";dn.message=\"4\";dn.upgrade=\"5\";dn.noop=\"6\";var Qu=Object.create(null);Tn.PACKET_TYPES_REVERSE=Qu;Object.keys(dn).forEach(c=>{Qu[dn[c]]=c});var Gp={type:\"error\",data:\"parser error\"};Tn.ERROR_PACKET=Gp});var tc=_e(vo=>{\"use strict\";Object.defineProperty(vo,\"__esModule\",{value:!0});var Xp=po(),Yp=typeof Blob==\"function\"||typeof Blob<\"u\"&&Object.prototype.toString.call(Blob)===\"[object BlobConstructor]\",Jp=typeof ArrayBuffer==\"function\",Kp=c=>typeof ArrayBuffer.isView==\"function\"?ArrayBuffer.isView(c):c&&c.buffer instanceof ArrayBuffer,Zp=({type:c,data:s},f,v)=>Yp&&s instanceof Blob?f?v(s):ec(s,v):Jp&&(s instanceof ArrayBuffer||Kp(s))?f?v(s):ec(new Blob([s]),v):v(Xp.PACKET_TYPES[c]+(s||\"\")),ec=(c,s)=>{let f=new FileReader;return f.onload=function(){let v=f.result.split(\",\")[1];s(\"b\"+v)},f.readAsDataURL(c)};vo.default=Zp});var nc=_e(pr=>{\"use strict\";Object.defineProperty(pr,\"__esModule\",{value:!0});pr.decode=pr.encode=void 0;var dr=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",ti=typeof Uint8Array>\"u\"?[]:new Uint8Array(256);for(let c=0;c<dr.length;c++)ti[dr.charCodeAt(c)]=c;var Qp=c=>{let s=new Uint8Array(c),f,v=s.length,w=\"\";for(f=0;f<v;f+=3)w+=dr[s[f]>>2],w+=dr[(s[f]&3)<<4|s[f+1]>>4],w+=dr[(s[f+1]&15)<<2|s[f+2]>>6],w+=dr[s[f+2]&63];return v%3===2?w=w.substring(0,w.length-1)+\"=\":v%3===1&&(w=w.substring(0,w.length-2)+\"==\"),w};pr.encode=Qp;var ev=c=>{let s=c.length*.75,f=c.length,v,w=0,q,ae,$e,pe;c[c.length-1]===\"=\"&&(s--,c[c.length-2]===\"=\"&&s--);let Pe=new ArrayBuffer(s),x=new Uint8Array(Pe);for(v=0;v<f;v+=4)q=ti[c.charCodeAt(v)],ae=ti[c.charCodeAt(v+1)],$e=ti[c.charCodeAt(v+2)],pe=ti[c.charCodeAt(v+3)],x[w++]=q<<2|ae>>4,x[w++]=(ae&15)<<4|$e>>2,x[w++]=($e&3)<<6|pe&63;return Pe};pr.decode=ev});var ic=_e(go=>{\"use strict\";Object.defineProperty(go,\"__esModule\",{value:!0});var Vi=po(),tv=nc(),nv=typeof ArrayBuffer==\"function\",rv=(c,s)=>{if(typeof c!=\"string\")return{type:\"message\",data:rc(c,s)};let f=c.charAt(0);return f===\"b\"?{type:\"message\",data:iv(c.substring(1),s)}:Vi.PACKET_TYPES_REVERSE[f]?c.length>1?{type:Vi.PACKET_TYPES_REVERSE[f],data:c.substring(1)}:{type:Vi.PACKET_TYPES_REVERSE[f]}:Vi.ERROR_PACKET},iv=(c,s)=>{if(nv){let f=(0,tv.decode)(c);return rc(f,s)}else return{base64:!0,data:c}},rc=(c,s)=>{switch(s){case\"blob\":return c instanceof ArrayBuffer?new Blob([c]):c;case\"arraybuffer\":default:return c}};go.default=rv});var ni=_e(Jt=>{\"use strict\";Object.defineProperty(Jt,\"__esModule\",{value:!0});Jt.decodePayload=Jt.decodePacket=Jt.encodePayload=Jt.encodePacket=Jt.protocol=void 0;var sc=tc();Jt.encodePacket=sc.default;var oc=ic();Jt.decodePacket=oc.default;var ac=String.fromCharCode(30),sv=(c,s)=>{let f=c.length,v=new Array(f),w=0;c.forEach((q,ae)=>{(0,sc.default)(q,!1,$e=>{v[ae]=$e,++w===f&&s(v.join(ac))})})};Jt.encodePayload=sv;var ov=(c,s)=>{let f=c.split(ac),v=[];for(let w=0;w<f.length;w++){let q=(0,oc.default)(f[w],s);if(v.push(q),q.type===\"error\")break}return v};Jt.decodePayload=ov;Jt.protocol=4});var Wn=_e(uc=>{uc.Emitter=Dt;function Dt(c){if(c)return av(c)}function av(c){for(var s in Dt.prototype)c[s]=Dt.prototype[s];return c}Dt.prototype.on=Dt.prototype.addEventListener=function(c,s){return this._callbacks=this._callbacks||{},(this._callbacks[\"$\"+c]=this._callbacks[\"$\"+c]||[]).push(s),this};Dt.prototype.once=function(c,s){function f(){this.off(c,f),s.apply(this,arguments)}return f.fn=s,this.on(c,f),this};Dt.prototype.off=Dt.prototype.removeListener=Dt.prototype.removeAllListeners=Dt.prototype.removeEventListener=function(c,s){if(this._callbacks=this._callbacks||{},arguments.length==0)return this._callbacks={},this;var f=this._callbacks[\"$\"+c];if(!f)return this;if(arguments.length==1)return delete this._callbacks[\"$\"+c],this;for(var v,w=0;w<f.length;w++)if(v=f[w],v===s||v.fn===s){f.splice(w,1);break}return f.length===0&&delete this._callbacks[\"$\"+c],this};Dt.prototype.emit=function(c){this._callbacks=this._callbacks||{};for(var s=new Array(arguments.length-1),f=this._callbacks[\"$\"+c],v=1;v<arguments.length;v++)s[v-1]=arguments[v];if(f){f=f.slice(0);for(var v=0,w=f.length;v<w;++v)f[v].apply(this,s)}return this};Dt.prototype.emitReserved=Dt.prototype.emit;Dt.prototype.listeners=function(c){return this._callbacks=this._callbacks||{},this._callbacks[\"$\"+c]||[]};Dt.prototype.hasListeners=function(c){return!!this.listeners(c).length}});var ri=_e(ji=>{\"use strict\";Object.defineProperty(ji,\"__esModule\",{value:!0});ji.globalThisShim=void 0;ji.globalThisShim=(()=>typeof self<\"u\"?self:typeof window<\"u\"?window:Function(\"return this\")())()});var vr=_e(kn=>{\"use strict\";Object.defineProperty(kn,\"__esModule\",{value:!0});kn.byteLength=kn.installTimerFunctions=kn.pick=void 0;var Hi=ri();function uv(c,...s){return s.reduce((f,v)=>(c.hasOwnProperty(v)&&(f[v]=c[v]),f),{})}kn.pick=uv;var cv=setTimeout,fv=clearTimeout;function lv(c,s){s.useNativeTimers?(c.setTimeoutFn=cv.bind(Hi.globalThisShim),c.clearTimeoutFn=fv.bind(Hi.globalThisShim)):(c.setTimeoutFn=setTimeout.bind(Hi.globalThisShim),c.clearTimeoutFn=clearTimeout.bind(Hi.globalThisShim))}kn.installTimerFunctions=lv;var hv=1.33;function dv(c){return typeof c==\"string\"?pv(c):Math.ceil((c.byteLength||c.size)*hv)}kn.byteLength=dv;function pv(c){let s=0,f=0;for(let v=0,w=c.length;v<w;v++)s=c.charCodeAt(v),s<128?f+=1:s<2048?f+=2:s<55296||s>=57344?f+=3:(v++,f+=4);return f}});var fc=_e(($m,cc)=>{var gr=1e3,$r=gr*60,mr=$r*60,zn=mr*24,vv=zn*7,gv=zn*365.25;cc.exports=function(c,s){s=s||{};var f=typeof c;if(f===\"string\"&&c.length>0)return $v(c);if(f===\"number\"&&isFinite(c))return s.long?yv(c):mv(c);throw new Error(\"val is not a non-empty string or a valid number. val=\"+JSON.stringify(c))};function $v(c){if(c=String(c),!(c.length>100)){var s=/^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(c);if(!!s){var f=parseFloat(s[1]),v=(s[2]||\"ms\").toLowerCase();switch(v){case\"years\":case\"year\":case\"yrs\":case\"yr\":case\"y\":return f*gv;case\"weeks\":case\"week\":case\"w\":return f*vv;case\"days\":case\"day\":case\"d\":return f*zn;case\"hours\":case\"hour\":case\"hrs\":case\"hr\":case\"h\":return f*mr;case\"minutes\":case\"minute\":case\"mins\":case\"min\":case\"m\":return f*$r;case\"seconds\":case\"second\":case\"secs\":case\"sec\":case\"s\":return f*gr;case\"milliseconds\":case\"millisecond\":case\"msecs\":case\"msec\":case\"ms\":return f;default:return}}}}function mv(c){var s=Math.abs(c);return s>=zn?Math.round(c/zn)+\"d\":s>=mr?Math.round(c/mr)+\"h\":s>=$r?Math.round(c/$r)+\"m\":s>=gr?Math.round(c/gr)+\"s\":c+\"ms\"}function yv(c){var s=Math.abs(c);return s>=zn?Wi(c,s,zn,\"day\"):s>=mr?Wi(c,s,mr,\"hour\"):s>=$r?Wi(c,s,$r,\"minute\"):s>=gr?Wi(c,s,gr,\"second\"):c+\" ms\"}function Wi(c,s,f,v){var w=s>=f*1.5;return Math.round(c/f)+\" \"+v+(w?\"s\":\"\")}});var hc=_e((mm,lc)=>{function bv(c){f.debug=f,f.default=f,f.coerce=pe,f.disable=q,f.enable=w,f.enabled=ae,f.humanize=fc(),f.destroy=Pe,Object.keys(c).forEach(x=>{f[x]=c[x]}),f.names=[],f.skips=[],f.formatters={};function s(x){let S=0;for(let Q=0;Q<x.length;Q++)S=(S<<5)-S+x.charCodeAt(Q),S|=0;return f.colors[Math.abs(S)%f.colors.length]}f.selectColor=s;function f(x){let S,Q=null,se,ge;function j(...P){if(!j.enabled)return;let G=j,X=Number(new Date),ue=X-(S||X);G.diff=ue,G.prev=S,G.curr=X,S=X,P[0]=f.coerce(P[0]),typeof P[0]!=\"string\"&&P.unshift(\"%O\");let Oe=0;P[0]=P[0].replace(/%([a-zA-Z%])/g,(Le,M)=>{if(Le===\"%%\")return\"%\";Oe++;let We=f.formatters[M];if(typeof We==\"function\"){let Ze=P[Oe];Le=We.call(G,Ze),P.splice(Oe,1),Oe--}return Le}),f.formatArgs.call(G,P),(G.log||f.log).apply(G,P)}return j.namespace=x,j.useColors=f.useColors(),j.color=f.selectColor(x),j.extend=v,j.destroy=f.destroy,Object.defineProperty(j,\"enabled\",{enumerable:!0,configurable:!1,get:()=>Q!==null?Q:(se!==f.namespaces&&(se=f.namespaces,ge=f.enabled(x)),ge),set:P=>{Q=P}}),typeof f.init==\"function\"&&f.init(j),j}function v(x,S){let Q=f(this.namespace+(typeof S>\"u\"?\":\":S)+x);return Q.log=this.log,Q}function w(x){f.save(x),f.namespaces=x,f.names=[],f.skips=[];let S,Q=(typeof x==\"string\"?x:\"\").split(/[\\s,]+/),se=Q.length;for(S=0;S<se;S++)!Q[S]||(x=Q[S].replace(/\\*/g,\".*?\"),x[0]===\"-\"?f.skips.push(new RegExp(\"^\"+x.slice(1)+\"$\")):f.names.push(new RegExp(\"^\"+x+\"$\")))}function q(){let x=[...f.names.map($e),...f.skips.map($e).map(S=>\"-\"+S)].join(\",\");return f.enable(\"\"),x}function ae(x){if(x[x.length-1]===\"*\")return!0;let S,Q;for(S=0,Q=f.skips.length;S<Q;S++)if(f.skips[S].test(x))return!1;for(S=0,Q=f.names.length;S<Q;S++)if(f.names[S].test(x))return!0;return!1}function $e(x){return x.toString().substring(2,x.toString().length-2).replace(/\\.\\*\\?$/,\"*\")}function pe(x){return x instanceof Error?x.stack||x.message:x}function Pe(){console.warn(\"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.\")}return f.enable(f.load()),f}lc.exports=bv});var ii=_e((jt,zi)=>{jt.formatArgs=Ev;jt.save=wv;jt.load=Av;jt.useColors=Cv;jt.storage=Sv();jt.destroy=(()=>{let c=!1;return()=>{c||(c=!0,console.warn(\"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.\"))}})();jt.colors=[\"#0000CC\",\"#0000FF\",\"#0033CC\",\"#0033FF\",\"#0066CC\",\"#0066FF\",\"#0099CC\",\"#0099FF\",\"#00CC00\",\"#00CC33\",\"#00CC66\",\"#00CC99\",\"#00CCCC\",\"#00CCFF\",\"#3300CC\",\"#3300FF\",\"#3333CC\",\"#3333FF\",\"#3366CC\",\"#3366FF\",\"#3399CC\",\"#3399FF\",\"#33CC00\",\"#33CC33\",\"#33CC66\",\"#33CC99\",\"#33CCCC\",\"#33CCFF\",\"#6600CC\",\"#6600FF\",\"#6633CC\",\"#6633FF\",\"#66CC00\",\"#66CC33\",\"#9900CC\",\"#9900FF\",\"#9933CC\",\"#9933FF\",\"#99CC00\",\"#99CC33\",\"#CC0000\",\"#CC0033\",\"#CC0066\",\"#CC0099\",\"#CC00CC\",\"#CC00FF\",\"#CC3300\",\"#CC3333\",\"#CC3366\",\"#CC3399\",\"#CC33CC\",\"#CC33FF\",\"#CC6600\",\"#CC6633\",\"#CC9900\",\"#CC9933\",\"#CCCC00\",\"#CCCC33\",\"#FF0000\",\"#FF0033\",\"#FF0066\",\"#FF0099\",\"#FF00CC\",\"#FF00FF\",\"#FF3300\",\"#FF3333\",\"#FF3366\",\"#FF3399\",\"#FF33CC\",\"#FF33FF\",\"#FF6600\",\"#FF6633\",\"#FF9900\",\"#FF9933\",\"#FFCC00\",\"#FFCC33\"];function Cv(){return typeof window<\"u\"&&window.process&&(window.process.type===\"renderer\"||window.process.__nwjs)?!0:typeof navigator<\"u\"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)?!1:typeof document<\"u\"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<\"u\"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<\"u\"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<\"u\"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/)}function Ev(c){if(c[0]=(this.useColors?\"%c\":\"\")+this.namespace+(this.useColors?\" %c\":\" \")+c[0]+(this.useColors?\"%c \":\" \")+\"+\"+zi.exports.humanize(this.diff),!this.useColors)return;let s=\"color: \"+this.color;c.splice(1,0,s,\"color: inherit\");let f=0,v=0;c[0].replace(/%[a-zA-Z%]/g,w=>{w!==\"%%\"&&(f++,w===\"%c\"&&(v=f))}),c.splice(v,0,s)}jt.log=console.debug||console.log||(()=>{});function wv(c){try{c?jt.storage.setItem(\"debug\",c):jt.storage.removeItem(\"debug\")}catch{}}function Av(){let c;try{c=jt.storage.getItem(\"debug\")}catch{}return!c&&typeof process<\"u\"&&\"env\"in process&&(c=process.env.DEBUG),c}function Sv(){try{return localStorage}catch{}}zi.exports=hc()(jt);var{formatters:_v}=zi.exports;_v.j=function(c){try{return JSON.stringify(c)}catch(s){return\"[UnexpectedJSONParseError]: \"+s.message}}});var Gi=_e(yr=>{\"use strict\";var Tv=yr&&yr.__importDefault||function(c){return c&&c.__esModule?c:{default:c}};Object.defineProperty(yr,\"__esModule\",{value:!0});yr.Transport=void 0;var kv=ni(),Ov=Wn(),xv=vr(),Pv=Tv(ii()),Rv=(0,Pv.default)(\"engine.io-client:transport\"),dc=class extends Error{constructor(s,f,v){super(s);this.description=f,this.context=v,this.type=\"TransportError\"}},pc=class extends Ov.Emitter{constructor(s){super();this.writable=!1,(0,xv.installTimerFunctions)(this,s),this.opts=s,this.query=s.query,this.readyState=\"\",this.socket=s.socket}onError(s,f,v){return super.emitReserved(\"error\",new dc(s,f,v)),this}open(){return(this.readyState===\"closed\"||this.readyState===\"\")&&(this.readyState=\"opening\",this.doOpen()),this}close(){return(this.readyState===\"opening\"||this.readyState===\"open\")&&(this.doClose(),this.onClose()),this}send(s){this.readyState===\"open\"?this.write(s):Rv(\"transport is not open, discarding packets\")}onOpen(){this.readyState=\"open\",this.writable=!0,super.emitReserved(\"open\")}onData(s){let f=(0,kv.decodePacket)(s,this.socket.binaryType);this.onPacket(f)}onPacket(s){super.emitReserved(\"packet\",s)}onClose(s){this.readyState=\"closed\",super.emitReserved(\"close\",s)}};yr.Transport=pc});var mo=_e(xn=>{\"use strict\";Object.defineProperty(xn,\"__esModule\",{value:!0});xn.yeast=xn.decode=xn.encode=void 0;var $c=\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_\".split(\"\"),Xi=64,mc={},vc=0,On=0,gc;function $o(c){let s=\"\";do s=$c[c%Xi]+s,c=Math.floor(c/Xi);while(c>0);return s}xn.encode=$o;function Mv(c){let s=0;for(On=0;On<c.length;On++)s=s*Xi+mc[c.charAt(On)];return s}xn.decode=Mv;function Fv(){let c=$o(+new Date);return c!==gc?(vc=0,gc=c):c+\".\"+$o(vc++)}xn.yeast=Fv;for(;On<Xi;On++)mc[$c[On]]=On});var Yi=_e(br=>{\"use strict\";Object.defineProperty(br,\"__esModule\",{value:!0});br.decode=br.encode=void 0;function Lv(c){let s=\"\";for(let f in c)c.hasOwnProperty(f)&&(s.length&&(s+=\"&\"),s+=encodeURIComponent(f)+\"=\"+encodeURIComponent(c[f]));return s}br.encode=Lv;function Dv(c){let s={},f=c.split(\"&\");for(let v=0,w=f.length;v<w;v++){let q=f[v].split(\"=\");s[decodeURIComponent(q[0])]=decodeURIComponent(q[1])}return s}br.decode=Dv});var bc=_e(Ji=>{\"use strict\";Object.defineProperty(Ji,\"__esModule\",{value:!0});Ji.hasCORS=void 0;var yc=!1;try{yc=typeof XMLHttpRequest<\"u\"&&\"withCredentials\"in new XMLHttpRequest}catch{}Ji.hasCORS=yc});var Cc=_e(Ki=>{\"use strict\";Object.defineProperty(Ki,\"__esModule\",{value:!0});Ki.XHR=void 0;var Iv=bc(),Nv=ri();function qv(c){let s=c.xdomain;try{if(typeof XMLHttpRequest<\"u\"&&(!s||Iv.hasCORS))return new XMLHttpRequest}catch{}if(!s)try{return new Nv.globalThisShim[[\"Active\"].concat(\"Object\").join(\"X\")](\"Microsoft.XMLHTTP\")}catch{}}Ki.XHR=qv});var Tc=_e(Pn=>{\"use strict\";var Uv=Pn&&Pn.__importDefault||function(c){return c&&c.__esModule?c:{default:c}};Object.defineProperty(Pn,\"__esModule\",{value:!0});Pn.Request=Pn.Polling=void 0;var Bv=Gi(),Vv=Uv(ii()),jv=mo(),Hv=Yi(),Ec=ni(),Sc=Cc(),Wv=Wn(),wc=vr(),zv=ri(),qt=(0,Vv.default)(\"engine.io-client:polling\");function Gv(){}var Xv=function(){return new Sc.XHR({xdomain:!1}).responseType!=null}(),_c=class extends Bv.Transport{constructor(s){super(s);if(this.polling=!1,typeof location<\"u\"){let v=location.protocol===\"https:\",w=location.port;w||(w=v?\"443\":\"80\"),this.xd=typeof location<\"u\"&&s.hostname!==location.hostname||w!==s.port,this.xs=s.secure!==v}let f=s&&s.forceBase64;this.supportsBinary=Xv&&!f}get name(){return\"polling\"}doOpen(){this.poll()}pause(s){this.readyState=\"pausing\";let f=()=>{qt(\"paused\"),this.readyState=\"paused\",s()};if(this.polling||!this.writable){let v=0;this.polling&&(qt(\"we are currently polling - waiting to pause\"),v++,this.once(\"pollComplete\",function(){qt(\"pre-pause polling complete\"),--v||f()})),this.writable||(qt(\"we are currently writing - waiting to pause\"),v++,this.once(\"drain\",function(){qt(\"pre-pause writing complete\"),--v||f()}))}else f()}poll(){qt(\"polling\"),this.polling=!0,this.doPoll(),this.emitReserved(\"poll\")}onData(s){qt(\"polling got data %s\",s);let f=v=>{if(this.readyState===\"opening\"&&v.type===\"open\"&&this.onOpen(),v.type===\"close\")return this.onClose({description:\"transport closed by the server\"}),!1;this.onPacket(v)};(0,Ec.decodePayload)(s,this.socket.binaryType).forEach(f),this.readyState!==\"closed\"&&(this.polling=!1,this.emitReserved(\"pollComplete\"),this.readyState===\"open\"?this.poll():qt('ignoring poll - transport state \"%s\"',this.readyState))}doClose(){let s=()=>{qt(\"writing close packet\"),this.write([{type:\"close\"}])};this.readyState===\"open\"?(qt(\"transport open - closing\"),s()):(qt(\"transport not open - deferring close\"),this.once(\"open\",s))}write(s){this.writable=!1,(0,Ec.encodePayload)(s,f=>{this.doWrite(f,()=>{this.writable=!0,this.emitReserved(\"drain\")})})}uri(){let s=this.query||{},f=this.opts.secure?\"https\":\"http\",v=\"\";this.opts.timestampRequests!==!1&&(s[this.opts.timestampParam]=(0,jv.yeast)()),!this.supportsBinary&&!s.sid&&(s.b64=1),this.opts.port&&(f===\"https\"&&Number(this.opts.port)!==443||f===\"http\"&&Number(this.opts.port)!==80)&&(v=\":\"+this.opts.port);let w=(0,Hv.encode)(s),q=this.opts.hostname.indexOf(\":\")!==-1;return f+\"://\"+(q?\"[\"+this.opts.hostname+\"]\":this.opts.hostname)+v+this.opts.path+(w.length?\"?\"+w:\"\")}request(s={}){return Object.assign(s,{xd:this.xd,xs:this.xs},this.opts),new Kt(this.uri(),s)}doWrite(s,f){let v=this.request({method:\"POST\",data:s});v.on(\"success\",f),v.on(\"error\",(w,q)=>{this.onError(\"xhr post error\",w,q)})}doPoll(){qt(\"xhr poll\");let s=this.request();s.on(\"data\",this.onData.bind(this)),s.on(\"error\",(f,v)=>{this.onError(\"xhr poll error\",f,v)}),this.pollXhr=s}};Pn.Polling=_c;var Kt=class extends Wv.Emitter{constructor(s,f){super();(0,wc.installTimerFunctions)(this,f),this.opts=f,this.method=f.method||\"GET\",this.uri=s,this.async=f.async!==!1,this.data=f.data!==void 0?f.data:null,this.create()}create(){let s=(0,wc.pick)(this.opts,\"agent\",\"pfx\",\"key\",\"passphrase\",\"cert\",\"ca\",\"ciphers\",\"rejectUnauthorized\",\"autoUnref\");s.xdomain=!!this.opts.xd,s.xscheme=!!this.opts.xs;let f=this.xhr=new Sc.XHR(s);try{qt(\"xhr open %s: %s\",this.method,this.uri),f.open(this.method,this.uri,this.async);try{if(this.opts.extraHeaders){f.setDisableHeaderCheck&&f.setDisableHeaderCheck(!0);for(let v in this.opts.extraHeaders)this.opts.extraHeaders.hasOwnProperty(v)&&f.setRequestHeader(v,this.opts.extraHeaders[v])}}catch{}if(this.method===\"POST\")try{f.setRequestHeader(\"Content-type\",\"text/plain;charset=UTF-8\")}catch{}try{f.setRequestHeader(\"Accept\",\"*/*\")}catch{}\"withCredentials\"in f&&(f.withCredentials=this.opts.withCredentials),this.opts.requestTimeout&&(f.timeout=this.opts.requestTimeout),f.onreadystatechange=()=>{f.readyState===4&&(f.status===200||f.status===1223?this.onLoad():this.setTimeoutFn(()=>{this.onError(typeof f.status==\"number\"?f.status:0)},0))},qt(\"xhr data %s\",this.data),f.send(this.data)}catch(v){this.setTimeoutFn(()=>{this.onError(v)},0);return}typeof document<\"u\"&&(this.index=Kt.requestsCount++,Kt.requests[this.index]=this)}onError(s){this.emitReserved(\"error\",s,this.xhr),this.cleanup(!0)}cleanup(s){if(!(typeof this.xhr>\"u\"||this.xhr===null)){if(this.xhr.onreadystatechange=Gv,s)try{this.xhr.abort()}catch{}typeof document<\"u\"&&delete Kt.requests[this.index],this.xhr=null}}onLoad(){let s=this.xhr.responseText;s!==null&&(this.emitReserved(\"data\",s),this.emitReserved(\"success\"),this.cleanup())}abort(){this.cleanup()}};Pn.Request=Kt;Kt.requestsCount=0;Kt.requests={};if(typeof document<\"u\"){if(typeof attachEvent==\"function\")attachEvent(\"onunload\",Ac);else if(typeof addEventListener==\"function\"){let c=\"onpagehide\"in zv.globalThisShim?\"pagehide\":\"unload\";addEventListener(c,Ac,!1)}}function Ac(){for(let c in Kt.requests)Kt.requests.hasOwnProperty(c)&&Kt.requests[c].abort()}});var yo=_e(pn=>{\"use strict\";Object.defineProperty(pn,\"__esModule\",{value:!0});pn.defaultBinaryType=pn.usingBrowserWebSocket=pn.WebSocket=pn.nextTick=void 0;var kc=ri();pn.nextTick=(()=>typeof Promise==\"function\"&&typeof Promise.resolve==\"function\"?s=>Promise.resolve().then(s):(s,f)=>f(s,0))();pn.WebSocket=kc.globalThisShim.WebSocket||kc.globalThisShim.MozWebSocket;pn.usingBrowserWebSocket=!0;pn.defaultBinaryType=\"arraybuffer\"});var Pc=_e(Cr=>{\"use strict\";var Yv=Cr&&Cr.__importDefault||function(c){return c&&c.__esModule?c:{default:c}};Object.defineProperty(Cr,\"__esModule\",{value:!0});Cr.WS=void 0;var Jv=Gi(),Kv=Yi(),Zv=mo(),Qv=vr(),Cn=yo(),eg=Yv(ii()),tg=ni(),ng=(0,eg.default)(\"engine.io-client:websocket\"),Oc=typeof navigator<\"u\"&&typeof navigator.product==\"string\"&&navigator.product.toLowerCase()===\"reactnative\",xc=class extends Jv.Transport{constructor(s){super(s);this.supportsBinary=!s.forceBase64}get name(){return\"websocket\"}doOpen(){if(!this.check())return;let s=this.uri(),f=this.opts.protocols,v=Oc?{}:(0,Qv.pick)(this.opts,\"agent\",\"perMessageDeflate\",\"pfx\",\"key\",\"passphrase\",\"cert\",\"ca\",\"ciphers\",\"rejectUnauthorized\",\"localAddress\",\"protocolVersion\",\"origin\",\"maxPayload\",\"family\",\"checkServerIdentity\");this.opts.extraHeaders&&(v.headers=this.opts.extraHeaders);try{this.ws=Cn.usingBrowserWebSocket&&!Oc?f?new Cn.WebSocket(s,f):new Cn.WebSocket(s):new Cn.WebSocket(s,f,v)}catch(w){return this.emitReserved(\"error\",w)}this.ws.binaryType=this.socket.binaryType||Cn.defaultBinaryType,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=s=>this.onClose({description:\"websocket connection closed\",context:s}),this.ws.onmessage=s=>this.onData(s.data),this.ws.onerror=s=>this.onError(\"websocket error\",s)}write(s){this.writable=!1;for(let f=0;f<s.length;f++){let v=s[f],w=f===s.length-1;(0,tg.encodePacket)(v,this.supportsBinary,q=>{let ae={};Cn.usingBrowserWebSocket||(v.options&&(ae.compress=v.options.compress),this.opts.perMessageDeflate&&(typeof q==\"string\"?Buffer.byteLength(q):q.length)<this.opts.perMessageDeflate.threshold&&(ae.compress=!1));try{Cn.usingBrowserWebSocket?this.ws.send(q):this.ws.send(q,ae)}catch{ng(\"websocket closed before onclose event\")}w&&(0,Cn.nextTick)(()=>{this.writable=!0,this.emitReserved(\"drain\")},this.setTimeoutFn)})}}doClose(){typeof this.ws<\"u\"&&(this.ws.close(),this.ws=null)}uri(){let s=this.query||{},f=this.opts.secure?\"wss\":\"ws\",v=\"\";this.opts.port&&(f===\"wss\"&&Number(this.opts.port)!==443||f===\"ws\"&&Number(this.opts.port)!==80)&&(v=\":\"+this.opts.port),this.opts.timestampRequests&&(s[this.opts.timestampParam]=(0,Zv.yeast)()),this.supportsBinary||(s.b64=1);let w=(0,Kv.encode)(s),q=this.opts.hostname.indexOf(\":\")!==-1;return f+\"://\"+(q?\"[\"+this.opts.hostname+\"]\":this.opts.hostname)+v+this.opts.path+(w.length?\"?\"+w:\"\")}check(){return!!Cn.WebSocket}};Cr.WS=xc});var bo=_e(Zi=>{\"use strict\";Object.defineProperty(Zi,\"__esModule\",{value:!0});Zi.transports=void 0;var rg=Tc(),ig=Pc();Zi.transports={websocket:ig.WS,polling:rg.Polling}});var Co=_e(Qi=>{\"use strict\";Object.defineProperty(Qi,\"__esModule\",{value:!0});Qi.parse=void 0;var sg=/^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/,og=[\"source\",\"protocol\",\"authority\",\"userInfo\",\"user\",\"password\",\"host\",\"port\",\"relative\",\"path\",\"directory\",\"file\",\"query\",\"anchor\"];function ag(c){let s=c,f=c.indexOf(\"[\"),v=c.indexOf(\"]\");f!=-1&&v!=-1&&(c=c.substring(0,f)+c.substring(f,v).replace(/:/g,\";\")+c.substring(v,c.length));let w=sg.exec(c||\"\"),q={},ae=14;for(;ae--;)q[og[ae]]=w[ae]||\"\";return f!=-1&&v!=-1&&(q.source=s,q.host=q.host.substring(1,q.host.length-1).replace(/;/g,\":\"),q.authority=q.authority.replace(\"[\",\"\").replace(\"]\",\"\").replace(/;/g,\":\"),q.ipv6uri=!0),q.pathNames=ug(q,q.path),q.queryKey=cg(q,q.query),q}Qi.parse=ag;function ug(c,s){let f=/\\/{2,9}/g,v=s.replace(f,\"/\").split(\"/\");return(s.slice(0,1)==\"/\"||s.length===0)&&v.splice(0,1),s.slice(-1)==\"/\"&&v.splice(v.length-1,1),v}function cg(c,s){let f={};return s.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,function(v,w,q){w&&(f[w]=q)}),f}});var Lc=_e(Er=>{\"use strict\";var fg=Er&&Er.__importDefault||function(c){return c&&c.__esModule?c:{default:c}};Object.defineProperty(Er,\"__esModule\",{value:!0});Er.Socket=void 0;var lg=bo(),Rc=vr(),hg=Yi(),Mc=Co(),dg=fg(ii()),pg=Wn(),Fc=ni(),ut=(0,dg.default)(\"engine.io-client:socket\"),En=class extends pg.Emitter{constructor(s,f={}){super();s&&typeof s==\"object\"&&(f=s,s=null),s?(s=(0,Mc.parse)(s),f.hostname=s.host,f.secure=s.protocol===\"https\"||s.protocol===\"wss\",f.port=s.port,s.query&&(f.query=s.query)):f.host&&(f.hostname=(0,Mc.parse)(f.host).host),(0,Rc.installTimerFunctions)(this,f),this.secure=f.secure!=null?f.secure:typeof location<\"u\"&&location.protocol===\"https:\",f.hostname&&!f.port&&(f.port=this.secure?\"443\":\"80\"),this.hostname=f.hostname||(typeof location<\"u\"?location.hostname:\"localhost\"),this.port=f.port||(typeof location<\"u\"&&location.port?location.port:this.secure?\"443\":\"80\"),this.transports=f.transports||[\"polling\",\"websocket\"],this.readyState=\"\",this.writeBuffer=[],this.prevBufferLen=0,this.opts=Object.assign({path:\"/engine.io\",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:\"t\",rememberUpgrade:!1,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!0},f),this.opts.path=this.opts.path.replace(/\\/$/,\"\")+\"/\",typeof this.opts.query==\"string\"&&(this.opts.query=(0,hg.decode)(this.opts.query)),this.id=null,this.upgrades=null,this.pingInterval=null,this.pingTimeout=null,this.pingTimeoutTimer=null,typeof addEventListener==\"function\"&&(this.opts.closeOnBeforeunload&&(this.beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener(\"beforeunload\",this.beforeunloadEventListener,!1)),this.hostname!==\"localhost\"&&(this.offlineEventListener=()=>{this.onClose(\"transport close\",{description:\"network connection lost\"})},addEventListener(\"offline\",this.offlineEventListener,!1))),this.open()}createTransport(s){ut('creating transport \"%s\"',s);let f=Object.assign({},this.opts.query);f.EIO=Fc.protocol,f.transport=s,this.id&&(f.sid=this.id);let v=Object.assign({},this.opts.transportOptions[s],this.opts,{query:f,socket:this,hostname:this.hostname,secure:this.secure,port:this.port});return ut(\"options: %j\",v),new lg.transports[s](v)}open(){let s;if(this.opts.rememberUpgrade&&En.priorWebsocketSuccess&&this.transports.indexOf(\"websocket\")!==-1)s=\"websocket\";else if(this.transports.length===0){this.setTimeoutFn(()=>{this.emitReserved(\"error\",\"No transports available\")},0);return}else s=this.transports[0];this.readyState=\"opening\";try{s=this.createTransport(s)}catch(f){ut(\"error while creating transport: %s\",f),this.transports.shift(),this.open();return}s.open(),this.setTransport(s)}setTransport(s){ut(\"setting transport %s\",s.name),this.transport&&(ut(\"clearing existing transport %s\",this.transport.name),this.transport.removeAllListeners()),this.transport=s,s.on(\"drain\",this.onDrain.bind(this)).on(\"packet\",this.onPacket.bind(this)).on(\"error\",this.onError.bind(this)).on(\"close\",f=>this.onClose(\"transport close\",f))}probe(s){ut('probing transport \"%s\"',s);let f=this.createTransport(s),v=!1;En.priorWebsocketSuccess=!1;let w=()=>{v||(ut('probe transport \"%s\" opened',s),f.send([{type:\"ping\",data:\"probe\"}]),f.once(\"packet\",S=>{if(!v)if(S.type===\"pong\"&&S.data===\"probe\"){if(ut('probe transport \"%s\" pong',s),this.upgrading=!0,this.emitReserved(\"upgrading\",f),!f)return;En.priorWebsocketSuccess=f.name===\"websocket\",ut('pausing current transport \"%s\"',this.transport.name),this.transport.pause(()=>{v||this.readyState!==\"closed\"&&(ut(\"changing transport and sending upgrade packet\"),x(),this.setTransport(f),f.send([{type:\"upgrade\"}]),this.emitReserved(\"upgrade\",f),f=null,this.upgrading=!1,this.flush())})}else{ut('probe transport \"%s\" failed',s);let Q=new Error(\"probe error\");Q.transport=f.name,this.emitReserved(\"upgradeError\",Q)}}))};function q(){v||(v=!0,x(),f.close(),f=null)}let ae=S=>{let Q=new Error(\"probe error: \"+S);Q.transport=f.name,q(),ut('probe transport \"%s\" failed because of error: %s',s,S),this.emitReserved(\"upgradeError\",Q)};function $e(){ae(\"transport closed\")}function pe(){ae(\"socket closed\")}function Pe(S){f&&S.name!==f.name&&(ut('\"%s\" works - aborting \"%s\"',S.name,f.name),q())}let x=()=>{f.removeListener(\"open\",w),f.removeListener(\"error\",ae),f.removeListener(\"close\",$e),this.off(\"close\",pe),this.off(\"upgrading\",Pe)};f.once(\"open\",w),f.once(\"error\",ae),f.once(\"close\",$e),this.once(\"close\",pe),this.once(\"upgrading\",Pe),f.open()}onOpen(){if(ut(\"socket open\"),this.readyState=\"open\",En.priorWebsocketSuccess=this.transport.name===\"websocket\",this.emitReserved(\"open\"),this.flush(),this.readyState===\"open\"&&this.opts.upgrade&&this.transport.pause){ut(\"starting upgrade probes\");let s=0,f=this.upgrades.length;for(;s<f;s++)this.probe(this.upgrades[s])}}onPacket(s){if(this.readyState===\"opening\"||this.readyState===\"open\"||this.readyState===\"closing\")switch(ut('socket receive: type \"%s\", data \"%s\"',s.type,s.data),this.emitReserved(\"packet\",s),this.emitReserved(\"heartbeat\"),s.type){case\"open\":this.onHandshake(JSON.parse(s.data));break;case\"ping\":this.resetPingTimeout(),this.sendPacket(\"pong\"),this.emitReserved(\"ping\"),this.emitReserved(\"pong\");break;case\"error\":let f=new Error(\"server error\");f.code=s.data,this.onError(f);break;case\"message\":this.emitReserved(\"data\",s.data),this.emitReserved(\"message\",s.data);break}else ut('packet received with socket readyState \"%s\"',this.readyState)}onHandshake(s){this.emitReserved(\"handshake\",s),this.id=s.sid,this.transport.query.sid=s.sid,this.upgrades=this.filterUpgrades(s.upgrades),this.pingInterval=s.pingInterval,this.pingTimeout=s.pingTimeout,this.maxPayload=s.maxPayload,this.onOpen(),this.readyState!==\"closed\"&&this.resetPingTimeout()}resetPingTimeout(){this.clearTimeoutFn(this.pingTimeoutTimer),this.pingTimeoutTimer=this.setTimeoutFn(()=>{this.onClose(\"ping timeout\")},this.pingInterval+this.pingTimeout),this.opts.autoUnref&&this.pingTimeoutTimer.unref()}onDrain(){this.writeBuffer.splice(0,this.prevBufferLen),this.prevBufferLen=0,this.writeBuffer.length===0?this.emitReserved(\"drain\"):this.flush()}flush(){if(this.readyState!==\"closed\"&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){let s=this.getWritablePackets();ut(\"flushing %d packets in socket\",s.length),this.transport.send(s),this.prevBufferLen=s.length,this.emitReserved(\"flush\")}}getWritablePackets(){if(!(this.maxPayload&&this.transport.name===\"polling\"&&this.writeBuffer.length>1))return this.writeBuffer;let f=1;for(let v=0;v<this.writeBuffer.length;v++){let w=this.writeBuffer[v].data;if(w&&(f+=(0,Rc.byteLength)(w)),v>0&&f>this.maxPayload)return ut(\"only send %d out of %d packets\",v,this.writeBuffer.length),this.writeBuffer.slice(0,v);f+=2}return ut(\"payload size is %d (max: %d)\",f,this.maxPayload),this.writeBuffer}write(s,f,v){return this.sendPacket(\"message\",s,f,v),this}send(s,f,v){return this.sendPacket(\"message\",s,f,v),this}sendPacket(s,f,v,w){if(typeof f==\"function\"&&(w=f,f=void 0),typeof v==\"function\"&&(w=v,v=null),this.readyState===\"closing\"||this.readyState===\"closed\")return;v=v||{},v.compress=v.compress!==!1;let q={type:s,data:f,options:v};this.emitReserved(\"packetCreate\",q),this.writeBuffer.push(q),w&&this.once(\"flush\",w),this.flush()}close(){let s=()=>{this.onClose(\"forced close\"),ut(\"socket closing - telling transport to close\"),this.transport.close()},f=()=>{this.off(\"upgrade\",f),this.off(\"upgradeError\",f),s()},v=()=>{this.once(\"upgrade\",f),this.once(\"upgradeError\",f)};return(this.readyState===\"opening\"||this.readyState===\"open\")&&(this.readyState=\"closing\",this.writeBuffer.length?this.once(\"drain\",()=>{this.upgrading?v():s()}):this.upgrading?v():s()),this}onError(s){ut(\"socket error %j\",s),En.priorWebsocketSuccess=!1,this.emitReserved(\"error\",s),this.onClose(\"transport error\",s)}onClose(s,f){(this.readyState===\"opening\"||this.readyState===\"open\"||this.readyState===\"closing\")&&(ut('socket close with reason: \"%s\"',s),this.clearTimeoutFn(this.pingTimeoutTimer),this.transport.removeAllListeners(\"close\"),this.transport.close(),this.transport.removeAllListeners(),typeof removeEventListener==\"function\"&&(removeEventListener(\"beforeunload\",this.beforeunloadEventListener,!1),removeEventListener(\"offline\",this.offlineEventListener,!1)),this.readyState=\"closed\",this.id=null,this.emitReserved(\"close\",s,f),this.writeBuffer=[],this.prevBufferLen=0)}filterUpgrades(s){let f=[],v=0,w=s.length;for(;v<w;v++)~this.transports.indexOf(s[v])&&f.push(s[v]);return f}};Er.Socket=En;En.protocol=Fc.protocol});var Eo=_e(xt=>{\"use strict\";Object.defineProperty(xt,\"__esModule\",{value:!0});xt.nextTick=xt.parse=xt.installTimerFunctions=xt.transports=xt.Transport=xt.protocol=xt.Socket=void 0;var Dc=Lc();Object.defineProperty(xt,\"Socket\",{enumerable:!0,get:function(){return Dc.Socket}});xt.protocol=Dc.Socket.protocol;var vg=Gi();Object.defineProperty(xt,\"Transport\",{enumerable:!0,get:function(){return vg.Transport}});var gg=bo();Object.defineProperty(xt,\"transports\",{enumerable:!0,get:function(){return gg.transports}});var $g=vr();Object.defineProperty(xt,\"installTimerFunctions\",{enumerable:!0,get:function(){return $g.installTimerFunctions}});var mg=Co();Object.defineProperty(xt,\"parse\",{enumerable:!0,get:function(){return mg.parse}});var yg=yo();Object.defineProperty(xt,\"nextTick\",{enumerable:!0,get:function(){return yg.nextTick}})});var Nc=_e((Pm,Ic)=>{var wr=1e3,Ar=wr*60,Sr=Ar*60,Gn=Sr*24,bg=Gn*7,Cg=Gn*365.25;Ic.exports=function(c,s){s=s||{};var f=typeof c;if(f===\"string\"&&c.length>0)return Eg(c);if(f===\"number\"&&isFinite(c))return s.long?Ag(c):wg(c);throw new Error(\"val is not a non-empty string or a valid number. val=\"+JSON.stringify(c))};function Eg(c){if(c=String(c),!(c.length>100)){var s=/^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(c);if(!!s){var f=parseFloat(s[1]),v=(s[2]||\"ms\").toLowerCase();switch(v){case\"years\":case\"year\":case\"yrs\":case\"yr\":case\"y\":return f*Cg;case\"weeks\":case\"week\":case\"w\":return f*bg;case\"days\":case\"day\":case\"d\":return f*Gn;case\"hours\":case\"hour\":case\"hrs\":case\"hr\":case\"h\":return f*Sr;case\"minutes\":case\"minute\":case\"mins\":case\"min\":case\"m\":return f*Ar;case\"seconds\":case\"second\":case\"secs\":case\"sec\":case\"s\":return f*wr;case\"milliseconds\":case\"millisecond\":case\"msecs\":case\"msec\":case\"ms\":return f;default:return}}}}function wg(c){var s=Math.abs(c);return s>=Gn?Math.round(c/Gn)+\"d\":s>=Sr?Math.round(c/Sr)+\"h\":s>=Ar?Math.round(c/Ar)+\"m\":s>=wr?Math.round(c/wr)+\"s\":c+\"ms\"}function Ag(c){var s=Math.abs(c);return s>=Gn?es(c,s,Gn,\"day\"):s>=Sr?es(c,s,Sr,\"hour\"):s>=Ar?es(c,s,Ar,\"minute\"):s>=wr?es(c,s,wr,\"second\"):c+\" ms\"}function es(c,s,f,v){var w=s>=f*1.5;return Math.round(c/f)+\" \"+v+(w?\"s\":\"\")}});var Uc=_e((Rm,qc)=>{function Sg(c){f.debug=f,f.default=f,f.coerce=pe,f.disable=q,f.enable=w,f.enabled=ae,f.humanize=Nc(),f.destroy=Pe,Object.keys(c).forEach(x=>{f[x]=c[x]}),f.names=[],f.skips=[],f.formatters={};function s(x){let S=0;for(let Q=0;Q<x.length;Q++)S=(S<<5)-S+x.charCodeAt(Q),S|=0;return f.colors[Math.abs(S)%f.colors.length]}f.selectColor=s;function f(x){let S,Q=null,se,ge;function j(...P){if(!j.enabled)return;let G=j,X=Number(new Date),ue=X-(S||X);G.diff=ue,G.prev=S,G.curr=X,S=X,P[0]=f.coerce(P[0]),typeof P[0]!=\"string\"&&P.unshift(\"%O\");let Oe=0;P[0]=P[0].replace(/%([a-zA-Z%])/g,(Le,M)=>{if(Le===\"%%\")return\"%\";Oe++;let We=f.formatters[M];if(typeof We==\"function\"){let Ze=P[Oe];Le=We.call(G,Ze),P.splice(Oe,1),Oe--}return Le}),f.formatArgs.call(G,P),(G.log||f.log).apply(G,P)}return j.namespace=x,j.useColors=f.useColors(),j.color=f.selectColor(x),j.extend=v,j.destroy=f.destroy,Object.defineProperty(j,\"enabled\",{enumerable:!0,configurable:!1,get:()=>Q!==null?Q:(se!==f.namespaces&&(se=f.namespaces,ge=f.enabled(x)),ge),set:P=>{Q=P}}),typeof f.init==\"function\"&&f.init(j),j}function v(x,S){let Q=f(this.namespace+(typeof S>\"u\"?\":\":S)+x);return Q.log=this.log,Q}function w(x){f.save(x),f.namespaces=x,f.names=[],f.skips=[];let S,Q=(typeof x==\"string\"?x:\"\").split(/[\\s,]+/),se=Q.length;for(S=0;S<se;S++)!Q[S]||(x=Q[S].replace(/\\*/g,\".*?\"),x[0]===\"-\"?f.skips.push(new RegExp(\"^\"+x.substr(1)+\"$\")):f.names.push(new RegExp(\"^\"+x+\"$\")))}function q(){let x=[...f.names.map($e),...f.skips.map($e).map(S=>\"-\"+S)].join(\",\");return f.enable(\"\"),x}function ae(x){if(x[x.length-1]===\"*\")return!0;let S,Q;for(S=0,Q=f.skips.length;S<Q;S++)if(f.skips[S].test(x))return!1;for(S=0,Q=f.names.length;S<Q;S++)if(f.names[S].test(x))return!0;return!1}function $e(x){return x.toString().substring(2,x.toString().length-2).replace(/\\.\\*\\?$/,\"*\")}function pe(x){return x instanceof Error?x.stack||x.message:x}function Pe(){console.warn(\"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.\")}return f.enable(f.load()),f}qc.exports=Sg});var si=_e((Ht,ts)=>{Ht.formatArgs=Tg;Ht.save=kg;Ht.load=Og;Ht.useColors=_g;Ht.storage=xg();Ht.destroy=(()=>{let c=!1;return()=>{c||(c=!0,console.warn(\"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.\"))}})();Ht.colors=[\"#0000CC\",\"#0000FF\",\"#0033CC\",\"#0033FF\",\"#0066CC\",\"#0066FF\",\"#0099CC\",\"#0099FF\",\"#00CC00\",\"#00CC33\",\"#00CC66\",\"#00CC99\",\"#00CCCC\",\"#00CCFF\",\"#3300CC\",\"#3300FF\",\"#3333CC\",\"#3333FF\",\"#3366CC\",\"#3366FF\",\"#3399CC\",\"#3399FF\",\"#33CC00\",\"#33CC33\",\"#33CC66\",\"#33CC99\",\"#33CCCC\",\"#33CCFF\",\"#6600CC\",\"#6600FF\",\"#6633CC\",\"#6633FF\",\"#66CC00\",\"#66CC33\",\"#9900CC\",\"#9900FF\",\"#9933CC\",\"#9933FF\",\"#99CC00\",\"#99CC33\",\"#CC0000\",\"#CC0033\",\"#CC0066\",\"#CC0099\",\"#CC00CC\",\"#CC00FF\",\"#CC3300\",\"#CC3333\",\"#CC3366\",\"#CC3399\",\"#CC33CC\",\"#CC33FF\",\"#CC6600\",\"#CC6633\",\"#CC9900\",\"#CC9933\",\"#CCCC00\",\"#CCCC33\",\"#FF0000\",\"#FF0033\",\"#FF0066\",\"#FF0099\",\"#FF00CC\",\"#FF00FF\",\"#FF3300\",\"#FF3333\",\"#FF3366\",\"#FF3399\",\"#FF33CC\",\"#FF33FF\",\"#FF6600\",\"#FF6633\",\"#FF9900\",\"#FF9933\",\"#FFCC00\",\"#FFCC33\"];function _g(){return typeof window<\"u\"&&window.process&&(window.process.type===\"renderer\"||window.process.__nwjs)?!0:typeof navigator<\"u\"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)?!1:typeof document<\"u\"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<\"u\"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<\"u\"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<\"u\"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/)}function Tg(c){if(c[0]=(this.useColors?\"%c\":\"\")+this.namespace+(this.useColors?\" %c\":\" \")+c[0]+(this.useColors?\"%c \":\" \")+\"+\"+ts.exports.humanize(this.diff),!this.useColors)return;let s=\"color: \"+this.color;c.splice(1,0,s,\"color: inherit\");let f=0,v=0;c[0].replace(/%[a-zA-Z%]/g,w=>{w!==\"%%\"&&(f++,w===\"%c\"&&(v=f))}),c.splice(v,0,s)}Ht.log=console.debug||console.log||(()=>{});function kg(c){try{c?Ht.storage.setItem(\"debug\",c):Ht.storage.removeItem(\"debug\")}catch{}}function Og(){let c;try{c=Ht.storage.getItem(\"debug\")}catch{}return!c&&typeof process<\"u\"&&\"env\"in process&&(c=process.env.DEBUG),c}function xg(){try{return localStorage}catch{}}ts.exports=Uc()(Ht);var{formatters:Pg}=ts.exports;Pg.j=function(c){try{return JSON.stringify(c)}catch(s){return\"[UnexpectedJSONParseError]: \"+s.message}}});var Vc=_e(_r=>{\"use strict\";var Rg=_r&&_r.__importDefault||function(c){return c&&c.__esModule?c:{default:c}};Object.defineProperty(_r,\"__esModule\",{value:!0});_r.url=void 0;var Mg=Eo(),Fg=Rg(si()),Bc=Fg.default(\"socket.io-client:url\");function Lg(c,s=\"\",f){let v=c;f=f||typeof location<\"u\"&&location,c==null&&(c=f.protocol+\"//\"+f.host),typeof c==\"string\"&&(c.charAt(0)===\"/\"&&(c.charAt(1)===\"/\"?c=f.protocol+c:c=f.host+c),/^(https?|wss?):\\/\\//.test(c)||(Bc(\"protocol-less url %s\",c),typeof f<\"u\"?c=f.protocol+\"//\"+c:c=\"https://\"+c),Bc(\"parse %s\",c),v=Mg.parse(c)),v.port||(/^(http|ws)$/.test(v.protocol)?v.port=\"80\":/^(http|ws)s$/.test(v.protocol)&&(v.port=\"443\")),v.path=v.path||\"/\";let q=v.host.indexOf(\":\")!==-1?\"[\"+v.host+\"]\":v.host;return v.id=v.protocol+\"://\"+q+\":\"+v.port+s,v.href=v.protocol+\"://\"+q+(f&&f.port===v.port?\"\":\":\"+v.port),v}_r.url=Lg});var wo=_e(Tr=>{\"use strict\";Object.defineProperty(Tr,\"__esModule\",{value:!0});Tr.hasBinary=Tr.isBinary=void 0;var Dg=typeof ArrayBuffer==\"function\",Ig=c=>typeof ArrayBuffer.isView==\"function\"?ArrayBuffer.isView(c):c.buffer instanceof ArrayBuffer,jc=Object.prototype.toString,Ng=typeof Blob==\"function\"||typeof Blob<\"u\"&&jc.call(Blob)===\"[object BlobConstructor]\",qg=typeof File==\"function\"||typeof File<\"u\"&&jc.call(File)===\"[object FileConstructor]\";function Hc(c){return Dg&&(c instanceof ArrayBuffer||Ig(c))||Ng&&c instanceof Blob||qg&&c instanceof File}Tr.isBinary=Hc;function ns(c,s){if(!c||typeof c!=\"object\")return!1;if(Array.isArray(c)){for(let f=0,v=c.length;f<v;f++)if(ns(c[f]))return!0;return!1}if(Hc(c))return!0;if(c.toJSON&&typeof c.toJSON==\"function\"&&arguments.length===1)return ns(c.toJSON(),!0);for(let f in c)if(Object.prototype.hasOwnProperty.call(c,f)&&ns(c[f]))return!0;return!1}Tr.hasBinary=ns});var Wc=_e(kr=>{\"use strict\";Object.defineProperty(kr,\"__esModule\",{value:!0});kr.reconstructPacket=kr.deconstructPacket=void 0;var Ug=wo();function Bg(c){let s=[],f=c.data,v=c;return v.data=Ao(f,s),v.attachments=s.length,{packet:v,buffers:s}}kr.deconstructPacket=Bg;function Ao(c,s){if(!c)return c;if(Ug.isBinary(c)){let f={_placeholder:!0,num:s.length};return s.push(c),f}else if(Array.isArray(c)){let f=new Array(c.length);for(let v=0;v<c.length;v++)f[v]=Ao(c[v],s);return f}else if(typeof c==\"object\"&&!(c instanceof Date)){let f={};for(let v in c)Object.prototype.hasOwnProperty.call(c,v)&&(f[v]=Ao(c[v],s));return f}return c}function Vg(c,s){return c.data=So(c.data,s),c.attachments=void 0,c}kr.reconstructPacket=Vg;function So(c,s){if(!c)return c;if(c&&c._placeholder===!0){if(typeof c.num==\"number\"&&c.num>=0&&c.num<s.length)return s[c.num];throw new Error(\"illegal attachments\")}else if(Array.isArray(c))for(let f=0;f<c.length;f++)c[f]=So(c[f],s);else if(typeof c==\"object\")for(let f in c)Object.prototype.hasOwnProperty.call(c,f)&&(c[f]=So(c[f],s));return c}});var Gc=_e((Dm,zc)=>{var Or=1e3,xr=Or*60,Pr=xr*60,Xn=Pr*24,jg=Xn*7,Hg=Xn*365.25;zc.exports=function(c,s){s=s||{};var f=typeof c;if(f===\"string\"&&c.length>0)return Wg(c);if(f===\"number\"&&isFinite(c))return s.long?Gg(c):zg(c);throw new Error(\"val is not a non-empty string or a valid number. val=\"+JSON.stringify(c))};function Wg(c){if(c=String(c),!(c.length>100)){var s=/^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(c);if(!!s){var f=parseFloat(s[1]),v=(s[2]||\"ms\").toLowerCase();switch(v){case\"years\":case\"year\":case\"yrs\":case\"yr\":case\"y\":return f*Hg;case\"weeks\":case\"week\":case\"w\":return f*jg;case\"days\":case\"day\":case\"d\":return f*Xn;case\"hours\":case\"hour\":case\"hrs\":case\"hr\":case\"h\":return f*Pr;case\"minutes\":case\"minute\":case\"mins\":case\"min\":case\"m\":return f*xr;case\"seconds\":case\"second\":case\"secs\":case\"sec\":case\"s\":return f*Or;case\"milliseconds\":case\"millisecond\":case\"msecs\":case\"msec\":case\"ms\":return f;default:return}}}}function zg(c){var s=Math.abs(c);return s>=Xn?Math.round(c/Xn)+\"d\":s>=Pr?Math.round(c/Pr)+\"h\":s>=xr?Math.round(c/xr)+\"m\":s>=Or?Math.round(c/Or)+\"s\":c+\"ms\"}function Gg(c){var s=Math.abs(c);return s>=Xn?rs(c,s,Xn,\"day\"):s>=Pr?rs(c,s,Pr,\"hour\"):s>=xr?rs(c,s,xr,\"minute\"):s>=Or?rs(c,s,Or,\"second\"):c+\" ms\"}function rs(c,s,f,v){var w=s>=f*1.5;return Math.round(c/f)+\" \"+v+(w?\"s\":\"\")}});var Yc=_e((Im,Xc)=>{function Xg(c){f.debug=f,f.default=f,f.coerce=pe,f.disable=q,f.enable=w,f.enabled=ae,f.humanize=Gc(),f.destroy=Pe,Object.keys(c).forEach(x=>{f[x]=c[x]}),f.names=[],f.skips=[],f.formatters={};function s(x){let S=0;for(let Q=0;Q<x.length;Q++)S=(S<<5)-S+x.charCodeAt(Q),S|=0;return f.colors[Math.abs(S)%f.colors.length]}f.selectColor=s;function f(x){let S,Q=null,se,ge;function j(...P){if(!j.enabled)return;let G=j,X=Number(new Date),ue=X-(S||X);G.diff=ue,G.prev=S,G.curr=X,S=X,P[0]=f.coerce(P[0]),typeof P[0]!=\"string\"&&P.unshift(\"%O\");let Oe=0;P[0]=P[0].replace(/%([a-zA-Z%])/g,(Le,M)=>{if(Le===\"%%\")return\"%\";Oe++;let We=f.formatters[M];if(typeof We==\"function\"){let Ze=P[Oe];Le=We.call(G,Ze),P.splice(Oe,1),Oe--}return Le}),f.formatArgs.call(G,P),(G.log||f.log).apply(G,P)}return j.namespace=x,j.useColors=f.useColors(),j.color=f.selectColor(x),j.extend=v,j.destroy=f.destroy,Object.defineProperty(j,\"enabled\",{enumerable:!0,configurable:!1,get:()=>Q!==null?Q:(se!==f.namespaces&&(se=f.namespaces,ge=f.enabled(x)),ge),set:P=>{Q=P}}),typeof f.init==\"function\"&&f.init(j),j}function v(x,S){let Q=f(this.namespace+(typeof S>\"u\"?\":\":S)+x);return Q.log=this.log,Q}function w(x){f.save(x),f.namespaces=x,f.names=[],f.skips=[];let S,Q=(typeof x==\"string\"?x:\"\").split(/[\\s,]+/),se=Q.length;for(S=0;S<se;S++)!Q[S]||(x=Q[S].replace(/\\*/g,\".*?\"),x[0]===\"-\"?f.skips.push(new RegExp(\"^\"+x.slice(1)+\"$\")):f.names.push(new RegExp(\"^\"+x+\"$\")))}function q(){let x=[...f.names.map($e),...f.skips.map($e).map(S=>\"-\"+S)].join(\",\");return f.enable(\"\"),x}function ae(x){if(x[x.length-1]===\"*\")return!0;let S,Q;for(S=0,Q=f.skips.length;S<Q;S++)if(f.skips[S].test(x))return!1;for(S=0,Q=f.names.length;S<Q;S++)if(f.names[S].test(x))return!0;return!1}function $e(x){return x.toString().substring(2,x.toString().length-2).replace(/\\.\\*\\?$/,\"*\")}function pe(x){return x instanceof Error?x.stack||x.message:x}function Pe(){console.warn(\"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.\")}return f.enable(f.load()),f}Xc.exports=Xg});var Jc=_e((Wt,is)=>{Wt.formatArgs=Jg;Wt.save=Kg;Wt.load=Zg;Wt.useColors=Yg;Wt.storage=Qg();Wt.destroy=(()=>{let c=!1;return()=>{c||(c=!0,console.warn(\"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.\"))}})();Wt.colors=[\"#0000CC\",\"#0000FF\",\"#0033CC\",\"#0033FF\",\"#0066CC\",\"#0066FF\",\"#0099CC\",\"#0099FF\",\"#00CC00\",\"#00CC33\",\"#00CC66\",\"#00CC99\",\"#00CCCC\",\"#00CCFF\",\"#3300CC\",\"#3300FF\",\"#3333CC\",\"#3333FF\",\"#3366CC\",\"#3366FF\",\"#3399CC\",\"#3399FF\",\"#33CC00\",\"#33CC33\",\"#33CC66\",\"#33CC99\",\"#33CCCC\",\"#33CCFF\",\"#6600CC\",\"#6600FF\",\"#6633CC\",\"#6633FF\",\"#66CC00\",\"#66CC33\",\"#9900CC\",\"#9900FF\",\"#9933CC\",\"#9933FF\",\"#99CC00\",\"#99CC33\",\"#CC0000\",\"#CC0033\",\"#CC0066\",\"#CC0099\",\"#CC00CC\",\"#CC00FF\",\"#CC3300\",\"#CC3333\",\"#CC3366\",\"#CC3399\",\"#CC33CC\",\"#CC33FF\",\"#CC6600\",\"#CC6633\",\"#CC9900\",\"#CC9933\",\"#CCCC00\",\"#CCCC33\",\"#FF0000\",\"#FF0033\",\"#FF0066\",\"#FF0099\",\"#FF00CC\",\"#FF00FF\",\"#FF3300\",\"#FF3333\",\"#FF3366\",\"#FF3399\",\"#FF33CC\",\"#FF33FF\",\"#FF6600\",\"#FF6633\",\"#FF9900\",\"#FF9933\",\"#FFCC00\",\"#FFCC33\"];function Yg(){return typeof window<\"u\"&&window.process&&(window.process.type===\"renderer\"||window.process.__nwjs)?!0:typeof navigator<\"u\"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)?!1:typeof document<\"u\"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<\"u\"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<\"u\"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<\"u\"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/)}function Jg(c){if(c[0]=(this.useColors?\"%c\":\"\")+this.namespace+(this.useColors?\" %c\":\" \")+c[0]+(this.useColors?\"%c \":\" \")+\"+\"+is.exports.humanize(this.diff),!this.useColors)return;let s=\"color: \"+this.color;c.splice(1,0,s,\"color: inherit\");let f=0,v=0;c[0].replace(/%[a-zA-Z%]/g,w=>{w!==\"%%\"&&(f++,w===\"%c\"&&(v=f))}),c.splice(v,0,s)}Wt.log=console.debug||console.log||(()=>{});function Kg(c){try{c?Wt.storage.setItem(\"debug\",c):Wt.storage.removeItem(\"debug\")}catch{}}function Zg(){let c;try{c=Wt.storage.getItem(\"debug\")}catch{}return!c&&typeof process<\"u\"&&\"env\"in process&&(c=process.env.DEBUG),c}function Qg(){try{return localStorage}catch{}}is.exports=Yc()(Wt);var{formatters:e$}=is.exports;e$.j=function(c){try{return JSON.stringify(c)}catch(s){return\"[UnexpectedJSONParseError]: \"+s.message}}});var os=_e(an=>{\"use strict\";Object.defineProperty(an,\"__esModule\",{value:!0});an.Decoder=an.Encoder=an.PacketType=an.protocol=void 0;var t$=Wn(),Kc=Wc(),Zc=wo(),n$=Jc(),_o=n$.default(\"socket.io-parser\");an.protocol=5;var mt;(function(c){c[c.CONNECT=0]=\"CONNECT\",c[c.DISCONNECT=1]=\"DISCONNECT\",c[c.EVENT=2]=\"EVENT\",c[c.ACK=3]=\"ACK\",c[c.CONNECT_ERROR=4]=\"CONNECT_ERROR\",c[c.BINARY_EVENT=5]=\"BINARY_EVENT\",c[c.BINARY_ACK=6]=\"BINARY_ACK\"})(mt=an.PacketType||(an.PacketType={}));var Qc=class{constructor(s){this.replacer=s}encode(s){return _o(\"encoding packet %j\",s),(s.type===mt.EVENT||s.type===mt.ACK)&&Zc.hasBinary(s)?(s.type=s.type===mt.EVENT?mt.BINARY_EVENT:mt.BINARY_ACK,this.encodeAsBinary(s)):[this.encodeAsString(s)]}encodeAsString(s){let f=\"\"+s.type;return(s.type===mt.BINARY_EVENT||s.type===mt.BINARY_ACK)&&(f+=s.attachments+\"-\"),s.nsp&&s.nsp!==\"/\"&&(f+=s.nsp+\",\"),s.id!=null&&(f+=s.id),s.data!=null&&(f+=JSON.stringify(s.data,this.replacer)),_o(\"encoded %j as %s\",s,f),f}encodeAsBinary(s){let f=Kc.deconstructPacket(s),v=this.encodeAsString(f.packet),w=f.buffers;return w.unshift(v),w}};an.Encoder=Qc;var ss=class extends t$.Emitter{constructor(s){super();this.reviver=s}add(s){let f;if(typeof s==\"string\"){if(this.reconstructor)throw new Error(\"got plaintext data when reconstructing a packet\");f=this.decodeString(s),f.type===mt.BINARY_EVENT||f.type===mt.BINARY_ACK?(this.reconstructor=new ef(f),f.attachments===0&&super.emitReserved(\"decoded\",f)):super.emitReserved(\"decoded\",f)}else if(Zc.isBinary(s)||s.base64)if(this.reconstructor)f=this.reconstructor.takeBinaryData(s),f&&(this.reconstructor=null,super.emitReserved(\"decoded\",f));else throw new Error(\"got binary data when not reconstructing a packet\");else throw new Error(\"Unknown type: \"+s)}decodeString(s){let f=0,v={type:Number(s.charAt(0))};if(mt[v.type]===void 0)throw new Error(\"unknown packet type \"+v.type);if(v.type===mt.BINARY_EVENT||v.type===mt.BINARY_ACK){let q=f+1;for(;s.charAt(++f)!==\"-\"&&f!=s.length;);let ae=s.substring(q,f);if(ae!=Number(ae)||s.charAt(f)!==\"-\")throw new Error(\"Illegal attachments\");v.attachments=Number(ae)}if(s.charAt(f+1)===\"/\"){let q=f+1;for(;++f&&!(s.charAt(f)===\",\"||f===s.length););v.nsp=s.substring(q,f)}else v.nsp=\"/\";let w=s.charAt(f+1);if(w!==\"\"&&Number(w)==w){let q=f+1;for(;++f;){let ae=s.charAt(f);if(ae==null||Number(ae)!=ae){--f;break}if(f===s.length)break}v.id=Number(s.substring(q,f+1))}if(s.charAt(++f)){let q=this.tryParse(s.substr(f));if(ss.isPayloadValid(v.type,q))v.data=q;else throw new Error(\"invalid payload\")}return _o(\"decoded %s as %j\",s,v),v}tryParse(s){try{return JSON.parse(s,this.reviver)}catch{return!1}}static isPayloadValid(s,f){switch(s){case mt.CONNECT:return typeof f==\"object\";case mt.DISCONNECT:return f===void 0;case mt.CONNECT_ERROR:return typeof f==\"string\"||typeof f==\"object\";case mt.EVENT:case mt.BINARY_EVENT:return Array.isArray(f)&&f.length>0;case mt.ACK:case mt.BINARY_ACK:return Array.isArray(f)}}destroy(){this.reconstructor&&this.reconstructor.finishedReconstruction()}};an.Decoder=ss;var ef=class{constructor(s){this.packet=s,this.buffers=[],this.reconPack=s}takeBinaryData(s){if(this.buffers.push(s),this.buffers.length===this.reconPack.attachments){let f=Kc.reconstructPacket(this.reconPack,this.buffers);return this.finishedReconstruction(),f}return null}finishedReconstruction(){this.reconPack=null,this.buffers=[]}}});var To=_e(as=>{\"use strict\";Object.defineProperty(as,\"__esModule\",{value:!0});as.on=void 0;function r$(c,s,f){return c.on(s,f),function(){c.off(s,f)}}as.on=r$});var ko=_e(Rr=>{\"use strict\";var i$=Rr&&Rr.__importDefault||function(c){return c&&c.__esModule?c:{default:c}};Object.defineProperty(Rr,\"__esModule\",{value:!0});Rr.Socket=void 0;var Zt=os(),us=To(),s$=Wn(),o$=i$(si()),Ut=o$.default(\"socket.io-client:socket\"),a$=Object.freeze({connect:1,connect_error:1,disconnect:1,disconnecting:1,newListener:1,removeListener:1}),tf=class extends s$.Emitter{constructor(s,f,v){super();this.connected=!1,this.receiveBuffer=[],this.sendBuffer=[],this.ids=0,this.acks={},this.flags={},this.io=s,this.nsp=f,v&&v.auth&&(this.auth=v.auth),this.io._autoConnect&&this.open()}get disconnected(){return!this.connected}subEvents(){if(this.subs)return;let s=this.io;this.subs=[us.on(s,\"open\",this.onopen.bind(this)),us.on(s,\"packet\",this.onpacket.bind(this)),us.on(s,\"error\",this.onerror.bind(this)),us.on(s,\"close\",this.onclose.bind(this))]}get active(){return!!this.subs}connect(){return this.connected?this:(this.subEvents(),this.io._reconnecting||this.io.open(),this.io._readyState===\"open\"&&this.onopen(),this)}open(){return this.connect()}send(...s){return s.unshift(\"message\"),this.emit.apply(this,s),this}emit(s,...f){if(a$.hasOwnProperty(s))throw new Error('\"'+s.toString()+'\" is a reserved event name');f.unshift(s);let v={type:Zt.PacketType.EVENT,data:f};if(v.options={},v.options.compress=this.flags.compress!==!1,typeof f[f.length-1]==\"function\"){let ae=this.ids++;Ut(\"emitting packet with ack id %d\",ae);let $e=f.pop();this._registerAckCallback(ae,$e),v.id=ae}let w=this.io.engine&&this.io.engine.transport&&this.io.engine.transport.writable;return this.flags.volatile&&(!w||!this.connected)?Ut(\"discard packet as the transport is not currently writable\"):this.connected?(this.notifyOutgoingListeners(v),this.packet(v)):this.sendBuffer.push(v),this.flags={},this}_registerAckCallback(s,f){let v=this.flags.timeout;if(v===void 0){this.acks[s]=f;return}let w=this.io.setTimeoutFn(()=>{delete this.acks[s];for(let q=0;q<this.sendBuffer.length;q++)this.sendBuffer[q].id===s&&(Ut(\"removing packet with ack id %d from the buffer\",s),this.sendBuffer.splice(q,1));Ut(\"event with ack id %d has timed out after %d ms\",s,v),f.call(this,new Error(\"operation has timed out\"))},v);this.acks[s]=(...q)=>{this.io.clearTimeoutFn(w),f.apply(this,[null,...q])}}packet(s){s.nsp=this.nsp,this.io._packet(s)}onopen(){Ut(\"transport is open - connecting\"),typeof this.auth==\"function\"?this.auth(s=>{this.packet({type:Zt.PacketType.CONNECT,data:s})}):this.packet({type:Zt.PacketType.CONNECT,data:this.auth})}onerror(s){this.connected||this.emitReserved(\"connect_error\",s)}onclose(s,f){Ut(\"close (%s)\",s),this.connected=!1,delete this.id,this.emitReserved(\"disconnect\",s,f)}onpacket(s){if(s.nsp===this.nsp)switch(s.type){case Zt.PacketType.CONNECT:if(s.data&&s.data.sid){let w=s.data.sid;this.onconnect(w)}else this.emitReserved(\"connect_error\",new Error(\"It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)\"));break;case Zt.PacketType.EVENT:case Zt.PacketType.BINARY_EVENT:this.onevent(s);break;case Zt.PacketType.ACK:case Zt.PacketType.BINARY_ACK:this.onack(s);break;case Zt.PacketType.DISCONNECT:this.ondisconnect();break;case Zt.PacketType.CONNECT_ERROR:this.destroy();let v=new Error(s.data.message);v.data=s.data.data,this.emitReserved(\"connect_error\",v);break}}onevent(s){let f=s.data||[];Ut(\"emitting event %j\",f),s.id!=null&&(Ut(\"attaching ack callback to event\"),f.push(this.ack(s.id))),this.connected?this.emitEvent(f):this.receiveBuffer.push(Object.freeze(f))}emitEvent(s){if(this._anyListeners&&this._anyListeners.length){let f=this._anyListeners.slice();for(let v of f)v.apply(this,s)}super.emit.apply(this,s)}ack(s){let f=this,v=!1;return function(...w){v||(v=!0,Ut(\"sending ack %j\",w),f.packet({type:Zt.PacketType.ACK,id:s,data:w}))}}onack(s){let f=this.acks[s.id];typeof f==\"function\"?(Ut(\"calling ack %s with %j\",s.id,s.data),f.apply(this,s.data),delete this.acks[s.id]):Ut(\"bad ack %s\",s.id)}onconnect(s){Ut(\"socket connected with id %s\",s),this.id=s,this.connected=!0,this.emitBuffered(),this.emitReserved(\"connect\")}emitBuffered(){this.receiveBuffer.forEach(s=>this.emitEvent(s)),this.receiveBuffer=[],this.sendBuffer.forEach(s=>{this.notifyOutgoingListeners(s),this.packet(s)}),this.sendBuffer=[]}ondisconnect(){Ut(\"server disconnect (%s)\",this.nsp),this.destroy(),this.onclose(\"io server disconnect\")}destroy(){this.subs&&(this.subs.forEach(s=>s()),this.subs=void 0),this.io._destroy(this)}disconnect(){return this.connected&&(Ut(\"performing disconnect (%s)\",this.nsp),this.packet({type:Zt.PacketType.DISCONNECT})),this.destroy(),this.connected&&this.onclose(\"io client disconnect\"),this}close(){return this.disconnect()}compress(s){return this.flags.compress=s,this}get volatile(){return this.flags.volatile=!0,this}timeout(s){return this.flags.timeout=s,this}onAny(s){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(s),this}prependAny(s){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(s),this}offAny(s){if(!this._anyListeners)return this;if(s){let f=this._anyListeners;for(let v=0;v<f.length;v++)if(s===f[v])return f.splice(v,1),this}else this._anyListeners=[];return this}listenersAny(){return this._anyListeners||[]}onAnyOutgoing(s){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.push(s),this}prependAnyOutgoing(s){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.unshift(s),this}offAnyOutgoing(s){if(!this._anyOutgoingListeners)return this;if(s){let f=this._anyOutgoingListeners;for(let v=0;v<f.length;v++)if(s===f[v])return f.splice(v,1),this}else this._anyOutgoingListeners=[];return this}listenersAnyOutgoing(){return this._anyOutgoingListeners||[]}notifyOutgoingListeners(s){if(this._anyOutgoingListeners&&this._anyOutgoingListeners.length){let f=this._anyOutgoingListeners.slice();for(let v of f)v.apply(this,s.data)}}};Rr.Socket=tf});var nf=_e(cs=>{\"use strict\";Object.defineProperty(cs,\"__esModule\",{value:!0});cs.Backoff=void 0;function Mr(c){c=c||{},this.ms=c.min||100,this.max=c.max||1e4,this.factor=c.factor||2,this.jitter=c.jitter>0&&c.jitter<=1?c.jitter:0,this.attempts=0}cs.Backoff=Mr;Mr.prototype.duration=function(){var c=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var s=Math.random(),f=Math.floor(s*this.jitter*c);c=(Math.floor(s*10)&1)==0?c-f:c+f}return Math.min(c,this.max)|0};Mr.prototype.reset=function(){this.attempts=0};Mr.prototype.setMin=function(c){this.ms=c};Mr.prototype.setMax=function(c){this.max=c};Mr.prototype.setJitter=function(c){this.jitter=c}});var sf=_e(Qt=>{\"use strict\";var u$=Qt&&Qt.__createBinding||(Object.create?function(c,s,f,v){v===void 0&&(v=f),Object.defineProperty(c,v,{enumerable:!0,get:function(){return s[f]}})}:function(c,s,f,v){v===void 0&&(v=f),c[v]=s[f]}),c$=Qt&&Qt.__setModuleDefault||(Object.create?function(c,s){Object.defineProperty(c,\"default\",{enumerable:!0,value:s})}:function(c,s){c.default=s}),f$=Qt&&Qt.__importStar||function(c){if(c&&c.__esModule)return c;var s={};if(c!=null)for(var f in c)f!==\"default\"&&Object.prototype.hasOwnProperty.call(c,f)&&u$(s,c,f);return c$(s,c),s},l$=Qt&&Qt.__importDefault||function(c){return c&&c.__esModule?c:{default:c}};Object.defineProperty(Qt,\"__esModule\",{value:!0});Qt.Manager=void 0;var Oo=Eo(),h$=ko(),d$=f$(os()),Yn=To(),p$=nf(),v$=Wn(),g$=l$(si()),St=g$.default(\"socket.io-client:manager\"),rf=class extends v$.Emitter{constructor(s,f){var v;super();this.nsps={},this.subs=[],s&&typeof s==\"object\"&&(f=s,s=void 0),f=f||{},f.path=f.path||\"/socket.io\",this.opts=f,Oo.installTimerFunctions(this,f),this.reconnection(f.reconnection!==!1),this.reconnectionAttempts(f.reconnectionAttempts||1/0),this.reconnectionDelay(f.reconnectionDelay||1e3),this.reconnectionDelayMax(f.reconnectionDelayMax||5e3),this.randomizationFactor((v=f.randomizationFactor)!==null&&v!==void 0?v:.5),this.backoff=new p$.Backoff({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(f.timeout==null?2e4:f.timeout),this._readyState=\"closed\",this.uri=s;let w=f.parser||d$;this.encoder=new w.Encoder,this.decoder=new w.Decoder,this._autoConnect=f.autoConnect!==!1,this._autoConnect&&this.open()}reconnection(s){return arguments.length?(this._reconnection=!!s,this):this._reconnection}reconnectionAttempts(s){return s===void 0?this._reconnectionAttempts:(this._reconnectionAttempts=s,this)}reconnectionDelay(s){var f;return s===void 0?this._reconnectionDelay:(this._reconnectionDelay=s,(f=this.backoff)===null||f===void 0||f.setMin(s),this)}randomizationFactor(s){var f;return s===void 0?this._randomizationFactor:(this._randomizationFactor=s,(f=this.backoff)===null||f===void 0||f.setJitter(s),this)}reconnectionDelayMax(s){var f;return s===void 0?this._reconnectionDelayMax:(this._reconnectionDelayMax=s,(f=this.backoff)===null||f===void 0||f.setMax(s),this)}timeout(s){return arguments.length?(this._timeout=s,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&this.backoff.attempts===0&&this.reconnect()}open(s){if(St(\"readyState %s\",this._readyState),~this._readyState.indexOf(\"open\"))return this;St(\"opening %s\",this.uri),this.engine=new Oo.Socket(this.uri,this.opts);let f=this.engine,v=this;this._readyState=\"opening\",this.skipReconnect=!1;let w=Yn.on(f,\"open\",function(){v.onopen(),s&&s()}),q=Yn.on(f,\"error\",ae=>{St(\"error\"),v.cleanup(),v._readyState=\"closed\",this.emitReserved(\"error\",ae),s?s(ae):v.maybeReconnectOnOpen()});if(this._timeout!==!1){let ae=this._timeout;St(\"connect attempt will timeout after %d\",ae),ae===0&&w();let $e=this.setTimeoutFn(()=>{St(\"connect attempt timed out after %d\",ae),w(),f.close(),f.emit(\"error\",new Error(\"timeout\"))},ae);this.opts.autoUnref&&$e.unref(),this.subs.push(function(){clearTimeout($e)})}return this.subs.push(w),this.subs.push(q),this}connect(s){return this.open(s)}onopen(){St(\"open\"),this.cleanup(),this._readyState=\"open\",this.emitReserved(\"open\");let s=this.engine;this.subs.push(Yn.on(s,\"ping\",this.onping.bind(this)),Yn.on(s,\"data\",this.ondata.bind(this)),Yn.on(s,\"error\",this.onerror.bind(this)),Yn.on(s,\"close\",this.onclose.bind(this)),Yn.on(this.decoder,\"decoded\",this.ondecoded.bind(this)))}onping(){this.emitReserved(\"ping\")}ondata(s){try{this.decoder.add(s)}catch(f){this.onclose(\"parse error\",f)}}ondecoded(s){Oo.nextTick(()=>{this.emitReserved(\"packet\",s)},this.setTimeoutFn)}onerror(s){St(\"error\",s),this.emitReserved(\"error\",s)}socket(s,f){let v=this.nsps[s];return v||(v=new h$.Socket(this,s,f),this.nsps[s]=v),v}_destroy(s){let f=Object.keys(this.nsps);for(let v of f)if(this.nsps[v].active){St(\"socket %s is still active, skipping close\",v);return}this._close()}_packet(s){St(\"writing packet %j\",s);let f=this.encoder.encode(s);for(let v=0;v<f.length;v++)this.engine.write(f[v],s.options)}cleanup(){St(\"cleanup\"),this.subs.forEach(s=>s()),this.subs.length=0,this.decoder.destroy()}_close(){St(\"disconnect\"),this.skipReconnect=!0,this._reconnecting=!1,this.onclose(\"forced close\"),this.engine&&this.engine.close()}disconnect(){return this._close()}onclose(s,f){St(\"closed due to %s\",s),this.cleanup(),this.backoff.reset(),this._readyState=\"closed\",this.emitReserved(\"close\",s,f),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;let s=this;if(this.backoff.attempts>=this._reconnectionAttempts)St(\"reconnect failed\"),this.backoff.reset(),this.emitReserved(\"reconnect_failed\"),this._reconnecting=!1;else{let f=this.backoff.duration();St(\"will wait %dms before reconnect attempt\",f),this._reconnecting=!0;let v=this.setTimeoutFn(()=>{s.skipReconnect||(St(\"attempting reconnect\"),this.emitReserved(\"reconnect_attempt\",s.backoff.attempts),!s.skipReconnect&&s.open(w=>{w?(St(\"reconnect attempt error\"),s._reconnecting=!1,s.reconnect(),this.emitReserved(\"reconnect_error\",w)):(St(\"reconnect success\"),s.onreconnect())}))},f);this.opts.autoUnref&&v.unref(),this.subs.push(function(){clearTimeout(v)})}}onreconnect(){let s=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved(\"reconnect\",s)}};Qt.Manager=rf});var cf=_e((Pt,uf)=>{\"use strict\";var $$=Pt&&Pt.__importDefault||function(c){return c&&c.__esModule?c:{default:c}};Object.defineProperty(Pt,\"__esModule\",{value:!0});Pt.default=Pt.connect=Pt.io=Pt.Socket=Pt.Manager=Pt.protocol=void 0;var m$=Vc(),fs=sf();Object.defineProperty(Pt,\"Manager\",{enumerable:!0,get:function(){return fs.Manager}});var af=ko();Object.defineProperty(Pt,\"Socket\",{enumerable:!0,get:function(){return af.Socket}});var y$=$$(si()),of=y$.default(\"socket.io-client\"),oi={};function Jn(c,s){typeof c==\"object\"&&(s=c,c=void 0),s=s||{};let f=m$.url(c,s.path||\"/socket.io\"),v=f.source,w=f.id,q=f.path,ae=oi[w]&&q in oi[w].nsps,$e=s.forceNew||s[\"force new connection\"]||s.multiplex===!1||ae,pe;return $e?(of(\"ignoring socket cache for %s\",v),pe=new fs.Manager(v,s)):(oi[w]||(of(\"new io instance for %s\",v),oi[w]=new fs.Manager(v,s)),pe=oi[w]),f.query&&!s.query&&(s.query=f.queryKey),pe.socket(f.path,s)}Pt.io=Jn;Pt.connect=Jn;Pt.default=Jn;Object.assign(Jn,{Manager:fs.Manager,Socket:af.Socket,io:Jn,connect:Jn});var b$=os();Object.defineProperty(Pt,\"protocol\",{enumerable:!0,get:function(){return b$.protocol}});uf.exports=Jn});var ff=_e(()=>{var C$=Hn(),xo=cf(),E$=window.___browserSync___.socketConfig,w$=window.___browserSync___.socketUrl,vn=xo(w$,E$);C$.module(\"bsSocket\",[]).service(\"Socket\",[\"$q\",\"$rootScope\",A$]);function A$(c,s){var f=c.defer(),v;vn.on(\"connection\",function(q){if(v=q.session,s.$emit(\"ui:connection\",q),f.resolve(q,this),window.name===\"\")window.name=JSON.stringify({id:xo.id});else{var ae=JSON.parse(window.name);ae.id,xo.id}}),vn.on(\"disconnect\",function(){s.$emit(\"ui:disconnect\")});var w={on:function(q,ae){vn.on(q,ae)},off:function(q,ae){vn.off(q,ae)},removeEvent:function(q,ae){vn.removeListener(q,ae)},emit:function(q,ae){vn.emit(q,ae||{})},clientEvent:function(q,ae){vn.emit(\"ui:client:proxy\",{event:q,data:ae})},options:function(){return f.promise},getData:function(q){var ae=c.defer();return vn.on(\"ui:receive:\"+q,function($e){ae.resolve($e)}),vn.emit(\"ui:get:\"+q),ae.promise},uiEvent:function(q){vn.emit(\"ui\",q)},newSession:function(){}};return Object.defineProperty(w,\"sessionId\",{get:function(){return v}}),w}});var Fr=_e((Wm,lf)=>{lf.exports=window.angular.module(\"BrowserSync\")});var hf=_e(()=>{var S$=Fr();S$.service(\"Pages\",[\"pagesConfig\",\"$location\",_$]);function _$(c,s){return{enable:function(f){return angular.forEach(c,function(v){v.active=!1}),f.active=!0,c},transform:function(f,v){if(typeof v==\"function\")return f=v(f);throw new TypeError(\"Noooo\")},current:function(){if(s.path()===\"/\")return c.overview;var f;return angular.forEach(c,function(v){v.path===s.path()&&(f=v)}),f}}}});var df=_e(()=>{var T$=Fr();T$.factory(\"Options\",[\"Socket\",k$]);function k$(c){return{all:function(){return c.getData(\"options\")}}}});var vf=_e((Po,pf)=>{\"use strict\";(function(c,s){typeof define==\"function\"&&define.amd?define([],s):typeof Po==\"object\"?pf.exports=s():c.store=s()})(Po,function(){var c={},s=typeof window<\"u\"?window:global,f=s.document,v=\"localStorage\",w=\"script\",q;c.disabled=!1,c.version=\"1.3.20\",c.set=function(se,ge){},c.get=function(se,ge){},c.has=function(se){return c.get(se)!==void 0},c.remove=function(se){},c.clear=function(){},c.transact=function(se,ge,j){j==null&&(j=ge,ge=null),ge==null&&(ge={});var P=c.get(se,ge);j(P),c.set(se,P)},c.getAll=function(){},c.forEach=function(){},c.serialize=function(se){return JSON.stringify(se)},c.deserialize=function(se){if(typeof se==\"string\")try{return JSON.parse(se)}catch{return se||void 0}};function ae(){try{return v in s&&s[v]}catch{return!1}}if(ae())q=s[v],c.set=function(se,ge){return ge===void 0?c.remove(se):(q.setItem(se,c.serialize(ge)),ge)},c.get=function(se,ge){var j=c.deserialize(q.getItem(se));return j===void 0?ge:j},c.remove=function(se){q.removeItem(se)},c.clear=function(){q.clear()},c.getAll=function(){var se={};return c.forEach(function(ge,j){se[ge]=j}),se},c.forEach=function(se){for(var ge=0;ge<q.length;ge++){var j=q.key(ge);se(j,c.get(j))}};else if(f&&f.documentElement.addBehavior){var $e,pe;try{pe=new ActiveXObject(\"htmlfile\"),pe.open(),pe.write(\"<\"+w+\">document.w=window</\"+w+'><iframe src=\"/favicon.ico\"></iframe>'),pe.close(),$e=pe.w.frames[0].document,q=$e.createElement(\"div\")}catch{q=f.createElement(\"div\"),$e=f.body}var Pe=function(se){return function(){var ge=Array.prototype.slice.call(arguments,0);ge.unshift(q),$e.appendChild(q),q.addBehavior(\"#default#userData\"),q.load(v);var j=se.apply(c,ge);return $e.removeChild(q),j}},x=new RegExp(\"[!\\\"#$%&'()*+,/\\\\\\\\:;<=>?@[\\\\]^`{|}~]\",\"g\"),S=function(se){return se.replace(/^d/,\"___$&\").replace(x,\"___\")};c.set=Pe(function(se,ge,j){return ge=S(ge),j===void 0?c.remove(ge):(se.setAttribute(ge,c.serialize(j)),se.save(v),j)}),c.get=Pe(function(se,ge,j){ge=S(ge);var P=c.deserialize(se.getAttribute(ge));return P===void 0?j:P}),c.remove=Pe(function(se,ge){ge=S(ge),se.removeAttribute(ge),se.save(v)}),c.clear=Pe(function(se){var ge=se.XMLDocument.documentElement.attributes;se.load(v);for(var j=ge.length-1;j>=0;j--)se.removeAttribute(ge[j].name);se.save(v)}),c.getAll=function(se){var ge={};return c.forEach(function(j,P){ge[j]=P}),ge},c.forEach=Pe(function(se,ge){for(var j=se.XMLDocument.documentElement.attributes,P=0,G;G=j[P];++P)ge(G.name,c.deserialize(se.getAttribute(G.name)))})}try{var Q=\"__storejs__\";c.set(Q,Q),c.get(Q)!=Q&&(c.disabled=!0),c.remove(Q)}catch{c.disabled=!0}return c.enabled=!c.disabled,c})});var $f=_e((gf,ls)=>{(function(c,s){\"use strict\";typeof ls==\"object\"&&typeof ls.exports==\"object\"?ls.exports=s():typeof define==\"function\"&&define.amd?define([],s):c.objectPath=s()})(gf,function(){\"use strict\";var c=Object.prototype.toString;function s(x,S){return x==null?!1:Object.prototype.hasOwnProperty.call(x,S)}function f(x){if(!x||q(x)&&x.length===0)return!0;if(typeof x!=\"string\"){for(var S in x)if(s(x,S))return!1;return!0}return!1}function v(x){return c.call(x)}function w(x){return typeof x==\"object\"&&v(x)===\"[object Object]\"}var q=Array.isArray||function(x){return c.call(x)===\"[object Array]\"};function ae(x){return typeof x==\"boolean\"||v(x)===\"[object Boolean]\"}function $e(x){var S=parseInt(x);return S.toString()===x?S:x}function pe(x){x=x||{};var S=function(j){return Object.keys(S).reduce(function(P,G){return G===\"create\"||typeof S[G]==\"function\"&&(P[G]=S[G].bind(S,j)),P},{})},Q;x.includeInheritedProps?Q=function(){return!0}:Q=function(j,P){return typeof P==\"number\"&&Array.isArray(j)||s(j,P)};function se(j,P){if(Q(j,P))return j[P]}function ge(j,P,G,X){if(typeof P==\"number\"&&(P=[P]),!P||P.length===0)return j;if(typeof P==\"string\")return ge(j,P.split(\".\").map($e),G,X);var ue=P[0],Oe=se(j,ue);if(x.includeInheritedProps&&(ue===\"__proto__\"||ue===\"constructor\"&&typeof Oe==\"function\"))throw new Error(\"For security reasons, object's magic properties cannot be set\");return P.length===1?((Oe===void 0||!X)&&(j[ue]=G),Oe):(Oe===void 0&&(typeof P[1]==\"number\"?j[ue]=[]:j[ue]={}),ge(j[ue],P.slice(1),G,X))}return S.has=function(j,P){if(typeof P==\"number\"?P=[P]:typeof P==\"string\"&&(P=P.split(\".\")),!P||P.length===0)return!!j;for(var G=0;G<P.length;G++){var X=$e(P[G]);if(typeof X==\"number\"&&q(j)&&X<j.length||(x.includeInheritedProps?X in Object(j):s(j,X)))j=j[X];else return!1}return!0},S.ensureExists=function(j,P,G){return ge(j,P,G,!0)},S.set=function(j,P,G,X){return ge(j,P,G,X)},S.insert=function(j,P,G,X){var ue=S.get(j,P);X=~~X,q(ue)||(ue=[],S.set(j,P,ue)),ue.splice(X,0,G)},S.empty=function(j,P){if(!f(P)&&j!=null){var G,X;if(!!(G=S.get(j,P))){if(typeof G==\"string\")return S.set(j,P,\"\");if(ae(G))return S.set(j,P,!1);if(typeof G==\"number\")return S.set(j,P,0);if(q(G))G.length=0;else if(w(G))for(X in G)Q(G,X)&&delete G[X];else return S.set(j,P,null)}}},S.push=function(j,P){var G=S.get(j,P);q(G)||(G=[],S.set(j,P,G)),G.push.apply(G,Array.prototype.slice.call(arguments,2))},S.coalesce=function(j,P,G){for(var X,ue=0,Oe=P.length;ue<Oe;ue++)if((X=S.get(j,P[ue]))!==void 0)return X;return G},S.get=function(j,P,G){if(typeof P==\"number\"&&(P=[P]),!P||P.length===0)return j;if(j==null)return G;if(typeof P==\"string\")return S.get(j,P.split(\".\"),G);var X=$e(P[0]),ue=se(j,X);return ue===void 0?G:P.length===1?ue:S.get(j[X],P.slice(1),G)},S.del=function(P,G){if(typeof G==\"number\"&&(G=[G]),P==null||f(G))return P;if(typeof G==\"string\")return S.del(P,G.split(\".\"));var X=$e(G[0]);if(!Q(P,X))return P;if(G.length===1)q(P)?P.splice(X,1):delete P[X];else return S.del(P[X],G.slice(1));return P},S}var Pe=pe();return Pe.create=pe,Pe.withInheritedProps=pe({includeInheritedProps:!0}),Pe})});var mf=_e(()=>{var O$=Hn(),gn=vf(),x$=$f();O$.module(\"bsStore\",[]).service(\"Store\",[\"$q\",\"$rootScope\",R$]);function P$(c){var s=gn.get(\"bs\",{});Object.keys(s).length||gn.set(\"bs\",{}),this.ns=c,this.get=function(f){var v=gn.get(\"bs\",{});return Object.keys(v).length||gn.set(\"bs\",{}),x$.get(v,[c].concat(f).join(\".\"))},this.set=function(f,v){var w=gn.get(\"bs\",{});Object.keys(w).length||gn.set(\"bs\",{}),w[c]||(w[c]={}),w[c][f]=v,gn.set(\"bs\",w)},this.remove=function(f){var v=gn.get(\"bs\",{});Object.keys(v).length||gn.set(\"bs\",{}),v[c]||(v[c]={}),v[c][f]&&delete v[c][f],gn.set(\"bs\",v)}}function R$(){return{create:function(c){var s=new P$(c);return s}}}});var yf=_e(()=>{var M$=Fr();M$.controller(\"MainController\",[\"$scope\",\"$rootScope\",\"$location\",\"$injector\",F$]);function F$(c,s,f,v){var w=this;w.options=!1,w.browsers=[],w.socketId=\"\";var q=v.get(\"pagesConfig\"),ae=v.get(\"Pages\"),$e=v.get(\"Socket\"),pe=v.get(\"Clients\");w.ui={menu:q,sectionMenu:!1,disconnected:!1},w.setActiveSection=function(Pe){ae.enable(Pe),f.path(Pe.path),w.ui.sectionMenu=!1},w.reloadAll=function(){pe.reloadAll(),s.$emit(\"notify:flash\",{heading:\"Instruction sent:\",message:\"Reload All Browsers  \\u2714\"})},w.scrollAllTo=function(){pe.scrollAllTo(0),s.$emit(\"notify:flash\",{heading:\"Instruction sent:\",message:\"Scroll all browsers to Y=0  \\u2714\"})},w.sendAllTo=function(Pe){pe.sendAllTo(Pe),s.$emit(\"notify:flash\",{heading:\"Instruction sent:\",message:\"Reset all Browsers to /\"})},w.toggleMenu=function(){w.ui.sectionMenu=!w.ui.sectionMenu},w.socketEvents={connection:function(Pe){w.update(Pe)},disconnect:function(){w.ui.disconnected=!0}},w.update=function(Pe){w.options=L$(Pe),w.ui.disconnected=!1,ae.transform(q.overview,function(x){return x})},w.setActiveSection(ae.current()),$e.options().then(w.socketEvents.connection),s.$on(\"ui:disconnect\",w.socketEvents.disconnect),s.$on(\"ui:connection\",function(Pe,x){w.socketEvents.connection(x),c.$digest()})}function L$(c){return c.displayUrl=D$(c.urls),c}function D$(c){return c?c.external||c.local:!1}});var Cf=_e((ey,bf)=>{bf.exports={ucfirst:function(c){return c.charAt(0).toUpperCase()+c.slice(1)},localRootUrl:function(c,s){return[s,\"://\",window.location.hostname,\":\",c].join(\"\")},localUrl:function(c,s,f){return f===\"snippet\"?c:[\"//\",window.location.hostname,\":\",s,c].join(\"\")},orderObjectBy:function(c,s,f){var v=[];return Object.keys(c).forEach(function(w){v.push(c[w])}),v.sort(function(w,q){return w[s]>q[s]?1:-1}),f&&v.reverse(),v}}});var Ef=_e((ty,Ro)=>{var Ro=Fr(),hs=Cf();Ro.filter(\"ucfirst\",function(){return hs.ucfirst}).filter(\"localRootUrl\",function(){return hs.localRootUrl}).filter(\"localUrl\",function(){return hs.localRootUrl}).filter(\"orderObjectBy\",function(){return hs.orderObjectBy})});var Af=_e((ny,wf)=>{wf.exports=function(){return{scope:{icon:\"@\"},restrict:\"E\",replace:!0,template:'<svg bs-svg-icon><use xlink:href=\"{{iconName}}\"></use></svg>',link:function(c,s,f){return c.iconName=\"#svg-\"+c.icon,c}}}});var _f=_e((ry,Sf)=>{Sf.exports=function(){return{restrict:\"E\",replace:!1,transclude:!0,scope:{path:\"@\"},template:\"<a href='#' ng-click='navi(path)' ng-transclude=''>as</a>\",controller:[\"$scope\",\"$location\",\"$injector\",function(c,s,f){var v=f.get(\"pagesConfig\"),w=f.get(\"Pages\");c.navi=function(q){var ae=v[q];w.enable(ae),s.path(q)}}]}}});var kf=_e((iy,Tf)=>{Tf.exports=function(){return{scope:{toggle:\"&\",item:\"=\",switchid:\"@\",title:\"@\",tagline:\"@\",active:\"=\",prop:\"@\"},restrict:\"E\",replace:!0,transclude:!0,templateUrl:\"bs-switch.html\",controllerAs:\"ctrl\",controller:[\"$scope\",function(c){var s=this;s.item=c.item}]}}});var xf=_e((sy,Of)=>{Of.exports=function(){return{scope:{url:\"@\",mode:\"@\"},restrict:\"E\",replace:!0,template:`<a href=\"{{url}}\" bs-button=\"subtle-alt icon\" target=\"_blank\" title=\"Open a new tab\" ng-show=\"mode !== 'snippet'\"><icon icon=\"newtab\"></icon> New Tab </a>`}}});var Pf=_e((oy,Lr)=>{var Lr=Fr();Lr.directive(\"icon\",Af());Lr.directive(\"linkTo\",_f());Lr.directive(\"switch\",kf());Lr.directive(\"newTab\",xf())});Nu();Bu();Hu();Gu();var I$=window.angular;I$.module(\"BrowserSync\",[\"bsHistory\",\"bsClients\",\"bsDisconnect\",\"bsNotify\",\"bsSocket\",\"bsStore\",\"ngRoute\",\"ngTouch\",\"ngSanitize\"]).config([\"$locationProvider\",N$]);function N$(c){c.html5Mode({enabled:!0,requireBase:!1})}var ay=Yu(),uy=Ju(),cy=Ku(),fy=Zu(),ly=ff(),hy=hf(),dy=df(),py=mf(),vy=yf(),gy=Ef(),$y=Pf();})();\n/**\n * @license AngularJS v1.8.2\n * (c) 2010-2020 Google LLC. http://angularjs.org\n * License: MIT\n */\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/_config.yml",
    "content": "sections:\n  - title: \"Overview\"\n    icon:  \"cog\"\n    href:  \"/server-info.html\"\n  - title: \"Sync Options\"\n    icon:  \"sync\"\n    href:  \"/sync-options.html\"\n  - title: \"History\"\n    icon:  \"list2\"\n    href:  \"/history.html\"\n  - title: \"Plugins\"\n    icon:  \"plug\"\n    href:  \"/plugins.html\"\n  - title: \"Remote Debug\"\n    icon:  \"bug\"\n    href:  \"/remote-debug.html\"\n  - title: \"Network Throttle\"\n    icon:  \"time\"\n    href:  \"/network-throttle.html\"\n  - title: \"Help / About\"\n    icon:  \"help\"\n    href:  \"/help.html\"\n\nlinks:\n  github:  \"https://github.com/BrowserSync/browser-sync/\"\n  issues:  \"https://github.com/BrowserSync/browser-sync/issues\"\n  twitter: \"https://twitter.com/browsersync\"\n  home:    \"https://browsersync.io\"\n  stackoverflow:  \"https://stackoverflow.com/questions/tagged/browser-sync\"\n  snippetOptions: \"https://www.browsersync.io/docs/options/#option-snippetOptions\"\n  contributing: \"https://github.com/shakyShane/browser-sync/blob/master/CONTRIBUTING.md\"\n  options: \"https://www.browsersync.io/docs/options\"\n  jh: \"https://wearejh.com\"\n\nproject:\n  name: \"Browsersync.io\"\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/_includes/enable.disable.hbs",
    "content": "<div bs-button-row>\n    <button bs-button=\"icon-left inline success\">\n        {{inc src=\"icon.hbs\" icon=\"circle-ok\" }} Enable All\n    </button>\n    <button bs-button=\"icon-left inline\">\n        {{inc src=\"icon.hbs\" icon=\"circle-delete\" }} Disable All\n    </button>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/_includes/form.input.checkbox.hbs",
    "content": "<div bs-input=\"inline\">\n    <input type=\"checkbox\" id=\"{{$_ \"kebabCase\" title}}\" checked>\n    <label for=\"{{$_ \"kebabCase\" title}}\" bs-input-label>{{title}}</label>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/_includes/form.input.text.hbs",
    "content": "<div bs-input=\"text\">\n    <label for=\"{{$_ \"kebabCase\" title}}\" bs-input-label>{{title}}</label>\n    <input id=\"{{$_ \"kebabCase\" title}}\" type=\"text\" size=\"{{value}}\" value=\"{{value}}\" placeholder=\"{{placeholder}}\"/>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/_includes/header.hbs",
    "content": "<header bs-header role=\"banner\">\n    <div bs-header-row=\"brand\">\n        <a href=\"/\" title=\"Visit the Browsersync.io website\" class=\"icon icon-logo\">\n            <svg>\n                <use xlink:href=\"#svg-logo\"></use>\n            </svg>\n        </a>\n        <span class=\"icon icon-word\">\n            <svg>\n                <use xlink:href=\"#svg-logo-word\"></use>\n            </svg>\n        </span>\n        <span bs-toggle=\"nav\" ng-click=\"toggleMenu()\">\n            <i bs-icon=\"list\"></i>\n        </span>\n    </div>\n    <!--<div bs-header-row>-->\n        <!--<ul bs-list=\"header\">-->\n            <!--<li><a href=\"#\">http://localhost:3000</a></li>-->\n            <!--<li><a href=\"#\">http://192.168.0.1:3000</a></li>-->\n        <!--</ul>-->\n    <!--</div>-->\n</header>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/_includes/icon.hbs",
    "content": "<svg bs-svg-icon><use xlink:href=\"#svg-{{icon}}\"></use></svg>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/_includes/nav.hbs",
    "content": "<section bs-sidebar>\n    <nav bs-section-nav class=\"ready\">\n        <ul bs-list>\n            {{#each site.sections}}\n            <li>\n                <a href=\"{{this.href}}\" bs-button=\"nav\" {{#current this.href}} class=\"active\"{{/current}}>\n                    {{ inc src=\"icon.hbs\" icon=this.icon }} {{this.title}}\n                </a>\n            </li>\n            {{/each}}\n            <li bs-action=\"menu-close\">\n                <button bs-button=\"nav\" ng-click=\"toggleMenu()\">{{ inc src=\"icon.hbs\" icon=\"circle-delete\" }} CLOSE</button>\n            </li>\n        </ul>\n    </nav>\n    <div bs-visible=\"not-palm\">\n        {{ inc src=\"components/footer.hbs\" }}\n    </div>\n</section>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/_layouts/components.hbs",
    "content": "---\nlayout: parent.hbs\n---\n<main>\n    {{content}}\n</main>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/_layouts/main.hbs",
    "content": "---\nlayout: parent.hbs\n---\n{{ inc src=\"../../public/img/icons/icons.svg\" }}\n<main>\n    {{ inc src=\"components/header.hbs\" }}\n    <section bs-container>\n        {{ inc src=\"nav.hbs\" }}\n        <section bs-content>\n            <div ng-view>\n                {{ content }}\n            </div>\n            <div bs-visible=\"palm\">\n                {{ inc src=\"components/footer.hbs\" }}\n            </div>\n        </section>\n    </section>\n</main>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/_layouts/parent.hbs",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title>Browser Sync - Control Panel</title>\n    <meta charset=\"utf-8\"/>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\"/>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <link rel=\"stylesheet\" href=\"css/core.min.css\"/>\n    {{ $yield name=\"head\" }}\n</head>\n<body>\n    {{content}}\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/components/button-bars.hbs",
    "content": "<div bs-button-group>\n    <button bs-button=\"icon-left\">{{inc src=\"icon.hbs\" icon=\"globe\"}} Website</button>\n    <button bs-button=\"icon-left\">{{inc src=\"icon.hbs\" icon=\"twitter\"}} Twitter</button>\n    <button bs-button=\"icon-right\">{{inc src=\"icon.hbs\" icon=\"github\"}} Github</button>\n    <button bs-button=\"icon\" disabled>{{inc src=\"icon.hbs\" icon=\"target\"}}</button>\n</div>\n<div bs-button-group>\n    <button bs-button=\"icon\">{{inc src=\"icon.hbs\" icon=\"globe\"}}</button>\n    <button bs-button=\"icon\">{{inc src=\"icon.hbs\" icon=\"twitter\"}}</button>\n    <button bs-button=\"icon\">{{inc src=\"icon.hbs\" icon=\"github\"}}</button>\n    <button bs-button=\"icon\">{{inc src=\"icon.hbs\" icon=\"target\"}}</button>\n</div>\n<div bs-button-group>\n    <button bs-button=\"\">Button</button>\n    <button bs-button=\"icon\">{{inc src=\"icon.hbs\" icon=\"globe\"}}</button>\n    <button bs-button=\"icon-left\">{{inc src=\"icon.hbs\" icon=\"globe\"}} Button Small</button>\n    <button bs-button disabled>n/a</button>\n    <button bs-button=\"icon-right\">{{inc src=\"icon.hbs\" icon=\"globe\"}} Button Small</button>\n</div>\n<div bs-button-group>\n    <button bs-button=\"subtle-alt\">Button</button>\n    <button bs-button=\"subtle-alt icon\">{{inc src=\"icon.hbs\" icon=\"globe\"}}</button>\n    <button bs-button=\"subtle-alt icon-left\">{{inc src=\"icon.hbs\" icon=\"globe\"}} Button Small</button>\n    <button bs-button=\"subtle-alt\" disabled>n/a</button>\n    <button bs-button=\"subtle-alt icon-right\">{{inc src=\"icon.hbs\" icon=\"globe\"}} Button Small</button>\n</div>\n<div bs-button-group>\n    <button bs-button=\"size-small subtle-alt\">Button</button>\n    <button bs-button=\"size-small subtle-alt icon\">{{inc src=\"icon.hbs\" icon=\"globe\"}}</button>\n    <button bs-button=\"size-small subtle-alt icon-left\">{{inc src=\"icon.hbs\" icon=\"globe\"}} Button Small</button>\n    <button bs-button=\"size-small subtle-alt\" disabled>n/a</button>\n    <button bs-button=\"size-small subtle-alt icon-right\">{{inc src=\"icon.hbs\" icon=\"globe\"}} Button Small</button>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/components/buttons.hbs",
    "content": "<p>Default button styles</p>\n<p>\n    <button bs-button>Button</button>\n    <button bs-button=\"size-small\">Button Small</button>\n    <button bs-button=\"size-small\" disabled>Button Small</button>\n</p>\n<p>Subtle button styles</p>\n<p>\n    <button bs-button=\"subtle\">Button</button>\n    <button bs-button=\"size-small subtle\">Button Small</button>\n    <button bs-button=\"size-small subtle\" disabled>Button Small</button>\n</p>\n<p>Alternative Subtle button styles</p>\n<p>\n    <button bs-button=\"subtle-alt\">Button</button>\n    <button bs-button=\"size-small subtle-alt\">Button Small</button>\n    <button bs-button=\"size-small subtle-alt\" disabled>Button Small</button>\n</p>\n<hr/>\n<p>Default buttons with icons</p>\n<div>\n    <button bs-button=\"icon-left\">{{ inc src=\"icon.hbs\" icon=\"square-add\" }} Icon Left</button>\n    <button bs-button=\"icon-right\">{{ inc src=\"icon.hbs\" icon=\"globe\" }} Icon Right</button>\n    <button bs-button=\"icon\">{{ inc src=\"icon.hbs\" icon=\"target\" }}</button>\n    <button bs-button=\"icon\" disabled>{{ inc src=\"icon.hbs\" icon=\"target\" }}</button>\n</div>\n<div>\n    <button bs-button=\"size-small icon-left\">{{ inc src=\"icon.hbs\" icon=\"square-add\" }} Icon Left</button>\n    <button bs-button=\"size-small icon-right\">{{ inc src=\"icon.hbs\" icon=\"bug\" }} Icon Right</button>\n    <button bs-button=\"size-small icon\">{{ inc src=\"icon.hbs\" icon=\"target\" }}</button>\n    <button bs-button=\"size-small icon\" disabled>{{ inc src=\"icon.hbs\" icon=\"target\" }}</button>\n</div>\n<br/>\n<p>Subtle buttons with icons</p>\n<div>\n    <button bs-button=\"subtle icon-left\">{{ inc src=\"icon.hbs\" icon=\"square-add\" }} Icon Left</button>\n    <button bs-button=\"subtle icon-right\">{{ inc src=\"icon.hbs\" icon=\"bug\" }} Icon Right</button>\n    <button bs-button=\"subtle icon\">{{ inc src=\"icon.hbs\" icon=\"target\" }}</button>\n    <button bs-button=\"subtle icon\" disabled>{{ inc src=\"icon.hbs\" icon=\"help\" }}</button>\n</div>\n<div>\n    <button bs-button=\"size-small subtle icon-left\">{{ inc src=\"icon.hbs\" icon=\"square-add\" }} Icon Left</button>\n    <button bs-button=\"size-small subtle icon-right\">{{ inc src=\"icon.hbs\" icon=\"bug\" }} Icon Right</button>\n    <button bs-button=\"size-small subtle icon\">{{ inc src=\"icon.hbs\" icon=\"target\" }}</button>\n    <button bs-button=\"size-small subtle icon\" disabled>{{ inc src=\"icon.hbs\" icon=\"help\" }}</button>\n</div>\n<br/>\n<p>Alternative Subtle button styles with icons</p>\n<div>\n    <button bs-button=\"size-small subtle-alt icon-left\">{{ inc src=\"icon.hbs\" icon=\"globe\" }} Icon Left</button>\n    <button bs-button=\"size-small subtle-alt icon-right\">{{ inc src=\"icon.hbs\" icon=\"bug\" }} Icon Right</button>\n    <button bs-button=\"size-small subtle-alt icon\">{{ inc src=\"icon.hbs\" icon=\"target\" }}</button>\n    <button bs-button=\"size-small subtle-alt icon\" disabled>{{ inc src=\"icon.hbs\" icon=\"help\" }}</button>\n</div>\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/components/footer.hbs",
    "content": "<footer bs-footer>\n    <p bs-text=\"copyright\">© 2021 -\n        <a href=\"{{site.links.home}}\">{{site.project.name}}</a>\n    </p>\n    <p>\n        <a href=\"{{site.links.github}}\" bs-icon>\n            {{ inc src=\"icon.hbs\" icon=\"github\" }}\n        </a>\n        <a href=\"{{site.links.twitter}}\" bs-icon>\n            {{ inc src=\"icon.hbs\" icon=\"twitter\" }}\n        </a>\n    </p>\n</footer>\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/components/forms.hbs",
    "content": "{{inc src=\"form.input.text.hbs\" title=\"Grid Size\" value=\"16px\"}}\n<br/>\n{{inc src=\"form.input.text.hbs\" title=\"Some input\" value=\"\" placeholder=\"EG: #main\"}}\n<br/>\n<p bs-label-heading>Form label</p>\n\n<div bs-input=\"text\">\n    <label for=\"overlay-01\" bs-input-label>Input + Button</label>\n    <div bs-input-group>\n        <input bs-stack id=\"overlay-01\" type=\"text\" size=\"10\" value=\"\" placeholder=\"EG: #main\"/>rs\n        <button bs-button=\"subtle-alt icon\"><svg bs-svg-icon><use xlink:href=\"#svg-circle-plus\"></use></svg></button>\n    </div>\n</div>\n\n<div bs-input=\"text\">\n    <label for=\"new-restriction\" bs-input-label>New Restriction</label>\n    <input bs-stack id=\"new-restriction\" type=\"text\" size=\"\" value=\"\" ng-model=\"ctrl.restriction\" placeholder=\"eg: #main\">\n    <div bs-state-wrapper ng-class=\"[ctrl.state.classname]\">\n        <button type=\"submit\" id=\"add-restriction\" bs-button=\"size-small subtle-alt icon-left\" ng-disabled=\"ctrl.state.waiting\">\n            <svg bs-svg-icon=\"\" icon=\"circle-plus\"><use xlink:href=\"#svg-circle-plus\"></use></svg>Add</button>\n        <div bs-state-icons>\n            <svg bs-svg-icon icon=\"circle-ok\" bs-state=\"success inline\"><use xlink:href=\"#svg-circle-ok\"></use></svg>\n            <svg bs-svg-icon icon=\"circle-minus\" bs-state=\"waiting inline\" bs-anim=\"spin\"><use xlink:href=\"#svg-circle-minus\"></use></svg>\n        </div>\n    </div>\n</div>\n\n\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/components/header.hbs",
    "content": "<header bs-header role=\"banner\">\n    <div bs-header-row=\"brand\">\n        <span class=\"icon icon-word\">\n            <svg>\n                <use xlink:href=\"#svg-logo-word\"></use>\n            </svg>\n        </span>\n        <a href=\"https://www.npmjs.com/package/browser-sync\" bs-link=\"version\" target=\"_blank\">v\\{{app.options.version}}</a>\n        <span bs-toggle=\"nav\" ng-click=\"app.toggleMenu('shane')\" ng-class=\"{'active': app.ui.sectionMenu}\">\n            <svg>\n                <use xlink:href=\"#svg-list\"></use>\n            </svg>\n            <svg bs-state=\"alt\">\n                <use xlink:href=\"#svg-circle-delete\"></use>\n            </svg>\n        </span>\n    </div>\n    <aside bs-controls=\"top\">\n        <div bs-flex=\"top\">\n            <a href=\"#\" bs-control title=\"Reload all Browsers\" ng-click=\"app.reloadAll()\">\n                {{ inc src=\"icon.hbs\" icon=\"repeat\" }}\n                Reload all\n            </a>\n            <a href=\"\\{{app.options.port | localRootUrl:app.options.scheme}}\" target=\"_blank\" bs-control title=\"Open a new tab\" ng-if=\"app.options\" ng-show=\"app.options.mode !== 'snippet'\" class=\"ng-scope\">\n                {{ inc src=\"icon.hbs\" icon=\"newtab\" }}\n                New Tab\n            </a>\n            <a href=\"#\" bs-control title=\"Reset the scroll position of all browsers to 0\" ng-click=\"app.scrollAllTo(0)\">\n                {{ inc src=\"icon.hbs\" icon=\"square-up\" }}\n                Scroll Top\n            </a>\n            <a href=\"#\" bs-control title=\"Reset all Browsers to Homepage\" ng-click=\"app.sendAllTo('/')\" ng-show=\"app.options.mode !== 'snippet'\">\n                {{ inc src=\"icon.hbs\" icon=\"home\" }}\n                Reset All\n            </a>\n        </div>\n    </aside>\n</header>\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/components/heading.hbs",
    "content": "<div bs-panel=\"controls outline\">\n    <h1 bs-heading>\n        {{ inc src=\"icon.hbs\" icon=\"cog\" }}\n        Server Info\n    </h1>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/components/help-content.hbs",
    "content": "<div bs-panel=\"controls outline\">\n    <h1 bs-heading>{{ inc src=\"icon.hbs\" icon=page.icon }} {{page.title}}</h1>\n</div>\n<div bs-panel>\n    <div bs-panel-content=\"basic\">\n        <p class=\"lede\">\n            Browsersync is an open-source project created by <a href=\"https://twitter.com/shaneOsbourne\">Shane Osbourne</a>\n        </p>\n        <p><small>Originally supported by [JH]({{site.links.jh}}).</small></p>\n    </div>\n</div>\n<div bs-panel>\n    <div bs-panel-content=\"basic\">\n        <h2>Help</h2>\n        <dl>\n            <dt>Why isn&rsquo;t Browsersync connecting with my project?</dt>\n            <dd>99% of the time, it's because your web page doesn't have a `body` tag.\n                In order for Browsersync to connect properly the `body` tag must be present in your website (we add a script tag just after it).\n                Alternatively you can provide a custom rule for the snippet using [snippetOptions]({{site.links.snippetOptions}})\n            </dd>\n            <dt>Which mode should I be running in?</dt>\n            <dd>\n                <ul>\n                    <li>If you have simple HTML, CSS & JavaScript files, you need the [server option]({{site.links.options}}-server).</li>\n                    <li>If you already have an existing server setup (such as an Express app, Mamp, Rails etc, then you need the [proxy option]({{site.links.options}}-proxy).</li>\n                    <li>If you intend to copy/paste the snippet into your website manually, you use the `snippet` mode. This is the default mode and is\n                    achieved by omitting both the server & proxy options</li>\n                </ul>\n            </dd>\n            <dt>Where can I report an issue?</dt>\n            <dd>\n                <p>If you have found an issue with the Browsersync UI, please use our [issue tracker]({{site.links.issues}}) </p>\n            </dd>\n\n        </dl>\n        <hr>\n        <p>Need more assistance? Please try our [documentation](http://www.browsersync.io/docs/) for user guides or our [stackoverflow]({{site.links.stackoverflow}}) tag for answers to common problems.</p>\n    </div>\n</div>\n<div bs-panel>\n    <div bs-panel-content=\"basic\">\n        <h2>Contribute</h2>\n        <p>We'd love for you to contribute to Browsersync and help make it even better than it is today! Please read our [contributor guidelines]({{site.links.contributing}}).</p>\n    </div>\n</div>\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/components/lists.hbs",
    "content": "<div class=\"tube\">\n<h2>Simple list</h2>\n<ul bs-list>\n    <li>Item 1</li>\n    <li>Item 2</li>\n    <li>Item 3</li>\n    <li>Item 4</li>\n    <li>Item 5</li>\n</ul>\n<br/>\n<h2>Bordered list</h2>\n<ul bs-list=\"bordered\">\n    <li>/gallery/new-item</li>\n    <li><a href=\"#\">https://github.com/shakyShane/browser-sync/pull/400</a></li>\n    <li>Item 3</li>\n    <li>Item 4</li>\n    <li>Item 5</li>\n</ul>\n<br/>\n<h2>Bordered list with controls</h2>\n</div>\n\n<ul bs-list=\"bordered inline-controls\">\n{{#each site.links}}\n    <li>\n        <p>{{this}}</p>\n        <div bs-button-group>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n              {{inc src=\"icon.hbs\" icon=\"syncall\"}}\n            </button>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n                {{inc src=\"icon.hbs\" icon=\"bin\"}}\n            </button>\n        </div>\n    </li>\n{{/each}}\n</ul>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/components/panels.hbs",
    "content": "<div class=\"tube\">\n    <p>Page heading</p>\n<div bs-panel=\"controls outline\">\n    <h1 bs-heading>\n        {{ inc src=\"icon.hbs\" icon=\"cog\" }}\n        Overview\n    </h1>\n</div>\n<hr/>\n    <div bs-panel=\"controls outline\">\n        <h1 bs-heading>\n            {{inc src=\"icon.hbs\" icon=\"syncall\"}}\n            Sync all\n        </h1>\n    </div>\n    <div bs-button-row>\n        <button bs-button=\"inline icon-left success\" ng-click=\"setMany(true)\">\n            <svg bs-svg-icon><use xlink:href=\"#svg-circle-ok\"></use></svg>\n            Enable All\n        </button>\n        <button bs-button=\"icon-left inline\" ng-click=\"setMany(false)\">\n            <svg bs-svg-icon><use xlink:href=\"#svg-circle-delete\"></use></svg>\n            Disable all\n        </button>\n    </div>\n</div>\n\n<div bs-panel=\"controls outline\">\n    <h1 bs-heading>\n        {{ inc src=\"icon.hbs\" icon=\"cog\" }}\n        Overview\n    </h1>\n</div>\n<hr/>\n\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/components/switches.hbs",
    "content": "<section bs-panel=\"switch\" ng-class=\"{'disabled': !active}\">\n    <div bs-panel-content>\n        <div bs-panel-icon>\n            <div class=\"switch\">\n                <input id=\"switch-1\"\n                       ng-model=\"item[prop]\"\n                       ng-change=\"toggle(item)\"\n                       class=\"cmn-toggle cmn-toggle-round\"\n                       type=\"checkbox\"\n                       checked=\"\">\n                <label for=\"switch-1\"></label>\n            </div>\n        </div>\n        <div>\n            <p bs-text=\"lede\">Css Grid Overlay</p>\n            <p>Some other content</p>\n        </div>\n    </div>\n    <div bs-panel-content>\n        <div bs-inputs bs-grid=\"wide-4 desk-2\">\n            <div bs-grid-item>\n                {{inc src=\"form.input.text.hbs\" title=\"Grid Size\" value=\"16px\"}}\n            </div>\n            <div bs-grid-item>\n                {{inc src=\"form.input.text.hbs\" title=\"Grid Colour\" value=\"rgba(0, 0, 0, 0.2)\"}}\n            </div>\n            <div bs-grid-item>\n                {{inc src=\"form.input.text.hbs\" title=\"Grid Selector\" value=\"body\"}}\n            </div>\n        </div>\n        <div bs-inputs bs-grid=\"wide-4 desk-2\">\n            <div bs-grid-item>\n                {{inc src=\"form.input.text.hbs\" title=\"Offset Top\" value=\"0\"}}\n            </div>\n            <div bs-grid-item>\n                {{inc src=\"form.input.text.hbs\" title=\"Offset Bottom\" value=\"0\"}}\n            </div>\n        </div>\n        <div bs-inputs bs-grid=\"wide-4 desk-2\">\n            <div bs-grid-item>\n                {{inc src=\"form.input.checkbox.hbs\" title=\"Vertical Axis\" value=\"0\"}}\n            </div>\n            <div bs-grid-item>\n                {{inc src=\"form.input.checkbox.hbs\" title=\"Horizontal Axis\" value=\"0\"}}\n            </div>\n        </div>\n    </div>\n</section>\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/components/type.hbs",
    "content": "<h1>Heading 1</h1>\n\n<h2>Heading 2</h2>\n\n<h3>Heading 3</h3>\n\n<p class=\"lede\">Lede paragraph. Lorem ipsum dolor sit amet.</p>\n\n<p>Paragraph. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Libero esse molestias, itaque, quia sed laudantium laboriosam amet aliquam ipsam, laborum asperiores quod obcaecati, maiores fugiat nihil cum minus provident vitae.</p>\n\n<p class=\"small\">Small paragraph. Lorem ipsum dolor sit amet.</p>\n\n<p><a href=\"#links\">Link</a> <span bs-sep>|</span> <a href=\"#\">Another link</a></p>\n\n<p>Inline tags. Lorem <strong>strong</strong> ipsum <code>code</code> dolar <mark>mark</mark> si <em>em</em>.</p>\n\n<hr>\n\n<ul>\n    <li>Lorem ipsum dolor sit amet.</li>\n    <li>Ratione dolore veritatis voluptas consequuntur!</li>\n    <li>Odit quis, pariatur ipsum vel.\n        <ul>\n            <li>Lorem ipsum dolor sit amet.</li>\n            <li>Ratione dolore veritatis voluptas consequuntur!</li>\n            <li>Odit quis, pariatur ipsum vel.</li>\n            <li>Suscipit laudantium, quam debitis tempore.</li>\n            <li>Nobis vero nesciunt suscipit porro.</li>\n        </ul>\n    </li>\n    <li>Suscipit laudantium, quam debitis tempore.</li>\n    <li>Nobis vero nesciunt suscipit porro.</li>\n</ul>\n\n<ol>\n    <li>Lorem ipsum dolor sit amet.</li>\n    <li>Ratione dolore veritatis voluptas consequuntur!</li>\n    <li>Odit quis, pariatur ipsum vel.\n        <ol>\n            <li>Lorem ipsum dolor sit amet.</li>\n            <li>Ratione dolore veritatis voluptas consequuntur!</li>\n            <li>Odit quis, pariatur ipsum vel.</li>\n            <li>Suscipit laudantium, quam debitis tempore.</li>\n            <li>Nobis vero nesciunt suscipit porro.</li>\n        </ol>\n    </li>\n    <li>Suscipit laudantium, quam debitis tempore.</li>\n    <li>Nobis vero nesciunt suscipit porro.</li>\n</ol>\n\n<dl>\n    <dt>Lorem ipsum dolor sit amet.</dt>\n    <dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus, hic.</dd>\n    <dt>Lorem ipsum dolor sit amet.</dt>\n    <dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus, hic.</dd>\n    <dt>Lorem ipsum dolor sit amet.</dt>\n    <dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus, hic.</dd>\n</dl>\n\n<hr>\n\n<table>\n    <caption>The Very Best Eggnog</caption>\n    <thead>\n        <tr>\n            <th scope=\"col\">Ingredients</th>\n            <th scope=\"col\">Serves 12</th>\n            <th scope=\"col\">Serves 24</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td data-title=\"Ingredient\">Milk</td>\n            <td data-title=\"For 12\">1 quart</td>\n            <td data-title=\"For 24\">2 quart</td>\n        </tr>\n        <tr>\n            <td data-title=\"Ingredient\">Cloves</td>\n            <td data-title=\"For 12\">5</td>\n            <td data-title=\"For 24\">10</td>\n        </tr>\n        <tr>\n            <td data-title=\"Ingredient\">Egg Yolks</td>\n            <td data-title=\"For 12\">12</td>\n            <td data-title=\"For 24\">24</td>\n        </tr>\n        <tr>\n            <td data-title=\"Ingredient\">Cups Sugar</td>\n            <td data-title=\"For 12\">1 ½ cups</td>\n            <td data-title=\"For 24\">3 cups</td>\n        </tr>\n        <tr>\n            <td data-title=\"Ingredient\">Dark Rum</td>\n            <td data-title=\"For 12\">1 ½ cups</td>\n            <td data-title=\"For 24\">3 cups</td>\n        </tr>\n        <tr>\n            <td data-title=\"Ingredient\">Freshly grated nutmeg to taste</td>\n            <td data-title=\"For 12\"></td>\n            <td data-title=\"For 24\"></td>\n        </tr>\n    </tbody>\n</table>\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/components.hbs",
    "content": "---\nlayout: components.hbs\ntitle: \"Components\"\nsections:\n    - name: \"Typography\"\n      file: \"components/type.hbs\"\n      tube: true\n    - name: \"Buttons\"\n      file: \"components/buttons.hbs\"\n      tube: true\n    - name: \"Button bars\"\n      file: \"components/button-bars.hbs\"\n      tube: true\n    - name: \"Form inputs\"\n      file: \"components/forms.hbs\"\n      tube: true\n    - name: \"Lists\"\n      file: \"components/lists.hbs\"\n      tube: false\n    - name: \"Headings\"\n      file: \"components/heading.hbs\"\n      tube: true\n    - name: \"Panels\"\n      file: \"components/panels.hbs\"\n      tube: false\n    - name: \"Header\"\n      file: \"components/header.hbs\"\n      tube: false\n    - name: \"Switches\"\n      file: \"components/switches.hbs\"\n      tube: false\n---\n<link rel=\"stylesheet\" href=\"css/components.css\" />\n{{ inc src=\"../../public/img/icons/svg/symbols.svg\" }}\n\n<div class=\"tube\">\n    <h1>Browsersync UI Components</h1>\n    <p>Also, you can view static representations of each section:</p>\n    <ul bs-list=\"inline\" class=\"\">\n    {{#each site.sections}}\n        <li>\n            <a href=\"{{this.href}}\" {{#current this.href}} class=\"active\"{{/current}}>{{this.title}}</a> {{#if @last}}{{else}}<span bs-sep>|</span>{{/if}}\n        </li>\n    {{/each}}\n    </ul>\n    <hr/>\n</div>\n\n{{#each page.sections}}\n{{#if this.tube}}\n<div class=\"tube\">\n    <h1>{{this.name}}</h1>\n    {{inc src=this.file title=this.name }}\n    </div>\n<hr/>\n{{else}}\n    <div class=\"tube\">\n        <h1>{{this.name}}</h1>\n    </div>\n    {{inc src=this.file title=this.name }}\n{{/if}}\n{{/each}}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/content/help.content.hbs",
    "content": "---\ntitle: \"Help / About\"\nicon: \"help\"\nmarkdown: true\n---\n{{inc src=\"components/help-content.hbs\" }}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/help.hbs",
    "content": "---\nlayout: main.hbs\ntitle: \"Help / About\"\nicon: \"help\"\nmarkdown: true\n---\n{{inc src=\"components/help-content.hbs\" }}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/history.hbs",
    "content": "---\nlayout: main.hbs\ntitle: \"History\"\nicon: \"book_2\"\nurls:\n    - /\n    - /store-home.php\n    - /store-product.php\n    - /store-product.php?element=thisisit.php&color=we23\n    - /store-home.php\n    - /store-home.php\n    - /store-home.php\n    - /store-home.php\n    - /store-home.php\n    - /store-home.php\n    - /store-home.php\n    - /store-home.php\n    - /store-home.php\n    - /store-home.php\n    - /store-home.php\n    - /store-home.php\n    - /store-home.php\n    - /store-home.php\n    - /store-home.php\n---\n<div bs-panel=\"controls outline\">\n    <h1 bs-heading>{{ inc src=\"icon.hbs\" icon=\"list2\" }} {{page.title}}</h1>\n</div>\n<div bs-button-row>\n    <button bs-button=\"inline icon-left\">\n        {{ inc src=\"icon.hbs\" icon=\"bin\" }}\n        Clear all\n    </button>\n</div>\n<div>\n    <ul bs-list=\"bordered inline-controls\">\n        {{#each page.urls}}\n        <li>\n            <p>{{this}}</p>\n            <div bs-button-group>\n                <a href=\"#\" ng-click=\"sendAllTo(url.path)\" bs-button=\"subtle-alt icon-left\" title=\"Sync all devices to this address.\">\n                    {{ inc src=\"icon.hbs\" icon=\"syncall\" }} Sync all\n                </a>\n                <a href=\"#\" bs-button=\"subtle-alt icon\" ng-click=\"removeVisited(url)\" bs-remove>\n                    {{ inc src=\"icon.hbs\" icon=\"bin\" }}\n                </a>\n            </div>\n        </li>\n        {{/each}}\n    </ul>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/network-throttle.hbs",
    "content": "---\nlayout: main.hbs\ntitle: \"Network Throttle\"\nicon: \"time\"\n---\n<div bs-panel=\"controls outline\">\n    <h1 bs-heading>{{ inc src=\"icon.hbs\" icon=page.icon }} {{page.title}}</h1>\n</div>\n\n<div bs-panel=\"no-border\">\n    <div bs-panel-content=\"basic\">\n        <div bs-inputs bs-grid=\"wide-3 desk-2\">\n            <div bs-grid-item>\n                <p bs-label-heading><b>Speed</b></p>\n\n                <!--<label  bs-input-label>Speed</label>-->\n                <div bs-input=\"inline\">\n                    <input type=\"radio\" id=\"speed-dsl\" checked name=\"speed\">\n                    <label for=\"speed-dsl\" bs-input-label=\"light\">DSL (2Mbps, 5ms RTT)</label>\n                </div>\n                <div bs-input=\"inline\">\n                    <input type=\"radio\" id=\"speed-3g\" checked name=\"speed\">\n                    <label for=\"speed-3g\" bs-input-label=\"light\">3G (750kbs, 100ms RTT)</label>\n                </div>\n                <div bs-input=\"inline\">\n                    <input type=\"radio\" id=\"speed-edge\" checked name=\"speed\">\n                    <label for=\"speed-edge\" bs-input-label=\"light\">EDGE (250kbs, 300ms RTT)</label>\n                </div>\n                <div bs-input=\"inline\">\n                    <input type=\"radio\" id=\"speed-gprs\" checked name=\"speed\">\n                    <label for=\"speed-gprs\" bs-input-label=\"light\">GPRS (50kbs, 500ms RTT)</label>\n                </div>\n                <div bs-input=\"inline\">\n                    <input type=\"radio\" id=\"speed-none\" checked name=\"speed\">\n                    <label for=\"speed-none\" bs-input-label=\"light\">None</label>\n                </div>\n            </div>\n            <div bs-grid-item>\n                <p bs-label-heading><b>Port</b></p>\n                <div bs-input=\"text\">\n                    <div bs-input=\"inline\">\n                        <input type=\"radio\" name=\"port-select\" id=\"port-auto\" checked=\"\" value=\"auto\" ng-model=\"ctrl.portEntry\" class=\"ng-pristine ng-untouched ng-valid\">\n                        <label for=\"port-auto\" bs-input-label>Auto Detection</label>\n                    </div>\n                    <div bs-input=\"inline\">\n                        <input type=\"radio\" id=\"port-manual\" name=\"port-select\" value=\"manual\" ng-model=\"ctrl.portEntry\" class=\"ng-pristine ng-untouched ng-valid\">\n                        <label for=\"port-manual\" bs-input-label>User specified <!-- ngIf: ctrl.state.portError --></label>\n                    </div>\n                    <input id=\"server-port\" type=\"text\" value=\"\" placeholder=\"Eg: 1024\" ng-model=\"ctrl.port\" ng-focus=\"ctrl.portEntry = 'manual'\" custom-validation=\"\" class=\"ng-pristine ng-untouched ng-valid\">\n\n                </div>\n                <br>\n                <button id=\"create-server\" bs-button=\"size-small subtle-alt icon-left\">\n                    <svg bs-svg-icon icon=\"circle-ok\" bs-state=\"success\"><use xlink:href=\"#svg-circle-ok\"></use></svg>\n                    <svg bs-svg-icon icon=\"circle-plus\" bs-state=\"default\"><use xlink:href=\"#svg-circle-plus\"></use></svg>\n                    Create Server\n                </button>\n            </div>\n        </div>\n    </div>\n    <br/>\n    <br/>\n    <div bs-panel-content=\"basic\">\n        <h3>Your Servers</h3>\n    </div>\n    <ul bs-list=\"bordered inline-controls\" bs-offset=\"basic\">\n        <li>\n            <p bs-width=\"5\">1.</p>\n            <p bs-width=\"10\"><b>3G</b></p>\n            <p><a href=\"\">https://localhost:3001</a></p>\n            <p><a href=\"\">https://192.136.1.0:3001</a></p>\n            <div bs-button-group>\n                <button href=\"#\" bs-button=\"subtle-alt icon\" title=\"Sync All\">\n                    {{inc src=\"icon.hbs\" icon=\"syncall\"}}\n                </button>\n                <button href=\"#\" bs-button=\"subtle-alt icon\" title=\"New Tab\">\n                    {{inc src=\"icon.hbs\" icon=\"newtab\"}}\n                </button>\n                <button href=\"#\" bs-button=\"subtle-alt icon\">\n                    {{inc src=\"icon.hbs\" icon=\"bin\"}}\n                </button>\n            </div>\n        </li>\n        <li>\n            <p bs-width=\"5\">2.</p>\n            <p bs-width=\"10\"><b>GPRS</b></p>\n            <p bs-width=\"inline\"><a href=\"\">https://localhost:3002</a></p>\n            <p><a href=\"\">https://192.136.1.0:3002</a></p>\n            <div bs-button-group>\n                <button href=\"#\" bs-button=\"subtle-alt icon\" title=\"Sync All\">\n                    {{inc src=\"icon.hbs\" icon=\"syncall\"}}\n                </button>\n                <button href=\"#\" bs-button=\"subtle-alt icon\" title=\"New Tab\">\n                    {{inc src=\"icon.hbs\" icon=\"newtab\"}}\n                </button>\n                <button href=\"#\" bs-button=\"subtle-alt icon\">\n                    {{inc src=\"icon.hbs\" icon=\"bin\"}}\n                </button>\n            </div>\n        </li>\n    </ul>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/plugins.hbs",
    "content": "---\nlayout: main.hbs\ntitle: \"Plugins\"\nicon: \"plug\"\nplugins: ['HTML Injector']\n---\n<div bs-panel=\"controls outline\">\n    <h1 bs-heading>{{ inc src=\"icon.hbs\" icon=page.icon }} {{page.title}}</h1>\n</div>\n<div>\n    <section bs-panel=\"switch\">\n        <div bs-panel-content=\"\">\n            <div bs-panel-icon=\"switch\">\n                <div class=\"switch\">\n                    <input id=\"cmn-form-{{@index}}\"\n                           ng-model=\"plugin.active\"\n                           ng-change=\"togglePlugin(plugin)\"\n                           class=\"cmn-toggle cmn-toggle-round\"\n                           type=\"checkbox\"\n                           checked=\"\">\n                    <label for=\"cmn-form-{{@index}}\"></label>\n                </div>\n            </div>\n            <div>\n                <p bs-text=\"lede\">Rewrite Rules</p>\n            </div>\n        </div>\n        <div bs-panel-content>\n            <p>\n                <button id=\"create-rewrite-rule\" bs-button=\"size-small subtle-alt icon-left\" ng-click=\"ctrl.showInputs();\">\n                    <svg bs-svg-icon=\"\"><use xlink:href=\"#svg-circle-plus\"></use></svg>\n                    Add Rewrite Rule\n                </button>\n            </p>\n        </div>\n        <div bs-panel-content>\n            <div bs-inputs bs-grid=\"desk-2\">\n                <div>\n                    <p bs-label-heading=\"\"><b>Current Replacements</b></p>\n                    <ul bs-list=\"bordered inline-controls leading-controls\" bs-flush=\"bottom\">\n                        <p>Rule <b>1 <span style=\"color: #e1e1e1; margin-left: 10px\">id: rewrite-1</span></b></p>\n                        <li bs-input=\"text\">\n                            <span bs-tag>Match <span>string</span></span>\n                            <p bs-text=\"mono\">&lt;script async=\"\" src=\"/browser-sync/browser-sync-client.2.7.12.js\"&gt;&lt;/script&gt;&lt;script async=\"\"</p>\n                            <div bs-button-group=\"\">\n                                <button href=\"#\" bs-button=\"subtle-alt icon\">\n                                    <svg bs-svg-icon=\"\"><use xlink:href=\"#svg-pencil\"></use></svg>\n                                </button>\n                                <button href=\"#\" bs-button=\"subtle-alt icon\" ng-click=\"ctrl.destroyServer(item, key)\" class=\"ng-click-active\">\n                                    <svg bs-svg-icon=\"\"><use xlink:href=\"#svg-circle-play\"></use></svg>\n                                </button>\n                                <button href=\"#\" bs-button=\"subtle-alt icon\" ng-click=\"ctrl.destroyServer(item, key)\" class=\"ng-click-active\">\n                                    <svg bs-svg-icon=\"\"><use xlink:href=\"#svg-bin\"></use></svg>\n                                </button>\n                            </div>\n                        </li>\n                        <li>\n                            <span bs-tag>Replace<span>function</span></span>\n                            <p bs-text=\"mono\">function (match) { return &quot;localhost:3003&quot; + namespace; }</p>\n                        </li>\n                    </ul>\n                    <ul bs-list=\"bordered inline-controls leading-controls\">\n\n                        <li>\n                            <span bs-tag>Match <span>regex</span></span>\n                            <p bs-text=\"mono\">/skin/default/assets/(.+?)</p>\n                            <div bs-button-group=\"\">\n                                <button href=\"#\" bs-button=\"subtle-alt icon\">\n                                    <svg bs-svg-icon=\"\"><use xlink:href=\"#svg-pencil\"></use></svg>\n                                </button>\n                                <button href=\"#\" bs-button=\"subtle-alt icon\" ng-click=\"ctrl.destroyServer(item, key)\" class=\"ng-click-active\">\n                                    <svg bs-svg-icon=\"\"><use xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n                                                             xlink:href=\"#svg-circle-pause\"></use></svg>\n                                </button>\n                                <button href=\"#\" bs-button=\"subtle-alt icon\" ng-click=\"ctrl.destroyServer(item, key)\" class=\"ng-click-active\">\n                                    <svg bs-svg-icon=\"\"><use xmlns:xlink=\"http://www.w3.org/1999/xlink\" xlink:href=\"#svg-bin\"></use></svg>\n                                </button>\n                            </div>\n                        </li>\n                        <li>\n                            <span bs-tag>Replace<span>string</span></span>\n                            <p bs-text=\"mono\">&lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;114x114&quot; href=&quot;http://www.sunspel.com/skin/frontend/sunspel/default/assets/img/114x114.png&quot;&gt;\n                                &lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;144x144&quot; href=&quot;http://www.sunspel.com/skin/frontend/sunspel/default/assets/img/144x144.png&quot;&gt;</p>\n                        </li>\n                    </ul>\n                </div>\n            </div>\n        </div>\n    </section>\n    <section bs-panel=\"switch\">\n        <div bs-panel-content=\"\">\n            <div bs-panel-icon=\"switch\">\n                <div class=\"switch\">\n                    <input id=\"cmn-form-{{@index}}\"\n                           ng-model=\"plugin.active\"\n                           ng-change=\"togglePlugin(plugin)\"\n                           class=\"cmn-toggle cmn-toggle-round\"\n                           type=\"checkbox\"\n                           checked=\"\">\n                    <label for=\"cmn-form-{{@index}}\"></label>\n                </div>\n            </div>\n            <div>\n                <p bs-text=\"lede\">HTML Injector</p>\n            </div>\n        </div>\n        <div bs-panel-content>\n            <p>Default behaviour is to compare the entire page. You can also restrict the comparisons\n                for localized edits.</p>\n        </div>\n        <div bs-panel-content>\n            <div bs-inputs bs-grid=\"desk-2\">\n                <div bs-grid-item=\"padded-right\">\n                    {{inc src=\"form.input.text.hbs\" title=\"New Restriction\" value=\"\" placeholder=\"eg: #main\"}}\n                </div>\n                <div bs-grid-item>\n                    <p bs-label-heading=\"\"><b>Current Restrictions:</b></p>\n                    <ul bs-list=\"bordered inline-controls\">\n                        <li><p bs-text=\"mono\">#main</p><div bs-button-group=\"\">\n                            <button href=\"#\" bs-button=\"subtle-alt icon\" ng-click=\"ctrl.destroyServer(item, key)\" class=\"ng-click-active\">\n                                <svg bs-svg-icon=\"\"><use xmlns:xlink=\"http://www.w3.org/1999/xlink\" xlink:href=\"#svg-bin\"></use></svg>\n                            </button>\n                        </div></li>\n                        <li><p bs-text=\"mono\">#header</p></li>\n                        <li><p bs-text=\"mono\">#footer</p></li>\n                    </ul>\n                </div>\n            </div>\n        </div>\n    </section>\n    <br/>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/remote-debug.hbs",
    "content": "---\nlayout: main.hbs\ntitle: \"Remote Debug\"\nicon: \"bug\"\nplugins:\n    - name: \"CSS Outlining\"\n      info: \"Add simple CSS outlines to all elements. (powered by pesitice\"\n---\n<div bs-panel=\"controls outline\">\n    <h1 bs-heading>{{ inc src=\"icon.hbs\" icon=page.icon }} {{page.title}}</h1>\n</div>\n{{ inc src=\"enable.disable.hbs\" }}\n<div>\n    {{#each page.plugins}}\n    <section bs-panel=\"switch\" class=\"disabled\">\n        <div bs-panel-content=\"\">\n            <div bs-panel-icon=\"switch\">\n                <div class=\"switch\">\n                    <input id=\"cmn-form-{{@index}}\"\n                           ng-model=\"plugin.active\"\n                           ng-change=\"togglePlugin(plugin)\"\n                           class=\"cmn-toggle cmn-toggle-round\"\n                           type=\"checkbox\">\n                    <label for=\"cmn-form-{{@index}}\"></label>\n                </div>\n            </div>\n            <div>\n                <p bs-text=\"lede\">{{this.name}}</p>\n                <p>Some Awesome tagline here</p>\n            </div>\n        </div>\n    </section>\n    {{/each}}\n    {{inc src=\"components/switches.hbs\" }}\n    <br/>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/server-info-snippet.hbs",
    "content": "---\nlayout: main.hbs\ntitle: \"Snippet Info\"\nicon: \"cog\"\npanels:\n    - title: \"Local\"\n      icon: \"imac\"\n      url: \"http://localhost:3000\"\n    - title: \"External\"\n      icon: \"wifi_3\"\n      url: \"http://192.168.0.1:3000\"\n    - title: \"Tunnel\"\n      icon: \"globe\"\n      url: \"http://14frwed.localtunnel.me\"\n---\n<div bs-panel=\"controls outline\">\n    <h1 bs-heading><i bs-icon=\"{{page.icon}}\"></i> {{page.title}}</h1>\n</div>\n<section>\n    <div bs-panel=\"full\">\n        <div bs-panel-content=\"\">\n            <div bs-panel-icon=\"\">\n                <i bs-icon=\"code\"></i>\n            </div>\n            <p bs-text=\"lede\">Place this snippet somewhere before the closing <code>&lt;/body&gt;</code> tag in your website</p>\n{{#hl}}\n<script type='text/javascript' id=\"__bs_script__\">//<![CDATA[\ndocument.write(\"<script async src='//HOST:3000/browser-sync/browser-sync-client.1.8.2.js'><\\/script>\".replace(/HOST/g, location.hostname).replace(/PORT/g, location.port));\n//]]></script>\n{{/hl}}\n            <!--<p bs-text=\"lede\">Serving files from</p>-->\n            <!--<ul bs-list=\"\">-->\n                <!--<li>/Users/shakyshane/Sites/browser-sync-modules/browser-sync-cp/test/fixtures</li>-->\n                <!--<li>/Users/shakyshane/Sites/browser-sync-modules/browser-sync-cp/test/fixtures</li>-->\n                <!--<li>/Users/shakyshane/Sites/browser-sync-modules/browser-sync-cp/test/fixtures</li>-->\n            <!--</ul>-->\n        </div>\n    </div>\n</section>\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/server-info.hbs",
    "content": "---\nlayout: main.hbs\ntitle: \"Server Info\"\nicon: \"cog\"\npanels:\n    - title: \"Local\"\n      icon: \"imac\"\n      url: \"http://localhost:3000\"\n    - title: \"External\"\n      icon: \"wifi\"\n      url: \"http://192.168.0.1:3000\"\n    - title: \"Tunnel\"\n      icon: \"globe\"\n      url: \"http://14frwed.localtunnel.me\"\n---\n<div bs-panel=\"controls outline\">\n    <h1 bs-heading>{{ inc src=\"icon.hbs\" icon=\"cog\" }} {{page.title}}</h1>\n</div>\n<div>\n    {{#each page.panels}}\n    <section bs-panel>\n        <div bs-panel-content>\n            <div bs-panel-icon>\n                {{ inc src=\"icon.hbs\" icon=this.icon }}\n            </div>\n            <p bs-text=\"lede\">{{this.title}}</p>\n            <p><a href=\"#\">{{this.url}}</a></p>\n            <div bs-button-group>\n                <a href=\"{{this.url}}\" target=\"_blank\" bs-button=\"size-small subtle-alt icon-left\">\n                    {{ inc src=\"icon.hbs\" icon=\"newtab\" }}\n                    new tab\n                </a>\n                <a href=\"#\" ng-click=\"sendAllTo(url.url)\" bs-button=\"size-small subtle-alt icon-left\">\n                    {{ inc src=\"icon.hbs\" icon=\"syncall\" }}\n                    sync all\n                </a>\n            </div>\n        </div>\n    </section>\n    {{/each}}\n</div>\n<section>\n    <div bs-panel=\"full\">\n        <div bs-panel-content>\n            <div bs-panel-icon>\n                {{ inc src=\"icon.hbs\" icon=\"terminal\" }}\n            </div>\n            <p bs-text=\"lede\">Serving files from</p>\n            <ul bs-list=\"basic\">\n                <li>/Users/shakyshane/Sites/browser-sync-modules/browser-sync-cp/test/fixtures</li>\n                <li>/Users/shakyshane/Sites/browser-sync-modules/browser-sync-cp/test/fixtures</li>\n                <li>/Users/shakyshane/Sites/browser-sync-modules/browser-sync-cp/test/fixtures</li>\n            </ul>\n        </div>\n    </div>\n</section>\n"
  },
  {
    "path": "packages/browser-sync-ui/src/crossbow/sync-options.hbs",
    "content": "---\nlayout: main.hbs\ntitle: \"Sync Options\"\nicon: \"repeat_2\"\noptions: ['Clicks', 'Scroll', 'Forms: Submit', 'Forms: Toggles', 'Forms: Inputs', 'Clicks', 'Scroll', 'Forms: Submit', 'Forms: Toggles', 'Forms: Inputs']\n---\n<div bs-panel=\"controls\">\n    <h1 bs-heading>{{inc src=\"icon.hbs\" icon=\"sync\" }} {{page.title}}</h1>\n</div>\n{{ inc src=\"enable.disable.hbs\" }}\n<div>\n    {{#each page.options}}\n    <section bs-panel=\"switch{{#if @last}} last{{/if}}\"{{#if @first}} class=\"disabled\"{{/if}}>\n        <div bs-panel-content=\"\">\n            <div bs-panel-icon>\n                <div class=\"switch\">\n                    <input id=\"cmn-form-{{@index}}\"\n                           ng-model=\"plugin.active\"\n                           ng-change=\"togglePlugin(plugin)\"\n                           class=\"cmn-toggle cmn-toggle-round\"\n                           type=\"checkbox\"\n                        {{#if @first}}{{else}}checked{{/if}}>\n                    <label for=\"cmn-form-{{@index}}\"></label>\n                </div>\n            </div>\n            <div>\n                <p bs-text=\"lede\">{{this}}</p>\n                <p>Mirrors click events across devices</p>\n            </div>\n        </div>\n    </section>\n    {{/each}}\n    <br/>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/angular.js",
    "content": "/**\n * @type {angular}\n */\nmodule.exports = window.angular;\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/app.js",
    "content": "require('angular');\nrequire('angular-route');\nrequire('angular-sanitize');\nrequire('angular-touch');\n\nvar angular = window.angular;\n\nangular\n    .module(\"BrowserSync\", [\n        \"bsHistory\",\n        \"bsClients\",\n        \"bsDisconnect\",\n        \"bsNotify\",\n        \"bsSocket\",\n        \"bsStore\",\n        \"ngRoute\",\n        \"ngTouch\",\n        \"ngSanitize\"\n    ])\n    .config([\"$locationProvider\", Config]);\n\n/**\n * @constructor\n * @param $locationProvider\n */\nfunction Config($locationProvider) {\n    $locationProvider.html5Mode({\n        enabled: true,\n        requireBase: false\n    });\n}\n\n\n/**\n * Modules\n * @type {exports}\n */\n/* jshint ignore:start */\nvar discon = require(\"./modules/bsDisconnect\");\nvar notify = require(\"./modules/bsNotify\");\nvar history = require(\"./modules/bsHistory\");\nvar clients = require(\"./modules/bsClients\");\nvar socket = require(\"./modules/bsSocket\");\nvar app = require(\"./services/Pages\");\nvar options = require(\"./services/Options\");\nvar Store = require(\"./modules/bsStore\");\nvar mainCtrl = require(\"./main/controller\");\nvar filter = require(\"./filters\");\nvar directives = require(\"./directives\");\n\n/* jshint ignore:end */\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/directives/icon.js",
    "content": "module.exports = function () {\n    return {\n        scope: {\n            icon: \"@\"\n        },\n        restrict: \"E\",\n        replace: true,\n        template: \"<svg bs-svg-icon><use xlink:href=\\\"{{iconName}}\\\"></use></svg>\",\n        link: function (scope, elem, attrs) {\n            scope.iconName = \"#svg-\" + scope.icon;\n            return scope;\n        }\n    };\n};"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/directives/link-to.js",
    "content": "module.exports = function () {\n    return {\n        restrict:   \"E\",\n        replace:    false,\n        transclude: true,\n        scope:      {\n            \"path\": \"@\"\n        },\n        template:   \"<a href='#' ng-click='navi(path)' ng-transclude=''>as</a>\",\n        controller: [\"$scope\", \"$location\", \"$injector\", function ($scope, $location, $injector) {\n\n            var pages = $injector.get(\"pagesConfig\");\n            var Pages = $injector.get(\"Pages\");\n\n            $scope.navi = function (path) {\n                var item = pages[path];\n                Pages.enable(item);\n                $location.path(path);\n            };\n        }]\n    };\n};"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/directives/new-tab.js",
    "content": "module.exports = function () {\n    return {\n        scope: {\n            url: \"@\",\n            mode: \"@\"\n        },\n        restrict: \"E\",\n        replace: true,\n        template: '<a href=\"{{url}}\" bs-button=\"subtle-alt icon\" target=\"_blank\" title=\"Open a new tab\" ng-show=\"mode !== \\'snippet\\'\"><icon icon=\"newtab\"></icon> New Tab </a>' //jshint:ignore\n    };\n};"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/directives/switch.js",
    "content": "module.exports = function () {\n    return {\n        scope: {\n            toggle: \"&\",\n            item: \"=\",\n            switchid: \"@\",\n            title: \"@\",\n            tagline: \"@\",\n            active: \"=\",\n            prop: \"@\"\n        },\n        restrict: \"E\",\n        replace: true,\n        transclude: true,\n        templateUrl: \"bs-switch.html\",\n        controllerAs: \"ctrl\",\n        controller: [\"$scope\", function ($scope) {\n            var ctrl = this;\n            ctrl.item = $scope.item;\n        }]\n    };\n};"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/directives.js",
    "content": "var module = require(\"./module\"); //jshint ignore:line\n\nmodule.directive(\"icon\", require(\"./directives/icon\"));\nmodule.directive(\"linkTo\", require(\"./directives/link-to\"));\nmodule.directive(\"switch\", require(\"./directives/switch\"));\nmodule.directive(\"newTab\", require(\"./directives/new-tab\"));"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/editor.js",
    "content": "var Codemirror = require(\"codemirror\");\nvar jsMode = require('codemirror/mode/javascript/javascript.js');\n\n(function () {\n\n    angular\n        .module(\"bsEditor\", [])\n        .service('Editor', function () {\n            return Codemirror;\n        });\n\n})(angular);\n\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/filters.js",
    "content": "var module = require(\"./module\"); //jshint ignore:line\nvar utils  = require(\"./utils\"); //jshint ignore:line\n\nmodule\n    .filter(\"ucfirst\",       function () { return utils.ucfirst;       })\n    .filter(\"localRootUrl\",  function () { return utils.localRootUrl;  })\n    .filter(\"localUrl\",      function () { return utils.localRootUrl;  })\n    .filter(\"orderObjectBy\", function () { return utils.orderObjectBy; });"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/main/controller.js",
    "content": "var app    = require(\"../module\");\n\napp.controller(\"MainController\", [\n    \"$scope\",\n    \"$rootScope\",\n    \"$location\",\n    \"$injector\",\n    MainController\n]);\n\n\n/**\n * @param $scope\n * @param $rootScope\n * @param $location\n * @param $injector\n * @constructor\n */\nfunction MainController ($scope, $rootScope, $location, $injector) {\n\n    var ctrl      = this;\n    ctrl.options  = false;\n    ctrl.browsers = [];\n    ctrl.socketId = \"\";\n\n    var pagesConfig = $injector.get(\"pagesConfig\");\n    var Pages       = $injector.get(\"Pages\");\n    var Socket      = $injector.get(\"Socket\");\n    var Clients     = $injector.get(\"Clients\");\n\n    ctrl.ui = {\n        menu:         pagesConfig,\n        sectionMenu:  false,\n        disconnected: false\n    };\n\n    /**\n     * @param $section\n     */\n    ctrl.setActiveSection = function ($section) {\n        Pages.enable($section);\n        $location.path($section.path);\n        ctrl.ui.sectionMenu = false;\n    };\n\n    /**\n     * Refresh all event\n     */\n    ctrl.reloadAll = function () {\n        Clients.reloadAll();\n        $rootScope.$emit(\"notify:flash\", {\n            heading: \"Instruction sent:\",\n            message: \"Reload All Browsers  ✔\"\n        });\n    };\n\n    /**\n     * @param value\n     */\n    ctrl.scrollAllTo = function () {\n        Clients.scrollAllTo(0);\n        $rootScope.$emit(\"notify:flash\", {\n            heading: \"Instruction sent:\",\n            message: \"Scroll all browsers to Y=0  ✔\"\n        });\n    };\n\n    /**\n     * Emit the socket event\n     */\n    ctrl.sendAllTo = function (path) {\n        Clients.sendAllTo(path);\n        $rootScope.$emit(\"notify:flash\", {\n            heading: \"Instruction sent:\",\n            message: \"Reset all Browsers to /\"\n        });\n    };\n\n    /**\n     *\n     */\n    ctrl.toggleMenu = function () {\n        ctrl.ui.sectionMenu = !ctrl.ui.sectionMenu;\n    };\n\n    /**\n     * @type {{connection: connection, addBrowsers: addBrowsers}}\n     */\n    ctrl.socketEvents = {\n\n        /**\n         * @param options\n         */\n        connection: function (options) {\n            ctrl.update(options);\n        },\n        /**\n         *\n         */\n        disconnect: function () {\n            ctrl.ui.disconnected = true;\n        }\n    };\n\n    /**\n     * Update the current $scope\n     */\n    ctrl.update = function (options) {\n\n        ctrl.options = transformOptions(options);\n        ctrl.ui.disconnected = false;\n\n        Pages.transform(pagesConfig[\"overview\"], function ($section) {\n            return $section;\n        });\n    };\n\n    /**\n     * Set the currently active page\n     */\n    ctrl.setActiveSection(Pages.current());\n\n    /**\n     * Get options from socket connection\n     */\n    Socket.options().then(ctrl.socketEvents.connection);\n\n    /**\n     * React to disconnects\n     */\n    $rootScope.$on(\"ui:disconnect\", ctrl.socketEvents.disconnect);\n    $rootScope.$on(\"ui:connection\", function (evt, options) {\n        ctrl.socketEvents.connection(options);\n        $scope.$digest();\n    });\n}\n\n/**\n * Options transformations\n * @param options\n * @returns {*}\n */\nfunction transformOptions(options) {\n\n    options.displayUrl = getDisplayUrl(options.urls);\n\n    return options;\n}\n\n/**\n * @param urls\n * @returns {*}\n */\nfunction getDisplayUrl (urls) {\n    if (!urls) {\n        return false;\n    }\n    return urls.external || urls.local;\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/module.js",
    "content": "/**\n * @type {angular}\n */\nmodule.exports = window.angular.module(\"BrowserSync\");\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/modules/bsClients.js",
    "content": "var angular = require('../angular');\n\nangular\n    .module(\"bsClients\", [\"bsSocket\"])\n    .service(\"Clients\", [\"Socket\", ClientsService]);\n\n/**\n * @param Socket\n * @returns {{reloadAll: Function, sendAllTo: Function, scrollAllTo: Function, highlight: Function}}\n * @constructor\n */\nfunction ClientsService(Socket) {\n\n    var api = {\n        reloadAll: function () {\n            Socket.clientEvent(\"browser:reload\");\n        },\n        sendAllTo: function (path) {\n            Socket.emit(\"ui\", {\n                namespace: \"history\",\n                event: \"sendAllTo\",\n                data: {\n                    path: path\n                }\n            });\n        },\n        scrollAllTo: function () {\n            Socket.clientEvent(\"scroll\", {\n                position: {\n                    raw: 0,\n                    proportional: 0\n                },\n                override: true\n            });\n        },\n        highlight: function (connection) {\n            Socket.emit(\"ui:highlight\", connection);\n        }\n    };\n\n    return api;\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/modules/bsDisconnect.js",
    "content": "var angular = require('../angular');\n\nangular\n    .module(\"bsDisconnect\", [])\n    .directive(\"disconnectElem\", function () {\n        return {\n            restrict: \"E\",\n            scope: {},\n            template: '<section bs-overlay ng-class=\"{\\'active\\': ui.visible}\">\\n    <p><icon icon=\"block\"></icon></p>\\n    <h1>{{ui.heading}} {{ui.message}}</h1>\\n    <p>Possible reasons are:</p>\\n    <ul bs-list>\\n        <li>1. Your process was exited by another tool</li>\\n    </ul>\\n    <p>You should check your terminal window to see what happened. <br/>(Or simply try reloading this page.)</p>\\n</section>', // jshint:ignore\n            controller: [\"$scope\", \"$rootScope\", \"$window\", disconnectController]\n        };\n    });\n\n/**\n * Disconnect\n * @param $scope\n * @param $rootScope\n * @param $window\n */\nfunction disconnectController($scope, $rootScope, $window) {\n\n    /**\n     * Default settings\n     */\n    const DEFAULT_HEADING = \"Browsersync\";\n    const DEFAULT_MESSAGE = \"Disconnected\";\n\n    $scope._disconnected = false;\n\n    /**\n     * Default state\n     * @type {{visible: boolean, status: string, heading: string, text: string}}\n     */\n    $scope.ui = {\n        visible: false,\n        heading: DEFAULT_HEADING,\n        message: DEFAULT_MESSAGE\n    };\n\n    /**\n     * @type {{connection: Function, disconnect: Function}}\n     */\n    $scope.socketEvents = {\n        connection: function () {\n            if ($scope._disconnected) {\n                $window.location.reload(true);\n            }\n            $scope.ui.visible = false;\n            $scope.$digest();\n        },\n        disconnect: function () {\n            $scope._disconnected = true;\n            $scope.ui.visible = true;\n            $scope.$digest();\n        }\n    };\n\n    $rootScope.$on(\"ui:connection\", $scope.socketEvents.connection);\n    $rootScope.$on(\"ui:disconnect\", $scope.socketEvents.disconnect);\n}\n\n\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/modules/bsHistory.js",
    "content": "var angular = require('../angular');\n\nangular\n    .module(\"bsHistory\", [\"bsSocket\"])\n    .service(\"History\", [\"Socket\", HistoryService]);\n\nfunction HistoryService(Socket) {\n\n    var visited = [];\n    var updateStack = [];\n\n    /**\n     * Add a single socket event and call all callbacks listening to it.\n     */\n    Socket.on(\"ui:history:update\", function (items) {\n        updateStack.forEach(function (fn) {\n            fn(items);\n        });\n    });\n\n    return {\n        visited: visited,\n        updateHistory: function (urls) {\n            visited = urls;\n        },\n        get: function () {\n            return Socket.getData(\"visited\");\n        },\n        remove: function (data) {\n            Socket.emit(\"ui\", {\n                namespace: \"history\",\n                event: \"remove\",\n                data: data\n            });\n        },\n        clear: function () {\n            Socket.emit(\"ui\", {\n                namespace: \"history\",\n                event: \"clear\"\n            });\n        },\n        on: function (event, fn) {\n            updateStack.push(fn);\n        },\n        off: function (fn) {\n            var index = updateStack.indexOf(fn);\n            if (index > -1) {\n                updateStack = updateStack.splice(index, 1);\n            }\n        }\n    };\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/modules/bsNotify.js",
    "content": "var angular = require('../angular');\n\nangular\n    .module('bsNotify', [])\n    .directive(\"notifyElem\", function () {\n        return {\n            restrict: \"E\",\n            scope: {},\n            template: \"<div bs-notify ng-class=\\\"{\\'active\\': ui.visible}\\\">\\n    <p class=\\\"notification__text\\\">{{ui.heading}} <span class=\\\"color--lime\\\">{{ui.message}}</span></p>\\n</div>\",\n            controller: [\"$scope\", \"$rootScope\", notifyController]\n        };\n    });\n\n/**\n * Notify\n * @param $scope\n * @param $rootScope\n */\nfunction notifyController($scope, $rootScope) {\n\n    /**\n     * Default settings\n     */\n    var DEFAULT_STATUS = \"info\";\n    var DEFAULT_HEADING = \"Browsersync:\";\n    var DEFAULT_MESSAGE = \"Welcome to Browsersync\";\n    var DEFAULT_TIMEOUT = 2000;\n\n    /**\n     * Default state\n     * @type {{visible: boolean, status: string, heading: string, text: string}}\n     */\n    $scope.ui = {\n        status: DEFAULT_STATUS,\n        heading: DEFAULT_HEADING,\n        message: DEFAULT_MESSAGE\n    };\n\n    /**\n     * @param evt\n     * @param data\n     */\n    $scope.show = function (evt, data) {\n\n        data = data || {};\n\n        /**\n         *\n         * Clear any previous timers\n         *\n         */\n        if ($scope._timer) {\n            clearTimeout($scope._timer);\n        }\n\n        /**\n         *\n         * Set a reset timer\n         *\n         */\n        $scope._timer = window.setTimeout($scope.reset, data.timeout || DEFAULT_TIMEOUT);\n\n        /**\n         *\n         * Set UI flags\n         *\n         */\n        $scope.ui.visible = true;\n        $scope.ui.status = data.status || DEFAULT_STATUS;\n        $scope.ui.heading = data.heading || DEFAULT_HEADING;\n        $scope.ui.message = data.message || DEFAULT_HEADING;\n    };\n\n    /**\n     * Reset the UI\n     */\n    $scope.reset = function () {\n        $scope.ui.visible = false;\n        $scope.$digest();\n    };\n\n    /**\n     * Listen to events on the $rootScope\n     */\n    $rootScope.$on(\"notify:flash\", $scope.show);\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/modules/bsSocket.js",
    "content": "var angular = require('../angular');\nvar socket = require('socket.io-client');\nvar socketConfig = window.___browserSync___.socketConfig;\nvar socketUrl = window.___browserSync___.socketUrl;\nvar io = socket(socketUrl, socketConfig);\n\nangular\n    .module(\"bsSocket\", [])\n    .service(\"Socket\", [\"$q\", \"$rootScope\", SocketService]);\n\nfunction SocketService($q, $rootScope) {\n\n    var deferred = $q.defer();\n    var session;\n\n    io.on(\"connection\", function (out) {\n        session = out.session;\n        $rootScope.$emit(\"ui:connection\", out);\n\n        deferred.resolve(out, this);\n\n        if (window.name === '') {\n            window.name = JSON.stringify({id: socket.id});\n        } else {\n            var prev = JSON.parse(window.name);\n            //console.log(prev, socket);\n            if (prev.id !== socket.id) {\n                //console.log('new session');\n            } else {\n                //console.log('page reload');\n            }\n            //console.log(JSON.parse(window.name));\n        }\n    });\n\n    io.on(\"disconnect\", function () {\n        $rootScope.$emit(\"ui:disconnect\");\n    });\n\n    var publicApi = {\n        on: function (name, callback) {\n            io.on(name, callback);\n        },\n        off: function (name, callback) {\n            io.off(name, callback);\n        },\n        removeEvent: function (name, callback) {\n            io.removeListener(name, callback);\n        },\n        emit: function (name, data) {\n            io.emit(name, data || {});\n        },\n        /**\n         * Proxy client events\n         * @param name\n         * @param data\n         */\n        clientEvent: function (name, data) {\n            io.emit(\"ui:client:proxy\", {\n                event: name,\n                data: data\n            });\n        },\n        options: function () {\n            return deferred.promise;\n        },\n        getData: function (name) {\n            var deferred = $q.defer();\n            io.on(\"ui:receive:\" + name, function (data) {\n                deferred.resolve(data);\n            });\n            io.emit(\"ui:get:\" + name);\n            return deferred.promise;\n        },\n        uiEvent: function (evt) {\n            io.emit(\"ui\", evt);\n        },\n        newSession: function () {\n\n        }\n    };\n\n    Object.defineProperty(publicApi, 'sessionId', {\n        get: function () {\n            return session\n        }\n    });\n\n    return publicApi;\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/modules/bsStore.js",
    "content": "var angular     = require('../angular');\nvar store      = require('store');\nvar objectPath = require('object-path');\n\nangular\n    .module(\"bsStore\", [])\n    .service(\"Store\", [\"$q\", \"$rootScope\", StoreModule]);\n\nfunction Store (ns) {\n    var bs = store.get('bs', {});\n    if (!Object.keys(bs).length) {\n        store.set('bs', {});\n    }\n    this.ns = ns;\n    this.get = function (path) {\n        var bs = store.get('bs', {});\n        if (!Object.keys(bs).length) {\n            store.set('bs', {});\n        }\n        return objectPath.get(bs, [ns].concat(path).join('.'));\n    };\n    this.set = function (path, value) {\n        var bs = store.get('bs', {});\n        if (!Object.keys(bs).length) {\n            store.set('bs', {});\n        }\n        if (!bs[ns]) {\n            bs[ns] = {};\n        }\n        bs[ns][path] = value;\n        store.set('bs', bs);\n    },\n    this.remove = function (path) {\n        var bs = store.get('bs', {});\n        if (!Object.keys(bs).length) {\n            store.set('bs', {});\n        }\n        if (!bs[ns]) {\n            bs[ns] = {};\n        }\n        if (bs[ns][path]) {\n            delete bs[ns][path];\n        }\n        store.set('bs', bs);\n    }\n}\n\nfunction StoreModule () {\n\n    return {\n        create: function (ns) {\n            var store = new Store(ns);\n            return store;\n        }\n    }\n};\n\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/services/Options.js",
    "content": "var app = require(\"../module\");\n\napp.factory(\"Options\", [\"Socket\", OptionsService]);\n\n/**\n * @param Socket\n * @returns {{all: Function}}\n * @constructor\n */\nfunction OptionsService(Socket) {\n\n    return {\n        all: function () {\n            return Socket.getData(\"options\");\n        }\n    };\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/services/Pages.js",
    "content": "/**\n * @type {angular}\n */\nvar app = require(\"../module\");\n\napp.service(\"Pages\", [\"pagesConfig\", \"$location\", ContentSections]);\n\n/**\n * @param pagesConfig\n * @param $location\n * @returns {{enable: Function, transform: Function, current: Function}}\n * @constructor\n */\nfunction ContentSections(pagesConfig, $location) {\n\n    return {\n        /**\n         * Enable a single Item\n         * @param $section\n         * @returns {*}\n         */\n        enable: function ($section) {\n            angular.forEach(pagesConfig, function (item) {\n                item.active = false;\n            });\n            $section.active = true;\n            return pagesConfig;\n        },\n        /**\n         * Transform an item\n         */\n        transform: function ($section, fn) {\n            if (typeof fn === \"function\") {\n                return $section = fn($section);\n            } else {\n                throw new TypeError(\"Noooo\");\n            }\n        },\n        /**\n         * Get the current section based on the path\n         * @returns {*}\n         */\n        current: function () {\n            if ($location.path() === \"/\") {\n                return pagesConfig[\"overview\"];\n            }\n            var match;\n            angular.forEach(pagesConfig, function (item) {\n                if (item.path === $location.path()) {\n                    match = item;\n                }\n            });\n            return match;\n        }\n    };\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scripts/utils.js",
    "content": "module.exports = {\n    ucfirst: function (string) {\n        return string.charAt(0).toUpperCase() + string.slice(1);\n    },\n    localRootUrl: function (port, scheme) {\n        return [scheme, \"://\", window.location.hostname, \":\", port].join(\"\");\n    },\n    localUrl: function(path, port, mode) {\n        if (mode === \"snippet\") {\n            return path;\n        }\n        return [\"//\", window.location.hostname, \":\", port, path].join(\"\");\n    },\n    orderObjectBy: function (items, field, reverse) {\n        var filtered = [];\n        Object.keys(items).forEach(function(key) {\n            filtered.push(items[key]);\n        });\n        filtered.sort(function (a, b) {\n            return (a[field] > b[field] ? 1 : -1);\n        });\n        if (reverse) {\n            filtered.reverse();\n        }\n        return filtered;\n    }\n};"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/_vars.scss",
    "content": "$red:           #F54747;\n$red-alt:       #F2AAAA;\n$sidebar:       #444444;\n$sidebar-hover: #363636;\n$header:        #222222;\n$green:         #033339;\n$green-dk:      #00262C;\n$body-text:    lighten($sidebar, 20%);\n\n$blue:          #4A90E2;\n\n$lime:          #81be00;\n$grey-text:     #ababab;\n$grey-bg:       #FBFBFB;\n$grey-bg-dk:    #F0F0F0;\n$grey-border:   $grey-bg-dk;\n\n$yellow: #e9ac00;\n\n$white: #fff;\n$black: #000;\n$grey: lighten($black, 20%); // 333333\n\n//\n// Special\n//\n$link: $red;\n$link-hover: $black;\n$alert: #cccc00;\n$success: #00cc66;\n$failure: #cc0000;\n$facebook: #3B5999;\n$twitter: #00ACEE;\n\n//\n// Type\n//\n$sans: \"source_sans\", \"Lucida Grande\", \"Lucida Sans\", sans-serif;\n// $sans-light: \"source_sans_proextralight\", \"Lucida Grande\", \"Lucida Sans\",sans-serif;\n$sans-heavy: \"source_sans\", \"Lucida Grande\", \"Lucida Sans\", sans-serif;\n$serif: Georgia, serif;\n$mono: Consolas, Monaco, monospace;\n\n//\n// Base\n//\n$base-font-size: 18px;\n$base-line-height: 1.5;\n$base-font-family: $sans;\n$base-color: $sidebar;\n\n//\n// Headings\n//\n$hn-font-weight: 400;\n$hn-line-height: 1;\n$hn-font-family: $sans;\n\n$hn-color: $base-color;\n$h1-size: 36px;\n$h2-size: 30px;\n$h3-size: 18px;\n$h4-size: 16px;\n$h5-size: 16px;\n$h6-size: 16px;\n\n\n//\n// Fixed width\n//\n$mono-size: 14px;\n$mono-line-height: $base-line-height;\n$mono-font-family: $mono;\n\n\n//\n// Special\n//\n$lede-size: 24px;\n$small-size: 14px;\n\n\n//\n// Spacing\n//\n$base-spacing: $base-font-size * $base-line-height;\n$half-spacing: ceil($base-spacing / 2);\n$gutter: 20px;\n$icon-gutter: 55px;\n\n//\n// Radii\n//\n$base-radius: 3px;\n$half-radius: ceil($base-radius / 2);\n\n//\n// Grids\n//\n$page-width: 740px;\n\n$lap-start: 600px;\n$desk-start: 750px;\n$wide-start: 1000px;\n\n$ns: \"bs\";\n\n//\n// Sidebar widths\n//\n$sidebar-width: 240px;\n$nav-button-height: 52px;\n\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/components.scss",
    "content": "@charset \"UTF-8\";\n\n@import \"vars\";\n@import \"modules/mixins\";\n@import \"theme/svg\";\n\nbody, html {\n    height: auto;\n}\n\n.tube {\n    padding: 0 $half-spacing;\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/core.scss",
    "content": "@charset \"UTF-8\";\n\n@import \"vars\";\n\n@import \"modules/mixins\";\n@import \"modules/reset\";\n@import \"vendor/normalize\";\n@import \"vendor/fonts\";\n\n@import \"theme/animations\";\n\n@import \"theme/base\";\n@import \"theme/grid\";\n@import \"theme/cloak\";\n@import \"theme/header\";\n@import \"theme/sidebar\";\n@import \"theme/section-nav\";\n@import \"theme/main-content\";\n\n@import \"theme/svg\";\n@import \"theme/custom-icons\";\n@import \"theme/headings\";\n@import \"theme/paragraphs\";\n@import \"theme/links\";\n@import \"theme/helpers\";\n@import \"theme/buttons\";\n@import \"theme/forms\";\n@import 'theme/spinner';\n@import \"theme/panel\";\n@import \"theme/lists\";\n@import \"theme/top-bar\";\n@import \"theme/state\";\n@import \"theme/switch\";\n@import \"theme/footer\";\n@import \"theme/code\";\n@import \"theme/notifications\";\n@import \"theme/disconnect\";\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/modules/_mixins.scss",
    "content": "@import \"../vars\";\n\n//\n// `@include media-query(min, 640px);`\n//\n@mixin media-query($type, $breakpoint: $lap-start) {\n    @if $type == \"min\" {\n        @media only screen and (min-width: $breakpoint) { @content }\n    }\n    @else if $type == \"max\" {\n        @media only screen and (max-width: $breakpoint - 1px) { @content }\n    }\n    @else if $type == \"palm\" {\n        @media only screen and (max-width: $lap-start - 1px) { @content }\n    }\n    @else if $type == \"lap\" {\n        @media only screen and (min-width: $lap-start) and (max-width: $desk-start - 1px) { @content }\n    }\n    @else if $type == \"desk\" {\n        @media only screen and (min-width: $desk-start) { @content }\n    }\n    @else if $type == \"wide\" {\n        @media only screen and (min-width: $wide-start) { @content }\n    }\n    @else if $type == \"retina\" {\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) { @content }\n    }\n}\n\n//\n// `@include font-size(10px);`\n//\n@mixin font-size($font-size){\n    font-size: $font-size;\n    font-size: ($font-size / $base-font-size)*1rem;\n}\n\n@mixin only-palm {\n    @include media-query(min, $lap-start) {\n        display: none;\n    }\n}\n\n@mixin not-palm {\n\n    display: none;\n    @include media-query(min, $lap-start) {\n        display: block;\n    }\n}\n\n@mixin sidebar-style {\n    background: $sidebar;\n}\n\n@mixin svg-shadow ($blur: 2px) {\n    //-webkit-filter: drop-shadow( 1px 1px $blur $green-dk );\n    //filter:         drop-shadow( 1px 1px $blur $green-dk );\n}\n\n@mixin subtle-button ($_color, $disabled) {\n    background: $white;\n    color: $_color;\n    border-color: darken($grey-border, 5%);\n\n    &:hover, &:focus {\n        color: $_color;\n        background: $grey-border;\n    }\n\n    &:focus {\n        background: $white;\n    }\n\n    &:active {\n        color: $_color;\n        text-shadow: 1px 1px 1px rgba(black, .2);\n        background: darken($white, 3%);\n    }\n\n    &[disabled] {\n        border-color: darken($grey-border, 5%);\n        background: $grey-border;\n        color: $disabled;\n    }\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/modules/_reset.scss",
    "content": "* {\n    &,\n    &:before,\n    &:after{\n        box-sizing: border-box;\n    }\n}\n\nh1,h2,h3,h4,h5,h6,\np,blockquote,pre,\ndl,dd,ol,ul,\nform,fieldset,legend,\ntable,th,td,caption,\nhr{\n    margin:0;\n    padding:0;\n}\n\nabbr[title],dfn[title]{\n    cursor:help;\n}\n\na,u,ins{\n    text-decoration:none;\n}\n\nins{\n    border-bottom:1px solid;\n}\n\nimg{\n    font-style:italic;\n}\n\nlabel,\ninput,\ntextarea,\nbutton,\nselect,\noption{\n    cursor:pointer;\n}\n    .text-input:active,\n    .text-input:focus,\n    textarea:active,\n    textarea:focus{\n        cursor:text;\n        outline:none;\n    }\n\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_animations.scss",
    "content": "\n[bs-anim~=\"spin\"] {\n    animation: spin 1s infinite linear;\n}\n\n@keyframes spin {\n    from {transform:rotate(0deg);}\n    to {transform:rotate(360deg);}\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_base.scss",
    "content": "html {\n    overflow-x: hidden;\n    overflow-y: auto;\n    height: 100%;\n    font: #{($base-font-size/16px)*100%}/#{$base-line-height} $base-font-family;\n    -webkit-text-size-adjust: 100%;\n    -ms-text-size-adjust: 100%;\n    -webkit-font-smoothing: antialiased;\n\n    @include media-query(min, $lap-start) {\n        height: 100vh;\n    }\n\n}\n\nbody {\n    min-height: 100%;\n    max-width: 100%;\n    overflow-x: hidden;\n    overflow-y: auto;\n    background: $white;\n    color: $body-text;\n    text-rendering: optimizeLegibility;\n\n    @include media-query(min, $lap-start) {\n        height: 100vh;\n        overflow-y: hidden;\n    }\n}\n\nmain {\n    position: relative;\n    @include media-query(min, $lap-start) {\n        overflow: hidden;\n    }\n}\n\n\n// Lists\n\nul,\nol,\ndl {\n    ul,\n    ol {\n        margin-bottom: 0;\n    }\n}\n\nul,\nol {\n    margin-left: $base-spacing;\n}\n\nul {\n    list-style: disc;\n\n    ul {\n        list-style: circle;\n    }\n}\n\nol {\n    list-style: decimal;\n\n    ol {\n        list-style: lower-alpha;\n    }\n}\n\ndt {\n    font-weight: bold;\n}\n\ndd + dt {\n    padding-top: $half-spacing;\n}\n\n\n// Tables\n\ntable {\n    margin-top: $half-spacing;\n    width: 100%;\n}\n\nth,\ntd {\n    padding: $half-spacing/2 $half-spacing;\n    border-bottom: 1px solid $grey-border;\n    text-align: left;\n    vertical-align: top;\n}\n\nth {\n    font-weight: bold;\n}\n\nthead {\n    tr:last-child {\n        th {\n            border-bottom: 2px solid $grey-border;\n        }\n    }\n}\n\n[colspan] {\n    text-align: center;\n}\n\n[colspan=\"1\"] {\n    text-align: left;\n}\n\n[rowspan] {\n    vertical-align: middle;\n}\n\n[rowspan=\"1\"] {\n    vertical-align: top;\n}\n\n\n// table {\n//     tr {\n//         td:first-child {\n//             white-space: nowrap;\n//             font-weight: bold;\n//         }\n//     }\n//     td {\n//         padding: $half-spacing $half-spacing/2 ;\n//     }\n//     tbody {\n//         tr:nth-child(odd) {\n//             background: #fafafa;\n//         }\n//     }\n// }\n\n\n// Sectioning\n\nhr {\n    clear: both;\n    margin-bottom: $base-spacing;\n    border: none;\n    border-bottom: 1px solid $grey-border;\n    padding-bottom: $half-spacing;\n    height: 1px;\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_buttons.scss",
    "content": "@import \"../vars\";\n@import \"../modules/mixins\";\n\n//\n// Default button styles\n// <button bs-button>Click me!</button>\n//\n[bs-button] {\n\n    @include font-size(16px);\n\n    display: inline-block;\n    border: 1px solid darken($red, 15%);\n    padding: 7px $half-spacing*1.5;\n    width: auto;\n    vertical-align: middle;\n    background: $red;\n    color: $white;\n    border-radius: $base-radius;\n    text-align: center;\n    cursor: pointer;\n    outline: none;\n    transition: color .2s, background .2s;\n    text-transform: uppercase;\n    letter-spacing: 1px;\n    //box-shadow: 0 1px 1px 0 rgba(black, .2);\n    margin-bottom: $half-spacing;\n    height: 40px;\n    -webkit-tap-highlight-color: rgba(0,0,0,0);\n\n    &:hover {\n        text-decoration: none;\n        color: $white;\n        background: darken($red, 10%);\n    }\n\n    &:focus {\n        text-decoration: none;\n        color: $white;\n    }\n\n    &:active {\n        color: $white;\n        box-shadow: 0px 1px 0px 0 rgba(black, .1) inset;\n        text-shadow: 1px 1px 0px rgba(black, .4);\n    }\n\n    &.success {\n\n        [bs-state~=\"success\"] {\n            opacity: 1;\n        }\n\n        [bs-state~=\"default\"] {\n            opacity: 0;\n        }\n\n        color: $lime!important;\n    }\n\n    &[disabled] {\n        border-color: desaturate($red, 30%);\n        background: desaturate($red, 30%);\n        color: #F2AAAA;\n    }\n\n    + .button,\n    + a {\n    }\n\n    [bs-svg-icon] {\n        position: absolute;\n        top: 11px;\n        left: $half-spacing;\n        width: 16px;\n        height: 16px;\n    }\n}\n\n//\n//\n//\n[bs-button~=\"subtle\"] {\n    @include subtle-button($red, $red-alt);\n}\n\n//\n//\n//\n[bs-button~=\"subtle-alt\"] {\n    @include subtle-button(darken($grey-border, 40%), darken($grey-border, 20%));\n}\n\n//\n//\n//\n[bs-button~=\"size-small\"] {\n\n    @include font-size(14px);\n    padding: 5px $half-spacing;\n    padding-top: 7px;\n    height: 34px;\n\n    [bs-svg-icon] {\n        top: 9px;\n        width: 14px;\n        height: 14px;\n    }\n}\n\n\n//\n// Icon\n//\n[bs-button~=\"icon\"] {\n\n    padding-left: $half-spacing;\n    padding-right: $half-spacing;\n\n    [bs-svg-icon] {\n        position: relative;\n        top: 2px;\n        left: auto;\n    }\n}\n\n//\n// Buttons with icons on left\n//\n[bs-button~=\"icon-left\"] {\n\n    position: relative;\n    padding-left: $base-spacing + $half-spacing;\n\n    [bs-svg-icon] {\n        left: $half-spacing;\n    }\n}\n\n//\n// Buttons with icons on left\n//\n[bs-button~=\"icon-right\"] {\n\n    position: relative;\n    padding-right: $base-spacing + $half-spacing;\n\n    [bs-svg-icon] {\n        left: auto;\n        right: $half-spacing;\n    }\n}\n\n//\n//\n//\n[bs-button-group] {\n\n    display: flex;\n    align-items: stretch;\n    margin-bottom: $half-spacing;\n\n    [bs-button] {\n        border-radius: 0;\n        margin-bottom: 0;\n        &:first-child {\n            border-top-left-radius: 3px;\n            border-bottom-left-radius: 3px;\n        }\n        &:last-child {\n            border-top-right-radius: 3px;\n            border-bottom-right-radius: 3px;\n        }\n    }\n}\n\n[bs-button~=\"inline\"] {\n\n    position: relative;\n    background: transparent;\n    color: $black;\n    border-radius: 0;\n    border: 0;\n    text-transform: uppercase;\n    box-shadow: 0 0 0 0;\n    @include font-size(14px);\n    margin-bottom: 0;\n    padding-top: 10px;\n\n    [bs-checkbox] {\n        margin-right: 8px;\n    }\n\n    &:focus {\n        background: transparent;\n        color: $black;\n    }\n\n    &:hover {\n        background: $grey-border;\n        color: $black;\n    }\n\n    &:active {\n        background: darken($grey-border, 10%);\n        box-shadow: 0 0 0 0;\n    }\n}\n\n[bs-button~=\"success\"] {\n    [bs-svg-icon] {\n        color: $lime;\n    }\n}\n\n[bs-button-row] {\n\n    background: $grey-bg;\n    border-bottom: 1px solid darken($grey-border, 10%);;\n\n    @include media-query(min, $lap-start) {\n        padding-left: $base-spacing;\n    }\n}\n\n//\n// Menu toggle\n//\n[bs-action~=\"menu-toggle\"] {\n    @include only-palm;\n}\n\n//\n// Menu Close\n//\n[bs-action~=\"menu-close\"] {\n    @include only-palm;\n}\n\n@mixin inline-button {\n    background: $grey-bg;\n    color: $grey-text;\n    text-shadow: 1px 1px 0 $white;\n    height: 100%;\n    padding: 0;\n    padding-left: $half-spacing;\n    padding-right: $half-spacing;\n    border-radius: 0;\n    line-height: $controls-height;\n    text-transform: uppercase;\n    @include font-size(14px);\n\n    border-left: 1px solid $grey-border;\n    border-top: 1px solid $grey-border;\n    border-bottom: 0;\n\n    @include media-query(min, $lap-start) {\n    }\n\n    &:hover {\n        background: lighten($grey-bg, 2%);\n        box-shadow: 0 0 1px rgba(black, .1) inset;\n    }\n\n    &:active {\n        box-shadow: 0 0 3px rgba(black, .2) inset;\n    }\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_cloak.scss",
    "content": "[ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n    display: none !important;\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_code.scss",
    "content": "@import \"../vars\";\n@import \"../modules/mixins\";\n\npre {\n    margin-top: $half-spacing;\n    padding: $half-spacing;\n    border-radius: $base-radius;\n    box-shadow: -10px 0px 10px $grey-border inset;\n    border: 1px solid darken($grey-border, 2%);\n\n    code {\n        @include font-size(12px);\n        @include font-size(16px);\n        color: currentColor;\n        line-height: 1;\n        background: transparent;\n        border: 0;\n    }\n}\n\ncode {\n    background: $grey-bg;\n    display: inline-block;\n    padding: 0 5px;\n    border: 1px solid $grey-border;\n    color: darken($blue, 10%);\n    @include font-size(14px);\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_custom-icons.scss",
    "content": ".icon {\n    display: inline-block;\n}\n\n.icon-trash {\n    width: 100%;\n    max-width: 26px;\n    height: 26px;\n}\n\n.icon-word {\n\n    width: 100%;\n    max-width: 150px;\n    height: 100%;\n    margin-left: $gutter - 5px;\n    color: $white;\n\n    svg {\n        position: relative;\n        top: -1px;\n    }\n}\n\n.icon-logo {\n\n    color: $white;\n    transition: all .1s;\n    width: $icon-gutter;\n    height: 37px;\n    text-align: center;\n\n    &:hover {\n        color: $white;\n        transform: scale(1.1);\n    }\n}\n\n[bs-svg-icon] {\n    display: inline-block;\n    width:  $base-spacing;\n    height: $base-spacing;\n    line-height: inherit;\n    position: relative;\n    top: $half-spacing/2;\n    use {\n        width:  $base-spacing;\n        height: $base-spacing;\n    }\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_disconnect.scss",
    "content": "@mixin cover-all {\n    position: absolute;\n    width: 100%;\n    height: 100%;\n    top: 0;\n    left: 0;\n    right: 0;\n}\n\n[bs-overlay] {\n\n    @include cover-all;\n    background: rgba(black, .9);\n    padding: $base-spacing*2 $half-spacing;\n    color: $white;\n    text-align: center;\n    visibility: hidden;\n    z-index: 2000;\n\n    &.active {\n        visibility: visible;\n    }\n\n    * {\n        color: $white;\n    }\n\n    [bs-svg-icon] {\n        width: 40px;\n        height: 40px;\n        @include media-query(min, $lap-start) {\n            width: 100px;\n            height: 100px;\n        }\n    }\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_footer.scss",
    "content": "$footer-text: $black;\n\n[bs-footer] {\n\n    color: $footer-text;\n    text-align: center;\n    margin-bottom: $base-spacing;\n    padding-top: $base-spacing;\n\n    @include font-size(14px);\n\n    @include media-query(min, $lap-start) {\n//        text-shadow: 1px 1px 1px rgba(black, .4);\n        padding-top: $base-spacing;\n        position: fixed;\n        bottom: 0;\n        width: $sidebar-width;\n        color: $grey-text;\n    }\n\n    p {\n        margin-bottom: 0;\n    }\n\n    a {\n        color: $footer-text;\n        @include media-query(min, $lap-start) {\n            color: $grey-text;\n        }\n\n        &:hover, &:focus {\n            text-decoration: none;\n            color: lighten($grey-text, 10%);\n        }\n    }\n\n    [bs-icon] {\n        padding: 0 10px;\n    }\n\n    [bs-svg-icon] {\n        @include media-query(min, $lap-start) {\n            @include svg-shadow;\n        }\n        width: 20px;\n        height: 20px;\n    }\n}\n\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_forms.scss",
    "content": "$input-height: 40px;\n\n@mixin base-input {\n\n    outline: none;\n    vertical-align: middle;\n    border-radius: $base-radius;\n    outline: 0;\n    height: $input-height;\n    padding-left: $half-spacing/2;\n    padding-right: $half-spacing;\n    max-width: 100%;\n    font-family: $sans;\n    color: $black;\n}\n\n/*\n * Basic Inputs\n */\nbutton,\ninput,\nselect {\n    @include base-input;\n}\n\n[bs-code-input] {\n    width: 100%;\n    border: 0;\n    border: 1px dashed $grey-border;\n    font-family: monospace;\n    padding: $half-spacing;\n\n    &:focus {\n        color: $blue;\n    }\n}\n\n[bs-heading-bar] {\n    display: flex;\n    margin-bottom: $half-spacing/2;\n    [bs-input-label] {\n        line-height: 36px;\n    }\n    [bs-button-group] {\n        flex: 1;\n        justify-content: flex-end;\n        margin-bottom: auto;\n        margin-top: auto;\n\n        [bs-button] {\n            padding: 3px 5px;\n            height: 24px;\n            font-size: 10px;\n\n            @include media-query(min, $lap-start) {\n                padding: 7px $half-spacing;\n                height: 34px;\n                font-size: 14px;\n            }\n        }\n    }\n}\n\n[bs-textarea-input] {\n    position: relative;\n    margin-bottom: $half-spacing;\n    [bs-tag] {\n        left: -64px;\n        color: #D08989;\n    }\n}\n[bs-error~=\"offset\"] {\n    position: absolute;\n    top: 0;\n    left: 0;\n}\n\n[bs-input-label] {\n\n    @include font-size(14px);\n\n    position: relative;\n    display: block;\n    text-transform: uppercase;\n    font-weight: bold;\n    color: $grey-text;\n    letter-spacing: .5px;\n\n    @include media-query(min, $lap-start) {\n        @include font-size(14px);\n    }\n}\n\n[bs-label-heading] {\n    color: $black;\n    font-weight: bold;\n}\n\n[bs-input] {\n\n    padding: 0;\n    border-radius: $base-radius;\n    height: 100%;\n\n    > * {\n        margin-top: auto;\n        margin-bottom: auto;\n    }\n\n    input {\n\n        border: 0;\n        border-radius: 0;\n        padding: 0;\n        outline: 0;\n        @include font-size(16px);\n        border-bottom: 1px dashed $grey-border;\n\n        &:focus {\n            color: $blue;\n        }\n    }\n\n    input[type=text] {\n        width: 100%;\n    }\n    input[type=radio] {\n        &:checked {\n            + label {\n                color: $blue!important;\n            }\n        }\n    }\n}\n\n[bs-input~=\"text\"] {\n    height: auto;\n    input {\n        font-family: monospace;\n    }\n}\n\n[bs-input~=\"checkbox\"] {\n\n}\n\n[bs-input~=\"inline\"] {\n\n    display: flex;\n    height: auto;\n\n    input {\n        &:focus {\n            + label {\n                text-decoration: underline;\n            }\n        }\n    }\n\n    > * {\n\n        margin-top: auto;\n        margin-bottom: auto;\n\n        &:first-child {\n            margin-right: $half-spacing;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_grid.scss",
    "content": "[bs-grid] {\n\n    display: flex;\n    width: 100%;\n    flex-flow: wrap;\n\n    > * {\n        width: 100%;\n        padding-top: $half-spacing;\n        padding-bottom: $half-spacing/2;\n    }\n}\n\n@include media-query(min, $desk-start) {\n    [bs-grid~=\"desk-2\"] {\n        [bs-grid-item] {\n            flex: 0 0 50%;\n        }\n    }\n}\n\n[bs-grid~=\"wide-4\"] {\n    [bs-grid-item] {\n        @include media-query(min, $wide-start) {\n            flex: 0 0 25%;\n        }\n    }\n}\n\n[bs-grid-item~=\"padded-right\"] {\n    @include media-query(min, $lap-start) {\n        padding-right: $base-spacing*2;\n    }\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_header.scss",
    "content": "@import \"../vars\";\n@import \"../modules/mixins\";\n\n$header-height: 60px;\n$border-height: 4px;\n$inner-height: $header-height - $border-height;\n\n[bs-header] {\n\n    position: relative;\n    background: $header;\n\n    @include media-query(min, $lap-start) {\n        display: flex;\n    }\n\n    [bs-header-row~=\"brand\"] {\n\n        height: $header-height;\n    }\n\n    [bs-header-row] {\n\n        position: relative;\n        width: 100%;\n        display: flex;\n\n        * {\n            margin-top: auto;\n            margin-bottom: auto;\n        }\n    }\n\n    [bs-list~=\"header\"] {\n\n        width: 100%;\n        padding-left: $icon-gutter + $gutter;\n        @include font-size(14px);\n\n        &, a {\n            color: $white;\n            &:hover {\n                text-decoration: none;\n            }\n        }\n\n        a {\n            display: block;\n            position: relative;\n            &:hover {\n                color: $lime;\n                text-shadow: 1px 1px 3px black;\n            }\n        }\n    }\n}\n\n[bs-toggle] {\n\n    @include font-size(24px);\n    @include only-palm;\n\n    position: absolute;\n    right: 0;\n    cursor: pointer;\n    width: 55px;\n    text-align: center;\n    height: $header-height;\n    line-height: $header-height;\n    color: $white;\n    transition: background .2s;\n    text-shadow: 1px 1px 2px $green-dk;\n    border-left: 1px solid $header;\n    border-bottom: 1px solid $header;\n\n    svg {\n        position: absolute;\n        top: $half-spacing;\n        left: $half-spacing - 2px;\n        height: 30px;\n        width: 30px;\n        pointer-events: none;\n\n        &[bs-state=alt] {\n            opacity: 0;\n        }\n    }\n\n    &:hover {\n        background: $sidebar;\n    }\n\n    &.active {\n        svg {\n            opacity: 0;\n            &[bs-state=alt] {\n                opacity: 1!important;\n            }\n        }\n    }\n}\n\n[bs-link~=\"version\"] {\n    color: $body-text;\n    margin-left: $half-spacing/2;\n    @include font-size(20px);\n    position: relative;\n    top: 4px;\n\n    &:hover, &:focus {\n        color: $red;\n    }\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_headings.scss",
    "content": "@import \"../vars\";\n@import \"../modules/mixins\";\n\n//\n// Site Theme\n//\nh1, h2, h3, h4, h5, h6, hgroup,\np, blockquote, address,\nul, ol, dl,\ntable,\nfieldset, figure, figcaption, details,\npre {\n    margin-bottom: $half-spacing;\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3,\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n    color: $hn-color;\n    font-weight: $hn-font-weight;\n    line-height: $hn-line-height;\n    font-family: $hn-font-family;\n    margin-bottom: $base-spacing;\n    -webkit-font-smoothing: antialiased;\n\n    small {\n        font-size: inherit;\n        font-weight: normal;\n    }\n}\n\nh1, .h1 {\n    @include font-size($h1-size);\n}\nh2, .h2 {\n    padding-top: $half-spacing;\n    @include font-size($h2-size);\n}\nh3, .h3 {\n    @include font-size($h3-size);\n    //margin-bottom: $half-spacing;\n    font-weight: bold;\n}\nh4, .h4 {\n    @include font-size($h4-size);\n}\nh5, .h5 {\n    @include font-size($h5-size);\n}\nh6, .h6 {\n    @include font-size($h6-size);\n}\n\n//\n// Custom Heading styles\n//\n[bs-heading] {\n\n    @include sidebar-style;\n    @include font-size(24px);\n\n    padding-left: $icon-gutter;\n    position: relative;\n    line-height: $nav-button-height;\n    margin-top: 0;\n    margin-bottom: 0;\n    color: $grey-bg;\n    background: darken($sidebar, 2%);\n    border-top: 1px solid darken($sidebar, 2%);\n\n    @include media-query(min, $lap-start) {\n\n        @include font-size(38px);\n        color: $sidebar;\n        background: $grey-bg;\n        padding-left: $icon-gutter + $gutter + 5px;\n        border-top: 0;\n        &:before {\n            display: none;\n        }\n    }\n\n    [bs-svg-icon] {\n\n        position: absolute;\n        left: 14px;\n        top: $half-spacing - 3px;\n\n        @include media-query(min, $lap-start) {\n            height: 38px;\n            width: 38px;\n            top: $half-spacing/2 - 1px;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_helpers.scss",
    "content": ".flush--bottom {\n    margin-bottom: 0!important;\n}\n\n.text--cap {\n    text-transform: capitalize;\n}\n\n.color--lime {\n    color: $lime;\n}\n\n.hidden {\n    display: none;\n    &.active {\n        display: block;\n    }\n}\n\n%item-stack {\n    margin-bottom: $half-spacing;\n}\n\n[bs-stack] {\n    margin-bottom: $half-spacing;\n}\n\n\nspan.sep {\n    margin-left:  5px;\n    margin-right: 5px;\n}\n\n@include media-query(min, $lap-start) {\n    .width-100 { width: 100%!important; }\n    .width-90  { width: 90%!important; }\n    .width-80  { width: 80%!important; }\n    .width-70  { width: 70%!important; }\n    .width-60  { width: 60%!important; }\n    .width-50  { width: 50%!important; }\n    .width-40  { width: 40%!important; }\n    .width-30  { width: 30%!important; }\n    .width-20  { width: 20%!important; }\n}\n\n@include media-query(min, $lap-start) {\n    [bs-width~=\"100\"] { width: 100%!important; }\n    [bs-width~=\"90\"]  { width: 90%!important; }\n    [bs-width~=\"80\"]  { width: 80%!important; }\n    [bs-width~=\"70\"]  { width: 70%!important; }\n    [bs-width~=\"60\"]  { width: 60%!important; }\n    [bs-width~=\"50\"]  { width: 50%!important; }\n    [bs-width~=\"40\"]  { width: 40%!important; }\n    [bs-width~=\"30\"]  { width: 30%!important; }\n    [bs-width~=\"25\"]  { width: 25%!important; }\n    [bs-width~=\"20\"]  { width: 20%!important; }\n\n    [bs-width~=\"10\"]  {\n        flex: 0 0 10%!important;\n    }\n    [bs-width~=\"5\"]  {\n        flex: 0 0 5%!important;\n    }\n}\n\n[bs-text~=\"lede\"] {\n    @include font-size(18px);\n}\n\n[bs-text~=\"mono\"] {\n    font-weight: normal;\n    @include font-size(16px);\n    font-family: monospace;\n    color: $black;\n}\n\n[bs-text~=\"micro\"] {\n    @include font-size(12px);\n    text-transform: uppercase;\n    color: darken($grey-border, 10%);\n    width: 60px;\n    display: inline-block;\n    text-align: right;\n    margin-right: 5px;\n}\n\n[bs-color~=\"white\"] {\n    color: $white;\n}\n\n[bs-color~=\"success\"] {\n    color: $lime;\n}\n\n[bs-visible] {\n\n}\n\n[bs-visible~=\"not-desk\"] {\n    @include media-query(min, $desk-start) {\n        display: none;\n    }\n}\n\n[bs-visible~=\"not-palm\"] {\n    display: none!important;\n    @include media-query(min, $lap-start) {\n        display: inherit!important;\n    }\n}\n\n[bs-visible~=\"palm\"] {\n    @include media-query(min, $lap-start) {\n        display: none;\n    }\n}\n\n[bs-sep] {\n    color: darken($grey-border, 10%);\n    margin-left: 3px;\n    margin-right: 3px;\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_links.scss",
    "content": "a {\n    color: $link;\n    transition: background 0.3s ease, color 0.3s ease;\n\n    &:hover,\n    &:active,\n    &:focus{\n//        text-decoration:underline;\n        color: $link-hover;\n    }\n\n    [class^=\"icon-\"],\n    [class*=\" icon-\"] {\n        text-decoration: none;\n    }\n}\n\n[bs-icon] {\n    transition: background 0.3s ease, color 0.3s ease;\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_lists.scss",
    "content": "$controls-height: 41px;\n\n[bs-flush] {\n    margin-bottom: 0;\n    border-bottom: 0;\n\n}\n\n//\n// Generic lists\n//\n[bs-list] {\n\n    margin-left: 0;\n    list-style: none;\n    word-wrap: break-word;\n\n    p {\n        margin-bottom: 0;\n    }\n\n    [bs-button-group] {\n\n        justify-content: flex-end;\n        margin-bottom: 0;\n\n        [bs-button] {\n            height: auto;\n            border: 0;\n            box-shadow: 0 0 0 0;\n            border-radius: 0;\n            &:active {\n                box-shadow: 0px 0px 1px rgba(black, .3) inset;\n            }\n            &:last-child {\n            }\n        }\n    }\n}\n\n[bs-list~=\"inline\"] {\n    li {\n        display: inline-block;\n    }\n}\n\n//\n// Bordered lists\n//\n[bs-list~=\"bordered\"] {\n\n    > li {\n\n        padding: ($half-spacing - 3px) $half-spacing;\n        border-bottom: 1px solid $grey-border;\n\n        &:first-child {\n            border-top: 1px solid $grey-border;\n        }\n    }\n}\n\n//\n// In-list controls\n//\n[bs-list~=\"inline-controls\"] {\n\n    word-wrap: break-word;\n\n    p {\n        margin-bottom: $half-spacing/2;\n    }\n\n    li {\n\n        background: $white;\n        position: relative;\n        padding-left: $half-spacing;\n        transition: background .5s;\n\n        &:hover {\n\n            background: $grey-bg;\n\n            [bs-button~=\"subtle-alt\"] {\n                color: $black;\n            }\n\n            [bs-button] {\n                background: transparent;\n                &:hover {\n                    color: $red;\n                }\n            }\n        }\n\n        // On wide screens, allow inline-buttons to sit on same line.\n        @include media-query(min, $desk-start) {\n\n            padding: 0;\n            padding-left: $half-spacing;\n            display: flex;\n\n            p {\n                margin-bottom: 0;\n                flex: 1;\n                padding-top: 11px;\n                padding-bottom: 11px;\n            }\n        }\n    }\n\n    [bs-button-group] {\n\n        margin-bottom: 0;\n\n        [bs-button~=\"icon-left\"] {\n\n            line-height: 35px;\n\n            [bs-svg-icon] {\n                top: 12px;\n            }\n        }\n\n        [bs-svg-icon] {\n            top: 4px;\n            width:  22px;\n            height: 22px;\n        }\n    }\n}\n\n[bs-tag] {\n    position: absolute;\n    right: calc(100% + 10px);\n    text-transform: uppercase;\n    font-size: 10px;\n    background: #f1f1f1;\n    border-radius: 3px;\n    padding: 1px 3px;\n    top: 6px;\n    text-align: center;\n\n    span {\n        color: darken(#f1f1f1, 20%);\n        display: block;\n    }\n}\n\n[bs-tag~=\"offset\"] {\n    top: 44px;\n    @include media-query(min, $lap-start) {\n        top: 6px;\n        right: auto;\n        left: -86px;\n    }\n}\n\n//\n// Padded-left variant of the bs-list\n//\n[bs-list~=\"padded-left\"] {\n    li {\n        padding-left: $half-spacing;\n    }\n}\n\n//\n// Basic version of a list\n//\n[bs-list~=\"basic\"] {\n    list-style: circle;\n    margin-left: $base-spacing;\n}\n\n//\n// Offset thing\n//\n[bs-offset~=\"basic\"] {\n\n    > li {\n\n        padding-left: $base-spacing;\n\n        @include media-query(min, $lap-start) {\n            padding-left: $base-spacing*1.5;\n        }\n    }\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_main-content.scss",
    "content": "@import \"../vars\";\n@import \"../modules/mixins\";\n\n[bs-container] {\n    @include media-query(min, $lap-start) {\n        display: flex;\n    }\n}\n\n[bs-content] {\n\n    overflow-x: hidden;\n    height: auto;\n    position: relative;\n    background: $white;\n    width:      100%;\n\n    @include media-query(min, $lap-start) {\n        height: 100vh;\n        overflow-y: auto;\n        -webkit-overflow-scrolling: touch;\n        padding-bottom: 59px; // offset header from scroll\n        margin-top: 1px;\n        width: auto;\n        flex: 1;\n    }\n}\n\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_misc.scss",
    "content": "hr {\n    border-color: $grey-border;\n}\n\ncode {\n\n    color: $teal;\n}\n\npre {\n\n    overflow: auto;\n    white-space: pre;\n    white-space: pre-wrap;\n    word-wrap: break-word;\n    padding: $half-spacing/2 $half-spacing;\n    color: $white;\n    background: $navy;\n    border-radius: $half-radius;\n\n    code {\n        color: $white;\n        line-height: 1.25;\n    }\n}\n\n[bs-stack] {\n    margin-bottom: $half-spacing;\n}\n\n[bs-pointer~=\"default\"] {\n    cursor: pointer;\n}\n\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_msgs.scss",
    "content": "%msg-line {\n    padding-left: $base-spacing + $half-spacing;\n    padding-top: 4px;\n    padding-bottom: 4px;\n    position: relative;\n}\n\n[bs-msg] {\n    @extend %msg-line;\n}\n[bs-msg~=\"success\"] {\n    &:before {\n        color: $lime;\n    }\n}\n[bs-msg~=\"info\"] {\n    &:before {\n        color: $yellow;\n    }\n}\n[bs-msg~=\"error\"] {\n    &:before {\n        color: $red;\n    }\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_notifications.scss",
    "content": "[bs-notify] {\n\n    position: absolute;\n    left: 0;\n    width: 100%;\n    background: $sidebar;\n    color: $white;\n    text-align: center;\n    padding: $base-spacing $half-spacing;\n    box-shadow: 0 5px 5px 0px rgba(0, 0, 0, .2);\n    transform: translateY(-200%);\n    transition: all .3s;\n    z-index: 100;\n\n    &.active {\n        transform: translateY(0);\n    }\n\n    p {\n        margin-bottom: 0;\n    }\n\n    &.success {\n\n    }\n\n    &.error {\n        background: #ED6A13;\n    }\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_panel.scss",
    "content": "@import \"../vars\";\n@import \"../modules/mixins\";\n\n@mixin panel {\n\n    position: relative;\n\n    [bs-text~=\"lede\"] {\n        @include font-size(20px);\n        @include media-query(min, $lap-start) {\n            @include font-size(24px);\n        }\n        position: relative;\n        margin-bottom: 0;\n        color: $black;\n    }\n\n    [bs-text~=\"prefixed\"] {\n        text-transform: none;\n        span {\n            text-transform: uppercase;\n            color: $grey-border;\n            font-weight: 200;\n        }\n    }\n}\n\n[bs-panel] {\n\n    @include panel;\n\n    background: $white;\n    padding: $base-spacing 0 $half-spacing;\n    border-bottom: 1px solid $grey-border;\n}\n\n[bs-panel~=\"switch\"] {\n\n    &.disabled {\n        background: $grey-bg;\n        &, [bs-text~=\"lede\"] {\n            color: $grey-text;\n        }\n    }\n\n    [bs-panel-content] {\n\n        padding-left: $base-spacing*3;\n\n        @include media-query(min, $lap-start) {\n            [bs-panel-icon] {\n                top: $base-spacing + 6px;\n            }\n            padding-left: $base-spacing*4;\n        }\n\n        margin-bottom: $half-spacing;\n    }\n\n    [bs-panel-content~=\"basic\"] {\n        padding-left: $half-spacing;\n        padding-right: $half-spacing;\n        max-width: none;\n    }\n\n    [bs-panel-content~=\"tight\"] {\n        padding-left: 0;\n        padding-right: 0;\n        max-width: none;\n    }\n}\n\n[bs-panel~=\"last\"] {\n\n    border-bottom: 2px solid $grey-border;\n    position: relative;\n\n    &:after {\n        content: \" \";\n        width: 100%;\n        height: 1px;\n        display: block;\n        background: $grey-border;\n        position: absolute;\n        bottom: -4px;\n        z-index: 2;\n    }\n}\n\n[bs-panel~=\"controls\"] {\n    padding: 0;\n    background: $grey-bg;\n    border-bottom: 1px solid $grey-border;\n\n    @include media-query(min, $lap-start) {\n        padding: $base-spacing;\n        padding-bottom: $half-spacing;\n    }\n\n    [bs-heading] {\n        @include media-query(min, $lap-start) {\n            margin-bottom: $half-spacing;\n        }\n    }\n}\n\n[bs-panel~=\"no-border\"] {\n    border-bottom: 0;\n}\n[bs-panel~=\"outline\"] {\n    border-bottom: 1px solid $grey-border;\n}\n\n[bs-panel-icon] {\n\n    position: absolute;\n    left: $half-spacing;\n    top: $base-spacing + 3px;\n\n    [bs-svg-icon] {\n        color: $sidebar;\n        height: 24px;\n        width: 24px;\n        top: 0;\n    }\n}\n\n[bs-panel-content] {\n\n    padding-left: $base-spacing*2;\n    padding-right: $half-spacing;\n\n    @include media-query(min, $lap-start) {\n\n        padding-left: $base-spacing*4;\n\n        [bs-panel-icon] {\n            left: 44px;\n            top: $base-spacing;\n            [bs-svg-icon] {\n                height: 30px;\n                width: 30px;\n                use {\n                    height: 30px;\n                    width: 30px;\n                }\n            }\n        }\n    }\n\n    [bs-panel~=\"trans\"] & {\n        padding-left: $base-spacing*2 + $half-spacing;\n    }\n}\n\n[bs-panel-content~=\"basic\"] {\n\n    padding-left: $base-spacing;\n    padding-right: $base-spacing;\n    max-width: 50em;\n\n    @include media-query(min, $lap-start) {\n        padding-left: $base-spacing*1.5;\n        padding-right: $base-spacing*1.5;\n    }\n}\n\n[bs-skinny] {\n    @include media-query(min, $wide-start) {\n        padding: $base-spacing*2 ($base-spacing*3 + $half-spacing);\n    }\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_paragraphs.scss",
    "content": ".lede {\n    // margin-bottom: $base-spacing;\n    @include font-size($lede-size);\n}\n\n.small {\n    @include font-size($small-size);\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_section-nav.scss",
    "content": "@import \"../vars\";\n@import \"../modules/mixins\";\n\n[bs-section-nav] {\n\n    @include sidebar-style;\n\n    position: absolute;\n    width: 100%;\n    transform: translateX(-200%) translateY(20px) scale(1.2);\n    transition-timing-function: cubic-bezier(.3, 0, 0, 1.3);\n    transition: all .3s;\n    opacity: 0;\n    z-index: 5;\n\n    ul {\n        margin-bottom: 0;\n    }\n\n    [bs-button] {\n\n        text-transform: none;\n        color: $grey-text;\n        width: 100%;\n        border-radius: 0;\n        text-align: left;\n        border: 0;\n        position: relative;\n        background: transparent;\n        display: block;\n        height: auto;\n        padding: 11px 0 11px $icon-gutter;\n        border-bottom: 1px solid $sidebar-hover;\n        @include font-size(16px);\n        margin-bottom: 0;\n        box-shadow: 0 0 0 0;\n\n        [bs-svg-icon] {\n            top:    14px;\n            width:  20px;\n            height: 20px;\n            @include svg-shadow(1px);\n        }\n\n        &.active {\n            background: $sidebar-hover;\n            z-index: 5;\n            color: $white;\n\n            [bs-svg-icon] {\n                color: $red;\n            }\n        }\n\n        &:hover {\n            color: $white;\n            background: $sidebar-hover;\n        }\n        &:active {\n            color: $white;\n            box-shadow: 0px 1px 2px 0 rgba(black, .1) inset;\n            background: darken($sidebar-hover, 5%);\n        }\n    }\n\n    @include media-query(min, $lap-start) {\n        &.ready {\n            opacity: 1;\n        }\n        position: relative;\n        transform: translateX(0) translateY(0) scale(1);\n    }\n\n    &.active {\n        transform: translateX(0) translateY(0) scale(1);\n        opacity: 1;\n    }\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_sidebar.scss",
    "content": "@import \"../vars\";\n@import \"../modules/mixins\";\n\n[bs-sidebar] {\n    position: relative;\n\n    @include sidebar-style;\n    @include media-query(min, $lap-start) {\n        width: $sidebar-width;\n\n        &:after {\n            content: \" \";\n            width: 10px;\n            height: 100%;\n            position: absolute;\n            right: 0;\n            top: 0;\n            z-index: 10;\n            background: linear-gradient(to right, rgba(0, 0, 0, 0) 0%,rgba(black, .20) 100%);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_spinner.scss",
    "content": "$spinner-color: $grey;\n.loader,\n.loader:before,\n.loader:after {\n    background: $spinner-color;\n    -webkit-animation: load1 .5s infinite ease-in-out;\n    animation: load1 .5s infinite ease-in-out;\n    width: 1em;\n    height: 2em;\n}\n.loader:before,\n.loader:after {\n    position: absolute;\n    top: 0;\n    content: '';\n}\n\n.loader:before {\n    left: -1.5em;\n}\n\n.loader {\n    opacity: 1;\n    transition: all 1s;\n    text-indent: -9999em;\n    margin: 8em auto;\n    position: absolute;\n    font-size: 11px;\n    -webkit-animation-delay: -0.16s;\n    animation-delay: -0.16s;\n    z-index: 1;\n    left: 50%;\n    &.behind {\n        z-index: 0;\n    }\n    &.ready {\n        opacity: 0;\n        transform: translateY(-200%);\n    }\n}\n.loader:after {\n    left: 1.5em;\n    -webkit-animation-delay: -0.32s;\n    animation-delay: -0.32s;\n}\n\n@keyframes load1 {\n    0%,\n    80%,\n    100% {\n        box-shadow: 0 0 $spinner-color;\n        height: 4em;\n    }\n    40% {\n        box-shadow: 0 -2em $spinner-color;\n        height: 5em;\n    }\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_state.scss",
    "content": "[bs-state~=\"success\"] {\n    opacity: 0;\n    color: $lime;\n}\n\n[bs-state~=\"waiting\"] {\n    opacity: 0;\n    color: $blue;\n}\n\n[bs-state-icons] {\n\n    position: relative;\n\n    [bs-svg-icon] {\n        position: absolute;\n    }\n}\n\n[bs-anim~=\"spin\"] {\n    animation: spin 1s infinite linear;\n}\n\n[bs-state-wrapper] {\n\n    display: flex;\n\n    [bs-state~=\"inline\"] {\n        top: 3px;\n        left: $half-spacing;\n        width: 17px;\n        height: 27px;\n    }\n\n    &.waiting {\n        [bs-state~=\"waiting\"] {\n            opacity: 1;\n        }\n    }\n    &.success {\n        [bs-state~=\"success\"] {\n            opacity: 1;\n        }\n    }\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_svg.scss",
    "content": "svg {\n\n    width: 100%;\n    height: 100%;\n    opacity: 1;\n    fill: currentColor!important;\n    transition: .3s;\n\n    &.icon-hidden {\n        opacity: 0;\n\n    }\n}\n\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_switch.scss",
    "content": "$switch-size: 22px;\n\n.cmn-toggle {\n    position: absolute;\n    margin-left: -9999px;\n    visibility: hidden;\n}\n.cmn-toggle + label {\n    display: block;\n    position: relative;\n    cursor: pointer;\n    outline: none;\n    user-select: none;\n    background: #AAAAAA;\n}\ninput.cmn-toggle-round + label {\n    padding: 4px;\n    width: $switch-size*2;\n    height: $switch-size;\n    border-radius: $base-radius;\n}\ninput.cmn-toggle-round + label:before, input.cmn-toggle-round + label:after {\n    display: block;\n    position: absolute;\n    top: 1px;\n    left: 2px;\n    bottom: 1px;\n    content: \"\";\n}\ninput.cmn-toggle-round + label:before {\n    right: 2px;\n    background-color: #AAAAAA;\n    border-radius: $base-radius;\n    transition: background 0.2s;\n}\ninput.cmn-toggle-round + label:after {\n    top: 3px;\n    width: $switch-size - 6px;\n    height: $switch-size - 6px;\n    background-color: $white;\n    border-radius: $base-radius;\n    transition: margin 0.2s;\n}\ninput.cmn-toggle-round:checked + label:before {\n    background-color: $lime;\n}\n\ninput.cmn-toggle-round + label:after {\n    margin-left: 1px;\n}\n\ninput.cmn-toggle-round:checked + label:after {\n    margin-left: $switch-size + 1px;\n}\n\ninput.cmn-toggle-round:checked + label {\n    background-color: $lime;\n\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/theme/_top-bar.scss",
    "content": "@import \"../vars\";\n@import \"../modules/mixins\";\n\n[bs-controls] {\n    width: auto;\n    flex: 1;\n}\n\n[bs-controls~=\"top\"] {\n//    width: 100%;\n//    position: fixed;\n//    bottom: 0;\n//    z-index: 200;\n//    @include media-query(min, $lap-start) {\n//    }\n}\n\n[bs-flex~=\"top\"] {\n\n    display: flex;\n    background: lighten($header, 4%);\n    border-bottom: 1px solid lighten($grey, 6%);\n\n    @include media-query(min, $lap-start) {\n        justify-content: flex-end;\n        height: $header-height - 1px;\n    }\n}\n\n[bs-control] {\n\n    @include font-size(12px);\n\n    flex: 1;\n\n    @include media-query(min, $lap-start) {\n        flex: none;\n        height: 100%;\n        padding-top: $half-spacing/2 + 3px;\n        padding-left: $half-spacing;\n        padding-right: $half-spacing;\n    }\n\n    padding-left: $half-spacing/2;\n    padding-right: $half-spacing/2;\n    border-left: 1px solid $grey;\n    border-top:  1px solid $grey;\n    position: relative;\n    color: $grey-text;\n    text-transform: uppercase;\n    text-align: center;\n    padding-top: 10px;\n    padding-bottom: 6px;\n\n    &:first-child {\n        border-left-width: 0;\n        @include media-query(min, $lap-start) {\n            border-left-width: 1px;\n        }\n    }\n\n    [bs-svg-icon] {\n        transition: all .3s;\n        width: 14px;\n        height: 14px;\n        top: 0;\n        display: block;\n        margin-left: auto;\n        margin-right: auto;\n        margin-bottom: 5px;\n\n        @include media-query(min, $lap-start) {\n            width: 19px;\n            height: 19px;\n        }\n    }\n\n//    &:before {\n//        width: 1px;\n//        height: 100%;\n//        top: 0;\n//        position: absolute;\n//        left: -2px;\n//        content: \" \";\n//        background: lighten($grey, 10%);\n//    }\n\n    &:focus {\n        text-decoration: none;\n        color: $grey-text;\n    }\n\n    &:hover {\n\n        background: $sidebar;\n        text-decoration: none;\n        color: $white;\n\n        [bs-svg-icon] {\n            transform: rotate(360deg) scale(1.1);\n            color: $white;\n        }\n    }\n}"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/vendor/_fonts.scss",
    "content": "$source-path: \"../fonts/source-sans\";\n\n@font-face {\n    font-family: 'source_sans';\n    src: url('#{$source-path}/sourcesanspro-it-webfont.eot');\n    src: url('#{$source-path}/sourcesanspro-it-webfont.eot?#iefix') format('embedded-opentype'),\n    url('#{$source-path}/sourcesanspro-it-webfont.woff2') format('woff2'),\n    url('#{$source-path}/sourcesanspro-it-webfont.woff') format('woff'),\n    url('#{$source-path}/sourcesanspro-it-webfont.ttf') format('truetype'),\n    url('#{$source-path}/sourcesanspro-it-webfont.svg#source_sans_proitalic') format('svg');\n    font-weight: normal;\n    font-style: italic;\n}\n\n@font-face {\n    font-family: 'source_sans';\n    src: url('#{$source-path}/sourcesanspro-bold-webfont.eot');\n    src: url('#{$source-path}/sourcesanspro-bold-webfont.eot?#iefix') format('embedded-opentype'),\n    url('#{$source-path}/sourcesanspro-bold-webfont.woff2') format('woff2'),\n    url('#{$source-path}/sourcesanspro-bold-webfont.woff') format('woff'),\n    url('#{$source-path}/sourcesanspro-bold-webfont.ttf') format('truetype'),\n    url('#{$source-path}/sourcesanspro-bold-webfont.svg#source_sans_probold') format('svg');\n    font-weight: bold;\n    font-style: normal;\n\n}\n\n@font-face {\n    font-family: 'source_sans';\n    src: url('#{$source-path}/sourcesanspro-regular-webfont.eot');\n    src: url('#{$source-path}/sourcesanspro-regular-webfont.eot?#iefix') format('embedded-opentype'),\n    url('#{$source-path}/sourcesanspro-regular-webfont.woff2') format('woff2'),\n    url('#{$source-path}/sourcesanspro-regular-webfont.woff') format('woff'),\n    url('#{$source-path}/sourcesanspro-regular-webfont.ttf') format('truetype'),\n    url('#{$source-path}/sourcesanspro-regular-webfont.svg#source_sans_proregular') format('svg');\n    font-weight: normal;\n    font-style: normal;\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/src/scss/vendor/_normalize.scss",
    "content": "/*! normalize.css v3.0.1 | 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 and Firefox.\n * Correct `block` display not defined for `main` in IE 11.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\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: 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": "packages/browser-sync-ui/src/svg-template.tmpl",
    "content": "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" style=\"display: none\">\n{#svg}\n<symbol id=\"{name}\" viewBox=\"{viewBox}\">\n    {raw|s}\n</symbol>{/svg}{~n}</svg>"
  },
  {
    "path": "packages/browser-sync-ui/static/components/button-bars.html",
    "content": "<div bs-button-group>\n    <button bs-button=\"icon-left\"><svg bs-svg-icon><use xlink:href=\"#svg-globe\"></use></svg> Website</button>\n    <button bs-button=\"icon-left\"><svg bs-svg-icon><use xlink:href=\"#svg-twitter\"></use></svg> Twitter</button>\n    <button bs-button=\"icon-right\"><svg bs-svg-icon><use xlink:href=\"#svg-github\"></use></svg> Github</button>\n    <button bs-button=\"icon\" disabled><svg bs-svg-icon><use xlink:href=\"#svg-target\"></use></svg></button>\n</div>\n<div bs-button-group>\n    <button bs-button=\"icon\"><svg bs-svg-icon><use xlink:href=\"#svg-globe\"></use></svg></button>\n    <button bs-button=\"icon\"><svg bs-svg-icon><use xlink:href=\"#svg-twitter\"></use></svg></button>\n    <button bs-button=\"icon\"><svg bs-svg-icon><use xlink:href=\"#svg-github\"></use></svg></button>\n    <button bs-button=\"icon\"><svg bs-svg-icon><use xlink:href=\"#svg-target\"></use></svg></button>\n</div>\n<div bs-button-group>\n    <button bs-button=\"\">Button</button>\n    <button bs-button=\"icon\"><svg bs-svg-icon><use xlink:href=\"#svg-globe\"></use></svg></button>\n    <button bs-button=\"icon-left\"><svg bs-svg-icon><use xlink:href=\"#svg-globe\"></use></svg> Button Small</button>\n    <button bs-button disabled>n/a</button>\n    <button bs-button=\"icon-right\"><svg bs-svg-icon><use xlink:href=\"#svg-globe\"></use></svg> Button Small</button>\n</div>\n<div bs-button-group>\n    <button bs-button=\"subtle-alt\">Button</button>\n    <button bs-button=\"subtle-alt icon\"><svg bs-svg-icon><use xlink:href=\"#svg-globe\"></use></svg></button>\n    <button bs-button=\"subtle-alt icon-left\"><svg bs-svg-icon><use xlink:href=\"#svg-globe\"></use></svg> Button Small</button>\n    <button bs-button=\"subtle-alt\" disabled>n/a</button>\n    <button bs-button=\"subtle-alt icon-right\"><svg bs-svg-icon><use xlink:href=\"#svg-globe\"></use></svg> Button Small</button>\n</div>\n<div bs-button-group>\n    <button bs-button=\"size-small subtle-alt\">Button</button>\n    <button bs-button=\"size-small subtle-alt icon\"><svg bs-svg-icon><use xlink:href=\"#svg-globe\"></use></svg></button>\n    <button bs-button=\"size-small subtle-alt icon-left\"><svg bs-svg-icon><use xlink:href=\"#svg-globe\"></use></svg> Button Small</button>\n    <button bs-button=\"size-small subtle-alt\" disabled>n/a</button>\n    <button bs-button=\"size-small subtle-alt icon-right\"><svg bs-svg-icon><use xlink:href=\"#svg-globe\"></use></svg> Button Small</button>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/static/components/buttons.html",
    "content": "<p>Default button styles</p>\n<p>\n    <button bs-button>Button</button>\n    <button bs-button=\"size-small\">Button Small</button>\n    <button bs-button=\"size-small\" disabled>Button Small</button>\n</p>\n<p>Subtle button styles</p>\n<p>\n    <button bs-button=\"subtle\">Button</button>\n    <button bs-button=\"size-small subtle\">Button Small</button>\n    <button bs-button=\"size-small subtle\" disabled>Button Small</button>\n</p>\n<p>Alternative Subtle button styles</p>\n<p>\n    <button bs-button=\"subtle-alt\">Button</button>\n    <button bs-button=\"size-small subtle-alt\">Button Small</button>\n    <button bs-button=\"size-small subtle-alt\" disabled>Button Small</button>\n</p>\n<hr/>\n<p>Default buttons with icons</p>\n<div>\n    <button bs-button=\"icon-left\"><svg bs-svg-icon><use xlink:href=\"#svg-square-add\"></use></svg> Icon Left</button>\n    <button bs-button=\"icon-right\"><svg bs-svg-icon><use xlink:href=\"#svg-globe\"></use></svg> Icon Right</button>\n    <button bs-button=\"icon\"><svg bs-svg-icon><use xlink:href=\"#svg-target\"></use></svg></button>\n    <button bs-button=\"icon\" disabled><svg bs-svg-icon><use xlink:href=\"#svg-target\"></use></svg></button>\n</div>\n<div>\n    <button bs-button=\"size-small icon-left\"><svg bs-svg-icon><use xlink:href=\"#svg-square-add\"></use></svg> Icon Left</button>\n    <button bs-button=\"size-small icon-right\"><svg bs-svg-icon><use xlink:href=\"#svg-bug\"></use></svg> Icon Right</button>\n    <button bs-button=\"size-small icon\"><svg bs-svg-icon><use xlink:href=\"#svg-target\"></use></svg></button>\n    <button bs-button=\"size-small icon\" disabled><svg bs-svg-icon><use xlink:href=\"#svg-target\"></use></svg></button>\n</div>\n<br/>\n<p>Subtle buttons with icons</p>\n<div>\n    <button bs-button=\"subtle icon-left\"><svg bs-svg-icon><use xlink:href=\"#svg-square-add\"></use></svg> Icon Left</button>\n    <button bs-button=\"subtle icon-right\"><svg bs-svg-icon><use xlink:href=\"#svg-bug\"></use></svg> Icon Right</button>\n    <button bs-button=\"subtle icon\"><svg bs-svg-icon><use xlink:href=\"#svg-target\"></use></svg></button>\n    <button bs-button=\"subtle icon\" disabled><svg bs-svg-icon><use xlink:href=\"#svg-help\"></use></svg></button>\n</div>\n<div>\n    <button bs-button=\"size-small subtle icon-left\"><svg bs-svg-icon><use xlink:href=\"#svg-square-add\"></use></svg> Icon Left</button>\n    <button bs-button=\"size-small subtle icon-right\"><svg bs-svg-icon><use xlink:href=\"#svg-bug\"></use></svg> Icon Right</button>\n    <button bs-button=\"size-small subtle icon\"><svg bs-svg-icon><use xlink:href=\"#svg-target\"></use></svg></button>\n    <button bs-button=\"size-small subtle icon\" disabled><svg bs-svg-icon><use xlink:href=\"#svg-help\"></use></svg></button>\n</div>\n<br/>\n<p>Alternative Subtle button styles with icons</p>\n<div>\n    <button bs-button=\"size-small subtle-alt icon-left\"><svg bs-svg-icon><use xlink:href=\"#svg-globe\"></use></svg> Icon Left</button>\n    <button bs-button=\"size-small subtle-alt icon-right\"><svg bs-svg-icon><use xlink:href=\"#svg-bug\"></use></svg> Icon Right</button>\n    <button bs-button=\"size-small subtle-alt icon\"><svg bs-svg-icon><use xlink:href=\"#svg-target\"></use></svg></button>\n    <button bs-button=\"size-small subtle-alt icon\" disabled><svg bs-svg-icon><use xlink:href=\"#svg-help\"></use></svg></button>\n</div>\n"
  },
  {
    "path": "packages/browser-sync-ui/static/components/footer.html",
    "content": "<footer bs-footer>\n    <p bs-text=\"copyright\">© 2021 -\n        <a href=\"https://browsersync.io\">Browsersync.io</a>\n    </p>\n    <p>\n        <a href=\"https://github.com/BrowserSync/browser-sync/\" bs-icon>\n            <svg bs-svg-icon><use xlink:href=\"#svg-github\"></use></svg>\n        </a>\n        <a href=\"https://twitter.com/browsersync\" bs-icon>\n            <svg bs-svg-icon><use xlink:href=\"#svg-twitter\"></use></svg>\n        </a>\n    </p>\n</footer>\n"
  },
  {
    "path": "packages/browser-sync-ui/static/components/forms.html",
    "content": "<div bs-input=\"text\">\n    <label for=\"grid-size\" bs-input-label>Grid Size</label>\n    <input id=\"grid-size\" type=\"text\" size=\"16px\" value=\"16px\" placeholder=\"\"/>\n</div>\n<br/>\n<div bs-input=\"text\">\n    <label for=\"some-input\" bs-input-label>Some input</label>\n    <input id=\"some-input\" type=\"text\" size=\"\" value=\"\" placeholder=\"EG: #main\"/>\n</div>\n<br/>\n<p bs-label-heading>Form label</p>\n\n<div bs-input=\"text\">\n    <label for=\"overlay-01\" bs-input-label>Input + Button</label>\n    <div bs-input-group>\n        <input bs-stack id=\"overlay-01\" type=\"text\" size=\"10\" value=\"\" placeholder=\"EG: #main\"/>rs\n        <button bs-button=\"subtle-alt icon\"><svg bs-svg-icon><use xlink:href=\"#svg-circle-plus\"></use></svg></button>\n    </div>\n</div>\n\n<div bs-input=\"text\">\n    <label for=\"new-restriction\" bs-input-label>New Restriction</label>\n    <input bs-stack id=\"new-restriction\" type=\"text\" size=\"\" value=\"\" ng-model=\"ctrl.restriction\" placeholder=\"eg: #main\">\n    <div bs-state-wrapper ng-class=\"[ctrl.state.classname]\">\n        <button type=\"submit\" id=\"add-restriction\" bs-button=\"size-small subtle-alt icon-left\" ng-disabled=\"ctrl.state.waiting\">\n            <svg bs-svg-icon=\"\" icon=\"circle-plus\"><use xlink:href=\"#svg-circle-plus\"></use></svg>Add</button>\n        <div bs-state-icons>\n            <svg bs-svg-icon icon=\"circle-ok\" bs-state=\"success inline\"><use xlink:href=\"#svg-circle-ok\"></use></svg>\n            <svg bs-svg-icon icon=\"circle-minus\" bs-state=\"waiting inline\" bs-anim=\"spin\"><use xlink:href=\"#svg-circle-minus\"></use></svg>\n        </div>\n    </div>\n</div>\n\n\n"
  },
  {
    "path": "packages/browser-sync-ui/static/components/header.html",
    "content": "<header bs-header role=\"banner\">\n    <div bs-header-row=\"brand\">\n        <span class=\"icon icon-word\">\n            <svg>\n                <use xlink:href=\"#svg-logo-word\"></use>\n            </svg>\n        </span>\n        <a href=\"https://www.npmjs.com/package/browser-sync\" bs-link=\"version\" target=\"_blank\">v{{app.options.version}}</a>\n        <span bs-toggle=\"nav\" ng-click=\"app.toggleMenu('shane')\" ng-class=\"{'active': app.ui.sectionMenu}\">\n            <svg>\n                <use xlink:href=\"#svg-list\"></use>\n            </svg>\n            <svg bs-state=\"alt\">\n                <use xlink:href=\"#svg-circle-delete\"></use>\n            </svg>\n        </span>\n    </div>\n    <aside bs-controls=\"top\">\n        <div bs-flex=\"top\">\n            <a href=\"#\" bs-control title=\"Reload all Browsers\" ng-click=\"app.reloadAll()\">\n                <svg bs-svg-icon><use xlink:href=\"#svg-repeat\"></use></svg>\n                Reload all\n            </a>\n            <a href=\"{{app.options.port | localRootUrl:app.options.scheme}}\" target=\"_blank\" bs-control title=\"Open a new tab\" ng-if=\"app.options\" ng-show=\"app.options.mode !== 'snippet'\" class=\"ng-scope\">\n                <svg bs-svg-icon><use xlink:href=\"#svg-newtab\"></use></svg>\n                New Tab\n            </a>\n            <a href=\"#\" bs-control title=\"Reset the scroll position of all browsers to 0\" ng-click=\"app.scrollAllTo(0)\">\n                <svg bs-svg-icon><use xlink:href=\"#svg-square-up\"></use></svg>\n                Scroll Top\n            </a>\n            <a href=\"#\" bs-control title=\"Reset all Browsers to Homepage\" ng-click=\"app.sendAllTo('/')\" ng-show=\"app.options.mode !== 'snippet'\">\n                <svg bs-svg-icon><use xlink:href=\"#svg-home\"></use></svg>\n                Reset All\n            </a>\n        </div>\n    </aside>\n</header>\n"
  },
  {
    "path": "packages/browser-sync-ui/static/components/heading.html",
    "content": "<div bs-panel=\"controls outline\">\n    <h1 bs-heading>\n        <svg bs-svg-icon><use xlink:href=\"#svg-cog\"></use></svg>\n        Server Info\n    </h1>\n</div>"
  },
  {
    "path": "packages/browser-sync-ui/static/components/help-content.html",
    "content": "<div bs-panel=\"controls outline\">\n    <h1 bs-heading><svg bs-svg-icon><use xlink:href=\"#svg-\"></use></svg> Help Content</h1>\n</div>\n<div bs-panel>\n    <div bs-panel-content=\"basic\">\n        <p class=\"lede\">\n            Browsersync is an open-source project created by <a href=\"https://twitter.com/shaneOsbourne\">Shane Osbourne</a>\n        </p>\n        <p><small>Originally supported by [JH](https://wearejh.com).</small></p>\n    </div>\n</div>\n<div bs-panel>\n    <div bs-panel-content=\"basic\">\n        <h2>Help</h2>\n        <dl>\n            <dt>Why isn&rsquo;t Browsersync connecting with my project?</dt>\n            <dd>99% of the time, it's because your web page doesn't have a `body` tag.\n                In order for Browsersync to connect properly the `body` tag must be present in your website (we add a script tag just after it).\n                Alternatively you can provide a custom rule for the snippet using [snippetOptions](https://www.browsersync.io/docs/options/#option-snippetOptions)\n            </dd>\n            <dt>Which mode should I be running in?</dt>\n            <dd>\n                <ul>\n                    <li>If you have simple HTML, CSS & JavaScript files, you need the [server option](https://www.browsersync.io/docs/options-server).</li>\n                    <li>If you already have an existing server setup (such as an Express app, Mamp, Rails etc, then you need the [proxy option](https://www.browsersync.io/docs/options-proxy).</li>\n                    <li>If you intend to copy/paste the snippet into your website manually, you use the `snippet` mode. This is the default mode and is\n                    achieved by omitting both the server & proxy options</li>\n                </ul>\n            </dd>\n            <dt>Where can I report an issue?</dt>\n            <dd>\n                <p>If you have found an issue with the Browsersync UI, please use our [issue tracker](https://github.com/BrowserSync/browser-sync/issues) </p>\n            </dd>\n\n        </dl>\n        <hr>\n        <p>Need more assistance? Please try our [documentation](http://www.browsersync.io/docs/) for user guides or our [stackoverflow](https://stackoverflow.com/questions/tagged/browser-sync) tag for answers to common problems.</p>\n    </div>\n</div>\n<div bs-panel>\n    <div bs-panel-content=\"basic\">\n        <h2>Contribute</h2>\n        <p>We'd love for you to contribute to Browsersync and help make it even better than it is today! Please read our [contributor guidelines](https://github.com/shakyShane/browser-sync/blob/master/CONTRIBUTING.md).</p>\n    </div>\n</div>\n"
  },
  {
    "path": "packages/browser-sync-ui/static/components/lists.html",
    "content": "<div class=\"tube\">\n<h2>Simple list</h2>\n<ul bs-list>\n    <li>Item 1</li>\n    <li>Item 2</li>\n    <li>Item 3</li>\n    <li>Item 4</li>\n    <li>Item 5</li>\n</ul>\n<br/>\n<h2>Bordered list</h2>\n<ul bs-list=\"bordered\">\n    <li>/gallery/new-item</li>\n    <li><a href=\"#\">https://github.com/shakyShane/browser-sync/pull/400</a></li>\n    <li>Item 3</li>\n    <li>Item 4</li>\n    <li>Item 5</li>\n</ul>\n<br/>\n<h2>Bordered list with controls</h2>\n</div>\n\n<ul bs-list=\"bordered inline-controls\">\n    <li>\n        <p>https://github.com/BrowserSync/browser-sync/</p>\n        <div bs-button-group>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n              <svg bs-svg-icon><use xlink:href=\"#svg-syncall\"></use></svg>\n            </button>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n                <svg bs-svg-icon><use xlink:href=\"#svg-bin\"></use></svg>\n            </button>\n        </div>\n    </li>\n    <li>\n        <p>https://github.com/BrowserSync/browser-sync/issues</p>\n        <div bs-button-group>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n              <svg bs-svg-icon><use xlink:href=\"#svg-syncall\"></use></svg>\n            </button>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n                <svg bs-svg-icon><use xlink:href=\"#svg-bin\"></use></svg>\n            </button>\n        </div>\n    </li>\n    <li>\n        <p>https://twitter.com/browsersync</p>\n        <div bs-button-group>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n              <svg bs-svg-icon><use xlink:href=\"#svg-syncall\"></use></svg>\n            </button>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n                <svg bs-svg-icon><use xlink:href=\"#svg-bin\"></use></svg>\n            </button>\n        </div>\n    </li>\n    <li>\n        <p>https://browsersync.io</p>\n        <div bs-button-group>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n              <svg bs-svg-icon><use xlink:href=\"#svg-syncall\"></use></svg>\n            </button>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n                <svg bs-svg-icon><use xlink:href=\"#svg-bin\"></use></svg>\n            </button>\n        </div>\n    </li>\n    <li>\n        <p>https://stackoverflow.com/questions/tagged/browser-sync</p>\n        <div bs-button-group>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n              <svg bs-svg-icon><use xlink:href=\"#svg-syncall\"></use></svg>\n            </button>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n                <svg bs-svg-icon><use xlink:href=\"#svg-bin\"></use></svg>\n            </button>\n        </div>\n    </li>\n    <li>\n        <p>https://www.browsersync.io/docs/options/#option-snippetOptions</p>\n        <div bs-button-group>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n              <svg bs-svg-icon><use xlink:href=\"#svg-syncall\"></use></svg>\n            </button>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n                <svg bs-svg-icon><use xlink:href=\"#svg-bin\"></use></svg>\n            </button>\n        </div>\n    </li>\n    <li>\n        <p>https://github.com/shakyShane/browser-sync/blob/master/CONTRIBUTING.md</p>\n        <div bs-button-group>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n              <svg bs-svg-icon><use xlink:href=\"#svg-syncall\"></use></svg>\n            </button>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n                <svg bs-svg-icon><use xlink:href=\"#svg-bin\"></use></svg>\n            </button>\n        </div>\n    </li>\n    <li>\n        <p>https://www.browsersync.io/docs/options</p>\n        <div bs-button-group>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n              <svg bs-svg-icon><use xlink:href=\"#svg-syncall\"></use></svg>\n            </button>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n                <svg bs-svg-icon><use xlink:href=\"#svg-bin\"></use></svg>\n            </button>\n        </div>\n    </li>\n    <li>\n        <p>https://wearejh.com</p>\n        <div bs-button-group>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n              <svg bs-svg-icon><use xlink:href=\"#svg-syncall\"></use></svg>\n            </button>\n            <button href=\"#\" bs-button=\"subtle-alt icon\">\n                <svg bs-svg-icon><use xlink:href=\"#svg-bin\"></use></svg>\n            </button>\n        </div>\n    </li>\n</ul>"
  },
  {
    "path": "packages/browser-sync-ui/static/components/panels.html",
    "content": "<div class=\"tube\">\n    <p>Page heading</p>\n<div bs-panel=\"controls outline\">\n    <h1 bs-heading>\n        <svg bs-svg-icon><use xlink:href=\"#svg-cog\"></use></svg>\n        Overview\n    </h1>\n</div>\n<hr/>\n    <div bs-panel=\"controls outline\">\n        <h1 bs-heading>\n            <svg bs-svg-icon><use xlink:href=\"#svg-syncall\"></use></svg>\n            Sync all\n        </h1>\n    </div>\n    <div bs-button-row>\n        <button bs-button=\"inline icon-left success\" ng-click=\"setMany(true)\">\n            <svg bs-svg-icon><use xlink:href=\"#svg-circle-ok\"></use></svg>\n            Enable All\n        </button>\n        <button bs-button=\"icon-left inline\" ng-click=\"setMany(false)\">\n            <svg bs-svg-icon><use xlink:href=\"#svg-circle-delete\"></use></svg>\n            Disable all\n        </button>\n    </div>\n</div>\n\n<div bs-panel=\"controls outline\">\n    <h1 bs-heading>\n        <svg bs-svg-icon><use xlink:href=\"#svg-cog\"></use></svg>\n        Overview\n    </h1>\n</div>\n<hr/>\n\n"
  },
  {
    "path": "packages/browser-sync-ui/static/components/switches.html",
    "content": "<section bs-panel=\"switch\" ng-class=\"{'disabled': !active}\">\n    <div bs-panel-content>\n        <div bs-panel-icon>\n            <div class=\"switch\">\n                <input id=\"switch-1\"\n                       ng-model=\"item[prop]\"\n                       ng-change=\"toggle(item)\"\n                       class=\"cmn-toggle cmn-toggle-round\"\n                       type=\"checkbox\"\n                       checked=\"\">\n                <label for=\"switch-1\"></label>\n            </div>\n        </div>\n        <div>\n            <p bs-text=\"lede\">Css Grid Overlay</p>\n            <p>Some other content</p>\n        </div>\n    </div>\n    <div bs-panel-content>\n        <div bs-inputs bs-grid=\"wide-4 desk-2\">\n            <div bs-grid-item>\n                <div bs-input=\"text\">\n                    <label for=\"grid-size\" bs-input-label>Grid Size</label>\n                    <input id=\"grid-size\" type=\"text\" size=\"16px\" value=\"16px\" placeholder=\"\"/>\n                </div>\n            </div>\n            <div bs-grid-item>\n                <div bs-input=\"text\">\n                    <label for=\"grid-colour\" bs-input-label>Grid Colour</label>\n                    <input id=\"grid-colour\" type=\"text\" size=\"rgba(0, 0, 0, 0.2)\" value=\"rgba(0, 0, 0, 0.2)\" placeholder=\"\"/>\n                </div>\n            </div>\n            <div bs-grid-item>\n                <div bs-input=\"text\">\n                    <label for=\"grid-selector\" bs-input-label>Grid Selector</label>\n                    <input id=\"grid-selector\" type=\"text\" size=\"body\" value=\"body\" placeholder=\"\"/>\n                </div>\n            </div>\n        </div>\n        <div bs-inputs bs-grid=\"wide-4 desk-2\">\n            <div bs-grid-item>\n                <div bs-input=\"text\">\n                    <label for=\"offset-top\" bs-input-label>Offset Top</label>\n                    <input id=\"offset-top\" type=\"text\" size=\"0\" value=\"0\" placeholder=\"\"/>\n                </div>\n            </div>\n            <div bs-grid-item>\n                <div bs-input=\"text\">\n                    <label for=\"offset-bottom\" bs-input-label>Offset Bottom</label>\n                    <input id=\"offset-bottom\" type=\"text\" size=\"0\" value=\"0\" placeholder=\"\"/>\n                </div>\n            </div>\n        </div>\n        <div bs-inputs bs-grid=\"wide-4 desk-2\">\n            <div bs-grid-item>\n                <div bs-input=\"inline\">\n                    <input type=\"checkbox\" id=\"vertical-axis\" checked>\n                    <label for=\"vertical-axis\" bs-input-label>Vertical Axis</label>\n                </div>\n            </div>\n            <div bs-grid-item>\n                <div bs-input=\"inline\">\n                    <input type=\"checkbox\" id=\"horizontal-axis\" checked>\n                    <label for=\"horizontal-axis\" bs-input-label>Horizontal Axis</label>\n                </div>\n            </div>\n        </div>\n    </div>\n</section>\n"
  },
  {
    "path": "packages/browser-sync-ui/static/components/type.html",
    "content": "<h1>Heading 1</h1>\n\n<h2>Heading 2</h2>\n\n<h3>Heading 3</h3>\n\n<p class=\"lede\">Lede paragraph. Lorem ipsum dolor sit amet.</p>\n\n<p>Paragraph. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Libero esse molestias, itaque, quia sed laudantium laboriosam amet aliquam ipsam, laborum asperiores quod obcaecati, maiores fugiat nihil cum minus provident vitae.</p>\n\n<p class=\"small\">Small paragraph. Lorem ipsum dolor sit amet.</p>\n\n<p><a href=\"#links\">Link</a> <span bs-sep>|</span> <a href=\"#\">Another link</a></p>\n\n<p>Inline tags. Lorem <strong>strong</strong> ipsum <code>code</code> dolar <mark>mark</mark> si <em>em</em>.</p>\n\n<hr>\n\n<ul>\n    <li>Lorem ipsum dolor sit amet.</li>\n    <li>Ratione dolore veritatis voluptas consequuntur!</li>\n    <li>Odit quis, pariatur ipsum vel.\n        <ul>\n            <li>Lorem ipsum dolor sit amet.</li>\n            <li>Ratione dolore veritatis voluptas consequuntur!</li>\n            <li>Odit quis, pariatur ipsum vel.</li>\n            <li>Suscipit laudantium, quam debitis tempore.</li>\n            <li>Nobis vero nesciunt suscipit porro.</li>\n        </ul>\n    </li>\n    <li>Suscipit laudantium, quam debitis tempore.</li>\n    <li>Nobis vero nesciunt suscipit porro.</li>\n</ul>\n\n<ol>\n    <li>Lorem ipsum dolor sit amet.</li>\n    <li>Ratione dolore veritatis voluptas consequuntur!</li>\n    <li>Odit quis, pariatur ipsum vel.\n        <ol>\n            <li>Lorem ipsum dolor sit amet.</li>\n            <li>Ratione dolore veritatis voluptas consequuntur!</li>\n            <li>Odit quis, pariatur ipsum vel.</li>\n            <li>Suscipit laudantium, quam debitis tempore.</li>\n            <li>Nobis vero nesciunt suscipit porro.</li>\n        </ol>\n    </li>\n    <li>Suscipit laudantium, quam debitis tempore.</li>\n    <li>Nobis vero nesciunt suscipit porro.</li>\n</ol>\n\n<dl>\n    <dt>Lorem ipsum dolor sit amet.</dt>\n    <dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus, hic.</dd>\n    <dt>Lorem ipsum dolor sit amet.</dt>\n    <dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus, hic.</dd>\n    <dt>Lorem ipsum dolor sit amet.</dt>\n    <dd>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus, hic.</dd>\n</dl>\n\n<hr>\n\n<table>\n    <caption>The Very Best Eggnog</caption>\n    <thead>\n        <tr>\n            <th scope=\"col\">Ingredients</th>\n            <th scope=\"col\">Serves 12</th>\n            <th scope=\"col\">Serves 24</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td data-title=\"Ingredient\">Milk</td>\n            <td data-title=\"For 12\">1 quart</td>\n            <td data-title=\"For 24\">2 quart</td>\n        </tr>\n        <tr>\n            <td data-title=\"Ingredient\">Cloves</td>\n            <td data-title=\"For 12\">5</td>\n            <td data-title=\"For 24\">10</td>\n        </tr>\n        <tr>\n            <td data-title=\"Ingredient\">Egg Yolks</td>\n            <td data-title=\"For 12\">12</td>\n            <td data-title=\"For 24\">24</td>\n        </tr>\n        <tr>\n            <td data-title=\"Ingredient\">Cups Sugar</td>\n            <td data-title=\"For 12\">1 ½ cups</td>\n            <td data-title=\"For 24\">3 cups</td>\n        </tr>\n        <tr>\n            <td data-title=\"Ingredient\">Dark Rum</td>\n            <td data-title=\"For 12\">1 ½ cups</td>\n            <td data-title=\"For 24\">3 cups</td>\n        </tr>\n        <tr>\n            <td data-title=\"Ingredient\">Freshly grated nutmeg to taste</td>\n            <td data-title=\"For 12\"></td>\n            <td data-title=\"For 24\"></td>\n        </tr>\n    </tbody>\n</table>\n"
  },
  {
    "path": "packages/browser-sync-ui/static/content/help.content.html",
    "content": "<div bs-panel=\"controls outline\">\n    <h1 bs-heading><svg bs-svg-icon><use xlink:href=\"#svg-help\"></use></svg> Help / About</h1>\n</div>\n<div bs-panel>\n    <div bs-panel-content=\"basic\">\n        <p class=\"lede\">\n            Browsersync is an open-source project created by <a href=\"https://twitter.com/shaneOsbourne\">Shane Osbourne</a>\n        </p>\n        <p><small>Originally supported by <a href=\"https://wearejh.com\">JH</a>.</small></p>\n    </div>\n</div>\n<div bs-panel>\n    <div bs-panel-content=\"basic\">\n        <h2>Help</h2>\n        <dl>\n            <dt>Why isn&rsquo;t Browsersync connecting with my project?</dt>\n            <dd>99% of the time, it&#39;s because your web page doesn&#39;t have a <code>body</code> tag.\n                In order for Browsersync to connect properly the <code>body</code> tag must be present in your website (we add a script tag just after it).\n                Alternatively you can provide a custom rule for the snippet using <a href=\"https://www.browsersync.io/docs/options/#option-snippetOptions\">snippetOptions</a>\n            </dd>\n            <dt>Which mode should I be running in?</dt>\n            <dd>\n                <ul>\n                    <li>If you have simple HTML, CSS &amp; JavaScript files, you need the <a href=\"https://www.browsersync.io/docs/options-server\">server option</a>.</li>\n                    <li>If you already have an existing server setup (such as an Express app, Mamp, Rails etc, then you need the <a href=\"https://www.browsersync.io/docs/options-proxy\">proxy option</a>.</li>\n                    <li>If you intend to copy/paste the snippet into your website manually, you use the <code>snippet</code> mode. This is the default mode and is\n                    achieved by omitting both the server &amp; proxy options</li>\n                </ul>\n            </dd>\n            <dt>Where can I report an issue?</dt>\n            <dd>\n                <p>If you have found an issue with the Browsersync UI, please use our <a href=\"https://github.com/BrowserSync/browser-sync/issues\">issue tracker</a> </p>\n            </dd>\n\n        </dl>\n        <hr>\n        <p>Need more assistance? Please try our <a href=\"http://www.browsersync.io/docs/\">documentation</a> for user guides or our <a href=\"https://stackoverflow.com/questions/tagged/browser-sync\">stackoverflow</a> tag for answers to common problems.</p>\n    </div>\n</div>\n<div bs-panel>\n    <div bs-panel-content=\"basic\">\n        <h2>Contribute</h2>\n        <p>We&#39;d love for you to contribute to Browsersync and help make it even better than it is today! Please read our <a href=\"https://github.com/shakyShane/browser-sync/blob/master/CONTRIBUTING.md\">contributor guidelines</a>.</p>\n    </div>\n</div>\n\n"
  },
  {
    "path": "packages/browser-sync-ui/tasks/crossbow.js",
    "content": "var crossbow = require('crossbow-sites');\nvar vfs = require('vinyl-fs');\nvar resolve = require('path').resolve;\n\nconst input = [\n    \"src/crossbow/*.hbs\",\n    \"src/crossbow/components/*.hbs\",\n    \"src/crossbow/content/*.hbs\",\n];\n\nvfs.src(input.map(x => resolve(x)))\n    .pipe(crossbow.stream({\n        config: {base: \"src/crossbow\"},\n        data: {site: \"file:_config.yml\"},\n    }))\n    .pipe(vfs.dest(\"./static\"));\n"
  },
  {
    "path": "packages/browser-sync-ui/tasks/icons.js",
    "content": "var easysvg = require(\"easy-svg\");\nvar vfs     = require(\"vinyl-fs\");\n\n/**\n * Compile SVG Symbols\n */\nfunction icons (opts, ctx, done) {\n    return vfs.src(opts.input)\n        .pipe(easysvg.stream({js: false}))\n        .on('error', done)\n        .pipe(vfs.dest(opts.output))\n}\n\nmodule.exports.tasks = [icons];\n"
  },
  {
    "path": "packages/browser-sync-ui/templates/config.item.tmpl",
    "content": ".when('%path%', {\n    templateUrl:  '%template%',\n    controller:   '%controller%',\n    controllerAs: 'ctrl',\n    resolve: {\n        options: ['Options', function(opts) {\n            return opts.all();\n        }]\n    }\n})"
  },
  {
    "path": "packages/browser-sync-ui/templates/config.tmpl",
    "content": "/**\n * This file is generated automatically at run time by the Browsersync UI\n */\n(function (angular) {\n\n    angular.module(\"BrowserSync\")\n\n    .config([\"$routeProvider\", \"$locationProvider\", function ($routeProvider) {\n        $routeProvider%when%\n    }])\n\n    .value(\"pagesConfig\", %pages%);\n\n})(angular);\n"
  },
  {
    "path": "packages/browser-sync-ui/templates/directives/bs-switch.html",
    "content": "<section bs-panel=\"switch\" ng-class=\"{'disabled': !active}\">\n    <div bs-panel-content>\n        <div bs-panel-icon>\n            <div class=\"switch\">\n                <input id=\"{{switchid}}\"\n                       ng-model=\"item[prop]\"\n                       ng-change=\"toggle(item)\"\n                       class=\"cmn-toggle cmn-toggle-round\"\n                       type=\"checkbox\"\n                       checked=\"\">\n                <label for=\"{{switchid}}\"></label>\n            </div>\n        </div>\n        <div>\n            <p bs-text=\"lede\">{{item.title}}</p>\n            <p ng-show=\"item.tagline && item.tagline.length\" ng-bind-html=\"item.tagline\">{{item.tagline}}</p>\n        </div>\n    </div>\n    <div ng-transclude ng-if=\"item.active\"></div>\n</section>"
  },
  {
    "path": "packages/browser-sync-ui/templates/inline.template.tmpl",
    "content": "<script type=\"text/ng-template\" id=\"%id%\">\n    %content%\n</script>"
  },
  {
    "path": "packages/browser-sync-ui/templates/plugin.item.tmpl",
    "content": "<switch toggle=\"ctrl.togglePlugin(ctrl.ui.named['%name%'])\"\n        switchid=\"plugin-switch-%index%\"\n        id=\"plugin-section-%index%\"\n        active=\"ctrl.ui.named['%name%'].active\"\n        prop=\"active\"\n        item=\"ctrl.ui.named['%name%']\">%content%</switch>"
  },
  {
    "path": "packages/browser-sync-ui/templates/plugin.tmpl",
    "content": "%markup%"
  },
  {
    "path": "packages/browser-sync-ui/test/.jshintrc",
    "content": "{\n    \"curly\": true,\n    \"eqeqeq\": true,\n    \"immed\": true,\n    \"latedef\": \"nofunc\",\n    \"newcap\": true,\n    \"noarg\": true,\n    \"laxbreak\": true,\n    \"sub\": true,\n    \"undef\": false,\n    \"unused\": false,\n    \"quotmark\": \"double\",\n    \"boss\": true,\n    \"eqnull\": true,\n    \"node\": true,\n    \"validthis\": true,\n    \"mocha\": true,\n    \"globals\": {\n        \"describe\" : false,\n        \"it\" : false,\n        \"expect\" : false,\n        \"runs\" : false,\n        \"waitsFor\" : false,\n        \"beforeEach\" : false,\n        \"afterEach\" : false,\n        \"before\" : false,\n        \"after\" : false,\n        \"sinon\" : false,\n        \"inject\" : false,\n        \"assert\" : false,\n        \"___browserSync___\" : false\n    }\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/bs-init.js",
    "content": "module.exports = function (ptor, config) {\n\n    var flow     = ptor.promise.controlFlow();\n    var deferred = ptor.promise.defer();\n\n    var bs       = require(\"browser-sync\").create(\"Test Instance\");\n\n    bs.use(require(\"../../../\"));\n\n    return flow.execute(function () {\n        bs.init(config, function (err, _bs) {\n            deferred.fulfill({\n                ui: _bs.ui,\n                bs: _bs\n            });\n        });\n\n        return deferred.promise;\n    });\n};"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/config.js",
    "content": "exports.config = {\n    seleniumAddress: \"http://localhost:4444/wd/hub\",\n    specs: [process.argv.slice(4, 5)[0].replace(\"test/client/e2e/\", \"\")]\n};"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/e2e.plugins.js",
    "content": "/**\n *\n * E2E tests for the plugins page\n *\n */\nvar assert = require(\"chai\").assert;\n\ndescribe('Plugins section', function() {\n\n    var expected, selector, menu, bsUrl;\n    var ptor = protractor.getInstance();\n    var url;\n\n    beforeEach(function () {\n        browser.ignoreSynchronization = true;\n        browser.get(\"/plugins\");\n        bsUrl     = process.env[\"BS_URL\"];\n    });\n    it(\"should list the form sync options\", function () {\n        expect(element.all(by.repeater(\"plugin in ui.plugins\")).count()).toBe(1);\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/e2e.server-info.js",
    "content": "/**\n *\n NONE Angular site\n browser.ignoreSynchronization = true;\n browser.get('http://localhost:8000/login.html');\n\n element(by.id('username')).sendKeys('Jane');\n element(by.id('password')).sendKeys('1234');\n element(by.id('clickme')).click();\n *\n */\n\ndescribe('Server Info section', function() {\n\n    var expected, selector, menu, bsUrl;\n    var ptor = protractor.getInstance();\n    var url;\n\n    beforeEach(function () {\n        browser.ignoreSynchronization = true;\n        browser.get(\"/\");\n        bsUrl     = process.env[\"BS_URL\"];\n        selector  = '(key, item) in ui.menu | orderObjectBy: \\'order\\'';\n    });\n\n    /**\n     * Look at the list of urls &\n     * 1. assert that the correct number are there\n     * 2. assert that the first one contains the `local` BrowserSync url\n     */\n    it(\"List items should contain the relevant information\", function () {\n\n        var elements = element.all(by.repeater(\"url in urls\"));\n\n        elements.count().then(function (count) {\n            expect(count).toEqual(1);\n        });\n\n        element(by.repeater(\"url in urls\").row(0)).getInnerHtml().then(function (out) {\n            expect(out.indexOf(bsUrl) > -1).toBeTruthy();\n        });\n    });\n    it(\"should render the icon\", function () {\n\n        var elements = element.all(by.css(\"[bs-callout] [bs-icon='computer_download']\"));\n\n        elements.count().then(function (count) {\n            expect(count).toEqual(1);\n        });\n    });\n    it(\"should have a link for opening new tab\", function () {\n\n        var elements = element.all(by.css(\"[bs-Content] a[title='Launch new tab here'\")).then(function (links) {\n            links[0].getAttribute(\"href\").then(function (out) {\n                expect(out.indexOf(bsUrl) > -1).toBeTruthy();\n            });\n            links[0].getAttribute(\"target\").then(function (out) {\n                expect(out).toEqual(\"_blank\");\n            });\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/e2e.sync-options.js",
    "content": "/**\n *\n * E2E tests for the sync-options plugin\n *\n */\ndescribe('Sync options section', function() {\n\n    var expected, selector, menu, bsUrl;\n    var ptor = protractor.getInstance();\n    var url;\n\n    beforeEach(function () {\n        browser.ignoreSynchronization = true;\n        browser.get(\"/sync-options\");\n        bsUrl     = process.env[\"BS_URL\"];\n    });\n\n    it(\"should list the sync options\", function () {\n\n        selector  = 'item in syncItems';\n\n        var elements = element.all(by.repeater(selector));\n\n        elements.count().then(function (count) {\n            expect(count).toEqual(2);\n        });\n    });\n    it(\"should list the switches in sync options\", function () {\n\n        selector  = 'item in syncItems';\n\n        var elements = element.all(by.repeater(selector));\n        var selector = '[bs-callout-content] [bs-text=\\\"lede\\\"]';\n\n        // Check the headings exist\n        elements.then(function (elems) {\n            getItemText(elems[0], selector, \"Clicks\");\n            getItemText(elems[1], selector, \"Scroll\");\n        });\n\n        //\n        elements.then(function (elems) {\n            expect(elems[0].element(by.css(\"#cmn-sync-0\")).isPresent()).toBe(true);\n            expect(elems[1].element(by.css(\"#cmn-sync-1\")).isPresent()).toBe(true);\n        });\n\n        function getItemText(elem, selector, expected) {\n            elem.element(by.css(selector)).then(function (item) {\n                expect(item.getText()).toEqual(expected);\n            });\n        }\n    });\n    it(\"should list the switches in sync options\", function () {\n\n        selector  = 'item in formItems';\n\n        var elements = element.all(by.repeater(selector));\n        var selector = '[bs-callout-content] [bs-text=\\\"lede\\\"]';\n\n        // Check the headings exist\n        elements.then(function (elems) {\n            getItemText(elems[0], selector, \"Submit\");\n            getItemText(elems[1], selector, \"Inputs\");\n            getItemText(elems[2], selector, \"Toggles\");\n        });\n\n\n        elements.then(function (elems) {\n            elems.forEach(function (elem, i) {\n                expect(elem.element(by.css(\"#cmn-form-\" + i)).isPresent()).toBe(true);\n            });\n        });\n\n        function getItemText(elem, selector, expected) {\n            elem.element(by.css(selector)).then(function (item) {\n                expect(item.getText()).toEqual(expected);\n            });\n        }\n    });\n    it(\"should list the form sync options\", function () {\n\n        selector  = 'item in formItems';\n\n        var elements = element.all(by.repeater(selector));\n\n        elements.count().then(function (count) {\n            expect(count).toEqual(3);\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/test-utils.js",
    "content": "module.exports = {\n    openWindow: function (browser, url) {\n        browser.executeScript(\"window.open('%s')\".replace(\"%s\", url));\n    }\n};"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/tests/history.js",
    "content": "/**\n *\n * E2E tests for the History plugin\n *\n */\nvar init   = require(\"./../bs-init\");\nvar utils  = require(\"./../test-utils\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"History section\", function() {\n\n    var bs;\n    var ui;\n    var bsUrl;\n    var cpUrl;\n\n    beforeEach(function () {\n        browser.ignoreSynchronization = true;\n        init(protractor, {\n            server: \"./test/fixtures\",\n            open:   false,\n            online: false,\n            logLevel: \"silent\"\n        }).then(function (out) {\n            bs    = out.bs;\n            ui    = out.ui;\n            bsUrl = bs.options.getIn([\"urls\", \"local\"]);\n            cpUrl = bs.options.getIn([\"urls\", \"ui\"]);\n        });\n    });\n\n    afterEach(function () {\n        bs.cleanup();\n    });\n\n    it(\"should list visited urls & delete them\", function () {\n\n        var elems   = element.all(by.repeater(\"url in ctrl.visited track by $index\"));\n\n        browser.get(cpUrl + \"/history\");\n\n        expect(elems.count()).toEqual(0);\n\n        utils.openWindow(browser, bsUrl);\n\n        browser.getAllWindowHandles().then(function (handles) {\n\n            var ui = handles[0];\n            var client = handles[1];\n            var urls = [\"/scrolling.html\", \"/forms.html\"];\n            var emptyContainer = \"#bs-history-empty\";\n            var listContainer  = \"#bs-history-list\";\n            var selector = by.css(listContainer + \" li > div > [bs-remove]\");\n            var deleteButtons = element.all(selector);\n\n            browser.sleep(500);\n            browser.switchTo().window(client);\n            browser.get(bsUrl + urls[0]);\n            browser.switchTo().window(ui);\n            browser.sleep(500);\n            expect(elems.count()).toEqual(2);\n            browser.switchTo().window(client);\n            browser.get(bsUrl + urls[1]);\n            browser.switchTo().window(ui);\n            browser.sleep(500);\n            expect(elems.count()).toEqual(3);\n            expect(element.all(by.css(emptyContainer)).count()).toBe(0);\n            deleteButtons.get(0).click();\n            browser.sleep(1000);\n            expect(elems.count()).toEqual(2);\n            deleteButtons.get(0).click();\n            browser.sleep(1000);\n            expect(elems.count()).toEqual(1);\n            deleteButtons.get(0).click();\n            browser.sleep(1000);\n            expect(elems.count()).toEqual(0);\n            expect(element.all(by.css(listContainer + \" li\")).count()).toBe(0);\n            expect(element.all(by.css(emptyContainer)).count()).toBe(1);\n\n            // Test the \"SYNC ALL\" buttons on each list item\n            browser.switchTo().window(client);\n            browser.get(bsUrl + urls[0]);\n            browser.get(bsUrl + urls[1]);\n            browser.get(bsUrl);\n            browser.sleep(1000);\n            browser.switchTo().window(ui);\n            expect(element.all(by.css(listContainer + \" li\")).count()).toBe(3);\n            element.all(by.css(listContainer + \" li > div > a\"))\n                .get(1)\n                .click();\n            browser.sleep(500);\n            browser.switchTo().window(client);\n\n            browser.getCurrentUrl().then(function (url) {\n                var match = url.match(new RegExp(bsUrl + \"\\\\/?\"));\n                assert.isTrue(match.length > 0);\n            });\n\n            // Test the \"clear all\" button\n            browser.switchTo().window(ui);\n            element.all(by.css('[bs-button-row] [bs-button~=\"inline\"]'))\n                .get(0)\n                .click();\n            browser.sleep(1000);\n            expect(elems.count()).toEqual(0);\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/tests/history.newtabs.js",
    "content": "/**\n *\n * E2E tests for the History plugin\n *\n */\nvar init   = require(\"./../bs-init\");\nvar utils  = require(\"./../test-utils\");\nvar assert = require(\"chai\").assert;\n\ndescribe(\"History section\", function() {\n\n    var bs;\n    var ui;\n    var bsUrl;\n    var cpUrl;\n\n    beforeEach(function () {\n        browser.ignoreSynchronization = true;\n        init(protractor, {\n            server: \"./test/fixtures\",\n            open:   false,\n            online: false,\n            logLevel: \"silent\"\n        }).then(function (out) {\n            bs    = out.bs;\n            ui    = out.ui;\n            bsUrl = bs.options.getIn([\"urls\", \"local\"]);\n            cpUrl = bs.options.getIn([\"urls\", \"ui\"]);\n        });\n    });\n\n    afterEach(function () {\n        bs.cleanup();\n    });\n\n    it(\"should list visited urls & delete them\", function () {\n\n        var elems   = element.all(by.repeater(\"url in ctrl.visited track by $index\"));\n\n        browser.get(cpUrl + \"/history\");\n\n        expect(elems.count()).toEqual(0);\n\n        utils.openWindow(browser, bsUrl);\n\n        browser.getAllWindowHandles().then(function (handles) {\n\n            var ui = handles[0];\n            var client = handles[1];\n            var urls = [\"/scrolling.html\", \"/forms.html\"];\n\n            browser.sleep(500);\n            browser.switchTo().window(client);\n            browser.get(bsUrl + urls[0]);\n            browser.switchTo().window(ui);\n            browser.sleep(500);\n            expect(elems.count()).toEqual(2);\n            var selector = '[href=\"%s/scrolling.html\"]'.replace('%s', bsUrl);\n            expect(elems.get(0).element(by.css(selector)).getText()).toBe('NEW TAB');\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/tests/home.js",
    "content": "/**\n *\n *\n */\n\nvar assert = require(\"chai\").assert;\nvar init  = require(\"./../bs-init\");\n\ndescribe(\"Section Navigation\", function() {\n\n    var selector, menu, headerSelector;\n\n    var bs;\n    var ui;\n    var bsUrl;\n    var cpUrl;\n\n    beforeEach(function () {\n\n        browser.ignoreSynchronization = true;\n        selector       = '(key, item) in app.ui.menu | orderObjectBy: \\'order\\'';\n        headerSelector = \"h1[bs-heading]\";\n\n        init(protractor, {\n            server: \"./test/fixtures\",\n            open:   false,\n            online: false,\n            logLevel: \"silent\"\n        }).then(function (out) {\n            bs    = out.bs;\n            ui    = out.ui;\n            bsUrl = bs.options.getIn([\"urls\", \"local\"]);\n            cpUrl = bs.options.getIn([\"urls\", \"ui\"]);\n        });\n    });\n\n    afterEach(function () {\n        bs.cleanup();\n    });\n\n    /**\n     *\n     * Check that the menu is rendered with the correct amount\n     * of links/sections\n     *\n     */\n    it(\"should render the correct amount of links\", function() {\n        browser.get(cpUrl);\n\n        var flow = protractor.promise.controlFlow();\n        var elems = element.all(by.css(\"[bs-section-nav] li\"));\n\n        flow.execute(function () {\n            expect(elems.get(0).getText()).toBe(\"Overview\");\n            expect(elems.get(1).getText()).toBe(\"Sync Options\");\n            expect(elems.get(2).getText()).toBe(\"History\");\n        });\n\n        flow.execute(function () {\n            elems.get(1).click();\n            expect(browser.getCurrentUrl()).toContain('sync-options');\n            elems.get(2).click();\n            expect(browser.getCurrentUrl()).toContain('history');\n            elems.get(3).click();\n            expect(browser.getCurrentUrl()).toContain('plugins');\n        });\n    });\n\n    it(\"should show the current Browsersync version in header\", function() {\n        browser.get(cpUrl);\n        expect(element(by.css('[bs-link=\"version\"]')).getText()).toBe('v' + bs.options.get('version'));\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/tests/network-throttle.auto.js",
    "content": "/**\n * Remote debug page\n */\nvar assert = require(\"chai\").assert;\nvar init  = require(\"./../bs-init\");\nvar utils  = require(\"./../test-utils\");\n\ndescribe(\"Network throttle page\", function() {\n\n    var bs;\n    var ui;\n    var bsUrl;\n    var cpUrl;\n\n    beforeEach(function () {\n\n        browser.ignoreSynchronization = true;\n\n        init(protractor, {\n            server: \"./test/fixtures\",\n            logLevel: \"silent\",\n            open:   false,\n            online: false\n        }).then(function (out) {\n            bs    = out.bs;\n            ui    = out.ui;\n            bsUrl = bs.options.getIn([\"urls\", \"local\"]);\n            cpUrl = bs.options.getIn([\"urls\", \"ui\"]);\n        });\n    });\n\n    afterEach(function () {\n        bs.cleanup();\n    });\n\n    it(\"Should allow servers to be created with auto port\", function() {\n\n        browser.get(cpUrl + \"/network-throttle\");\n        browser.sleep(1000);\n\n        var items = element.all(by.repeater(\"(key, item) in ctrl.throttle.targets | orderObjectBy:'order'\"));\n\n        expect(items.count()).toBe(6);\n\n        var createServerBtn = by.id(\"create-server\");\n\n        expect(element(createServerBtn).isPresent()).toBeTruthy();\n\n        element(createServerBtn).click();\n\n        browser.sleep(1000);\n\n        var flow     = protractor.promise.controlFlow();\n\n        flow.execute(function () {\n\n            var serverList = element(by.id(\"throttle-server-list\"));\n            var listItem   = serverList.all(by.tagName(\"li\"));\n\n            expect(listItem.count()).toBe(1);\n\n            listItem\n                .get(0)\n                .all(by.tagName(\"p\"))\n                .get(2)\n                .getText()\n                .then(utils.openWindow.bind(null, browser));\n\n            browser.sleep(1000);\n\n            browser.getAllWindowHandles().then(function (handles) {\n                var ui     = handles[0];\n                var client = handles[1];\n                browser.switchTo().window(client);\n                expect(element(by.id(\"__bs_script__\")).isPresent()).toBeTruthy();\n            });\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/tests/network-throttle.js",
    "content": "/**\n * Remote debug page\n */\nvar assert = require(\"chai\").assert;\nvar init  = require(\"./../bs-init\");\nvar utils  = require(\"./../test-utils\");\n\ndescribe(\"Network throttle page\", function() {\n\n    var bs;\n    var ui;\n    var bsUrl;\n    var cpUrl;\n\n    beforeEach(function () {\n\n        browser.ignoreSynchronization = true;\n\n        init(protractor, {\n            server: \"./test/fixtures\",\n            logLevel: \"silent\",\n            open:   false,\n            online: false\n        }).then(function (out) {\n            bs    = out.bs;\n            ui    = out.ui;\n            bsUrl = bs.options.getIn([\"urls\", \"local\"]);\n            cpUrl = bs.options.getIn([\"urls\", \"ui\"]);\n        });\n    });\n\n    afterEach(function () {\n        bs.cleanup();\n    });\n\n    it(\"Should allow servers to be created with auto port\", function() {\n\n        browser.get(cpUrl + \"/network-throttle\");\n        browser.sleep(1000);\n\n        var items = element.all(by.repeater(\"(key, item) in ctrl.throttle.targets | orderObjectBy:'order'\"));\n\n        expect(items.count()).toBe(6);\n\n        var createServerBtn = by.id(\"create-server\");\n\n        expect(element(createServerBtn).isPresent()).toBeTruthy();\n\n        element(createServerBtn).click();\n\n        browser.sleep(1000);\n\n        var flow     = protractor.promise.controlFlow();\n\n        flow.execute(function () {\n\n            var serverList = element(by.id(\"throttle-server-list\"));\n            var listItem   = serverList.all(by.tagName(\"li\"));\n\n            expect(listItem.count()).toBe(1);\n\n            listItem\n                .get(0)\n                .all(by.tagName(\"p\"))\n                .get(2)\n                .getText()\n                .then(utils.openWindow.bind(null, browser));\n\n            browser.sleep(1000);\n\n            browser.getAllWindowHandles().then(function (handles) {\n                var ui     = handles[0];\n                var client = handles[1];\n                browser.switchTo().window(client);\n                expect(element(by.id(\"__bs_script__\")).isPresent()).toBeTruthy();\n            });\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/tests/network-throttle.manual.js",
    "content": "/**\n * Remote debug page\n */\nvar assert = require(\"chai\").assert;\nvar init  = require(\"./../bs-init\");\nvar utils  = require(\"./../test-utils\");\n\ndescribe(\"Network throttle page\", function() {\n\n    var bs;\n    var ui;\n    var bsUrl;\n    var cpUrl;\n\n    beforeEach(function () {\n\n        browser.ignoreSynchronization = true;\n\n        init(protractor, {\n            server: \"./test/fixtures\",\n            logLevel: \"silent\",\n            open:   false,\n            online: false\n        }).then(function (out) {\n            bs    = out.bs;\n            ui    = out.ui;\n            bsUrl = bs.options.getIn([\"urls\", \"local\"]);\n            cpUrl = bs.options.getIn([\"urls\", \"ui\"]);\n        });\n    });\n\n    afterEach(function () {\n        bs.cleanup();\n    });\n\n    it(\"Should allow servers to be created with user-entered port\", function() {\n\n        browser.get(cpUrl + \"/network-throttle\");\n        browser.sleep(1000);\n        var testPort = 4003;\n\n        var createServerBtn = by.id(\"create-server\");\n        var portEntry = element(by.id(\"server-port\"));\n\n        portEntry.sendKeys(testPort);\n\n        element(createServerBtn).click();\n\n        browser.sleep(1000);\n\n        var flow     = protractor.promise.controlFlow();\n\n        flow.execute(function () {\n\n            var serverList = element(by.id(\"throttle-server-list\"));\n            var listItem   = serverList.all(by.tagName(\"li\"));\n\n            expect(listItem.count()).toBe(1);\n\n            listItem\n                .get(0)\n                .all(by.tagName(\"p\"))\n                .get(2)\n                .getText()\n                .then(function (url) {\n                    expect(url).toBe(\"http://localhost:\" + testPort);\n                    utils.openWindow(browser, url);\n                });\n\n            browser.sleep(1000);\n\n            browser.getAllWindowHandles().then(function (handles) {\n                var ui     = handles[0];\n                var client = handles[1];\n                browser.switchTo().window(client);\n                expect(element(by.id(\"__bs_script__\")).isPresent()).toBeTruthy();\n            });\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/tests/network-throttle.remove.js",
    "content": "/**\n * Remote debug page\n */\nvar assert = require(\"chai\").assert;\nvar init  = require(\"./../bs-init\");\nvar utils  = require(\"./../test-utils\");\n\ndescribe(\"Network throttle page\", function() {\n\n    var bs;\n    var ui;\n    var bsUrl;\n    var cpUrl;\n\n    beforeEach(function () {\n\n        browser.ignoreSynchronization = true;\n\n        init(protractor, {\n            server: \"./test/fixtures\",\n            logLevel: \"silent\",\n            open:   false,\n            online: false\n        }).then(function (out) {\n            bs    = out.bs;\n            ui    = out.ui;\n            bsUrl = bs.options.getIn([\"urls\", \"local\"]);\n            cpUrl = bs.options.getIn([\"urls\", \"ui\"]);\n        });\n    });\n\n    afterEach(function () {\n        bs.cleanup();\n    });\n\n    it(\"Should allow servers removed when bin icon clicked\", function() {\n\n        browser.get(cpUrl + \"/network-throttle\");\n\n        browser.sleep(1000);\n\n        var createServerBtn = by.id(\"create-server\");\n\n        element(createServerBtn).click();\n\n        browser.sleep(1000);\n\n        var flow     = protractor.promise.controlFlow();\n\n        var serverList = element(by.id(\"throttle-server-list\"));\n        var listItem   = serverList.all(by.tagName(\"li\"));\n        expect(listItem.count()).toBe(1);\n\n        listItem\n            .get(0)\n            .all(by.tagName(\"BUTTON\"))\n            .get(0)\n            .click();\n\n        expect(listItem.count()).toBe(0);\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/tests/plugins.inline.js",
    "content": "/**\n * Plugins page\n */\nvar assert = require(\"chai\").assert;\nvar path   = require(\"path\");\nvar init   = require(\"./../bs-init\");\nvar utils  = require(\"./../test-utils\");\n\ndescribe(\"Plugins page - with inline BrowserSync plugins\", function() {\n\n    var bs;\n    var ui;\n    var bsUrl;\n    var cpUrl;\n\n    beforeEach(function () {\n\n        browser.ignoreSynchronization = true;\n\n        var plugin = {\n            module: {\n                plugin: function () {\n\n                },\n                \"plugin:name\": \"Test Plugin\"\n            }\n        };\n\n        init(protractor, {\n            server: \"./test/fixtures\",\n            logLevel: \"silent\",\n            open:   false,\n            online: false,\n            plugins: [plugin]\n        }).then(function (out) {\n            bs    = out.bs;\n            ui    = out.ui;\n            bsUrl = bs.options.getIn([\"urls\", \"local\"]);\n            cpUrl = bs.options.getIn([\"urls\", \"ui\"]);\n        });\n    });\n\n    afterEach(function () {\n        bs.cleanup();\n    });\n\n    it(\"Should list registered plugins\", function() {\n\n        browser.get(cpUrl + \"/plugins\");\n        browser.sleep(500);\n\n        var switchElement = by.id('plugin-section-0');\n        var pluginSwitch  = element(by.id(\"plugin-switch-0\"));\n\n        expect(pluginSwitch.isPresent()).toBeTruthy();\n\n        /**\n         * Not auto-disabled on page load\n         */\n        element(switchElement).getAttribute('class').then(function (attr) {\n            assert.notInclude(attr, 'disabled');\n        });\n\n        /**\n         * Assert that BrowserSync reports this plugin as active\n         */\n        assert.isTrue(bs.getUserPlugins()[1].active);\n\n        /**\n         * De-activate by clicking the switch\n         */\n        element(by.css(\"label[for='plugin-switch-0']\"))\n            .click();\n\n        browser.sleep(500);\n\n        var flow     = protractor.promise.controlFlow();\n\n        /**\n         * Assert that BrowserSync reports this plugin as inactive\n         */\n        flow.execute(function () {\n            assert.isFalse(bs.getUserPlugins()[1].active);\n        });\n\n        /**\n         * Refresh and ensure the state is maintained\n         */\n        browser.get(cpUrl + \"/plugins\");\n        browser.sleep(500);\n\n        /**\n         * Assert that the class `disabled` is applied to the element for styling\n         */\n        expect(element(switchElement).getAttribute('class')).toMatch('disabled');\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/tests/plugins.js",
    "content": "/**\n * Plugins page\n */\nvar assert = require(\"chai\").assert;\nvar path   = require(\"path\");\nvar init   = require(\"./../bs-init\");\nvar utils  = require(\"./../test-utils\");\n\ndescribe(\"Plugins page\", function() {\n\n    var bs;\n    var ui;\n    var bsUrl;\n    var cpUrl;\n\n    beforeEach(function () {\n\n        browser.ignoreSynchronization = true;\n\n        var plugin = {\n            module: path.resolve(__dirname, \"../../../\", \"fixtures/plugin\")\n        };\n\n        init(protractor, {\n            server: \"./test/fixtures\",\n            logLevel: \"silent\",\n            open:   false,\n            online: false,\n            plugins: [plugin]\n        }).then(function (out) {\n            bs    = out.bs;\n            ui    = out.ui;\n            bsUrl = bs.options.getIn([\"urls\", \"local\"]);\n            cpUrl = bs.options.getIn([\"urls\", \"ui\"]);\n        });\n    });\n\n    afterEach(function () {\n        bs.cleanup();\n    });\n\n    it(\"Should list registered plugins\", function() {\n\n        browser.get(cpUrl + \"/plugins\");\n        browser.sleep(500);\n\n        var switchElement = by.id('plugin-section-0');\n        var pluginSwitch  = element(by.id(\"plugin-switch-0\"));\n\n        expect(pluginSwitch.isPresent()).toBeTruthy();\n\n        /**\n         * Not auto-disabled on page load\n         */\n        element(switchElement).getAttribute('class').then(function (attr) {\n            assert.notInclude(attr, 'disabled');\n        });\n\n        /**\n         * Assert that BrowserSync reports this plugin as active\n         */\n        assert.isTrue(bs.getUserPlugins()[1].active);\n\n        /**\n         * De-activate by clicking the switch\n         */\n        element(by.css(\"label[for='plugin-switch-0']\"))\n            .click();\n\n        browser.sleep(500);\n\n        var flow     = protractor.promise.controlFlow();\n\n        /**\n         * Assert that BrowserSync reports this plugin as inactive\n         */\n        flow.execute(function () {\n            assert.isFalse(bs.getUserPlugins()[1].active);\n        });\n\n        /**\n         * Refresh and ensure the state is maintained\n         */\n        browser.get(cpUrl + \"/plugins\");\n        browser.sleep(500);\n\n        /**\n         * Assert that the class `disabled` is applied to the element for styling\n         */\n        expect(element(switchElement).getAttribute('class')).toMatch('disabled');\n    });\n});\n"
  },
  {
    "path": "packages/browser-sync-ui/test/client/e2e/tests/remote-debug.js",
    "content": "/**\n * Remote debug page\n */\nvar assert = require(\"chai\").assert;\nvar init  = require(\"./../bs-init\");\nvar utils  = require(\"./../test-utils\");\n\ndescribe(\"Remote debug page\", function() {\n\n    var bs;\n    var ui;\n    var bsUrl;\n    var cpUrl;\n\n    beforeEach(function () {\n\n        browser.ignoreSynchronization = true;\n\n        init(protractor, {\n            server: \"./test/fixtures\",\n            logLevel: \"silent\",\n            open:   false,\n            online: false\n        }).then(function (out) {\n            bs    = out.bs;\n            ui    = out.ui;\n            bsUrl = bs.options.getIn([\"urls\", \"local\"]);\n            cpUrl = bs.options.getIn([\"urls\", \"ui\"]);\n        });\n    });\n\n    afterEach(function () {\n        bs.cleanup();\n    });\n\n    it(\"should allow elements to be added/removed from clients via the UI\", function() {\n\n        var id = ui.getOptionIn([\"clientFiles\", \"pesticide\", \"id\"]);\n\n        browser.get(cpUrl + \"/remote-debug\");\n        browser.sleep(1000);\n\n        var button = element.all(by.css(\"label[for='plugins-1']\"));\n\n        button.get(0).click();\n\n        utils.openWindow(browser, bsUrl);\n\n        browser.getAllWindowHandles().then(function (handles) {\n            var ui     = handles[0];\n            var client = handles[1];\n            browser.switchTo().window(client);\n            expect(element(by.id(id)).isPresent()).toBeTruthy();\n            browser.sleep(1000);\n            browser.switchTo().window(ui);\n            button.get(0).click();\n            browser.switchTo().window(client);\n            browser.sleep(1000);\n            expect(element(by.id(id)).isPresent()).toBeFalsy();\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/content.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n    <meta charset=\"UTF-8\">\n    <title></title>\n    <style type=\"text/css\">\n        .link {\n            color: red;\n        }\n    </style>\n</head>\n<body>\n\n<a href=\"index.html\">Homepage</a>\n<a href=\"scrolling.html\">Scrolling</a>\n\n<nav>\n    <ul>\n        <li><a href=\"#nowhere\" title=\"Lorum ipsum dolor sit amet\">Lorem</a></li>\n        <li><a href=\"#nowhere\" title=\"Aliquam tincidunt mauris eu risus\">Aliquam</a></li>\n        <li><a href=\"#nowhere\" title=\"Morbi in sem quis dui placerat ornare\">Morbi</a></li>\n        <li><a href=\"#nowhere\" title=\"Praesent dapibus, neque id cursus faucibus\">Praesent</a></li>\n        <li><a href=\"#nowhere\" title=\"Pellentesque fermentum dolor\">Pellentesque</a></li>\n    </ul>\n</nav>\n\n<h1>HTML Ipsum Presents</h1>\n\n<p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. <em>Aenean ultricies mi vitae est.</em> Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, <code>commodo vitae</code>, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. <a href=\"#\">Donec non enim</a> in turpis pulvinar facilisis. Ut felis.</p>\n\n<h2>Header Level 2</h2>\n\n<ol>\n    <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li>\n    <li>Aliquam tincidunt mauris eu risus.</li>\n</ol>\n\n<blockquote><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est.</p></blockquote>\n\n<h3>Header Level 3</h3>\n\n<ul>\n    <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li>\n    <li>Aliquam tincidunt mauris eu risus.</li>\n</ul>\n\n<pre><code>\n    #header h1 a {\n        display: block;\n        width: 300px;\n        height: 80px;\n    }\n</code></pre>\n\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/css/blog.css",
    "content": "/*\n * Globals\n */\n\nbody {\n  font-family: Georgia, \"Times New Roman\", Times, serif;\n  color: #555;\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3,\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: 0;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: normal;\n  color: #333;\n}\n\n\n/*\n * Override Bootstrap's default container.\n */\n\n@media (min-width: 1200px) {\n  .container {\n    width: 970px;\n  }\n}\n\n\n/*\n * Masthead for nav\n */\n\n.blog-masthead {\n  background-color: #428bca;\n  -webkit-box-shadow: inset 0 -2px 5px rgba(0,0,0,.1);\n          box-shadow: inset 0 -2px 5px rgba(0,0,0,.1);\n}\n\n/* Nav links */\n.blog-nav-item {\n  position: relative;\n  display: inline-block;\n  padding: 5px;\n  font-weight: 500;\n  color: #cdddeb;\n}\n.blog-nav-item:hover,\n.blog-nav-item:focus {\n  color: #fff;\n  text-decoration: none;\n}\n\n/* Active state gets a caret at the bottom */\n.blog-nav .active {\n  color: #fff;\n}\n.blog-nav .active:after {\n  position: absolute;\n  bottom: 0;\n  left: 50%;\n  width: 0;\n  height: 0;\n  margin-left: -5px;\n  vertical-align: middle;\n  content: \" \";\n  border-right: 5px solid transparent;\n  border-bottom: 5px solid;\n  border-left: 5px solid transparent;\n}\n\n\n/*\n * Blog name and description\n */\n\n.blog-header {\n  padding-top: 20px;\n  padding-bottom: 20px;\n}\n.blog-title {\n  margin-top: 30px;\n  margin-bottom: 0;\n  font-size: 60px;\n  font-weight: normal;\n}\n.blog-description {\n  font-size: 20px;\n  color: #999;\n}\n\n\n/*\n * Main column and sidebar layout\n */\n\n.blog-main {\n  font-size: 18px;\n  line-height: 1.5;\n}\n\n/* Sidebar modules for boxing content */\n.sidebar-module {\n  padding: 15px;\n  margin: 0 -15px 15px;\n}\n.sidebar-module-inset {\n  padding: 15px;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.sidebar-module-inset p:last-child,\n.sidebar-module-inset ul:last-child,\n.sidebar-module-inset ol:last-child {\n  margin-bottom: 0;\n}\n\n\n/* Pagination */\n.pager {\n  margin-bottom: 60px;\n  text-align: left;\n}\n.pager > li > a {\n  width: 140px;\n  padding: 10px 20px;\n  text-align: center;\n  border-radius: 30px;\n}\n\n\n/*\n * Blog posts\n */\n\n.blog-post {\n  margin-bottom: 60px;\n}\n.blog-post-title {\n  margin-bottom: 5px;\n  font-size: 40px;\n}\n.blog-post-meta {\n  margin-bottom: 20px;\n  color: #999;\n}\n\n\n/*\n * Footer\n */\n\n.blog-footer {\n  padding: 40px 0;\n  color: #999;\n  text-align: center;\n  background-color: #f9f9f9;\n  border-top: 1px solid #e5e5e5;\n}\n.blog-footer p:last-child {\n  margin-bottom: 0;\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.2.0 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*! normalize.css v3.0.1 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\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: 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  margin: .67em 0;\n  font-size: 2em;\n}\nmark {\n  color: #000;\n  background: #ff0;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -.5em;\n}\nsub {\n  bottom: -.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  height: 0;\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\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  margin: 0;\n  font: inherit;\n  color: inherit;\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  padding: 0;\n  border: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\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-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  padding: .35em .625em .75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\nlegend {\n  padding: 0;\n  border: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\ntd,\nth {\n  padding: 0;\n}\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    -webkit-box-shadow: none !important;\n            box-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^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n\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  .table td,\n  .table th {\n    background-color: #fff !important;\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-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n\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\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  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* {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333;\n  background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #428bca;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #2a6496;\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  width: 100% \\9;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\n  width: 100% \\9;\n  max-width: 100%;\n  height: auto;\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all .2s ease-in-out;\n       -o-transition: all .2s ease-in-out;\n          transition: all .2s ease-in-out;\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 #eee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\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: #777;\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}\ncite {\n  font-style: normal;\n}\nmark,\n.mark {\n  padding: .2em;\n  background-color: #fcf8e3;\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: #777;\n}\n.text-primary {\n  color: #428bca;\n}\na.text-primary:hover {\n  color: #3071a9;\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: #428bca;\n}\na.bg-primary:hover {\n  background-color: #3071a9;\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 #eee;\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  margin-left: -5px;\n  list-style: none;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 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    overflow: hidden;\n    clear: left;\n    text-align: right;\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 #777;\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 #eee;\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: #777;\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  text-align: right;\n  border-right: 5px solid #eee;\n  border-left: 0;\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}\nblockquote:before,\nblockquote:after {\n  content: \"\";\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: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  -webkit-box-shadow: none;\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  color: #333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\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  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\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  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.row {\n  margin-right: -15px;\n  margin-left: -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-right: 15px;\n  padding-left: 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}\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 #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\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 #ddd;\n}\n.table .table {\n  background-color: #fff;\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 #ddd;\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 #ddd;\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) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  display: table-cell;\n  float: none;\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@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: auto;\n    overflow-y: hidden;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\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  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 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: #333;\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  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\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: #555;\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: #555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\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  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n  color: #777;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #777;\n}\n.form-control::-webkit-input-placeholder {\n  color: #777;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eee;\n  opacity: 1;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  line-height: 34px;\n  line-height: 1.42857143 \\0;\n}\ninput[type=\"date\"].input-sm,\ninput[type=\"time\"].input-sm,\ninput[type=\"datetime-local\"].input-sm,\ninput[type=\"month\"].input-sm {\n  line-height: 30px;\n}\ninput[type=\"date\"].input-lg,\ninput[type=\"time\"].input-lg,\ninput[type=\"datetime-local\"].input-lg,\ninput[type=\"month\"].input-lg {\n  line-height: 46px;\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  min-height: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\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-top: 4px \\9;\n  margin-left: -20px;\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  font-weight: normal;\n  vertical-align: middle;\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-right: 0;\n  padding-left: 0;\n}\n.input-sm,\n.form-horizontal .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 {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n  height: auto;\n}\n.input-lg,\n.form-horizontal .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 {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\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: 25px;\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}\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  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\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  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\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  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\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 .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  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    padding-top: 7px;\n    margin-bottom: 0;\n    text-align: right;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  top: 0;\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  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\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  color: #333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  opacity: .65;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333;\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: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: #fff;\n  border-color: #ccc;\n}\n.btn-default .badge {\n  color: #fff;\n  background-color: #333;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #3071a9;\n  border-color: #285e8e;\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: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: #428bca;\n  border-color: #357ebd;\n}\n.btn-primary .badge {\n  color: #428bca;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #fff;\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: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: #fff;\n}\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #fff;\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: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: #fff;\n}\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #fff;\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: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: #fff;\n}\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #fff;\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: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: #fff;\n}\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\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: #2a6496;\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: #777;\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  -webkit-transition: opacity .15s linear;\n       -o-transition: opacity .15s linear;\n          transition: opacity .15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n}\n.collapse.in {\n  display: block;\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  -webkit-transition: height .35s ease;\n       -o-transition: height .35s ease;\n          transition: height .35s 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  font-size: 14px;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\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: #333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #428bca;\n  outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 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  content: \"\";\n  border-top: 0;\n  border-bottom: 4px solid;\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    right: 0;\n    left: auto;\n  }\n  .navbar-right .dropdown-menu-left {\n    right: auto;\n    left: 0;\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:focus,\n.btn-group-vertical > .btn:focus {\n  outline: 0;\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-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-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-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-top-left-radius: 0;\n  border-bottom-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-right: 8px;\n  padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\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-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\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-left-radius: 0;\n  border-top-right-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  display: table-cell;\n  float: none;\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 > input[type=\"checkbox\"] {\n  position: absolute;\n  z-index: -1;\n  filter: alpha(opacity=0);\n  opacity: 0;\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-right: 0;\n  padding-left: 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: #555;\n  text-align: center;\n  background-color: #eee;\n  border: 1px solid #ccc;\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-top-right-radius: 0;\n  border-bottom-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-top-left-radius: 0;\n  border-bottom-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  padding-left: 0;\n  margin-bottom: 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: #eee;\n}\n.nav > li.disabled > a {\n  color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eee;\n  border-color: #428bca;\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 #ddd;\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: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555;\n  cursor: default;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\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  margin-bottom: 5px;\n  text-align: center;\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 #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\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: #fff;\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: #fff;\n  background-color: #428bca;\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  margin-bottom: 5px;\n  text-align: center;\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 #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\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: #fff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-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  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  -webkit-overflow-scrolling: touch;\n  border-top: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\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    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !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-right: 0;\n    padding-left: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-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  -webkit-transform: translate3d(0, 0, 0);\n       -o-transform: translate3d(0, 0, 0);\n          transform: translate3d(0, 0, 0);\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  height: 50px;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\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  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\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    -webkit-box-shadow: none;\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  .navbar-nav.navbar-right:last-child {\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  }\n}\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\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 .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}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-form.navbar-right:last-child {\n    margin-right: -15px;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\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-right: 15px;\n    margin-left: 15px;\n  }\n  .navbar-text.navbar-right:last-child {\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: #777;\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: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333;\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: #555;\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: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\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  color: #555;\n  background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777;\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: #333;\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: #555;\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: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333;\n}\n.navbar-default .btn-link {\n  color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333;\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: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #777;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #777;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #fff;\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: #fff;\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: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #fff;\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  color: #fff;\n  background-color: #080808;\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: #777;\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: #fff;\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: #fff;\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: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #777;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.navbar-inverse .btn-link {\n  color: #777;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #fff;\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: #444;\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  padding: 0 5px;\n  color: #ccc;\n  content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n  color: #777;\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  margin-left: -1px;\n  line-height: 1.42857143;\n  color: #428bca;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-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: #2a6496;\n  background-color: #eee;\n  border-color: #ddd;\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: #fff;\n  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\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: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n  border-color: #ddd;\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-top-left-radius: 6px;\n  border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-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-top-left-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\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: #fff;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\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: #777;\n  cursor: not-allowed;\n  background-color: #fff;\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: #fff;\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: #fff;\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: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #428bca;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\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  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #777;\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: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #fff;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eee;\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  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 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: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all .2s ease-in-out;\n       -o-transition: all .2s ease-in-out;\n          transition: all .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-right: auto;\n  margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #428bca;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333;\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  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\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@-o-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  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n          box-shadow: inset 0 1px 2px rgba(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: #fff;\n  text-align: center;\n  background-color: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n  -webkit-transition: width .6s ease;\n       -o-transition: width .6s ease;\n          transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  -webkit-background-size: 40px 40px;\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       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar[aria-valuenow=\"1\"],\n.progress-bar[aria-valuenow=\"2\"] {\n  min-width: 30px;\n}\n.progress-bar[aria-valuenow=\"0\"] {\n  min-width: 30px;\n  color: #777;\n  background-color: transparent;\n  background-image: none;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-object {\n  display: block;\n}\n.media-heading {\n  margin: 0 0 5px;\n}\n.media > .pull-left {\n  margin-right: 10px;\n}\n.media > .pull-right {\n  margin-left: 10px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-left-radius: 4px;\n  border-top-right-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}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\na.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  color: #555;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  color: #777;\n  background-color: #eee;\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: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #428bca;\n  border-color: #428bca;\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: #e1edf7;\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: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 1px rgba(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-left-radius: 3px;\n  border-top-right-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 #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group {\n  margin-bottom: 0;\n}\n.panel > .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  border-top: 0;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .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:first-child,\n.panel > .table-responsive:first-child > .table: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 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  border-top: 1px solid #ddd;\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  margin-bottom: 0;\n  border: 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  border-top: 1px solid #ddd;\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 #ddd;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #428bca;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #428bca;\n}\n.panel-primary > .panel-heading .badge {\n  color: #428bca;\n  background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #428bca;\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  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 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  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(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: #000;\n  text-shadow: 0 1px 0 #fff;\n  filter: alpha(opacity=20);\n  opacity: .2;\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\nbutton.close {\n  -webkit-appearance: none;\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  overflow: hidden;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transition: -webkit-transform .3s ease-out;\n       -o-transition:      -o-transform .3s ease-out;\n          transition:         transform .3s ease-out;\n  -webkit-transform: translate3d(0, -25%, 0);\n       -o-transform: translate3d(0, -25%, 0);\n          transform: translate3d(0, -25%, 0);\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate3d(0, 0, 0);\n       -o-transform: translate3d(0, 0, 0);\n          transform: translate3d(0, 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: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  outline: 0;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.modal-backdrop.in {\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.modal-header {\n  min-height: 16.42857143px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\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-bottom: 0;\n  margin-left: 5px;\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    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n            box-shadow: 0 5px 15px rgba(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  font-size: 12px;\n  line-height: 1.4;\n  visibility: visible;\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.tooltip.in {\n  filter: alpha(opacity=90);\n  opacity: .9;\n}\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000;\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: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\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: #000;\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: #000;\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: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\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  text-align: left;\n  white-space: normal;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\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  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\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  content: \"\";\n  border-width: 10px;\n}\n.popover.top > .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, .25);\n  border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-color: #fff;\n  border-bottom-width: 0;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, .25);\n  border-left-width: 0;\n}\n.popover.right > .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  content: \" \";\n  border-right-color: #fff;\n  border-left-width: 0;\n}\n.popover.bottom > .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-width: 0;\n  border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  content: \" \";\n  border-right-width: 0;\n  border-left-color: #fff;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: .6s ease-in-out left;\n       -o-transition: .6s ease-in-out left;\n          transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\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  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #fff;\n  text-decoration: none;\n  filter: alpha(opacity=90);\n  outline: 0;\n  opacity: .9;\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  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #fff;\n  border-radius: 10px;\n}\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(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    right: 20%;\n    left: 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  display: table;\n  content: \" \";\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-right: auto;\n  margin-left: 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  -webkit-transform: translate3d(0, 0, 0);\n       -o-transform: translate3d(0, 0, 0);\n          transform: translate3d(0, 0, 0);\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/*# sourceMappingURL=bootstrap.css.map */\n"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/forms.html",
    "content": "\n<!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    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <title>Narrow Jumbotron Template for Bootstrap</title>\n    <!-- Bootstrap core CSS -->\n    <link href=\"//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css\" rel=\"stylesheet\">\n</head>\n\n<body>\n\n<input type=\"text\" value=\"nope\" />\n\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/index.html",
    "content": "\n<!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    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"icon\" href=\"\">\n\n    <title>Blog Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"css/blog.css\" rel=\"stylesheet\">\n\n</head>\n\n<body>\n\n<div class=\"blog-masthead\">\n    <div class=\"container\">\n        <nav class=\"blog-nav\">\n            <a class=\"blog-nav-item active\" href=\"#\">Home</a>\n            <a class=\"blog-nav-item\" href=\"#\">New features</a>\n            <a class=\"blog-nav-item\" href=\"#\">Press</a>\n            <a class=\"blog-nav-item\" href=\"#\">New hires</a>\n            <a class=\"blog-nav-item\" href=\"#\">About</a>\n        </nav>\n    </div>\n</div>\n\n<div class=\"container\">\n\n    <div class=\"blog-header\">\n        <h1 class=\"blog-title\">The Bootstrap Blog</h1>\n        <p class=\"lead blog-description\">The official example template of creating a blog with Bootstrap.</p>\n    </div>\n\n    <div class=\"row\">\n\n        <div class=\"col-sm-8 blog-main\">\n\n            <div class=\"blog-post\">\n                <h2 class=\"blog-post-title\">Sample blog post</h2>\n                <p class=\"blog-post-meta\">January 1, 2014 by <a href=\"#\">Mark</a></p>\n\n                <p>This blog post shows a few different types of content that's supported and styled with Bootstrap. Basic typography, images, and code are all supported.</p>\n                <hr>\n                <p>Cum sociis natoque penatibus et magnis <a href=\"#\">dis parturient montes</a>, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Cras mattis consectetur purus sit amet fermentum.</p>\n                <blockquote>\n                    <p>Curabitur blandit tempus porttitor. <strong>Nullam quis risus eget urna mollis</strong> ornare vel eu leo. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>\n                </blockquote>\n                <p>Etiam porta <em>sem malesuada magna</em> mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.</p>\n                <h2>Heading</h2>\n                <p>Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>\n                <h3>Sub-heading</h3>\n                <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n                <pre><code>Example code block</code></pre>\n                <p>Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa.</p>\n                <h3>Sub-heading</h3>\n                <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>\n                <ul>\n                    <li>Praesent commodo cursus magna, vel scelerisque nisl consectetur et.</li>\n                    <li>Donec id elit non mi porta gravida at eget metus.</li>\n                    <li>Nulla vitae elit libero, a pharetra augue.</li>\n                </ul>\n                <p>Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue.</p>\n                <ol>\n                    <li>Vestibulum id ligula porta felis euismod semper.</li>\n                    <li>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</li>\n                    <li>Maecenas sed diam eget risus varius blandit sit amet non magna.</li>\n                </ol>\n                <p>Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis.</p>\n            </div><!-- /.blog-post -->\n\n            <div class=\"blog-post\">\n                <h2 class=\"blog-post-title\">Another blog post</h2>\n                <p class=\"blog-post-meta\">December 23, 2013 by <a href=\"#\">Jacob</a></p>\n\n                <p>Cum sociis natoque penatibus et magnis <a href=\"#\">dis parturient montes</a>, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Cras mattis consectetur purus sit amet fermentum.</p>\n                <blockquote>\n                    <p>Curabitur blandit tempus porttitor. <strong>Nullam quis risus eget urna mollis</strong> ornare vel eu leo. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>\n                </blockquote>\n                <p>Etiam porta <em>sem malesuada magna</em> mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.</p>\n                <p>Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>\n            </div><!-- /.blog-post -->\n\n            <div class=\"blog-post\">\n                <h2 class=\"blog-post-title\">New feature</h2>\n                <p class=\"blog-post-meta\">December 14, 2013 by <a href=\"#\">Chris</a></p>\n\n                <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>\n                <ul>\n                    <li>Praesent commodo cursus magna, vel scelerisque nisl consectetur et.</li>\n                    <li>Donec id elit non mi porta gravida at eget metus.</li>\n                    <li>Nulla vitae elit libero, a pharetra augue.</li>\n                </ul>\n                <p>Etiam porta <em>sem malesuada magna</em> mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.</p>\n                <p>Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue.</p>\n            </div><!-- /.blog-post -->\n\n            <nav>\n                <ul class=\"pager\">\n                    <li><a href=\"#\">Previous</a></li>\n                    <li><a href=\"#\">Next</a></li>\n                </ul>\n            </nav>\n\n        </div><!-- /.blog-main -->\n\n        <div class=\"col-sm-3 col-sm-offset-1 blog-sidebar\">\n            <div class=\"sidebar-module sidebar-module-inset\">\n                <h4>About</h4>\n                <p>Etiam porta <em>sem malesuada magna</em> mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.</p>\n            </div>\n            <div class=\"sidebar-module\">\n                <h4>Archives</h4>\n                <ol class=\"list-unstyled\">\n                    <li><a href=\"#\">March 2014</a></li>\n                    <li><a href=\"#\">February 2014</a></li>\n                    <li><a href=\"#\">January 2014</a></li>\n                    <li><a href=\"#\">December 2013</a></li>\n                    <li><a href=\"#\">November 2013</a></li>\n                    <li><a href=\"#\">October 2013</a></li>\n                    <li><a href=\"#\">September 2013</a></li>\n                    <li><a href=\"#\">August 2013</a></li>\n                    <li><a href=\"#\">July 2013</a></li>\n                    <li><a href=\"#\">June 2013</a></li>\n                    <li><a href=\"#\">May 2013</a></li>\n                    <li><a href=\"#\">April 2013</a></li>\n                </ol>\n            </div>\n            <div class=\"sidebar-module\">\n                <h4>Elsewhere</h4>\n                <ol class=\"list-unstyled\">\n                    <li><a href=\"#\">GitHub</a></li>\n                    <li><a href=\"#\">Twitter</a></li>\n                    <li><a href=\"#\">Facebook</a></li>\n                </ol>\n            </div>\n        </div><!-- /.blog-sidebar -->\n\n    </div><!-- /.row -->\n\n</div><!-- /.container -->\n\n<footer class=\"blog-footer\">\n    <p>Blog template built for <a href=\"http://getbootstrap.com\">Bootstrap</a> by <a href=\"https://twitter.com/mdo\">@mdo</a>.</p>\n    <p>\n        <a href=\"#\">Back to top</a>\n    </p>\n</footer>\n\n</body>\n</html>\n"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/plugin/index.plugin.js",
    "content": "const PLUGIN_NAME = \"Test BS Plugin\";\n\nmodule.exports = {\n    \"plugin:name\": PLUGIN_NAME,\n    \"plugin\": function (opts, bs) {\n        var logger = bs.getLogger(PLUGIN_NAME);\n        bs.events.on(\"plugins:configure\", function (data) {\n            if (data.name === PLUGIN_NAME) {\n                //console.log(data);\n            }\n        });\n    }\n};"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/plugin/package.json",
    "content": "{\n  \"name\": \"bs-test-plugin\",\n  \"version\": \"1.5.2\",\n  \"description\": \"Fixture plugin\",\n  \"main\": \"index.plugin.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/shakyshane/test-plugin.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/shakyshane/test-plugin/issues\"\n  },\n  \"scripts\": {\n    \"test\": \"mocha --reporter spec\"\n  },\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"browser-sync\": \"^2.3.1\",\n    \"chai\": \"^1.9.1\",\n    \"mocha\": \"^1.21.4\",\n    \"multiline\": \"^0.3.4\",\n    \"socket.io-client\": \"^1.1.0\"\n  },\n  \"dependencies\": {\n    \"dom-compare-temp\": \"^0.1.0\",\n    \"jsdom\": \"^3.1.2\",\n    \"lodash\": \"^2.4.1\",\n    \"opt-merger\": \"^0.2.1\",\n    \"debug\": \"^2.1.3\",\n    \"request\": \"^2.40.0\"\n  },\n  \"keywords\": [\n    \"browser sync plugin\",\n    \"html injection\"\n  ],\n  \"browser-sync:ui\": {\n    \"hooks\": {\n      \"markup\": \"ui/test.html\",\n      \"templates\": [\"ui/test.directive.html\"],\n      \"client:js\": [\"ui/client.js\"]\n    }\n  }\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/plugin/ui/client.js",
    "content": "(function (angular) {\n\n    const PLUGIN_NAME = \"Test Plugin\";\n\n    angular\n        .module(\"BrowserSync\")\n        .directive(\"testPlugin\", function () {\n            return {\n                restrict: \"E\",\n                replace: true,\n                scope: {\n                    \"options\": \"=\"\n                },\n                templateUrl: \"test.directive.html\",\n                controller: [\"$scope\", \"Socket\", function ($scope, Socket) {\n                    var ctrl = this;\n                    ctrl.removeRestriction = function (selector) {\n                        Socket.uiEvent({\n                            namespace: PLUGIN_NAME,\n                            event: \"remove\",\n                            data: selector\n                        });\n                    };\n                }],\n                controllerAs: \"ctrl\"\n            };\n        });\n\n})(angular);\n\n"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/plugin/ui/test.directive.html",
    "content": "<section>\n    <h1>Test markup from Test Directive</h1>\n</section>"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/plugin/ui/test.html",
    "content": "<test-plugin options='ctrl.options'></test-plugin>"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/plugin-multi-templates/index.plugin.js",
    "content": "const PLUGIN_NAME = \"Test BS Plugin\";\n\nmodule.exports = {\n    \"plugin:name\": PLUGIN_NAME,\n    \"plugin\": function (opts, bs) {\n        var logger = bs.getLogger(PLUGIN_NAME);\n        bs.events.on(\"plugins:configure\", function (data) {\n            if (data.name === PLUGIN_NAME) {\n                //console.log(data);\n            }\n        });\n    }\n};"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/plugin-multi-templates/package.json",
    "content": "{\n  \"name\": \"bs-test-plugin\",\n  \"version\": \"1.5.2\",\n  \"description\": \"Fixture plugin\",\n  \"main\": \"index.plugin.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/shakyshane/test-plugin.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/shakyshane/test-plugin/issues\"\n  },\n  \"scripts\": {\n    \"test\": \"mocha --reporter spec\"\n  },\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"browser-sync\": \"^2.3.1\",\n    \"chai\": \"^1.9.1\",\n    \"mocha\": \"^1.21.4\",\n    \"multiline\": \"^0.3.4\",\n    \"socket.io-client\": \"^1.1.0\"\n  },\n  \"dependencies\": {\n    \"dom-compare-temp\": \"^0.1.0\",\n    \"jsdom\": \"^3.1.2\",\n    \"lodash\": \"^2.4.1\",\n    \"opt-merger\": \"^0.2.1\",\n    \"debug\": \"^2.1.3\",\n    \"request\": \"^2.40.0\"\n  },\n  \"keywords\": [\n    \"browser sync plugin\",\n    \"html injection\"\n  ],\n  \"browser-sync:ui\": {\n    \"hooks\": {\n      \"markup\": \"ui/test.html\",\n      \"templates\": [\n        \"ui/test.directive.html\",\n        \"ui/test.list.html\"\n      ],\n      \"client:js\": [\n        \"ui/client.js\",\n        \"ui/client2.js\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/plugin-multi-templates/ui/client.js",
    "content": "(function (angular) {\n\n    const PLUGIN_NAME = \"Test Plugin\";\n\n    angular\n        .module(\"BrowserSync\")\n        .directive(\"testPlugin\", function () {\n            return {\n                restrict: \"E\",\n                replace: true,\n                scope: {\n                    \"options\": \"=\"\n                },\n                templateUrl: \"test.directive.html\",\n                controller: [\"$scope\", \"Socket\", function ($scope, Socket) {\n                    var ctrl = this;\n                    ctrl.removeRestriction = function (selector) {\n                        Socket.uiEvent({\n                            namespace: PLUGIN_NAME,\n                            event: \"remove\",\n                            data: selector\n                        });\n                    };\n                }],\n                controllerAs: \"ctrl\"\n            };\n        });\n\n})(angular);\n\n"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/plugin-multi-templates/ui/client2.js",
    "content": "(function (angular) {\n\n    const PLUGIN_NAME = \"Test Plugin file 2\";\n\n    angular\n        .module(\"BrowserSync\")\n        .directive(\"testPlugin\", function () {\n            return {\n                restrict: \"E\",\n                replace: true,\n                scope: {\n                    \"options\": \"=\"\n                },\n                templateUrl: \"test.list.html\",\n                controller: [\"$scope\", \"Socket\", function ($scope, Socket) {\n                    var ctrl = this;\n                    ctrl.removeRestriction = function (selector) {\n                        Socket.uiEvent({\n                            namespace: PLUGIN_NAME,\n                            event: \"remove\",\n                            data: selector\n                        });\n                    };\n                }],\n                controllerAs: \"ctrl\"\n            };\n        });\n\n})(angular);\n\n"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/plugin-multi-templates/ui/test.directive.html",
    "content": "<section>\n    <h1>Test markup from Test Directive</h1>\n</section>"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/plugin-multi-templates/ui/test.html",
    "content": "<test-plugin options='ctrl.options'></test-plugin>"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/plugin-multi-templates/ui/test.list.html",
    "content": "<section>\n    <h1>Test markup from Test LIST Directive</h1>\n</section>"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/plugin-noui/index.plugin.js",
    "content": "module.exports = {\n    \"plugin:name\": \"Test BS Plugin 2\",\n    \"plugin\": function () {\n        console.log(\"Sup From the test plugin\");\n    }\n};"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/plugin-noui/package.json",
    "content": "{\n  \"name\": \"bs-test2-plugin\",\n  \"version\": \"1.5.2\",\n  \"description\": \"Fixture plugin\",\n  \"main\": \"index.plugin.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/shakyshane/test-plugin.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/shakyshane/test-plugin/issues\"\n  },\n  \"scripts\": {\n    \"test\": \"mocha --reporter spec\"\n  },\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"browser-sync\": \"^2.3.1\",\n    \"chai\": \"^1.9.1\",\n    \"mocha\": \"^1.21.4\",\n    \"multiline\": \"^0.3.4\",\n    \"socket.io-client\": \"^1.1.0\"\n  },\n  \"dependencies\": {\n    \"dom-compare-temp\": \"^0.1.0\",\n    \"jsdom\": \"^3.1.2\",\n    \"lodash\": \"^2.4.1\",\n    \"opt-merger\": \"^0.2.1\",\n    \"debug\": \"^2.1.3\",\n    \"request\": \"^2.40.0\"\n  },\n  \"keywords\": [\n    \"browser sync plugin\",\n    \"html injection\"\n  ]\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/test/fixtures/scrolling.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n    <meta charset=\"UTF-8\">\n    <title></title>\n</head>\n<body>\n\n<a href=\"index.html\">Homepage</a>\n\n<a href=\"content.html\">Content</a>\n\n<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi architecto at blanditiis debitis delectus deleniti eos ex expedita, explicabo id incidunt officia officiis quaerat, reiciendis repudiandae sapiente soluta tenetur ut.</p>\n\n<p>Asperiores aspernatur aut autem deleniti, distinctio dolorem ducimus earum eos et eveniet ex laudantium maiores modi mollitia nesciunt nisi odit perspiciatis placeat quae quasi qui quo rerum sapiente suscipit voluptatibus.</p>\n\n<p>Animi aperiam debitis dolore doloribus eaque eveniet, fugit harum iusto molestiae nam nobis odit quas quibusdam repellendus, repudiandae temporibus unde? Atque eius eos eveniet facilis ipsum magnam maiores molestiae quia.</p>\n\n<p>Assumenda et ex nostrum officia repellendus, sapiente. Ad commodi consequatur culpa deleniti dolorum eaque est excepturi exercitationem facere harum ipsum libero, minima nemo neque non quae quas sapiente sed suscipit.</p>\n\n<p>Animi cum distinctio iure optio! Amet assumenda doloremque doloribus dolorum eius hic illum iusto magni nesciunt nobis praesentium quae quam, qui, quo sunt suscipit tempora tenetur vel veniam voluptas, voluptatibus.</p>\n\n<p>Deserunt dolore, explicabo illo labore maxime numquam ratione ullam voluptate. Adipisci aliquid asperiores aspernatur atque, aut consequatur doloremque enim eveniet fugiat magnam minima nam, non quod reiciendis, reprehenderit ullam voluptatem.</p>\n\n<p>A alias aliquid animi asperiores atque cupiditate doloribus, eaque fugit harum itaque sed veniam. Amet autem cum doloribus enim odit quasi, quod. Aliquam aspernatur error eum exercitationem magnam odio officia.</p>\n\n<p>Ex explicabo harum placeat unde. Animi aspernatur, at dignissimos dolor, doloremque eaque est et eveniet facere inventore labore magnam numquam odit officiis quam quas quidem repellat reprehenderit sapiente vero voluptates.</p>\n\n<p>Deserunt, enim obcaecati officia praesentium recusandae totam. Blanditiis consequatur dicta dolores est, nihil provident quaerat quam similique temporibus, vel velit voluptatem! Enim eos minima nostrum saepe sapiente, sed ullam unde.</p>\n\n<p>Animi consequuntur illum magnam minus nostrum perspiciatis sint velit? Aliquid dicta et illo in incidunt iure, laboriosam magni, minus quidem quos ratione saepe sed tempora veniam, voluptates? Id, nulla, voluptatibus?</p>\n\n<p>At eos laudantium mollitia placeat repudiandae tempora voluptatem. Alias, aliquid blanditiis culpa delectus deserunt dicta enim et fuga ipsam iure laborum nobis optio placeat possimus quo quod sequi soluta voluptates.</p>\n\n<p>A beatae delectus maiores nulla. Accusamus architecto, at blanditiis commodi cum, deleniti dignissimos doloribus ducimus fugit impedit nam neque officiis omnis, perspiciatis porro rem repellendus totam ullam vel veritatis? Natus?</p>\n\n<p>Aut cumque exercitationem fugiat harum hic natus, nisi ratione similique veniam voluptates? A, alias consequatur cupiditate enim et facere facilis fuga, fugiat, nesciunt nihil officia porro quibusdam quidem suscipit velit?</p>\n\n<p>Aspernatur atque blanditiis consectetur mollitia porro quidem sed sequi. Commodi esse ipsam possimus praesentium, quaerat quidem. Ad beatae doloribus eos ipsa magnam magni ratione tempore vel? Aut beatae ea rem.</p>\n\n<p>A ab aperiam at corporis dolor dolorum eaque error eveniet expedita harum impedit incidunt magni modi nam non nostrum nulla pariatur, quam quisquam suscipit tempora ullam voluptas. Dolores eos, quis.</p>\n\n<p>Aliquid cum minus praesentium quam quidem recusandae rem. Aperiam expedita facere iusto optio. Distinctio doloremque perspiciatis recusandae sed? A facilis libero minima rem veniam? Et id magnam nostrum? Qui, voluptate?</p>\n\n<p>Accusamus aspernatur assumenda commodi culpa cum dicta dolore dolores enim est illum, in ipsam iure iusto libero magnam nam nesciunt obcaecati porro provident reiciendis repellat sequi temporibus, tenetur veniam voluptate!</p>\n\n<p>Accusamus adipisci excepturi fugiat itaque maxime necessitatibus repudiandae tempore. Animi corporis debitis hic, illum impedit inventore laudantium maiores nihil optio placeat quas quia, quo reiciendis saepe tempora tempore totam ullam!</p>\n\n<p>Architecto consequatur dignissimos illo ipsam minus nam, provident quisquam quo repellendus soluta sunt vitae voluptates! Alias animi dignissimos doloremque dolorum eveniet hic obcaecati quaerat ratione tenetur. Animi distinctio quasi repellat.</p>\n\n<p>Ad animi cum debitis deleniti distinctio doloribus ducimus enim est eum id illum itaque iure magnam molestias mollitia nesciunt obcaecati optio, pariatur praesentium quam quibusdam quos reprehenderit sint tempore vero!</p>\n\n<p>Accusamus animi architecto deserunt error eum in minima, porro quod, repellat sit velit voluptate? Amet, assumenda commodi in maxime nesciunt nostrum recusandae rerum sint sunt voluptate? Accusamus dolores odit repellendus?</p>\n\n<p>Ab at eius enim facere maiores nemo officiis praesentium quia quidem sit vel vitae voluptatem, voluptates? Cumque eos iste iure labore nam omnis, quos reprehenderit? Commodi dicta expedita laudantium minus?</p>\n\n<p>Ab architecto, commodi consequuntur cum eaque eos exercitationem expedita id inventore laudantium magnam minima molestiae nemo non praesentium quae quia rem similique vero voluptatem. Ad error eveniet natus praesentium repellendus.</p>\n\n<p>A ad alias, animi at autem corporis distinctio dolore ea eaque eos et expedita explicabo facere facilis fuga, inventore ipsum minus nam natus nisi quos ratione, repellat sapiente sunt vero.</p>\n\n<p>Aspernatur autem, cum debitis enim fugit iure natus officia rem suscipit? Culpa explicabo hic libero possimus quis. Aperiam cupiditate dolor dolore harum incidunt, natus nostrum, possimus quia quis, ratione repellat.</p>\n\n<p>A animi at delectus doloribus ducimus harum, ipsa ipsum laudantium nemo nisi, non numquam odio placeat praesentium repellendus rerum voluptas voluptatibus? Eligendi illum incidunt laudantium optio quod repudiandae veritatis vero?</p>\n\n<p>Debitis exercitationem illum possimus quasi soluta veritatis! Architecto aut consequatur delectus, ea iure libero magnam necessitatibus recusandae reiciendis repellendus sit, temporibus totam veniam voluptatibus voluptatum! Commodi incidunt nostrum quasi vero.</p>\n\n<p>Asperiores aspernatur culpa dolore, eius iste molestiae mollitia neque nihil, non numquam odio possimus, quaerat quia quis quisquam repellat repudiandae similique veniam voluptatem voluptatum. Assumenda atque natus totam. Consequatur, facilis?</p>\n\n<p>Consectetur delectus esse exercitationem nihil nobis non quibusdam ratione rerum tempora vitae! Corporis debitis dolorem doloribus esse, iusto minima minus neque, nesciunt quasi quos sequi tempora ullam vel. Explicabo, hic!</p>\n\n<p>A adipisci aperiam dicta laborum recusandae? Asperiores consequuntur cumque debitis ea fuga libero maxime minus quasi recusandae voluptates. Adipisci aliquid deleniti dolor doloribus nesciunt nisi non optio provident quidem sint.</p>\n\n<p>Autem cum ea esse eveniet excepturi, fugit illum laborum minima molestias mollitia pariatur soluta tempora, veritatis? Alias, nostrum, velit. Dolores labore minima placeat quia? Eius quasi soluta tempora tempore vel?</p>\n\n<p>Debitis eligendi numquam officiis omnis quia? Dolor enim eveniet maiores maxime quae. A ab aliquam commodi, cupiditate dolore eum fuga inventore necessitatibus neque non obcaecati, quia recusandae rem ullam vel.</p>\n\n<p>Debitis earum modi molestias repellat sunt? Exercitationem explicabo incidunt modi, nihil officiis vel. Accusantium ad, adipisci alias, aliquam at consequuntur distinctio, dolorum harum iste magni maiores odio saepe similique vero.</p>\n\n<p>Asperiores assumenda commodi, consequatur consequuntur deleniti dignissimos eos exercitationem facilis fugiat ipsa libero minima molestiae mollitia nemo, nostrum perferendis perspiciatis quas quidem quis reiciendis sequi sint vel veniam vero vitae!</p>\n\n<p>A aliquid amet aut consequatur cupiditate distinctio doloremque doloribus ea, eius expedita id illo itaque labore molestiae nemo nihil quibusdam repellat rerum, saepe sint, ullam unde velit voluptate voluptates voluptatibus?</p>\n\n<p>Adipisci at commodi debitis dignissimos modi molestiae natus numquam, pariatur possimus provident quibusdam quo unde vero. Ab explicabo facilis labore maiores necessitatibus non quibusdam, quidem reprehenderit sint tempore temporibus, ullam!</p>\n\n<p>Adipisci asperiores at eos fugiat natus optio ullam unde. Asperiores dignissimos eius et eum eveniet maxime modi nisi repellat totam, ullam. Cum cupiditate ea minima porro! Culpa cumque quidem vero?</p>\n\n<p>A consequatur, debitis dolores eos ipsa iure natus non, provident ratione recusandae, repellat similique soluta ut! Atque explicabo fugit inventore iste iusto mollitia, officiis vero? Consequatur distinctio illum officiis repudiandae?</p>\n\n<p>Culpa, harum, perferendis? Accusantium blanditiis corporis culpa facere illum obcaecati odit reiciendis sint tempora totam. Distinctio dolores earum facere iste iure libero modi molestiae provident, quas quibusdam quod ullam velit.</p>\n\n<p>Accusamus aliquam aspernatur assumenda consequatur dolore doloremque eos et expedita itaque iusto neque nesciunt nobis non numquam, obcaecati odit officia quibusdam quo rem saepe sequi tenetur, ullam unde vitae, voluptatum!</p>\n\n<p>A, alias architecto assumenda debitis dicta, distinctio eligendi enim est ipsa iure, laboriosam libero magnam molestiae neque nisi numquam odit omnis praesentium provident quam quo recusandae rem repudiandae sapiente similique.</p>\n\n<p>Aperiam architecto beatae culpa cumque ea earum eligendi hic id iste itaque maiores minus molestiae nesciunt, nulla numquam officia placeat quod repellat sequi sint tempore veniam vero. Commodi dolorum, quo!</p>\n\n<p>Consequatur eius, fugit magni modi nam perferendis repudiandae sunt temporibus veniam! Consequuntur eaque et incidunt ipsum iure nulla provident quae. Delectus facere, facilis iste minima nihil pariatur quibusdam quidem tempora?</p>\n\n<p>Aliquid, amet animi culpa delectus dolores ex expedita facilis iure iusto laboriosam officia omnis optio perferendis porro praesentium reprehenderit similique ullam, voluptas! Amet assumenda facere impedit in ipsa quidem soluta.</p>\n\n<p>Aliquid, assumenda, quisquam? Consectetur doloremque illo quis quo tenetur vero! Eum, eveniet laborum molestias natus necessitatibus quam quibusdam voluptates! Architecto eveniet explicabo incidunt nihil nisi placeat saepe sit suscipit veritatis.</p>\n\n<p>Atque dolores harum minima nemo nesciunt nobis placeat quaerat sed suscipit voluptas. Ab accusamus, amet architecto consectetur cumque ea eius, eum excepturi illum impedit minus quae quasi, similique temporibus veniam?</p>\n\n<p>Animi at ducimus earum, explicabo facilis magnam optio quaerat quo soluta velit? A, blanditiis cum deleniti eaque eius ex fuga incidunt inventore magnam magni minus provident quisquam repellat totam veritatis.</p>\n\n<p>Animi consequatur fugit iste neque placeat possimus repellat, reprehenderit sint tempore velit! Aliquid autem culpa cum dolore, dolores earum esse fugit hic incidunt iusto perspiciatis rem tenetur vitae voluptatem voluptates?</p>\n\n<p>Ab aspernatur aut autem delectus deleniti earum error laboriosam minus modi molestias nihil, porro quibusdam reprehenderit voluptates, voluptatibus? Animi aspernatur consectetur dignissimos dolorum eius fugit laboriosam obcaecati odit rem veniam.</p>\n\n<p>Adipisci beatae ducimus ea laboriosam maxime molestiae mollitia repudiandae? Ad asperiores consequuntur cum deleniti eligendi in ipsum minima minus, nemo obcaecati odio omnis perferendis quos repellendus similique. Dolorem, laborum, nihil.</p>\n\n<p>Accusamus blanditiis consequatur dolores dolorum ea eligendi, excepturi exercitationem id laboriosam maiores necessitatibus nulla porro praesentium provident quia quis quo ratione sapiente sequi suscipit veniam vero voluptatum. Dicta, nam, nemo?</p>\n\n<p>Architecto blanditiis cum delectus, doloremque, est fuga libero nihil pariatur perspiciatis placeat possimus quibusdam vero! Aperiam consequuntur nihil veniam veritatis voluptate! Animi architecto at esse hic obcaecati quia rem repudiandae!</p>\n\n<p>Architecto dignissimos ex facere fugit, ipsam nisi non optio, repellendus similique temporibus totam unde. Ad aspernatur blanditiis nemo possimus. Ab alias animi est facilis incidunt molestias nam qui quo reprehenderit.</p>\n\n<p>Accusantium consectetur culpa, distinctio doloremque dolorum eaque et facere id illo modi nulla odio praesentium quam, qui quisquam quo sunt vel voluptas voluptate voluptatum! Commodi enim laudantium quo recusandae similique.</p>\n\n<p>Accusamus architecto dolorum labore. Eaque, ratione, repudiandae? Ab eaque error est, ex, illum inventore ipsum itaque iusto modi nemo neque odit omnis provident quis reprehenderit suscipit velit, voluptatibus! Quod, reiciendis.</p>\n\n<p>A accusamus ad adipisci alias asperiores autem doloremque eligendi est fugiat fugit illum ipsa laudantium magni maiores molestiae natus nulla, omnis quibusdam quo rem repellat repudiandae sed vel vitae voluptatibus.</p>\n\n<p>Ad adipisci amet consectetur dicta dolor eveniet facilis fugit id ipsum itaque, mollitia necessitatibus nobis non nostrum, quae qui repellat rerum, sed sit sunt tempora tempore temporibus vel veritatis vitae.</p>\n\n<p>Dolores ipsum laboriosam molestias pariatur quod temporibus unde! Harum, incidunt modi necessitatibus nobis rem ullam voluptatum! Blanditiis commodi, delectus dicta dolorum ea impedit libero nihil sit soluta tempore totam voluptate?</p>\n\n<p>Accusantium aperiam dicta dolor ea, eveniet ex facere ipsam labore libero magni necessitatibus officia perferendis totam vero voluptatum. Corporis culpa cupiditate iusto quia? Alias blanditiis debitis facilis perspiciatis ut veritatis.</p>\n\n<p>Debitis dicta eos excepturi, facere iste magni optio, quas quasi quod, quos rem repellat sit suscipit totam voluptatibus? Animi asperiores beatae cum exercitationem illum, labore magni nisi officia possimus voluptates?</p>\n\n<p>Accusantium asperiores expedita minus perspiciatis qui! Aliquid, ex, impedit? A ab amet assumenda atque autem consectetur, delectus eos illo natus repellendus sit, temporibus totam? Asperiores doloremque eveniet exercitationem laborum ullam.</p>\n\n<p>Ab aperiam atque autem blanditiis commodi consequatur cum deleniti dignissimos dolorum facere harum hic illo laborum neque nihil officia optio quibusdam reiciendis rem repellat, sed totam ullam vel veritatis voluptas?</p>\n\n<p>Deleniti dolor eligendi id minima. A consequuntur dignissimos id iure magni sapiente totam. Ad amet debitis error et facere iure, laudantium natus nobis perspiciatis possimus, qui tenetur unde veniam voluptatibus!</p>\n\n<p>Assumenda autem blanditiis error facilis impedit, modi nobis quam temporibus unde, ut vel velit! Ad consequuntur dicta distinctio facere illo in inventore libero, maiores natus necessitatibus odio officiis, repellendus veritatis?</p>\n\n<p>Et exercitationem, pariatur! Asperiores corporis eius est impedit ipsa ipsum iusto modi nobis, obcaecati perferendis quas quasi recusandae sapiente sunt, tenetur. Aliquid animi aperiam fugit, harum odio quibusdam quis rerum?</p>\n\n<p>A, adipisci deleniti eveniet iure iusto sapiente? Corporis eos harum nobis quas ut voluptatem! A, blanditiis consequuntur dolores dolorum eaque impedit necessitatibus nemo obcaecati quas sequi, suscipit veniam vero voluptatem.</p>\n\n<p>Animi commodi doloribus hic recusandae rerum. Assumenda dignissimos ea ipsum perspiciatis porro quas quo velit voluptatum. Harum magni maxime mollitia neque non, odio quibusdam saepe tempora tenetur voluptatum? Minima, quia!</p>\n\n<p>Ab, aspernatur autem blanditiis dolore, ducimus eos fugiat itaque laboriosam minus perspiciatis provident reprehenderit, sapiente tempore ut veniam. Aperiam corporis eius in quibusdam repellendus similique vel vero voluptatem voluptates voluptatibus.</p>\n\n<p>Alias culpa dicta eum fuga nobis officia placeat provident quasi reiciendis soluta? Aliquam amet aspernatur, consectetur ea, est eveniet exercitationem impedit iste, magni necessitatibus quod ratione sed unde ut veniam!</p>\n\n<p>Aut commodi consequatur eaque eos esse eum id illum in iste laboriosam, molestias nemo nobis optio praesentium quidem quis sed? Aliquid dolores eaque eligendi eos ex minus, pariatur quisquam voluptate.</p>\n\n<p>Aperiam, cumque delectus facilis pariatur perspiciatis quo sed tempore tenetur? Adipisci fuga fugit magni quibusdam ratione. Aliquam beatae cum eius enim, id, officiis quas quisquam reprehenderit repudiandae sapiente, temporibus totam?</p>\n\n<p>Ab animi aut consequuntur culpa doloremque dolorum ducimus eaque eum, fugiat ipsum, neque nihil, officia placeat quisquam quod repellat reprehenderit voluptas. Et impedit ipsa laboriosam laborum maiores, mollitia praesentium recusandae?</p>\n\n<p>Amet beatae ea explicabo facere fugiat in itaque molestiae nihil nobis, non odit perferendis possimus, repudiandae, rerum sunt velit veritatis vero voluptatum. Asperiores consequatur cupiditate, dolores esse est neque veniam.</p>\n\n<p>A accusamus aliquam blanditiis consectetur consequuntur distinctio dolores doloribus error est et exercitationem illum, inventore laudantium minima mollitia nulla odio pariatur quam quis quisquam reiciendis rem repellat repellendus rerum, voluptatem.</p>\n\n<p>Adipisci, aperiam commodi dolorem doloremque, eos et illo maxime, mollitia nisi perspiciatis provident sint. Dignissimos distinctio ducimus eligendi iste, maxime minima nemo neque, quos saepe similique, sunt tenetur velit voluptate!</p>\n\n<p>Corporis deleniti deserunt eum fugiat harum laboriosam maxime minus molestiae odit possimus praesentium quaerat, quibusdam quo ratione sint soluta voluptatum. A, id minus nisi quos repellat tempora ullam veritatis? Est!</p>\n\n<p>A, consequuntur quasi. Cumque deserunt doloremque facilis iusto libero, maiores minus non provident sunt veritatis? Distinctio dolorem dolores, eveniet in maiores molestias nostrum quibusdam rem sint, soluta ut veritatis vitae.</p>\n\n<p>Architecto atque consequatur dolor dolore est facere facilis impedit inventore molestiae nam nemo placeat possimus, provident quibusdam recusandae. Aspernatur consequatur corporis culpa deserunt dignissimos fugit impedit ipsa itaque quam recusandae.</p>\n\n<p>Dolorem necessitatibus, quam. Aliquid asperiores atque cum dolore, dolorem dolorum error est fugit ipsa ipsam iste itaque laudantium magnam maxime obcaecati officiis pariatur quo repellendus rerum sit velit veritatis voluptate?</p>\n\n<p>Aut consectetur cum dicta dolores ducimus eligendi, enim esse est incidunt inventore iure iusto labore laboriosam molestiae, mollitia necessitatibus nobis possimus praesentium quaerat recusandae repellendus saepe soluta tenetur ullam veritatis.</p>\n\n<p>Consequatur, porro, voluptate. Accusantium autem corporis culpa cum distinctio dolorum eligendi eos id illo incidunt inventore laborum laudantium molestias nemo odit omnis porro quis quo, recusandae sapiente sit voluptas voluptatem.</p>\n\n<p>Consectetur distinctio eos fugit ipsa, officiis pariatur quam? Expedita, mollitia, quos. Dignissimos dolores eius eos fuga nobis quam quidem unde. Accusantium consectetur consequuntur doloribus hic iusto rem suscipit, tempora vitae?</p>\n\n<p>Accusamus eligendi nostrum numquam quam tenetur. A aspernatur at, autem dolorum iste numquam placeat. A dolorum, non sit sunt velit veniam. Accusamus consequuntur cum numquam possimus veniam. Fugiat, quae, sed.</p>\n\n<p>Assumenda consequuntur dignissimos dolor dolorem fuga illum iure, iusto minus numquam, pariatur porro quaerat quas quis rem sed soluta voluptates? Earum eius eligendi et necessitatibus nemo, quas totam ut voluptas!</p>\n\n<p>Enim iusto quia quis. Blanditiis harum neque, quasi repudiandae rerum saepe? Consectetur maiores nemo quis rerum? Consequuntur eaque, quae repudiandae suscipit veniam voluptate? A asperiores dolore ea officia possimus ut.</p>\n\n<p>Alias animi autem corporis dicta dolor dolorem enim est explicabo facilis hic impedit, magnam molestiae necessitatibus nostrum provident quasi quia quos reiciendis saepe sapiente sed similique tenetur totam ut vero.</p>\n\n<p>Ab adipisci, consequuntur dolorum iste iure molestiae molestias perferendis rem reprehenderit repudiandae similique sit tempora totam. Amet dicta, doloremque eligendi harum illo incidunt libero non perferendis, quibusdam reiciendis similique voluptatum.</p>\n\n<p>Ab accusamus adipisci amet impedit nemo odit sint. Consectetur distinctio esse ex explicabo illo iure labore, maxime molestias nesciunt numquam obcaecati officia pariatur quibusdam ratione rerum sapiente similique velit voluptate!</p>\n\n<p>Accusamus aperiam aspernatur, at culpa cumque enim eum excepturi ipsam, iusto minima nobis numquam provident sit vel velit vitae voluptates. Ab architecto eveniet magnam, nobis nostrum quia quidem recusandae. Deleniti.</p>\n\n<p>Ad aperiam asperiores aspernatur dignissimos doloremque et, explicabo fugit ipsa iure magni minima mollitia nemo nulla numquam optio pariatur quae qui quidem quo sit velit vitae voluptas voluptatem. Dolorem, iusto.</p>\n\n<p>Alias aperiam aut deleniti dignissimos ea error esse explicabo, facere id iste labore magni modi molestiae nobis obcaecati odio, omnis quasi quis quos rem repellat similique suscipit tenetur voluptate voluptatum!</p>\n\n<p>Aliquid asperiores culpa cumque doloremque facere harum iure quia saepe ullam. Architecto at autem cupiditate, deserunt dolor dolores doloribus iure libero molestias officiis porro provident quam sapiente tempore temporibus vitae?</p>\n\n<p>Atque consequatur eligendi fugit, neque quidem quo quod vero. Amet aut eligendi eum excepturi harum illum iusto officia repudiandae? Alias consectetur dolore doloremque explicabo ipsam natus provident quam, quo vero?</p>\n\n<p>Adipisci, animi cumque esse, ex expedita impedit incidunt natus nobis obcaecati perspiciatis quod reiciendis repellendus rerum! Ea eius in laudantium maiores minus mollitia nulla porro, possimus quae quasi quo quod?</p>\n\n<p>Eum ex libero magnam magni minima officia provident quo rem rerum voluptatibus! Aut delectus dolore exercitationem obcaecati ullam voluptatibus? Consequuntur dolorum fuga impedit ipsum laboriosam, placeat quia recusandae rem voluptas.</p>\n\n<p>A at autem blanditiis corporis cupiditate ducimus ea earum eum ex facere fuga laboriosam, nesciunt nihil pariatur porro provident qui reprehenderit saepe similique sint sit tempore tenetur velit veniam voluptas!</p>\n\n<p>Ad aliquid deleniti dolor eveniet, iure reprehenderit similique? Ab atque beatae magnam non saepe? Culpa dicta, doloremque eos esse, et hic ipsam ipsum, laudantium minus qui quia quo vel voluptatibus.</p>\n\n<p>At dolore excepturi incidunt iste obcaecati odit quasi quia quo saepe? Aliquam asperiores dolore, eaque ex fuga fugiat ipsam iure iusto, minus omnis perspiciatis quibusdam quisquam temporibus tenetur voluptate. Est.</p>\n\n<p>Accusantium aliquid cumque dicta distinctio earum hic ipsa saepe voluptas? Aspernatur cum debitis dolore earum iure officiis porro rerum sequi veniam, voluptatibus. Ab aperiam dignissimos eaque impedit neque repudiandae voluptatem.</p>\n\n<p>Ab ad autem consequuntur cupiditate, dolorem earum eligendi est inventore maiores modi molestiae neque nulla omnis quos sed suscipit unde voluptates. Dolor enim explicabo minus nihil quaerat repellendus sed tempora!</p>\n</body>\n</html>"
  },
  {
    "path": "packages/browser-sync-ui/test/opts.server.json",
    "content": "{\n    \"files\": [],\n    \"server\": {\n        \"baseDir\": \"./test/fixtures\",\n        \"middleware\": []\n    },\n    \"proxy\": false,\n    \"port\": 3000,\n    \"ghostMode\": {\n        \"clicks\": true,\n        \"scroll\": true,\n        \"forms\": {\n            \"submit\": true,\n            \"inputs\": true,\n            \"toggles\": true\n        }\n    },\n    \"logLevel\": \"info\",\n    \"logPrefix\": \"BS\",\n    \"logConnections\": false,\n    \"logFileChanges\": true,\n    \"logSnippet\": true,\n    \"snippetOptions\": {\n        \"rule\": {\n            \"match\": {}\n        }\n    },\n    \"open\": false,\n    \"browser\": \"default\",\n    \"hostnameSuffix\": false,\n    \"notify\": true,\n    \"scrollProportionally\": true,\n    \"scrollThrottle\": 0,\n    \"reloadDelay\": 0,\n    \"injectChanges\": true,\n    \"startPath\": null,\n    \"minify\": true,\n    \"host\": \"192.168.0.2\",\n    \"codeSync\": true,\n    \"timestamps\": true,\n    \"socket\": {\n        \"path\": \"/browser-sync/socket.io\",\n        \"clientPath\": \"/browser-sync\",\n        \"namespace\": \"/browser-sync\"\n    },\n    \"injectFileTypes\": [\n        \"css\",\n        \"png\",\n        \"jpg\",\n        \"jpeg\",\n        \"svg\",\n        \"gif\",\n        \"webp\"\n    ],\n    \"excludedFileTypes\": [\n        \"js\",\n        \"css\",\n        \"pdf\",\n        \"map\",\n        \"svg\",\n        \"ico\",\n        \"woff\",\n        \"json\",\n        \"eot\",\n        \"ttf\",\n        \"png\",\n        \"jpg\",\n        \"jpeg\",\n        \"webp\",\n        \"gif\",\n        \"mp4\",\n        \"mp3\",\n        \"3gp\",\n        \"ogg\",\n        \"ogv\",\n        \"webm\",\n        \"m4a\",\n        \"flv\",\n        \"wmv\",\n        \"avi\",\n        \"swf\",\n        \"scss\"\n    ],\n    \"debugInfo\": true,\n    \"version\": \"1.8.1\",\n    \"online\": true,\n    \"external\": \"192.168.0.2\",\n    \"urls\": {\n        \"local\": \"http://localhost:3000\",\n        \"external\": \"http://192.168.0.2:3000\"\n    },\n    \"snippet\": \"<script type='text/javascript' id=\\\"__bs_script__\\\">//<![CDATA[\\n    document.write(\\\"<script async src='/browser-sync/browser-sync-client.1.8.1.js'><\\\\/script>\\\".replace(/HOST/g, location.hostname).replace(/PORT/g, location.port));\\n//]]></script>\",\n    \"scriptPaths\": {\n        \"path\": \"/browser-sync/browser-sync-client.js\",\n        \"versioned\": \"/browser-sync/browser-sync-client.1.8.1.js\"\n    }\n}\n"
  },
  {
    "path": "packages/browser-sync-ui/test/protractor.sh",
    "content": "#!/usr/bin/env bash\n# Add individual files here for single debugging\n#./node_modules/.bin/protractor test/client/e2e/config.js --file tests/history.js\n#./node_modules/.bin/protractor test/client/e2e/config.js --file tests/history.newtabs.js\n#./node_modules/.bin/protractor test/client/e2e/config.js --file tests/home.js\n#./node_modules/.bin/protractor test/client/e2e/config.js --file tests/network-throttle.auto.js\n#./node_modules/.bin/protractor test/client/e2e/config.js --file tests/network-throttle.js\n#./node_modules/.bin/protractor test/client/e2e/config.js --file tests/network-throttle.manual.js\n#./node_modules/.bin/protractor test/client/e2e/config.js --file tests/network-throttle.remove.js\n#./node_modules/.bin/protractor test/client/e2e/config.js --file tests/plugins.inline.js\n#./node_modules/.bin/protractor test/client/e2e/config.js --file tests/plugins.js\n#./node_modules/.bin/protractor test/client/e2e/config.js --file tests/remote-debug.js\n\nfor file in test/client/e2e/tests/*\ndo\n  set -e\n  ./node_modules/.bin/protractor test/client/e2e/config.js --file $file\ndone\n"
  },
  {
    "path": "packages/browser-sync-ui/test/server/history/history.js",
    "content": "/*jshint -W079 */\nvar Immutable = require(\"immutable\");\nvar history   = require(\"../../../lib/plugins/history/history\");\nvar assert    = require(\"chai\").assert;\nvar url       = require(\"url\");\n\ndescribe(\"Saving history\", function () {\n    it(\"Adding a new path\", function () {\n        var imm = Immutable.OrderedSet();\n        var out = history.addPath(imm, url.parse(\"http://localhost/shane\"), \"server\");\n        assert.deepEqual(out.toJS(), [\"/shane\"]);\n    });\n    it(\"Adding a dupe path\", function () {\n        var imm = Immutable.OrderedSet();\n        var out = history.addPath(imm, url.parse(\"http://localhost/\"), \"server\");\n        assert.deepEqual(out.toJS(), [\"/\"]);\n    });\n    it(\"Adding a path in snippet mode\", function () {\n        var imm = Immutable.OrderedSet();\n        var out = history.addPath(imm, url.parse(\"http://localhost:65323/about.html\"), \"snippet\");\n        assert.deepEqual(out.toJS(), [\"http://localhost:65323/about.html\"]);\n    });\n    it(\"Can remove a path\", function () {\n        var imm = Immutable.OrderedSet([\"/shane\"]);\n        var out = history.removePath(imm, \"http://localhost/\");\n        assert.deepEqual(out.toJS(), [\"/shane\"]);\n    });\n    it(\"Can compare two maps\", function () {\n        var map1 = Immutable.Map({a:1, b:1, c:\"1\", d: Immutable.Map({hello:\"shane\"})});\n        var map2 = Immutable.Map({a:1, b:1, c:\"1\", d: Immutable.Map({hello:\"shane\"})});\n        assert.isTrue(Immutable.is(map1, map2));\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/server/init.js",
    "content": "/*jshint -W079 */\nvar browserSync = require(\"browser-sync\");\nvar cp          = require(\"../../index\");\nvar assert      = require(\"chai\").assert;\nvar request     = require(\"supertest\");\n\ndescribe(\"Can be started with browserSync instance\", function() {\n\n    var bsInstance, ui;\n\n    before(function (done) {\n\n        browserSync.use(cp);\n\n        var config = {\n            online: false,\n            logLevel: \"silent\",\n            open: false\n        };\n        bsInstance = browserSync(config, function (err, bs) {\n            ui = bs.ui;\n            done();\n        }).instance;\n    });\n\n    after(function () {\n        bsInstance.cleanup();\n    });\n\n    it(\"can register as plugin\", function() {\n        assert.ok(ui);\n    });\n    it(\"can serve from lib dir\", function(done) {\n        request(ui.server)\n            .get(\"/\")\n            .expect(200)\n            .end(function (err, res) {\n                assert.include(res.text, \"<title>Browsersync</title>\");\n                done();\n            });\n    });\n    it(\"has options\", function(done) {\n        assert.equal(ui.options.getIn([\"bs\", \"mode\"]), \"snippet\");\n        assert.ok(String(ui.options.getIn([\"bs\", \"port\"])).match(/\\d{4}/));\n        done();\n    });\n});\n\n"
  },
  {
    "path": "packages/browser-sync-ui/test/server/plugins.js",
    "content": "/*jshint -W079 */\nvar browserSync = require(\"browser-sync\");\nvar ui          = require(\"../../index\");\nvar assert      = require(\"chai\").assert;\nvar path        = require(\"path\");\nvar isMap       = require(\"immutable\").Map.isMap;\n\ndescribe(\"Can resolve Browsersync plugins\", function() {\n\n    it(\"can return plugins with added meta data\", function(done) {\n\n        browserSync.reset();\n        browserSync.use(ui);\n        var plugin = {\n            module: path.resolve(__dirname, \"../\", \"fixtures/plugin\")\n        };\n        browserSync({\n            server: \"test/fixtures\",\n            logLevel: \"silent\",\n            open: false,\n            plugins: [plugin]\n        }, function (err, bs) {\n\n            assert.equal(bs.ui.bsPlugins.size, 1);\n            assert.isTrue(isMap(bs.ui.bsPlugins.get(0).get(\"pkg\")));\n            var clientJs = bs.ui.bsPlugins.get(0).get(\"client:js\").toJS();\n            assert.equal(Object.keys(clientJs).length, 1);\n            var first = clientJs[Object.keys(clientJs)[0]];\n            assert.include(first, \"const PLUGIN_NAME = \\\"Test Plugin\\\";\");\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"can return plugins from non-module\", function(done) {\n\n        browserSync.reset();\n        browserSync.use(ui);\n        var plugin = {\n            module: {\n                plugin: function () {\n                },\n                \"plugin:name\": \"Test inline plugin\"\n            }\n        };\n        browserSync({\n            server: \"test/fixtures\",\n            logLevel: \"silent\",\n            open: false,\n            plugins: [plugin]\n        }, function (err, bs) {\n\n            assert.equal(bs.ui.bsPlugins.size, 1);\n            assert.equal(bs.ui.bsPlugins.get(0).get(\"name\"), \"Test inline plugin\");\n\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Does not blow up when Plugin does not contain any UI\", function(done) {\n\n        browserSync.reset();\n        browserSync.use(ui);\n        var plugin = {\n            module: path.resolve(__dirname, \"../\", \"fixtures/plugin-noui\")\n        };\n        browserSync({\n            server: \"test/fixtures\",\n            logLevel: \"silent\",\n            open: false,\n            plugins: [plugin]\n        }, function (err, bs) {\n            assert.equal(bs.ui.bsPlugins.size, 1);\n            assert.isTrue(require(\"immutable\").Map.isMap(bs.ui.bsPlugins.get(0).get(\"pkg\")));\n            bs.cleanup();\n            done();\n        });\n    });\n\n    it(\"Does not blow up when mixed plugins used together\", function(done) {\n\n        browserSync.reset();\n        browserSync.use(ui);\n        var plugin1 = {\n            module: path.resolve(__dirname, \"../\", \"fixtures/plugin\")\n        };\n        var plugin2 = {\n            module: path.resolve(__dirname, \"../\", \"fixtures/plugin-noui\")\n        };\n        browserSync({\n            server: \"test/fixtures\",\n            logLevel: \"silent\",\n            open: false,\n            plugins: [plugin1, plugin2]\n        }, function (err, bs) {\n            assert.equal(bs.ui.bsPlugins.size, 2);\n            assert.isTrue(require(\"immutable\").Map.isMap(bs.ui.bsPlugins.get(0).get(\"pkg\")));\n            var clientJs = bs.ui.bsPlugins.get(0).get(\"client:js\").toJS();\n            assert.equal(Object.keys(clientJs).length, 1);\n            bs.cleanup();\n            done();\n        });\n    });\n});\n\n"
  },
  {
    "path": "packages/browser-sync-ui/test/server/plugins.templates.js",
    "content": "/*jshint -W079 */\nvar browserSync = require(\"browser-sync\");\nvar ui          = require(\"../../index\");\nvar assert      = require(\"chai\").assert;\nvar path        = require(\"path\");\n\ndescribe(\"Resolving templates loaded via plugins\", function() {\n\n    it(\"can load a single template\", function(done) {\n\n        browserSync.reset();\n        browserSync.use(ui);\n        var plugin = {\n            module: path.resolve(__dirname, \"../\", \"fixtures/plugin\")\n        };\n        browserSync({\n            server: \"test/fixtures\",\n            logLevel: \"silent\",\n            open: false,\n            plugins: [plugin]\n        }, function (err, bs) {\n            assert.include(bs.ui.templates, \"id=\\\"test-bs-plugin/test.directive.html\");\n            assert.include(bs.ui.templates, \"<h1>Test markup from Test Directive</h1>\");\n            assert.include(bs.ui.clientJs, \"const PLUGIN_NAME = \\\"Test Plugin\\\";\");\n\n            bs.cleanup();\n            done();\n        });\n    });\n    it(\"can load multiple templates\", function (done) {\n        browserSync.reset();\n        browserSync.use(ui);\n        var plugin = {\n            module: path.resolve(__dirname, \"../\", \"fixtures/plugin-multi-templates\")\n        };\n        browserSync({\n            server: \"test/fixtures\",\n            logLevel: \"silent\",\n            open: false,\n            plugins: [plugin]\n        }, function (err, bs) {\n            assert.include(bs.ui.templates, \"id=\\\"test-bs-plugin/test.directive.html\");\n            assert.include(bs.ui.templates, \"id=\\\"test-bs-plugin/test.list.html\");\n            assert.include(bs.ui.templates, \"<h1>Test markup from Test Directive</h1>\");\n            assert.include(bs.ui.templates, \"<h1>Test markup from Test LIST Directive</h1>\");\n            assert.include(bs.ui.clientJs, \"const PLUGIN_NAME = \\\"Test Plugin\\\";\");\n            assert.include(bs.ui.clientJs, \"const PLUGIN_NAME = \\\"Test Plugin file 2\\\";\");\n\n            bs.cleanup();\n            done();\n        });\n    });\n});\n\n"
  },
  {
    "path": "packages/browser-sync-ui/test/server/remote-debug/client.files.js",
    "content": "/*jshint -W079 */\nvar browserSync = require(\"browser-sync\");\nvar request     = require(\"supertest\");\nvar assert      = require(\"chai\").assert;\n\ndescribe(\"Remote debug\", function () {\n\n    var bs, ui;\n\n    this.timeout(10000);\n\n    before(function (done) {\n\n        browserSync.reset();\n        browserSync.use(require(\"../../../index\"));\n\n        var config = {\n            online: false,\n            open: false,\n            server: \"test/fixtures\",\n            logLevel: \"silent\"\n        };\n\n        browserSync(config, function (err, out) {\n            ui = out.ui;\n            bs = out;\n            done();\n        });\n    });\n    after(function () {\n        bs.cleanup();\n    });\n    it(\"should enable a file & allow BrowserSync to serve it\", function (done) {\n\n        var cssFile = ui.options.getIn([\"clientFiles\", \"pesticide\"]).toJS();\n\n        ui.enableElement(cssFile);\n\n        request(bs.server)\n            .get(cssFile.src)\n            .expect(200)\n            .end(function (err, res) {\n                assert.include(res.text, \"1px solid #3498db\");\n                done();\n            });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/server/remote-debug/latency.js",
    "content": "/*jshint -W079 */\nvar browserSync = require(\"browser-sync\");\nvar bsui        = require(\"../../../index\");\nvar request     = require(\"supertest\");\nvar assert      = require(\"chai\").assert;\n\ndescribe.skip(\"Remote debug - Latency\", function () {\n\n    var bs, ui;\n\n    this.timeout(10000);\n\n    before(function (done) {\n\n        browserSync.reset();\n\n        browserSync.use(bsui);\n\n        var config = {\n            online: false,\n            open: false,\n            logLevel: \"silent\",\n            server: \"test/fixtures\"\n        };\n\n        browserSync(config, function (err, out) {\n            ui = out.ui;\n            bs = out;\n            done();\n        });\n    });\n    after(function () {\n        bs.cleanup();\n    });\n    it(\"should Init Latency plugin on/off\", function (done) {\n\n        var latency = ui.options.getIn([\"remote-debug\", \"latency\"]).toJS();\n        assert.deepEqual(latency.rate, 0);\n        assert.deepEqual(latency.active, false);\n\n        ui.latency.toggle(true);\n        latency = ui.options.getIn([\"remote-debug\", \"latency\"]).toJS();\n        assert.deepEqual(latency.active, true);\n        ui.latency.toggle(false);\n        latency = ui.options.getIn([\"remote-debug\", \"latency\"]).toJS();\n        assert.deepEqual(latency.active, false);\n\n        done();\n    });\n    it(\"should adjust the throttle rate\", function (done) {\n\n        ui.latency.toggle(true);\n        ui.latency.adjust({rate: 1.5});\n\n        var time = new Date().getTime();\n\n        request(bs.server)\n            .get(\"/\")\n            .expect(200)\n            .end(function () {\n                assert.isTrue((new Date().getTime() - time) > 1500);\n                done();\n            });\n\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/server/remote-debug/no-cache.js",
    "content": "/*jshint -W079 */\nvar browserSync = require(\"browser-sync\");\nvar bsui        = require(\"../../../index\");\nvar assert      = require(\"chai\").assert;\nvar request     = require(\"supertest\");\n\ndescribe.skip(\"Remote debug - No cache\", function () {\n\n    var bs, ui;\n\n    this.timeout(10000);\n\n    before(function (done) {\n\n        browserSync.reset();\n\n        browserSync.use(bsui);\n\n        var config = {\n            online: false,\n            open: false,\n            logLevel: \"silent\",\n            server: \"test/fixtures\"\n        };\n\n        browserSync(config, function (err, out) {\n            ui = out.ui;\n            bs = out;\n            done();\n        });\n    });\n    after(function () {\n        bs.cleanup();\n    });\n    it(\"should disable browser cache with middlewares\", function (done) {\n\n        var target = ui.options.getIn([\"remote-debug\", \"no-cache\"]).toJS();\n\n        assert.equal(target.active, false);\n\n        ui.noCache.toggle(true);\n\n        target = ui.options.getIn([\"remote-debug\", \"no-cache\"]).toJS();\n\n        assert.equal(target.active, true);\n\n        request(bs.server)\n            .get(\"/\")\n            .set(\"accept\", \"text/html\")\n            .expect(200)\n            .end(function (err, res) {\n\n                assert.equal(res.headers[\"cache-control\"], \"no-cache, no-store, must-revalidate\");\n                assert.equal(res.headers[\"pragma\"], \"no-cache\");\n                assert.equal(res.headers[\"expires\"], 0);\n\n                ui.noCache.toggle(false);\n\n                request(bs.server)\n                    .get(\"/\")\n                    .set(\"accept\", \"text/html\")\n                    .expect(200)\n                    .end(function (err, res) {\n\n                        assert.notInclude(res.headers[\"cache-control\"], \"no-cache\");\n                        assert.notInclude(res.headers[\"pragma\"], \"no-cache\");\n                        assert.notInclude(res.headers[\"expires\"], 0);\n\n                        ui.noCache.toggle(false);\n\n                        done();\n                    });\n            });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/server/remote-debug/throttle.https.js",
    "content": "/*jshint -W079 */\nvar browserSync = require(\"browser-sync\");\nvar bsui        = require(\"../../../index\");\nvar assert      = require(\"chai\").assert;\nvar request     = require(\"supertest\");\n\ndescribe(\"Remote debug - Throttle HTTPS\", function () {\n\n    var bs, ui;\n\n    this.timeout(10000);\n\n    process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;\n\n    before(function (done) {\n\n        browserSync.reset();\n\n        browserSync.use(bsui);\n\n        var config = {\n            online: false,\n            open: false,\n            logLevel: \"silent\",\n            server: \"test/fixtures\",\n            https: true\n        };\n\n        browserSync(config, function (err, out) {\n            ui = out.ui;\n            bs = out;\n            done();\n        });\n    });\n    after(function () {\n        bs.cleanup();\n    });\n    it(\"should init DSL speed\", function (done) {\n\n        var target = ui.options.getIn([\"network-throttle\", \"targets\"]).toJS()[0];\n\n        target.active = true;\n\n        var cb = function (err, out) {\n            assert.isDefined(out.server);\n            assert.isDefined(out.port);\n            assert.isDefined(ui.servers[out.port]);\n\n            var updated = ui.getOptionIn([\"network-throttle\", \"servers\"]).toJS();\n\n            assert.equal(updated[out.port].urls.length, 1);\n            assert.include(updated[out.port].urls[0], \"https://\");\n\n            request(updated[out.port].urls[0])\n                .get(\"/\")\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function (err, res) {\n                    if (err) {\n                        return done(err);\n                    }\n                    assert.include(res.text, bs.options.get(\"snippet\"));\n                    done();\n                });\n        };\n\n        ui.throttle[\"server:create\"]({\n            speed: target,\n            port: \"\",\n            cb: cb\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/test/server/remote-debug/throttle.js",
    "content": "/*jshint -W079 */\nvar browserSync = require(\"browser-sync\");\nvar bsui        = require(\"../../../index\");\nvar assert      = require(\"chai\").assert;\nvar request     = require(\"supertest\");\n\ndescribe(\"Remote debug - Throttle HTTP\", function () {\n\n    var bs, ui;\n\n    this.timeout(10000);\n\n    process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;\n\n    before(function (done) {\n\n        browserSync.reset();\n\n        browserSync.use(bsui);\n\n        var config = {\n            online: false,\n            open: false,\n            logLevel: \"silent\",\n            server: \"test/fixtures\"\n        };\n\n        browserSync(config, function (err, out) {\n            ui = out.ui;\n            bs = out;\n            done();\n        });\n    });\n    after(function () {\n        bs.cleanup();\n    });\n    it(\"should init DSL speed\", function (done) {\n\n        var target = ui.options.getIn([\"network-throttle\", \"targets\"]).toJS()[0];\n\n        target.active = true;\n\n        var cb = function (err, out) {\n            assert.isDefined(out.server);\n            assert.isDefined(out.port);\n            assert.isDefined(ui.servers[out.port]);\n\n            var updated = ui.getOptionIn([\"network-throttle\", \"servers\"]).toJS();\n\n            assert.equal(updated[out.port].urls.length, 1);\n            assert.include(updated[out.port].urls[0], \"http://\");\n\n            request(updated[out.port].urls[0])\n                .get(\"/\")\n                .set(\"accept\", \"text/html\")\n                .expect(200)\n                .end(function (err, res) {\n                    if (err) {\n                        return done(err);\n                    }\n                    assert.include(res.text, bs.options.get(\"snippet\"));\n                    done();\n                });\n        };\n\n        ui.throttle[\"server:create\"]({\n            speed: target,\n            port: \"\",\n            cb: cb\n        });\n    });\n});"
  },
  {
    "path": "packages/browser-sync-ui/webpack.config.js",
    "content": "var webpack = require('webpack');\nvar config = {\n    devtool: 'source-map',\n    context: __dirname + '/src/scripts',\n    entry: [\n        \"./app.js\"\n    ],\n    output: {\n        path: __dirname + \"/public\",\n        filename: \"js/app.js\"\n    },\n    watchOptions: {\n        poll: true\n    }\n};\n\nmodule.exports = config;\n"
  },
  {
    "path": "playwright.config.ts",
    "content": "import { defineConfig, devices } from \"@playwright/test\";\n\n/**\n * See https://playwright.dev/docs/test-configuration.\n */\nexport default defineConfig({\n    testDir: \"./tests\",\n    /* Run tests in files in parallel */\n    fullyParallel: true,\n    /* Fail the build on CI if you accidentally left test.only in the source code. */\n    forbidOnly: !!process.env.CI,\n    /* Retry on CI only */\n    retries: process.env.CI ? 2 : 0,\n    /* Opt out of parallel tests on CI. */\n    workers: process.env.CI ? 1 : 1,\n    // workers: 1,\n    /* Reporter to use. See https://playwright.dev/docs/test-reporters */\n    /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */\n    use: {\n        /* Base URL to use in actions like `await page.goto('/')`. */\n        // baseURL: 'http://127.0.0.1:3000',\n\n        /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */\n        trace: \"on-first-retry\"\n    },\n    projects: [\n        {\n            name: \"snippet-options\",\n            use: {\n                ...devices[\"Desktop Chrome\"]\n            },\n            testDir: \"tests/examples/snippet\"\n        },\n        {\n            name: \"basic\",\n            use: {\n                ...devices[\"Desktop Chrome\"]\n            },\n            testDir: \"tests/examples/basic\"\n        },\n    ]\n});\n"
  },
  {
    "path": "tests/examples/basic/basic.spec.ts",
    "content": "import { expect } from \"@playwright/test\";\nimport { makesRequestIn, responseFor, test } from \"../../utils\";\n\ntest.describe(\"basic\", () => {\n    test(\"file reloading when .css changes\", async ({ page, bs }) => {\n        await page.goto(bs.url);\n        const request = makesRequestIn(page, {\n            matches: {\n                url: url => {\n                    return url.searchParams.has(\"browsersync\");\n                }\n            }\n        });\n        await bs.touch(\"**/style.css\");\n        await request;\n    });\n    test(\"file reloading when HTTP received\", async ({ page, bs }) => {\n        await page.goto(bs.url);\n        const request = makesRequestIn(page, {\n            matches: {\n                url: url => {\n                    return url.searchParams.has(\"browsersync\");\n                }\n            }\n        });\n        const url = new URL(\"__browser_sync__\", bs.url);\n        await fetch(url.toString(), {\n            method: \"POST\",\n            body: JSON.stringify([\n                \"file:reload\",\n                {\n                    ext: \"css\",\n                    path: \"*.css\",\n                    basename: \"*/*.css\",\n                    event: \"change\",\n                    type: \"inject\",\n                    log: true\n                }\n            ]),\n            headers: {\n                \"content-type\": \"application/json\"\n            }\n        });\n        await request;\n    });\n    test(\"can import 1 stylesheet from <style>@import</style>\", async ({ page, bs }) => {\n        await page.goto(bs.url + \"/import.html\");\n\n        // make sure the search param is absent to prevent false\n        const href = await page.evaluate(() => {\n            const firstStyle = document.getElementsByTagName(\"style\")[0];\n            // @ts-expect-error\n            return firstStyle.sheet.cssRules[0].href;\n        });\n        expect(href).not.toContain(\"browsersync\");\n\n        // now change a file\n        bs.touch(\"assets/import.css\");\n\n        // eventually, the css file should be updated\n        await page.waitForFunction(() => {\n            const firstStyle = document.getElementsByTagName(\"style\")[0];\n            // @ts-expect-error\n            return firstStyle.sheet.cssRules[0].href.includes(\"?browsersync\");\n        });\n    });\n    test.skip(\"can import nested from nested @import rules\", async ({ page, bs }) => {\n        await page.goto(bs.url + \"/import-link.html\");\n\n        // make sure the search param is absent to prevent false\n        const href = await page.evaluate(() => {\n            // @ts-expect-error\n            return document.styleSheets[0].cssRules[0].href;\n        });\n        expect(href).not.toContain(\"browsersync\");\n\n        // now change a file\n        bs.touch(\"assets/import2.css\");\n\n        // eventually, the css file should be updated\n        await page.waitForFunction(() => {\n            // @ts-expect-error\n            const link = document.getElementsByTagName(\"link\")?.[0].sheet?.cssRules?.[0].href;\n            return (link || \"\").includes(\"?browsersync\");\n        });\n    });\n    test(\"should reload single <img src>\", async ({ page, bs }) => {\n        await page.goto(bs.url + \"/images.html\");\n\n        const request = makesRequestIn(page, {\n            matches: {\n                url: url => {\n                    return url.searchParams.has(\"browsersync\");\n                }\n            }\n        });\n\n        // now change a file\n        bs.touch(\"**/cam-secure.png\");\n        await request;\n\n        const img = await page.$(\"img\");\n        expect(await img.getAttribute(\"src\")).toContain(\"?browsersync\");\n\n        // eventually, the img file should be updated\n        const elem2 = await page.$('[id=\"img-style\"]');\n        const style = await elem2.getAttribute(\"style\");\n        expect(style).not.toContain(\"?browsersync\");\n    });\n    test(\"should reload single style backgroundImage style property\", async ({ page, bs }) => {\n        await page.goto(bs.url + \"/images.html\");\n\n        const request = makesRequestIn(page, {\n            matches: {\n                url: url => {\n                    return url.searchParams.has(\"browsersync\");\n                }\n            }\n        });\n\n        // now change a file\n        bs.touch(\"**/cam-secure-02.png\");\n        await request;\n\n        const img = await page.$(\"img\");\n        expect(await img.getAttribute(\"src\")).not.toContain(\"?browsersync\");\n\n        const elem2 = await page.$('[id=\"img-style\"]');\n        const style = await elem2.getAttribute(\"style\");\n        expect(style).toContain(\"?browsersync\");\n    });\n    test(\"should reload both images\", async ({ page, bs }) => {\n        await page.goto(bs.url + \"/images.html\");\n\n        const request = makesRequestIn(page, {\n            matches: {\n                url: url => {\n                    return url.searchParams.has(\"browsersync\");\n                }\n            }\n        });\n\n        // now change a file\n        bs.touch(\"**/*.png\");\n        await request;\n\n        const img = await page.$(\"img\");\n        expect(await img.getAttribute(\"src\")).toContain(\"?browsersync\");\n\n        const elem2 = await page.$('[id=\"img-style\"]');\n        const style = await elem2.getAttribute(\"style\");\n        expect(style).toContain(\"?browsersync\");\n    });\n});\n\ntest.describe(\"UI\", () => {\n    test(\"remote debugger\", async ({ context, page, bs }) => {\n        await page.goto(bs.url);\n        const request = makesRequestIn(page, {\n            matches: {\n                pathname: \"/browser-sync/pesticide.css\"\n            }\n        });\n\n        // open the UI\n        const ui = await context.newPage();\n        await ui.goto(bs.uiUrl);\n        await ui.getByRole(\"button\", { name: \"Remote Debug\" }).click();\n        await ui\n            .locator(\"label\")\n            .first()\n            .click();\n\n        // back to the main page\n        await page.bringToFront();\n\n        // ensure the CSS file was requested\n        await request;\n    });\n});\n\ntest.describe(\"Overlays\", () => {\n    test(\"should flash Connected message\", async ({ context, page, bs }) => {\n        await page.goto(bs.url);\n        await page.locator(\"#__bs_notify__\").waitFor({ timeout: 5000 });\n    });\n});\n"
  },
  {
    "path": "tests/examples/html-inject/html-inject.spec.ts",
    "content": "import { expect } from \"@playwright/test\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { makesRequestIn, responseFor, test } from \"../../utils\";\n\ntest.describe(\"html-inject\", () => {\n    test(\"injecting HTML\", async ({ page, bs }) => {\n        await page.goto(bs.url);\n\n        // fill the form field\n        await page.getByLabel('Name:').fill('shane');\n\n        // read the original contents\n        const original = readFileSync(join(bs.cwd, 'index.html'), 'utf8');\n\n        // fake the response to indicate a HTML change on disk\n        await page.route('**', (route, req) => {\n            const url = new URL(req.url());\n            if (url.pathname === '/') {\n                return route.fulfill({\n                    body: original.replace('Name:', 'FirstName:'),\n                    status: 200,\n                    contentType: \"text/html\"\n                })\n            }\n            return route.continue()\n        });\n\n        // wait for the request to happen\n        const request = makesRequestIn(page, {\n            matches: {\n                pathname: \"/\"\n            }\n        });\n\n        // simulate the file-change\n        await bs.touch(\"index.html\");\n\n        // wait for BS to re-request the file\n        await request;\n\n        // now ensure the Label was updated + the form values are still present\n        await expect(page.getByLabel('FirstName:')).toHaveValue('shane', {timeout: 1000});\n    });\n})\n"
  },
  {
    "path": "tests/examples/snippet/snippet.spec.ts",
    "content": "import { expect } from \"@playwright/test\";\nimport { makesRequestIn, test } from \"../../utils\";\n\ntest(\"Snippet works\", async ({ page, bs }) => {\n    await makesRequestIn(page, {\n        matches: { pathname: \"/browser-sync/socket.io/\" },\n        when: { pageLoads: { url: bs.url } }\n    });\n});\n\ntest(\"Gives correct terminal output for file watching\", async ({ page, bs }) => {\n    await page.goto(bs.url);\n    const prevCount = bs.stdout.length;\n    await bs.touch(\"index.html\");\n    const stdout = await bs.next({ stdout: { lines: { count: 1, after: prevCount } } });\n    expect(stdout).toContain(\"[Browsersync] Reloading Browsers...\\n\");\n});\n"
  },
  {
    "path": "tests/examples/tailwind/tailwind.spec.ts",
    "content": "import { expect } from \"@playwright/test\";\nimport { test, responseFor } from \"../../utils\";\n\ntest(\"startup writes CSS file\", async ({ page, bs }) => {\n    const [body] = await responseFor({\n        pathname: \"/dist/output.css\",\n        when: { page, loads: { url: bs.url } }\n    });\n    expect(body).toContain(`! tailwindcss`);\n});\n"
  },
  {
    "path": "tests/utils.ts",
    "content": "import { Page, test as base, Response as PlaywrightResponse } from \"@playwright/test\";\nimport { join, relative } from \"node:path\";\nimport { fork, execSync } from \"node:child_process\";\nimport * as z from \"zod\";\nimport strip from \"strip-ansi\";\n\nconst messageSchema = z.discriminatedUnion(\"kind\", [\n    z.object({\n        kind: z.literal(\"ready\"),\n        urls: z.object({\n            local: z.string(),\n            ui: z.string()\n        }),\n        cwd: z.string()\n    })\n]);\ntype Msg = z.infer<typeof messageSchema>;\n\ninterface NextArgs {\n    stdout: { lines: { count: number; after: number } };\n}\n\nexport const test = base.extend<{\n    bs: {\n        url: string;\n        cwd: string;\n        uiUrl: string;\n        child: any;\n        stdout: string[];\n        touch: (path: string) => void;\n        next: (args: NextArgs) => Promise<string[]>;\n    };\n}>({\n    bs: async ({}, use, testInfo) => {\n        const last2 = testInfo.file.split(\"/\").slice(-3, -1);\n        const cwd = process.cwd();\n        const base = join(cwd, ...last2);\n        const file = join(base, \"run.js\");\n        const stdout: string[] = [];\n\n        // console.log(\"running\", {\n        //     cwd,\n        //     base: relative(cwd, base),\n        //     file: relative(cwd, file),\n        //     testInfoFile: relative(cwd, testInfo.file)\n        // });\n\n        const child = fork(file, {\n            cwd: base,\n            stdio: \"pipe\"\n        });\n\n        child.stdout.on(\"data\", d => {\n            stdout.push(d.toString());\n            // console.log(d.toString());\n        });\n        child.stderr.on(\"data\", d => console.error(d.toString()));\n\n        const msg = await new Promise<Msg>((res, rej) => {\n            child.on(\"spawn\", (...args) => {\n                // console.log(\"✅ spawned\");\n            });\n            child.on(\"error\", error => {\n                rej(new Error(\"child process error\" + error));\n            });\n            child.on(\"message\", message => {\n                // console.log(\"📩 message\", message);\n                const parsed = messageSchema.safeParse(message);\n                if (parsed.success) {\n                    res(parsed.data);\n                } else {\n                    // @ts-expect-error - not sure why this is not working\n                    rej(new Error(\"zod parsing error\" + parsed.error));\n                }\n            });\n        });\n\n        // console.log(\"---\", msg.cwd);\n\n        const closed = new Promise<any>((res, rej) => {\n            child.on(\"exit\", code => {\n                // console.log(\"exit, code: \", code);\n            });\n            child.on(\"close\", code => {\n                // console.log(\"[child]: close\", code);\n                res(code);\n            });\n            child.on(\"disconnect\", (...args) => {\n                // console.log(\"disconnect\", ...args);\n            });\n        });\n\n        await use({\n            url: msg.urls.local,\n            uiUrl: msg.urls.ui,\n            cwd: msg.cwd,\n            child,\n            stdout,\n            touch: (path: string) => {\n                touchFile(join(msg.cwd, path));\n            },\n            next: async (args: NextArgs) => {\n                const {\n                    stdout: { lines }\n                } = args;\n                return new Promise<string[]>((res, rej) => {\n                    const timeout = setTimeout(() => {\n                        clearTimeout(timeout);\n                        clearInterval(int);\n                        rej(new Error(\"timeout\"));\n                    }, 2000);\n                    const int = setInterval(() => {\n                        if (stdout.length > lines.after) {\n                            const dif = stdout.length - lines.after;\n                            if (dif >= lines.count) {\n                                const next = stdout.slice(lines.after).map(line => {\n                                    return strip(line);\n                                });\n                                res(next);\n                                clearInterval(int);\n                            }\n                        }\n                    }, 100);\n                });\n            }\n        });\n\n        child.kill(\"SIGTERM\");\n\n        await closed;\n    }\n});\n\ninterface RequestForArgs {\n    matches:\n        | {\n              url: (url: URL) => boolean;\n          }\n        | {\n              pathname: string;\n          };\n    when?: {\n        pageLoads: {\n            url: string;\n        };\n    };\n}\n\nexport function makesRequestIn(page: Page, args: RequestForArgs) {\n    const { matches, when } = args;\n\n    if (\"pathname\" in matches) {\n        const requestPromise = new Promise(res => {\n            page.on(\"request\", r => {\n                const url = new URL(r.url());\n                if (url.pathname === matches.pathname) {\n                    res(url);\n                }\n            });\n        });\n        const jobs = [requestPromise];\n        if (when) {\n            jobs.push(page.goto(when.pageLoads.url));\n        }\n        const good = Promise.all(jobs);\n        return Promise.race([\n            good,\n            timeout({ msg: \"waiting for request timed out: \" + matches.pathname })\n        ]);\n    }\n\n    if (\"url\" in matches) {\n        const requestPromise = new Promise(res => {\n            page.on(\"request\", r => {\n                const url = new URL(r.url());\n                if (matches.url(url)) {\n                    res(url);\n                }\n            });\n        });\n\n        return Promise.race([requestPromise, timeout({ msg: \"waiting for request timed out\" })]);\n    }\n}\n\ninterface ResponseForArgs {\n    pathname: string;\n    when: { page: Page; loads: { url: string } };\n}\n\nexport async function responseFor(args: ResponseForArgs) {\n    const { when, pathname } = args;\n    const responseBody = new Promise<Buffer>(res => {\n        when.page.on(\"response\", r => {\n            const url = new URL(r.url());\n            if (url.pathname === pathname) {\n                res(r.body());\n            }\n        });\n    }).then(x => x.toString());\n\n    const load = when.page.goto(when.loads.url);\n    const good = Promise.all([responseBody, load]);\n    return Promise.race([good, timeout({ msg: \"waiting for response timed out: \" + pathname })]);\n}\n\nfunction timeout({ ms, msg }: { ms?: number; msg?: string } = {}): Promise<never> {\n    return new Promise((res, rej) =>\n        setTimeout(() => rej(new Error(msg || \"timedout\")), ms ?? 2000)\n    );\n}\n\nfunction touchFile(filePath) {\n    execSync(`touch ${filePath}`);\n}\n"
  }
]