[
  {
    "path": ".all-contributorsrc",
    "content": "{\n  \"files\": [\n    \"README.md\"\n  ],\n  \"imageSize\": 100,\n  \"commit\": false,\n  \"contributors\": [\n    {\n      \"login\": \"afshinm\",\n      \"name\": \"Afshin Mehrabani\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/314326?v=4\",\n      \"profile\": \"http://afshinm.name\",\n      \"contributions\": [\n        \"code\",\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"bozdoz\",\n      \"name\": \"bozdoz\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/1410985?v=4\",\n      \"profile\": \"https://bozdoz.com\",\n      \"contributions\": [\n        \"code\",\n        \"doc\"\n      ]\n    }\n  ],\n  \"contributorsPerLine\": 7,\n  \"projectName\": \"intro.js\",\n  \"projectOwner\": \"usablica\",\n  \"repoType\": \"github\",\n  \"repoHost\": \"https://github.com\",\n  \"skipCi\": true\n}\n"
  },
  {
    "path": ".browserslistrc",
    "content": "> 0.5%\nnot dead\n"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "content": "# Intro.js Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, gender identity and expression, level of experience,\nnationality, personal appearance, race, religion, or sexual identity and\norientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\nadvances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n  address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at <afshin.meh@gmail.com>. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contributing\n\nBy participating in this project, you agree to abide by the [code of conduct].\n\n[code of conduct]: https://github.com/usablica/intro.js/blob/master/CODE_OF_CONDUCT.md\n\n## Best Practices\n\nBefore you post any issue or pull request, search [the issues][issues] and [the pull requests][pulls] to see if it has already been addressed. \n\n[issues]: https://github.com/usablica/intro.js/issues\n[pulls]: https://github.com/usablica/intro.js/pulls\n\nHere are some best practices that will help us accept/address pull requests and issues:\n\n* Outline one, **and only one**, specific problem/feature that you are trying to address.\n* Write a **good title** that summarizes the specific problem.\n* Introduce the problem before you write any code.\n* **Help us reproduce the problem** if applicable with a [jsfiddle][jsfiddle]/[codepen][codepen] showcasing the need for a solution.\n\n[jsfiddle]: https://jsfiddle.net/\n[codepen]: https://codepen.io/\n\n## Pull Requests\n\nFork, then clone the repo:\n\n    git clone git@github.com:your-username/intro.js.git\n\nMake your changes and push to your fork and [submit a pull request][pr].\n\n[pr]: https://github.com/usablica/intro.js/compare\n\nAt this point you're waiting on us. We may suggest some changes or improvements or alternatives."
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "## Description\nDescribe one (and only one) issue or enhancement you want to see in Intro.js (before writing any code).\n\n## Expected Behavior\nWhat did you expect to happen?\n\n## Actual Behavior\nWhat actually happened?\n\n## Errors and Screenshots (optional)\nGive us any additional information if you have.\n\n## Example (recommended)\nHow can someone else see/test this issue?  List the steps or write some code; or create a jsfiddle or codepen.\n\n## Environment (optional)\nList browser information, Intro.js version, Operating System, JavaScript libraries (jQuery, Angular, React), etc.\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n- package-ecosystem: npm\n  directory: \"/\"\n  schedule:\n    interval: daily\n  open-pull-requests-limit: 10\n  ignore:\n  - dependency-name: postcss\n    versions:\n    - 8.2.10\n    - 8.2.12\n    - 8.2.5\n    - 8.2.6\n    - 8.2.7\n    - 8.2.9\n  - dependency-name: core-js\n    versions:\n    - 3.10.0\n    - 3.10.1\n    - 3.10.2\n    - 3.9.0\n  - dependency-name: eslint\n    versions:\n    - 7.20.0\n    - 7.21.0\n    - 7.23.0\n    - 7.24.0\n  - dependency-name: \"@babel/core\"\n    versions:\n    - 7.12.13\n    - 7.12.16\n    - 7.12.17\n    - 7.13.1\n    - 7.13.13\n    - 7.13.14\n    - 7.13.15\n    - 7.13.8\n  - dependency-name: y18n\n    versions:\n    - 4.0.1\n    - 4.0.2\n  - dependency-name: \"@babel/preset-env\"\n    versions:\n    - 7.12.13\n    - 7.12.16\n    - 7.12.17\n    - 7.13.0\n    - 7.13.10\n    - 7.13.5\n    - 7.13.8\n    - 7.13.9\n  - dependency-name: autoprefixer\n    versions:\n    - 10.2.3\n    - 10.2.4\n    - 10.2.5\n  - dependency-name: minify\n    versions:\n    - 7.0.0\n    - 7.0.1\n"
  },
  {
    "path": ".github/stale.yml",
    "content": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 60\n# Number of days of inactivity before a stale issue is closed\ndaysUntilClose: 10\n# Issues with these labels will never be considered stale\nexemptLabels:\n  - security\n  - feature\n  - roadmap\n  - bug\n  - feature request\n  - new feature\n# Label to use when marking an issue as stale\nstaleLabel: wontfix\n# Comment to post when marking an issue as stale. Set to `false` to disable\nmarkComment: >\n  This issue has been automatically marked as stale because it has not had\n  recent activity. It will be closed if no further activity occurs. Thank you\n  for your contributions.\n# Comment to post when closing a stale issue. Set to `false` to disable\ncloseComment: false\nonly: issues\n"
  },
  {
    "path": ".github/workflows/main.yaml",
    "content": "name: Compressed Size\n\non: [pull_request]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n    \n    strategy:\n      matrix:\n        node-version: [18.x]\n\n    steps:\n    - uses: actions/checkout@v2\n    - name: Use Node.js ${{ matrix.node-version }}\n      uses: actions/setup-node@v1\n      with:\n        node-version: ${{ matrix.node-version }}\n    - run: npm ci\n    - run: npm run build\n    - run: npm run test\n      env:\n        CI: true"
  },
  {
    "path": ".github/workflows/nodejs.yml",
    "content": "name: Node.js CI\n\non: [push]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [18.x]\n\n    steps:\n    - uses: actions/checkout@v2\n    - name: Use Node.js ${{ matrix.node-version }}\n      uses: actions/setup-node@v1\n      with:\n        node-version: ${{ matrix.node-version }}\n    - run: npm ci\n    - run: npm run build\n    - run: npm run test\n      env:\n        CI: true\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\n_site\n\n.idea\n.DS_Store\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\n\n# Dependencies\nnode_modules/\n\n# Coverage\ncoverage\n\n# Transpiled files\nbuild/\ndist/\n\n# VS Code\n.vscode\n!.vscode/tasks.js\n\n# JetBrains IDEs\n.idea/\n*.iml\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Lerna\n.changelog\n\n# Tests\ncypress/setup/dist\ncypress/videos/\ncypress/snapshots/actual\ncypress/snapshots/diff\n"
  },
  {
    "path": ".jshintignore",
    "content": "./dist\n./tests/cypress/setup/dist\n"
  },
  {
    "path": ".jshintrc",
    "content": "{\n  \"esversion\": 8,\n  \"undef\": true,\n  \"unused\": true,\n  \"eqeqeq\": true,\n  \"globals\": {\n    \"window\": true,\n    \"document\": true,\n    \"exports\": true,\n    \"define\": true,\n    \"SVGElement\": true,\n    \"Element\": true,\n    \"module\": true,\n    \"console\": true,\n    \"global\": true,\n    \"self\": true,\n    \"cy\": true,\n    \"context\": true,\n    \"setTimeout\": true,\n    \"clearTimeout\": true,\n    \"Cypress\": true,\n\n    \"afterAll\": false,\n    \"afterEach\": false,\n    \"beforeAll\": false,\n    \"beforeEach\": false,\n    \"check\": false,\n    \"describe\": false,\n    \"expect\": false,\n    \"gen\": false,\n    \"it\": false,\n    \"fit\": false,\n    \"jest\": false,\n    \"pit\": false,\n    \"require\": false,\n    \"test\": false,\n    \"xdescribe\": false,\n    \"xit\": false,\n    \"xtest\": false\n  }\n}\n"
  },
  {
    "path": "README.md",
    "content": "# Intro.js\n\n[![Build Status](https://travis-ci.org/usablica/intro.js.svg?branch=master)](https://travis-ci.org/usablica/intro.js)\n[![](https://data.jsdelivr.com/v1/package/npm/intro.js/badge)](https://www.jsdelivr.com/package/npm/intro.js)\n[![npm](https://img.shields.io/npm/dm/intro.js)](https://www.jsdelivr.com/package/npm/intro.js)\n\n> User Onboarding and Product Walkthrough Library\n\n<p align=\"center\">\n  <a href=\"https://introjs.com\">\n    <img src=\"https://raw.githubusercontent.com/usablica/intro.js/gh-pages/img/introjs-demo.png\">\n  </a>\n</p>\n\n## Where to get\nYou can obtain your local copy of Intro.js from:\n\n**1)** This GitHub repository, using ```git clone https://github.com/usablica/intro.js.git```\n\n**2)** Using yarn ```yarn add intro.js```\n\n**3)** Using npm ```npm install intro.js --save```\n\n**4)** Download it from CDN ([1](http://www.jsdelivr.com/projects/intro.js), [2](https://cdnjs.com/libraries/intro.js))\n\n## How to use\nIntro.js can be added to your site in three simple steps:\n\n**1)** Include `intro.js` and `introjs.css` (or the minified version for production) in your page. Use `introjs-rtl.min.css` for Right-to-Left language support.\n\n> CDN hosted files are available at [jsDelivr](http://www.jsdelivr.com/projects/intro.js) (click Show More) & [cdnjs](https://cdnjs.com/libraries/intro.js).\n\n**2)** Add `data-intro` and `data-step` to your HTML elements. To add hints you should use `data-hint` attribute.\n\nFor example:\n\n```html\n<a href='http://google.com/' data-intro='Hello step one!'></a>\n````\n\nSee all attributes [here](https://introjs.com/docs/intro/attributes/).\n\n**3)** Call this JavaScript function:\n```javascript\nintroJs().start();\n````\n\nOptionally, pass one parameter to `introJs` function to limit the presentation section.\n\n**For example** `introJs(\".introduction-farm\").start();` runs the introduction only for elements with `class='introduction-farm'`.\n\n## Documentation\n\nPlease visit [Documentation](http://introjs.com/docs).\n\n## Using with:\n\nIntro.js has many wrappers for different purposes. Please visit [Documentation](http://introjs.com/docs) for more info.\n\n## Build\n\nFirst you should install `nodejs` and `npm`, then first run this command: `npm install` to install all dependencies.\n\nNow you can run this command to minify all static resources:\n\n    npm run build\n\n## Contributors ✨\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"http://afshinm.name\"><img src=\"https://avatars3.githubusercontent.com/u/314326?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Afshin Mehrabani</b></sub></a><br /><a href=\"https://github.com/usablica/intro.js/commits?author=afshinm\" title=\"Code\">💻</a> <a href=\"https://github.com/usablica/intro.js/commits?author=afshinm\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://bozdoz.com\"><img src=\"https://avatars0.githubusercontent.com/u/1410985?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>bozdoz</b></sub></a><br /><a href=\"https://github.com/usablica/intro.js/commits?author=bozdoz\" title=\"Code\">💻</a> <a href=\"https://github.com/usablica/intro.js/commits?author=bozdoz\" title=\"Documentation\">📖</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\n## Support/Discussion\n- [Stackoverflow](http://stackoverflow.com/questions/tagged/intro.js)\n\n## Usage Trends\n- [Usage Trends of Product Walkthrough Libraries](https://npm-compare.com/intro.js,@reactour/tour,driver.js,vue-tour)\n\n## License\n\n### Commercial license\n\nIf you want to use Intro.js for a commercial application, theme or plugin the commercial license is the appropriate license. With this option, your source code is kept proprietary. Purchase a commercial license at [introjs.com](http://introjs.com/#commercial)\n\n### Open-source license\n\nGNU AGPLv3\n"
  },
  {
    "path": "babel.config.js",
    "content": "module.exports = {\n  \"env\": {\n    test: {\n      presets: [\n        [\n          \"@babel/env\",\n        ]\n      ]\n    }\n  },\n  \"presets\": [\n    [\"@babel/preset-typescript\", {}],\n    [\n      \"@babel/env\",\n      {\n        modules: false,\n        useBuiltIns: \"usage\",\n        forceAllTransforms: true,\n        corejs: {\n          version: 3,\n          proposals: false\n        }\n      }\n    ]\n  ]\n}\n"
  },
  {
    "path": "bin/release.sh",
    "content": "#!/bin/bash\n\nset -xe\n\n#\n# Script for releasing new versions\n# Handles version updating and publishing to:\n# \t- GitHub\n# \t- NPM\n#\n\nDIST_FOLDER=\"./dist\"\n\nfunction cleanup() {\n    rm -rf \"$DIST_FOLDER\"\n}\n\ntrap cleanup EXIT\n\nmkdir -p \"$DIST_FOLDER\"\nnpm run build\n\n# check package version\nVERSION=$(node --eval \"console.log(require('./package.json').version);\")\n\nLAST=$(git describe --abbrev=0)\n\nif [[ v$VERSION == \"$LAST\" ]]; then\n\techo \"Update version in package.json!\"\n\texit 1\nfi\n\n# check javascript version\nVERSION=$(node --eval \"document = {}; console.log(require('$DIST_FOLDER/intro.js').version);\")\n\nif [[ v$VERSION == \"$LAST\" ]]; then\n\techo \"Update version in ./intro.js!\"\n\texit 1\nfi\n\nnpm test\n\n# this is an attempt to preserve backward compatibility\n# it can be replaced with package.json \"exports\" once it's stable\ncp \"./package.json\" \"$DIST_FOLDER\"\ncp ./*.md \"$DIST_FOLDER\"\ncp -r \"themes\" \"$DIST_FOLDER\"\n\npushd $DIST_FOLDER\n\necho \"New Version: $LAST => v$VERSION\"\necho \"---\"\n\nnpm publish --dry-run\n\necho \"Publish? (type yes or no)\"\nread confirm\n\nif [[ $confirm == \"yes\" ]]; then\n    echo \"Publishing...\"\n\n    git tag \"v$VERSION\"\n    git push --tags\n\n    npm publish\nelse\n  echo \"Skipping the publish procedure\"\nfi\n\npopd\n"
  },
  {
    "path": "component.json",
    "content": "{\n  \"name\": \"intro.js\",\n  \"repo\": \"usablica/intro.js\",\n  \"description\": \"Lightweight, user-friendly onboarding tour library\",\n  \"version\": \"8.3.2\",\n  \"main\": \"intro.js\",\n  \"scripts\": [\n    \"intro.js\"\n  ],\n  \"styles\": [\n    \"introjs.css\"\n  ]\n}\n"
  },
  {
    "path": "cypress/plugins/index.ts",
    "content": "module.exports = (on, config) => {\n  const getCompareSnapshotsPlugin = require(\"cypress-visual-regression/dist/plugin\");\n  getCompareSnapshotsPlugin(on, config);\n};\n"
  },
  {
    "path": "cypress/setup/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <!-- Required meta tags -->\n    <meta charset=\"utf-8\" />\n    <title>Intro.js</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n    <!-- Bootstrap CSS -->\n    <link\n      href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/css/bootstrap.min.css\"\n      rel=\"stylesheet\"\n      integrity=\"sha384-wEmeIV1mKuiNpC+IOBjI7aAzPcEZeedi5yW5f2yOq55WWLwNGmvvx4Um1vskeMj0\"\n      crossorigin=\"anonymous\"\n    />\n\n    <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" />\n    <link\n      href=\"https://fonts.googleapis.com/css2?family=Roboto&display=swap\"\n      rel=\"stylesheet\"\n    />\n\n    <link href=\"http://localhost:10001/dist/introjs.css\" rel=\"stylesheet\" />\n    <link href=\"http://host.docker.internal:10001/dist/introjs.css\" rel=\"stylesheet\" />\n\n    <style type=\"text/css\">\n      body,\n      h1,\n      h2,\n      h3,\n      h4,\n      h5,\n      h6,\n      .h1,\n      .h2,\n      .h3,\n      .h4,\n      .h5,\n      .h6 {\n        font-family: \"Roboto\" !important;\n      }\n    </style>\n\n    <title>Hello, world!</title>\n  </head>\n  <body>\n    <main>\n      <div class=\"container py-4\">\n        <header\n          id=\"fixed-parent\"\n          class=\"pb-3 mb-4 border-bottom\"\n          style=\"position: fixed\"\n          data-hint=\"fixed header\"\n        >\n          <a\n            id=\"fixed\"\n            href=\"/\"\n            class=\"d-flex align-items-center text-dark text-decoration-none\"\n          >\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              width=\"40\"\n              height=\"32\"\n              class=\"me-2\"\n              viewBox=\"0 0 118 94\"\n              role=\"img\"\n            >\n              <title>Bootstrap</title>\n              <path\n                fill-rule=\"evenodd\"\n                clip-rule=\"evenodd\"\n                d=\"M24.509 0c-6.733 0-11.715 5.893-11.492 12.284.214 6.14-.064 14.092-2.066 20.577C8.943 39.365 5.547 43.485 0 44.014v5.972c5.547.529 8.943 4.649 10.951 11.153 2.002 6.485 2.28 14.437 2.066 20.577C12.794 88.106 17.776 94 24.51 94H93.5c6.733 0 11.714-5.893 11.491-12.284-.214-6.14.064-14.092 2.066-20.577 2.009-6.504 5.396-10.624 10.943-11.153v-5.972c-5.547-.529-8.934-4.649-10.943-11.153-2.002-6.484-2.28-14.437-2.066-20.577C105.214 5.894 100.233 0 93.5 0H24.508zM80 57.863C80 66.663 73.436 72 62.543 72H44a2 2 0 01-2-2V24a2 2 0 012-2h18.437c9.083 0 15.044 4.92 15.044 12.474 0 5.302-4.01 10.049-9.119 10.88v.277C75.317 46.394 80 51.21 80 57.863zM60.521 28.34H49.948v14.934h8.905c6.884 0 10.68-2.772 10.68-7.727 0-4.643-3.264-7.207-9.012-7.207zM49.948 49.2v16.458H60.91c7.167 0 10.964-2.876 10.964-8.281 0-5.406-3.903-8.178-11.425-8.178H49.948z\"\n                fill=\"currentColor\"\n              ></path>\n            </svg>\n            <span class=\"fs-4\">Jumbotron example</span>\n          </a>\n        </header>\n\n        <div class=\"mt-5 p-5 mb-4 bg-light rounded-3\">\n          <div class=\"container-fluid py-5\" id=\"main-section\">\n            <h1 class=\"display-5 fw-bold\" data-intro=\"first header step\">\n              Custom jumbotron\n            </h1>\n            <p class=\"col-md-8 fs-4\" data-intro=\"second paragraph step\">\n              Using a series of utilities, you can create this jumbotron, just\n              like the one in previous versions of Bootstrap. Check out the\n              examples below for how you can remix and restyle it to your\n              liking.\n            </p>\n            <button\n              class=\"btn btn-primary btn-lg\"\n              type=\"button\"\n              id=\"clickable-button\"\n              data-hint=\"a button\"\n              onclick=\"window.click()\"\n              onmouseover=\"this.innerHTML='Hovered'\"\n            >\n              Example button\n            </button>\n          </div>\n        </div>\n\n        <div class=\"row align-items-md-stretch\">\n          <div class=\"col-md-6\">\n            <div\n              class=\"h-100 p-5 text-white bg-dark rounded-3\"\n              id=\"relative-parent\"\n              style=\"position: relative\"\n            >\n              <h2 data-intro=\"third header step\">Change the background</h2>\n              <p>\n                Swap the background-color utility and add a `.text-*` color\n                utility to mix up the jumbotron look. Then, mix and match with\n                additional component themes and more.\n              </p>\n              <button\n                class=\"btn btn-outline-light\"\n                type=\"button\"\n                id=\"clickable-relative-button\"\n                onclick=\"window.clickRelative()\"\n                onmouseover=\"this.innerHTML='Hovered Relative'\"\n              >\n                Example button\n              </button>\n            </div>\n          </div>\n          <div class=\"col-md-6\">\n            <div\n              class=\"h-100 p-5 bg-light border rounded-3\"\n              id=\"absolute-parent\"\n              style=\"position: absolute\"\n            >\n              <h2 data-intro=\"fourth header step\" data-hint=\"secondary header\">\n                Add borders\n              </h2>\n              <p>\n                Or, keep it light and add a border for some added definition to\n                the boundaries of your content. Be sure to look under the hood\n                at the source HTML here as we've adjusted the alignment and\n                sizing of both column's content for equal-height.\n              </p>\n              <button\n                class=\"btn btn-outline-secondary\"\n                type=\"button\"\n                id=\"clickable-absolute-button\"\n                onclick=\"window.clickAbsolute()\"\n                onmouseover=\"this.innerHTML='Hovered Absolute'\"\n              >\n                Example button\n              </button>\n            </div>\n          </div>\n        </div>\n\n        <footer\n          class=\"pt-3 mt-4 text-muted border-top\"\n          data-hint=\"this is the footer\"\n        >\n          &copy; 2021\n        </footer>\n      </div>\n    </main>\n\n    <script\n      src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/js/bootstrap.bundle.min.js\"\n      integrity=\"sha384-p34f1UUtsS3wqzfto5wAAmdvj+osOnFyQFpp4Ua3gs/ZVWx6oOypYoCJhGGScy+8\"\n      crossorigin=\"anonymous\"\n    ></script>\n\n    <script type=\"text/javascript\">\n      window.click = function () {\n        console.log(1);\n      };\n      window.clickRelative = function () {\n        console.log(2);\n      };\n      window.clickAbsolute = function () {\n        console.log(3);\n      };\n    </script>\n    <script type=\"text/javascript\" src=\"http://localhost:10001/dist/intro.js\"></script>\n    <script type=\"text/javascript\" src=\"http://host.docker.internal:10001/dist/intro.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "cypress/support/index.d.ts",
    "content": "\ndeclare namespace Cypress {\n  interface Chainable<Subject = any>{\n    nextStep(): Chainable<any>;\n    prevStep(): Chainable<any>;\n  }\n  interface Window {\n    introJs: any;\n    click: () => void;\n    clickRelative: () => void;\n    clickAbsolute: () => void;\n  }\n}\n"
  },
  {
    "path": "cypress/support/index.ts",
    "content": "/// <reference types=\"./index.d.ts\" />\n\nimport { addCompareSnapshotCommand } from \"cypress-visual-regression/dist/command\";\n\naddCompareSnapshotCommand({\n  capture: \"fullPage\",\n  errorThreshold: 0.09,\n});\n\nCypress.Commands.add(\"nextStep\", () => {\n  cy.get(\".introjs-nextbutton\").click();\n});\n\nCypress.Commands.add(\"prevStep\", () => {\n  cy.get(\".introjs-prevbutton\").click();\n});\n\nCypress.on(\"window:before:load\", (win) => {\n  const htmlNode = win.document.querySelector(\"html\");\n  const node = win.document.createElement(\"style\");\n  node.innerHTML = \"html { scroll-behavior: inherit !important; }\";\n  htmlNode?.appendChild(node);\n});\n\nimport \"cypress-real-events/support\";\n"
  },
  {
    "path": "cypress.config.ts",
    "content": "import { defineConfig } from \"cypress\";\nimport { configureVisualRegression } from \"cypress-visual-regression\";\n\nmodule.exports = defineConfig({\n  viewportWidth: 1000,\n  trashAssetsBeforeRuns: true,\n  env: {\n    visualRegressionFailSilently: false,\n  },\n  e2e: {\n    screenshotsFolder: \"./cypress/snapshots/actual\",\n    supportFile: \"./cypress/support/index.ts\",\n    specPattern: \"**/*.*cy.*\",\n    setupNodeEvents(on, config) {\n      configureVisualRegression(on);\n\n      return config;\n    },\n  },\n});\n"
  },
  {
    "path": "docs/readme.md",
    "content": "## Moved to https://introjs.com/docs (repo: https://github.com/usablica/introjs-website)\n"
  },
  {
    "path": "example/RTL/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Handling \"Right To Left\" languages</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n    <!-- Add IntroJs RTL styles -->\n    <link href=\"../../dist/introjs-rtl.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n\n    <style type=\"text/css\">\n      a, .introjs-tooltiptext {\n        font-family: 'tahoma' !important;\n      }\n    </style>\n\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\" data-step=\"5\" data-intro=\"دانلود کن\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-step=\"1\" data-title=\"یک عنوان کوتاه\" data-intro=\"ویکی‌پدیا مقاله‌های رایگانی را ارائه می‌دهد که برای توزیع بیشتر در نظر گرفته شده‌اند و می‌توان آن‌ها را در زیر مدخل‌های واژگانی (لم) و همچنین پورتال‌ها بر اساس حوزه‌های موضوعی و فهرست‌های موضوعی یافت.\">RTL Style</h1>\n        <p class=\"lead\" data-step=\"4\"data-intro=\"یک مرحله دیگه\">This is the <abbr lang=\"en\" title=\"Right To Left\">RTL</abbr> version of IntroJs which includes an addition CSS file to perform the RTL style.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:introJs.tour().setOptions({ 'nextLabel': 'بعد', 'prevLabel': 'قبل', 'doneLabel': 'اتمام' }).start();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\" data-step=\"2\" data-title=\"عنوانی بسیار طولانی که حاوی مقدار زیادی متن غیر ضروری است به طوری که عنوان در چندین خط قرار می گیرد\" data-intro=\"باحال نیست؟\" data-position='right'>\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n        </div>\n\n        <div class=\"span6\" data-step=\"3\" data-intro=\"امکانات بیشتر\"  data-position='left'>\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n        </div>\n      </div>\n\n      <hr>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/assets/css/demo.css",
    "content": "@import url(https://fonts.googleapis.com/css?family=Raleway);\n\nbody {\n  padding-top: 20px;\n  font-family: 'Raleway', sans-serif;\n  padding-bottom: 40px;\n}\n\n/* Custom container */\n.container-narrow {\n  margin: 0 auto;\n  max-width: 700px;\n}\n.container-narrow > hr {\n  margin: 30px 0;\n}\n\n/* Main marketing message and sign up button */\n.jumbotron {\n  margin: 60px 0;\n  text-align: center;\n}\n.jumbotron h1 {\n  font-size: 72px;\n  line-height: 1;\n}\n.jumbotron .btn {\n  font-size: 21px;\n  padding: 14px 24px;\n}\n\n/* Supporting marketing content */\n.marketing {\n  margin: 60px 0;\n}\n.marketing p + h4 {\n  margin-top: 28px;\n}\n"
  },
  {
    "path": "example/auto-position/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Auto Positioning</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n\t<script>\n\t\tfunction startTour() {\n\t\t\tvar tour = introJs.tour()\n\t\t\ttour.setOption('tooltipPosition', 'auto');\n\t\t\ttour.setOption('positionPrecedence', ['left', 'right', 'top', 'bottom']);\n\t\t\ttour.start();\n\t\t}\n\n\t</script>\n  <style>\n    .jumbotron {\n      max-width: 700px;\n      margin: 0 auto;\n    }\n  </style>\n  </head>\n\n  <body>\n\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\" data-step=\"8\" data-intro=\"Get it, use it.\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-step=\"1\" data-intro=\"This is a tooltip!\">Auto Positioning</h1>\n        <p class=\"lead\" data-step=\"7\" data-intro=\"Another step.\">This is IntroJs with <code>tooltipPosition</code> set to <code>auto</code>.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:startTour();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\" data-step=\"2\" data-intro=\"Ok, wasn't that fun?\">\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n\n        <div class=\"span6\" data-step=\"3\" data-intro=\"More features, more fun.\">\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n        </div>\n\n\t\t<div style='height:1000px'></div>\n\t\t<div class=\"span6\" data-step=\"4\" data-intro=\"A step we need to scroll to\">\n\t\t\t<h4>Section Seven</h4>\n\t\t\t<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\t\t</div>\n\n\t\t<div style='height:1000px'></div>\n\t\t<div class=\"span6\" data-step=\"5\" data-intro=\"We want this one to be on top\" data-position=\"top\">\n\t\t\t<h4>Section Eight</h4>\n\t\t\t<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\t\t</div>\n\n\n\t\t<div style='height:1000px'></div>\n\t\t<div class=\"span6\" data-step=\"6\" data-intro=\"We want this one to be on the left, but it won't fit\" data-position=\"left\">\n\t\t\t<h4>Section Nine</h4>\n\t\t\t<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\t\t</div>\n      </div>\n\n      <hr>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/bootstrap/v3/.gitignore",
    "content": "node_modules"
  },
  {
    "path": "example/bootstrap/v3/LICENSE",
    "content": "\nThe MIT License (MIT)\n\nCopyright (c) 2013-2016 Blackrock Digital LLC.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "example/bootstrap/v3/README.md",
    "content": "# [Start Bootstrap](http://startbootstrap.com/) - [Agency](http://startbootstrap.com/template-overviews/agency/)\n\n[Agency](http://startbootstrap.com/template-overviews/agency/) is a one page agency portfolio theme for [Bootstrap](http://getbootstrap.com/) created by [Start Bootstrap](http://startbootstrap.com/). This theme features several content sections, a responsive portfolio grid with hover effects, full page portfolio item modals, a responsive timeline, and a working PHP contact form.\n\n## Getting Started\n\nSeveral options are available to get started quickly:\n* [Download the latest release on Start Bootstrap](http://startbootstrap.com/template-overviews/agency/)\n* Clone the repo: `git clone https://github.com/BlackrockDigital/startbootstrap-agency.git`\n* Fork the repo\n\n## Developing Using Source Files\n\nTo use the source files, you will need to have npm installed globally along with Gulp.js. To start:\n* Run `npm install` in the root directory\n* Run `gulp dev` and edit the files as needed\n\nIf you need to update the plugins included with this template, simply run the following tasks:\n* First run `npm update` to update the dependencies\n* Then run `gulp copy` to copy the new versions to their proper destinations\n\n## Bugs and Issues\n\nHave a bug or an issue with this template? [Open a new issue](https://github.com/BlackrockDigital/startbootstrap-agency/issues) here on GitHub or leave a comment on the [template overview page at Start Bootstrap](http://startbootstrap.com/template-overviews/agency/).\n\n## Creator\n\nStart Bootstrap was created by and is maintained by **[David Miller](http://davidmiller.io/)**, Owner of [Blackrock Digital](http://blackrockdigital.io/).\n\n* https://twitter.com/davidmillerskt\n* https://github.com/davidtmiller\n\nStart Bootstrap is based on the [Bootstrap](http://getbootstrap.com/) framework created by [Mark Otto](https://twitter.com/mdo) and [Jacob Thorton](https://twitter.com/fat).\n\n## Copyright and License\n\nCopyright 2013-2016 Blackrock Digital LLC. Code released under the [MIT](https://github.com/BlackrockDigital/startbootstrap-agency/blob/gh-pages/LICENSE) license."
  },
  {
    "path": "example/bootstrap/v3/css/agency.css",
    "content": "/*!\n * Start Bootstrap - Agency v1.1.1 (http://startbootstrap.com/template-overviews/agency)\n * Copyright 2013-2016 Start Bootstrap\n * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE)\n */\nbody {\n  overflow-x: hidden;\n  font-family: \"Roboto Slab\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n.text-muted {\n  color: #777777;\n}\n.text-primary {\n  color: #fed136;\n}\np {\n  font-size: 14px;\n  line-height: 1.75;\n}\np.large {\n  font-size: 16px;\n}\na,\na:hover,\na:focus,\na:active,\na.active {\n  outline: none;\n}\na {\n  color: #fed136;\n}\na:hover,\na:focus,\na:active,\na.active {\n  color: #fec503;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: uppercase;\n  font-weight: 700;\n}\n.img-centered {\n  margin: 0 auto;\n}\n.bg-light-gray {\n  background-color: #eeeeee;\n}\n.bg-darkest-gray {\n  background-color: #222222;\n}\n.btn-primary {\n  color: white;\n  background-color: #fed136;\n  border-color: #fed136;\n  font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: uppercase;\n  font-weight: 700;\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: white;\n  background-color: #fec503;\n  border-color: #f6bf01;\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: #fed136;\n  border-color: #fed136;\n}\n.btn-primary .badge {\n  color: #fed136;\n  background-color: white;\n}\n.btn-xl {\n  color: white;\n  background-color: #fed136;\n  border-color: #fed136;\n  font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: uppercase;\n  font-weight: 700;\n  border-radius: 3px;\n  font-size: 18px;\n  padding: 20px 40px;\n}\n.btn-xl:hover,\n.btn-xl:focus,\n.btn-xl:active,\n.btn-xl.active,\n.open .dropdown-toggle.btn-xl {\n  color: white;\n  background-color: #fec503;\n  border-color: #f6bf01;\n}\n.btn-xl:active,\n.btn-xl.active,\n.open .dropdown-toggle.btn-xl {\n  background-image: none;\n}\n.btn-xl.disabled,\n.btn-xl[disabled],\nfieldset[disabled] .btn-xl,\n.btn-xl.disabled:hover,\n.btn-xl[disabled]:hover,\nfieldset[disabled] .btn-xl:hover,\n.btn-xl.disabled:focus,\n.btn-xl[disabled]:focus,\nfieldset[disabled] .btn-xl:focus,\n.btn-xl.disabled:active,\n.btn-xl[disabled]:active,\nfieldset[disabled] .btn-xl:active,\n.btn-xl.disabled.active,\n.btn-xl[disabled].active,\nfieldset[disabled] .btn-xl.active {\n  background-color: #fed136;\n  border-color: #fed136;\n}\n.btn-xl .badge {\n  color: #fed136;\n  background-color: white;\n}\n.navbar-custom {\n  background-color: #222222;\n  border-color: transparent;\n}\n.navbar-custom .navbar-brand {\n  color: #fed136;\n  font-family: \"Kaushan Script\", \"Helvetica Neue\", Helvetica, Arial, cursive;\n}\n.navbar-custom .navbar-brand:hover,\n.navbar-custom .navbar-brand:focus,\n.navbar-custom .navbar-brand:active,\n.navbar-custom .navbar-brand.active {\n  color: #fec503;\n}\n.navbar-custom .navbar-collapse {\n  border-color: rgba(255, 255, 255, 0.02);\n}\n.navbar-custom .navbar-toggle {\n  background-color: #fed136;\n  border-color: #fed136;\n  font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: uppercase;\n  color: white;\n  font-size: 12px;\n}\n.navbar-custom .navbar-toggle:hover,\n.navbar-custom .navbar-toggle:focus {\n  background-color: #fed136;\n}\n.navbar-custom .nav li a {\n  font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: uppercase;\n  font-weight: 400;\n  letter-spacing: 1px;\n  color: white;\n}\n.navbar-custom .nav li a:hover,\n.navbar-custom .nav li a:focus {\n  color: #fed136;\n  outline: none;\n}\n.navbar-custom .navbar-nav > .active > a {\n  border-radius: 0;\n  color: white;\n  background-color: #fed136;\n}\n.navbar-custom .navbar-nav > .active > a:hover,\n.navbar-custom .navbar-nav > .active > a:focus {\n  color: white;\n  background-color: #fec503;\n}\n@media (min-width: 768px) {\n  .navbar-custom {\n    background-color: transparent;\n    padding: 25px 0;\n    -webkit-transition: padding 0.3s;\n    -moz-transition: padding 0.3s;\n    transition: padding 0.3s;\n    border: none;\n  }\n  .navbar-custom .navbar-brand {\n    font-size: 2em;\n    -webkit-transition: all 0.3s;\n    -moz-transition: all 0.3s;\n    transition: all 0.3s;\n  }\n  .navbar-custom .navbar-nav > .active > a {\n    border-radius: 3px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-custom.affix {\n    background-color: #222222;\n    padding: 10px 0;\n  }\n  .navbar-custom.affix .navbar-brand {\n    font-size: 1.5em;\n  }\n}\nheader {\n  background-image: url('../img/header-bg.jpg');\n  background-repeat: no-repeat;\n  background-attachment: scroll;\n  background-position: center center;\n  -webkit-background-size: cover;\n  -moz-background-size: cover;\n  background-size: cover;\n  -o-background-size: cover;\n  text-align: center;\n  color: white;\n}\nheader .intro-text {\n  padding-top: 100px;\n  padding-bottom: 50px;\n}\nheader .intro-text .intro-lead-in {\n  font-family: \"Droid Serif\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-style: italic;\n  font-size: 22px;\n  line-height: 22px;\n  margin-bottom: 25px;\n}\nheader .intro-text .intro-heading {\n  font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: uppercase;\n  font-weight: 700;\n  font-size: 50px;\n  line-height: 50px;\n  margin-bottom: 25px;\n}\n@media (min-width: 768px) {\n  header .intro-text {\n    padding-top: 300px;\n    padding-bottom: 200px;\n  }\n  header .intro-text .intro-lead-in {\n    font-family: \"Droid Serif\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n    font-style: italic;\n    font-size: 40px;\n    line-height: 40px;\n    margin-bottom: 25px;\n  }\n  header .intro-text .intro-heading {\n    font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n    text-transform: uppercase;\n    font-weight: 700;\n    font-size: 75px;\n    line-height: 75px;\n    margin-bottom: 50px;\n  }\n}\nsection {\n  padding: 100px 0;\n}\nsection h2.section-heading {\n  font-size: 40px;\n  margin-top: 0;\n  margin-bottom: 15px;\n}\nsection h3.section-subheading {\n  font-size: 16px;\n  font-family: \"Droid Serif\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: none;\n  font-style: italic;\n  font-weight: 400;\n  margin-bottom: 75px;\n}\n@media (min-width: 768px) {\n  section {\n    padding: 150px 0;\n  }\n}\n.service-heading {\n  margin: 15px 0;\n  text-transform: none;\n}\n#portfolio .portfolio-item {\n  margin: 0 0 15px;\n  right: 0;\n}\n#portfolio .portfolio-item .portfolio-link {\n  display: block;\n  position: relative;\n  max-width: 400px;\n  margin: 0 auto;\n}\n#portfolio .portfolio-item .portfolio-link .portfolio-hover {\n  background: rgba(254, 209, 54, 0.9);\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  transition: all ease 0.5s;\n  -webkit-transition: all ease 0.5s;\n  -moz-transition: all ease 0.5s;\n}\n#portfolio .portfolio-item .portfolio-link .portfolio-hover:hover {\n  opacity: 1;\n}\n#portfolio .portfolio-item .portfolio-link .portfolio-hover .portfolio-hover-content {\n  position: absolute;\n  width: 100%;\n  height: 20px;\n  font-size: 20px;\n  text-align: center;\n  top: 50%;\n  margin-top: -12px;\n  color: white;\n}\n#portfolio .portfolio-item .portfolio-link .portfolio-hover .portfolio-hover-content i {\n  margin-top: -12px;\n}\n#portfolio .portfolio-item .portfolio-link .portfolio-hover .portfolio-hover-content h3,\n#portfolio .portfolio-item .portfolio-link .portfolio-hover .portfolio-hover-content h4 {\n  margin: 0;\n}\n#portfolio .portfolio-item .portfolio-caption {\n  max-width: 400px;\n  margin: 0 auto;\n  background-color: white;\n  text-align: center;\n  padding: 25px;\n}\n#portfolio .portfolio-item .portfolio-caption h4 {\n  text-transform: none;\n  margin: 0;\n}\n#portfolio .portfolio-item .portfolio-caption p {\n  font-family: \"Droid Serif\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-style: italic;\n  font-size: 16px;\n  margin: 0;\n}\n#portfolio * {\n  z-index: 2;\n}\n@media (min-width: 767px) {\n  #portfolio .portfolio-item {\n    margin: 0 0 30px;\n  }\n}\n.timeline {\n  list-style: none;\n  padding: 0;\n  position: relative;\n}\n.timeline:before {\n  top: 0;\n  bottom: 0;\n  position: absolute;\n  content: \"\";\n  width: 2px;\n  background-color: #f1f1f1;\n  left: 40px;\n  margin-left: -1.5px;\n}\n.timeline > li {\n  margin-bottom: 50px;\n  position: relative;\n  min-height: 50px;\n}\n.timeline > li:before,\n.timeline > li:after {\n  content: \" \";\n  display: table;\n}\n.timeline > li:after {\n  clear: both;\n}\n.timeline > li .timeline-panel {\n  width: 100%;\n  float: right;\n  padding: 0 20px 0 100px;\n  position: relative;\n  text-align: left;\n}\n.timeline > li .timeline-panel:before {\n  border-left-width: 0;\n  border-right-width: 15px;\n  left: -15px;\n  right: auto;\n}\n.timeline > li .timeline-panel:after {\n  border-left-width: 0;\n  border-right-width: 14px;\n  left: -14px;\n  right: auto;\n}\n.timeline > li .timeline-image {\n  left: 0;\n  margin-left: 0;\n  width: 80px;\n  height: 80px;\n  position: absolute;\n  z-index: 100;\n  background-color: #fed136;\n  color: white;\n  border-radius: 100%;\n  border: 7px solid #f1f1f1;\n  text-align: center;\n}\n.timeline > li .timeline-image h4 {\n  font-size: 10px;\n  margin-top: 12px;\n  line-height: 14px;\n}\n.timeline > li.timeline-inverted > .timeline-panel {\n  float: right;\n  text-align: left;\n  padding: 0 20px 0 100px;\n}\n.timeline > li.timeline-inverted > .timeline-panel:before {\n  border-left-width: 0;\n  border-right-width: 15px;\n  left: -15px;\n  right: auto;\n}\n.timeline > li.timeline-inverted > .timeline-panel:after {\n  border-left-width: 0;\n  border-right-width: 14px;\n  left: -14px;\n  right: auto;\n}\n.timeline > li:last-child {\n  margin-bottom: 0;\n}\n.timeline .timeline-heading h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.timeline .timeline-heading h4.subheading {\n  text-transform: none;\n}\n.timeline .timeline-body > p,\n.timeline .timeline-body > ul {\n  margin-bottom: 0;\n}\n@media (min-width: 768px) {\n  .timeline:before {\n    left: 50%;\n  }\n  .timeline > li {\n    margin-bottom: 100px;\n    min-height: 100px;\n  }\n  .timeline > li .timeline-panel {\n    width: 41%;\n    float: left;\n    padding: 0 20px 20px 30px;\n    text-align: right;\n  }\n  .timeline > li .timeline-image {\n    width: 100px;\n    height: 100px;\n    left: 50%;\n    margin-left: -50px;\n  }\n  .timeline > li .timeline-image h4 {\n    font-size: 13px;\n    margin-top: 16px;\n    line-height: 18px;\n  }\n  .timeline > li.timeline-inverted > .timeline-panel {\n    float: right;\n    text-align: left;\n    padding: 0 30px 20px 20px;\n  }\n}\n@media (min-width: 992px) {\n  .timeline > li {\n    min-height: 150px;\n  }\n  .timeline > li .timeline-panel {\n    padding: 0 20px 20px;\n  }\n  .timeline > li .timeline-image {\n    width: 150px;\n    height: 150px;\n    margin-left: -75px;\n  }\n  .timeline > li .timeline-image h4 {\n    font-size: 18px;\n    margin-top: 30px;\n    line-height: 26px;\n  }\n  .timeline > li.timeline-inverted > .timeline-panel {\n    padding: 0 20px 20px;\n  }\n}\n@media (min-width: 1200px) {\n  .timeline > li {\n    min-height: 170px;\n  }\n  .timeline > li .timeline-panel {\n    padding: 0 20px 20px 100px;\n  }\n  .timeline > li .timeline-image {\n    width: 170px;\n    height: 170px;\n    margin-left: -85px;\n  }\n  .timeline > li .timeline-image h4 {\n    margin-top: 40px;\n  }\n  .timeline > li.timeline-inverted > .timeline-panel {\n    padding: 0 100px 20px 20px;\n  }\n}\n.team-member {\n  text-align: center;\n  margin-bottom: 50px;\n}\n.team-member img {\n  margin: 0 auto;\n  border: 7px solid white;\n}\n.team-member h4 {\n  margin-top: 25px;\n  margin-bottom: 0;\n  text-transform: none;\n}\n.team-member p {\n  margin-top: 0;\n}\naside.clients img {\n  margin: 50px auto;\n}\nsection#contact {\n  background-color: #222222;\n  background-image: url('../img/map-image.png');\n  background-position: center;\n  background-repeat: no-repeat;\n}\nsection#contact .section-heading {\n  color: white;\n}\nsection#contact .form-group {\n  margin-bottom: 25px;\n}\nsection#contact .form-group input,\nsection#contact .form-group textarea {\n  padding: 20px;\n}\nsection#contact .form-group input.form-control {\n  height: auto;\n}\nsection#contact .form-group textarea.form-control {\n  height: 236px;\n}\nsection#contact .form-control:focus {\n  border-color: #fed136;\n  box-shadow: none;\n}\nsection#contact ::-webkit-input-placeholder {\n  font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: uppercase;\n  font-weight: 700;\n  color: #eeeeee;\n}\nsection#contact :-moz-placeholder {\n  /* Firefox 18- */\n  font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: uppercase;\n  font-weight: 700;\n  color: #eeeeee;\n}\nsection#contact ::-moz-placeholder {\n  /* Firefox 19+ */\n  font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: uppercase;\n  font-weight: 700;\n  color: #eeeeee;\n}\nsection#contact :-ms-input-placeholder {\n  font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: uppercase;\n  font-weight: 700;\n  color: #eeeeee;\n}\nsection#contact .text-danger {\n  color: #e74c3c;\n}\nfooter {\n  padding: 25px 0;\n  text-align: center;\n}\nfooter span.copyright {\n  line-height: 40px;\n  font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: uppercase;\n  text-transform: none;\n}\nfooter ul.quicklinks {\n  margin-bottom: 0;\n  line-height: 40px;\n  font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: uppercase;\n  text-transform: none;\n}\nul.social-buttons {\n  margin-bottom: 0;\n}\nul.social-buttons li a {\n  display: block;\n  background-color: #222222;\n  height: 40px;\n  width: 40px;\n  border-radius: 100%;\n  font-size: 20px;\n  line-height: 40px;\n  color: white;\n  outline: none;\n  -webkit-transition: all 0.3s;\n  -moz-transition: all 0.3s;\n  transition: all 0.3s;\n}\nul.social-buttons li a:hover,\nul.social-buttons li a:focus,\nul.social-buttons li a:active {\n  background-color: #fed136;\n}\n.btn:focus,\n.btn:active,\n.btn.active,\n.btn:active:focus {\n  outline: none;\n}\n.portfolio-modal .modal-dialog {\n  margin: 0;\n  height: 100%;\n  width: auto;\n}\n.portfolio-modal .modal-content {\n  border-radius: 0;\n  background-clip: border-box;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n  border: none;\n  min-height: 100%;\n  padding: 100px 0;\n  text-align: center;\n}\n.portfolio-modal .modal-content h2 {\n  margin-bottom: 15px;\n  font-size: 3em;\n}\n.portfolio-modal .modal-content p {\n  margin-bottom: 30px;\n}\n.portfolio-modal .modal-content p.item-intro {\n  margin: 20px 0 30px;\n  font-family: \"Droid Serif\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-style: italic;\n  font-size: 16px;\n}\n.portfolio-modal .modal-content ul.list-inline {\n  margin-bottom: 30px;\n  margin-top: 0;\n}\n.portfolio-modal .modal-content img {\n  margin-bottom: 30px;\n}\n.portfolio-modal .close-modal {\n  position: absolute;\n  width: 75px;\n  height: 75px;\n  background-color: transparent;\n  top: 25px;\n  right: 25px;\n  cursor: pointer;\n}\n.portfolio-modal .close-modal:hover {\n  opacity: 0.3;\n}\n.portfolio-modal .close-modal .lr {\n  height: 75px;\n  width: 1px;\n  margin-left: 35px;\n  background-color: #222222;\n  transform: rotate(45deg);\n  -ms-transform: rotate(45deg);\n  /* IE 9 */\n  -webkit-transform: rotate(45deg);\n  /* Safari and Chrome */\n  z-index: 1051;\n}\n.portfolio-modal .close-modal .lr .rl {\n  height: 75px;\n  width: 1px;\n  background-color: #222222;\n  transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  /* IE 9 */\n  -webkit-transform: rotate(90deg);\n  /* Safari and Chrome */\n  z-index: 1052;\n}\n.portfolio-modal .modal-backdrop {\n  opacity: 0;\n  display: none;\n}\n::-moz-selection {\n  text-shadow: none;\n  background: #fed136;\n}\n::selection {\n  text-shadow: none;\n  background: #fed136;\n}\nimg::selection {\n  background: transparent;\n}\nimg::-moz-selection {\n  background: transparent;\n}\nbody {\n  webkit-tap-highlight-color: #fed136;\n}\n"
  },
  {
    "path": "example/bootstrap/v3/gulpfile.js",
    "content": "// Assigning modules to local variables\nvar gulp = require('gulp');\nvar less = require('gulp-less');\nvar browserSync = require('browser-sync').create();\nvar header = require('gulp-header');\nvar cleanCSS = require('gulp-clean-css');\nvar rename = require(\"gulp-rename\");\nvar uglify = require('gulp-uglify');\nvar pkg = require('./package.json');\n\n// Set the banner content\nvar banner = ['/*!\\n',\n    ' * Start Bootstrap - <%= pkg.title %> v<%= pkg.version %> (<%= pkg.homepage %>)\\n',\n    ' * Copyright 2013-' + (new Date()).getFullYear(), ' <%= pkg.author %>\\n',\n    ' * Licensed under <%= pkg.license.type %> (<%= pkg.license.url %>)\\n',\n    ' */\\n',\n    ''\n].join('');\n\n// Default task\ngulp.task('default', ['less', 'minify-css', 'minify-js', 'copy']);\n\n// Less task to compile the less files and add the banner\ngulp.task('less', function() {\n    return gulp.src('less/agency.less')\n        .pipe(less())\n        .pipe(header(banner, { pkg: pkg }))\n        .pipe(gulp.dest('css'))\n        .pipe(browserSync.reload({\n            stream: true\n        }))\n});\n\n// Minify CSS\ngulp.task('minify-css', function() {\n    return gulp.src('css/agency.css')\n        .pipe(cleanCSS({ compatibility: 'ie8' }))\n        .pipe(rename({ suffix: '.min' }))\n        .pipe(gulp.dest('css'))\n        .pipe(browserSync.reload({\n            stream: true\n        }))\n});\n\n// Minify JS\ngulp.task('minify-js', function() {\n    return gulp.src('js/agency.js')\n        .pipe(uglify())\n        .pipe(header(banner, { pkg: pkg }))\n        .pipe(rename({ suffix: '.min' }))\n        .pipe(gulp.dest('js'))\n        .pipe(browserSync.reload({\n            stream: true\n        }))\n});\n\n// Copy Bootstrap core files from node_modules to vendor directory\ngulp.task('bootstrap', function() {\n    return gulp.src(['node_modules/bootstrap/dist/**/*', '!**/npm.js', '!**/bootstrap-theme.*', '!**/*.map'])\n        .pipe(gulp.dest('vendor/bootstrap'))\n})\n\n// Copy jQuery core files from node_modules to vendor directory\ngulp.task('jquery', function() {\n    return gulp.src(['node_modules/jquery/dist/jquery.js', 'node_modules/jquery/dist/jquery.min.js'])\n        .pipe(gulp.dest('vendor/jquery'))\n})\n\n// Copy Font Awesome core files from node_modules to vendor directory\ngulp.task('fontawesome', function() {\n    return gulp.src([\n            'node_modules/font-awesome/**',\n            '!node_modules/font-awesome/**/*.map',\n            '!node_modules/font-awesome/.npmignore',\n            '!node_modules/font-awesome/*.txt',\n            '!node_modules/font-awesome/*.md',\n            '!node_modules/font-awesome/*.json'\n        ])\n        .pipe(gulp.dest('vendor/font-awesome'))\n})\n\n// Copy all third party dependencies from node_modules to vendor directory\ngulp.task('copy', ['bootstrap', 'jquery', 'fontawesome']);\n\n// Configure the browserSync task\ngulp.task('browserSync', function() {\n    browserSync.init({\n        server: {\n            baseDir: ''\n        },\n    })\n})\n\n// Watch Task that compiles LESS and watches for HTML or JS changes and reloads with browserSync\ngulp.task('dev', ['browserSync', 'less', 'minify-css', 'minify-js'], function() {\n    gulp.watch('less/*.less', ['less']);\n    gulp.watch('css/*.css', ['minify-css']);\n    gulp.watch('js/*.js', ['minify-js']);\n    // Reloads the browser whenever HTML or JS files change\n    gulp.watch('*.html', browserSync.reload);\n    gulp.watch('js/**/*.js', browserSync.reload);\n});"
  },
  {
    "path": "example/bootstrap/v3/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\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\n    <title>Agency - Start Bootstrap Theme</title>\n\n    <!-- Bootstrap Core CSS -->\n    <link href=\"vendor/bootstrap/css/bootstrap.min.css\" rel=\"stylesheet\">\n\n    <!-- Custom Fonts -->\n    <link href=\"vendor/font-awesome/css/font-awesome.min.css\" rel=\"stylesheet\" type=\"text/css\">\n    <link href=\"https://fonts.googleapis.com/css?family=Montserrat:400,700\" rel=\"stylesheet\" type=\"text/css\">\n    <link href='https://fonts.googleapis.com/css?family=Kaushan+Script' rel='stylesheet' type='text/css'>\n    <link href='https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic,700italic' rel='stylesheet' type='text/css'>\n    <link href='https://fonts.googleapis.com/css?family=Roboto+Slab:400,100,300,700' rel='stylesheet' type='text/css'>\n\n    <!-- Theme CSS -->\n    <link href=\"css/agency.min.css\" rel=\"stylesheet\">\n\n    <!-- Introjs CSS -->\n    <link href=\"../../../introjs.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->\n    <!--[if lt IE 9]>\n        <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n        <script src=\"https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js\"></script>\n    <![endif]-->\n\n</head>\n\n<body id=\"page-top\" class=\"index\">\n\n    <!-- Navigation -->\n    <nav id=\"mainNav\" class=\"navbar navbar-default navbar-custom navbar-fixed-top\">\n        <div class=\"container\">\n            <!-- Brand and toggle get grouped for better mobile display -->\n            <div class=\"navbar-header page-scroll\">\n                <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\"#bs-example-navbar-collapse-1\">\n                    <span class=\"sr-only\">Toggle navigation</span> Menu <i class=\"fa fa-bars\"></i>\n                </button>\n                <a class=\"navbar-brand page-scroll\" href=\"#page-top\">Start Bootstrap</a>\n            </div>\n\n            <!-- Collect the nav links, forms, and other content for toggling -->\n            <div class=\"collapse navbar-collapse\" id=\"bs-example-navbar-collapse-1\">\n                <ul class=\"nav navbar-nav navbar-right\">\n                    <li class=\"hidden\">\n                        <a href=\"#page-top\"></a>\n                    </li>\n                    <li>\n                        <a class=\"page-scroll\" href=\"#services\">Services</a>\n                    </li>\n                    <li>\n                        <a class=\"page-scroll\" href=\"#portfolio\">Portfolio</a>\n                    </li>\n                    <li>\n                        <a class=\"page-scroll\" href=\"#about\">About</a>\n                    </li>\n                    <li>\n                        <a class=\"page-scroll\" href=\"#team\">Team</a>\n                    </li>\n                    <li>\n                        <a class=\"page-scroll\" href=\"#contact\">Contact</a>\n                    </li>\n                </ul>\n            </div>\n            <!-- /.navbar-collapse -->\n        </div>\n        <!-- /.container-fluid -->\n    </nav>\n\n    <!-- Header -->\n    <header>\n        <div class=\"container\">\n            <div class=\"intro-text\">\n                <div data-intro=\"This is the name of this site\" class=\"intro-lead-in\">Welcome To Our Studio!</div>\n                <div  data-intro=\"This is the main headline\" class=\"intro-heading\">It's Nice To Meet You</div>\n                <a href=\"javascript:void(0)\" onclick=\"introJs.tour().start();\" class=\"page-scroll btn btn-xl\">Start Introjs</a>\n            </div>\n        </div>\n    </header>\n\n    <!-- Services Section -->\n    <section id=\"services\">\n        <div class=\"container\">\n            <div class=\"row\">\n                <div class=\"col-lg-12 text-center\">\n                    <h2 class=\"section-heading\">Services</h2>\n                    <h3 class=\"section-subheading text-muted\">Lorem ipsum dolor sit amet consectetur.</h3>\n                </div>\n            </div>\n            <div class=\"row text-center\">\n                <div class=\"col-md-4\" data-intro=\"This is the first feature\">\n                    <span class=\"fa-stack fa-4x\">\n                        <i class=\"fa fa-circle fa-stack-2x text-primary\"></i>\n                        <i class=\"fa fa-shopping-cart fa-stack-1x fa-inverse\"></i>\n                    </span>\n                    <h4 class=\"service-heading\">E-Commerce</h4>\n                    <p class=\"text-muted\">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima maxime quam architecto quo inventore harum ex magni, dicta impedit.</p>\n                </div>\n                <div class=\"col-md-4\" data-intro=\"and the second feature\">\n                    <span class=\"fa-stack fa-4x\">\n                        <i class=\"fa fa-circle fa-stack-2x text-primary\"></i>\n                        <i class=\"fa fa-laptop fa-stack-1x fa-inverse\"></i>\n                    </span>\n                    <h4 class=\"service-heading\">Responsive Design</h4>\n                    <p class=\"text-muted\">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima maxime quam architecto quo inventore harum ex magni, dicta impedit.</p>\n                </div>\n                <div class=\"col-md-4\" data-intro=\"last feature of our website!\">\n                    <span class=\"fa-stack fa-4x\">\n                        <i class=\"fa fa-circle fa-stack-2x text-primary\"></i>\n                        <i class=\"fa fa-lock fa-stack-1x fa-inverse\"></i>\n                    </span>\n                    <h4 class=\"service-heading\">Web Security</h4>\n                    <p class=\"text-muted\">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima maxime quam architecto quo inventore harum ex magni, dicta impedit.</p>\n                </div>\n            </div>\n        </div>\n    </section>\n\n    <!-- Portfolio Grid Section -->\n    <section id=\"portfolio\" class=\"bg-light-gray\">\n        <div class=\"container\">\n            <div class=\"row\">\n                <div class=\"col-lg-12 text-center\">\n                    <h2 class=\"section-heading\">Portfolio</h2>\n                    <h3 class=\"section-subheading text-muted\">Lorem ipsum dolor sit amet consectetur.</h3>\n                </div>\n            </div>\n            <div class=\"row\">\n                <div class=\"col-md-4 col-sm-6 portfolio-item\">\n                    <a href=\"#portfolioModal1\" class=\"portfolio-link\" data-toggle=\"modal\">\n                        <div class=\"portfolio-hover\">\n                            <div class=\"portfolio-hover-content\">\n                                <i class=\"fa fa-plus fa-3x\"></i>\n                            </div>\n                        </div>\n                        <img src=\"img/portfolio/roundicons.png\" class=\"img-responsive\" alt=\"\">\n                    </a>\n                    <div class=\"portfolio-caption\">\n                        <h4>Round Icons</h4>\n                        <p class=\"text-muted\">Graphic Design</p>\n                    </div>\n                </div>\n                <div class=\"col-md-4 col-sm-6 portfolio-item\">\n                    <a href=\"#portfolioModal2\" class=\"portfolio-link\" data-toggle=\"modal\">\n                        <div class=\"portfolio-hover\">\n                            <div class=\"portfolio-hover-content\">\n                                <i class=\"fa fa-plus fa-3x\"></i>\n                            </div>\n                        </div>\n                        <img src=\"img/portfolio/startup-framework.png\" class=\"img-responsive\" alt=\"\">\n                    </a>\n                    <div class=\"portfolio-caption\">\n                        <h4>Startup Framework</h4>\n                        <p class=\"text-muted\">Website Design</p>\n                    </div>\n                </div>\n                <div class=\"col-md-4 col-sm-6 portfolio-item\">\n                    <a href=\"#portfolioModal3\" class=\"portfolio-link\" data-toggle=\"modal\">\n                        <div class=\"portfolio-hover\">\n                            <div class=\"portfolio-hover-content\">\n                                <i class=\"fa fa-plus fa-3x\"></i>\n                            </div>\n                        </div>\n                        <img src=\"img/portfolio/treehouse.png\" class=\"img-responsive\" alt=\"\">\n                    </a>\n                    <div class=\"portfolio-caption\">\n                        <h4>Treehouse</h4>\n                        <p class=\"text-muted\">Website Design</p>\n                    </div>\n                </div>\n                <div class=\"col-md-4 col-sm-6 portfolio-item\">\n                    <a href=\"#portfolioModal4\" class=\"portfolio-link\" data-toggle=\"modal\">\n                        <div class=\"portfolio-hover\">\n                            <div class=\"portfolio-hover-content\">\n                                <i class=\"fa fa-plus fa-3x\"></i>\n                            </div>\n                        </div>\n                        <img src=\"img/portfolio/golden.png\" class=\"img-responsive\" alt=\"\">\n                    </a>\n                    <div class=\"portfolio-caption\">\n                        <h4>Golden</h4>\n                        <p class=\"text-muted\">Website Design</p>\n                    </div>\n                </div>\n                <div class=\"col-md-4 col-sm-6 portfolio-item\">\n                    <a href=\"#portfolioModal5\" class=\"portfolio-link\" data-toggle=\"modal\">\n                        <div class=\"portfolio-hover\">\n                            <div class=\"portfolio-hover-content\">\n                                <i class=\"fa fa-plus fa-3x\"></i>\n                            </div>\n                        </div>\n                        <img src=\"img/portfolio/escape.png\" class=\"img-responsive\" alt=\"\">\n                    </a>\n                    <div class=\"portfolio-caption\">\n                        <h4>Escape</h4>\n                        <p class=\"text-muted\">Website Design</p>\n                    </div>\n                </div>\n                <div class=\"col-md-4 col-sm-6 portfolio-item\">\n                    <a href=\"#portfolioModal6\" class=\"portfolio-link\" data-toggle=\"modal\">\n                        <div class=\"portfolio-hover\">\n                            <div class=\"portfolio-hover-content\">\n                                <i class=\"fa fa-plus fa-3x\"></i>\n                            </div>\n                        </div>\n                        <img src=\"img/portfolio/dreams.png\" class=\"img-responsive\" alt=\"\">\n                    </a>\n                    <div class=\"portfolio-caption\">\n                        <h4>Dreams</h4>\n                        <p class=\"text-muted\">Website Design</p>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </section>\n\n    <!-- About Section -->\n    <section id=\"about\">\n        <div class=\"container\">\n            <div class=\"row\">\n                <div class=\"col-lg-12 text-center\">\n                    <h2 class=\"section-heading\">About</h2>\n                    <h3 class=\"section-subheading text-muted\">Lorem ipsum dolor sit amet consectetur.</h3>\n                </div>\n            </div>\n            <div class=\"row\">\n                <div class=\"col-lg-12\">\n                    <ul class=\"timeline\">\n                        <li>\n                            <div class=\"timeline-image\">\n                                <img class=\"img-circle img-responsive\" src=\"img/about/1.jpg\" alt=\"\">\n                            </div>\n                            <div class=\"timeline-panel\">\n                                <div class=\"timeline-heading\">\n                                    <h4>2009-2011</h4>\n                                    <h4 class=\"subheading\">Our Humble Beginnings</h4>\n                                </div>\n                                <div class=\"timeline-body\">\n                                    <p class=\"text-muted\">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sunt ut voluptatum eius sapiente, totam reiciendis temporibus qui quibusdam, recusandae sit vero unde, sed, incidunt et ea quo dolore laudantium consectetur!</p>\n                                </div>\n                            </div>\n                        </li>\n                        <li class=\"timeline-inverted\">\n                            <div class=\"timeline-image\">\n                                <img class=\"img-circle img-responsive\" src=\"img/about/2.jpg\" alt=\"\">\n                            </div>\n                            <div class=\"timeline-panel\">\n                                <div class=\"timeline-heading\">\n                                    <h4>March 2011</h4>\n                                    <h4 class=\"subheading\">An Agency is Born</h4>\n                                </div>\n                                <div class=\"timeline-body\">\n                                    <p class=\"text-muted\">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sunt ut voluptatum eius sapiente, totam reiciendis temporibus qui quibusdam, recusandae sit vero unde, sed, incidunt et ea quo dolore laudantium consectetur!</p>\n                                </div>\n                            </div>\n                        </li>\n                        <li>\n                            <div class=\"timeline-image\">\n                                <img class=\"img-circle img-responsive\" src=\"img/about/3.jpg\" alt=\"\">\n                            </div>\n                            <div class=\"timeline-panel\">\n                                <div class=\"timeline-heading\">\n                                    <h4>December 2012</h4>\n                                    <h4 class=\"subheading\">Transition to Full Service</h4>\n                                </div>\n                                <div class=\"timeline-body\">\n                                    <p class=\"text-muted\">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sunt ut voluptatum eius sapiente, totam reiciendis temporibus qui quibusdam, recusandae sit vero unde, sed, incidunt et ea quo dolore laudantium consectetur!</p>\n                                </div>\n                            </div>\n                        </li>\n                        <li class=\"timeline-inverted\">\n                            <div class=\"timeline-image\">\n                                <img class=\"img-circle img-responsive\" src=\"img/about/4.jpg\" alt=\"\">\n                            </div>\n                            <div class=\"timeline-panel\">\n                                <div class=\"timeline-heading\">\n                                    <h4>July 2014</h4>\n                                    <h4 class=\"subheading\">Phase Two Expansion</h4>\n                                </div>\n                                <div class=\"timeline-body\">\n                                    <p class=\"text-muted\">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sunt ut voluptatum eius sapiente, totam reiciendis temporibus qui quibusdam, recusandae sit vero unde, sed, incidunt et ea quo dolore laudantium consectetur!</p>\n                                </div>\n                            </div>\n                        </li>\n                        <li class=\"timeline-inverted\">\n                            <div class=\"timeline-image\">\n                                <h4>Be Part\n                                    <br>Of Our\n                                    <br>Story!</h4>\n                            </div>\n                        </li>\n                    </ul>\n                </div>\n            </div>\n        </div>\n    </section>\n\n    <!-- Team Section -->\n    <section id=\"team\" class=\"bg-light-gray\">\n        <div class=\"container\">\n            <div class=\"row\">\n                <div class=\"col-lg-12 text-center\">\n                    <h2 class=\"section-heading\">Our Amazing Team</h2>\n                    <h3 class=\"section-subheading text-muted\">Lorem ipsum dolor sit amet consectetur.</h3>\n                </div>\n            </div>\n            <div class=\"row\" data-intro=\"Please meet our awesome team!\">\n                <div class=\"col-sm-4\">\n                    <div class=\"team-member\">\n                        <img src=\"img/team/1.jpg\" class=\"img-responsive img-circle\" alt=\"\">\n                        <h4>Kay Garland</h4>\n                        <p class=\"text-muted\">Lead Designer</p>\n                        <ul class=\"list-inline social-buttons\">\n                            <li><a href=\"#\"><i class=\"fa fa-twitter\"></i></a>\n                            </li>\n                            <li><a href=\"#\"><i class=\"fa fa-facebook\"></i></a>\n                            </li>\n                            <li><a href=\"#\"><i class=\"fa fa-linkedin\"></i></a>\n                            </li>\n                        </ul>\n                    </div>\n                </div>\n                <div class=\"col-sm-4\">\n                    <div class=\"team-member\">\n                        <img src=\"img/team/2.jpg\" class=\"img-responsive img-circle\" alt=\"\">\n                        <h4>Larry Parker</h4>\n                        <p class=\"text-muted\">Lead Marketer</p>\n                        <ul class=\"list-inline social-buttons\">\n                            <li><a href=\"#\"><i class=\"fa fa-twitter\"></i></a>\n                            </li>\n                            <li><a href=\"#\"><i class=\"fa fa-facebook\"></i></a>\n                            </li>\n                            <li><a href=\"#\"><i class=\"fa fa-linkedin\"></i></a>\n                            </li>\n                        </ul>\n                    </div>\n                </div>\n                <div class=\"col-sm-4\">\n                    <div class=\"team-member\">\n                        <img src=\"img/team/3.jpg\" class=\"img-responsive img-circle\" alt=\"\">\n                        <h4>Diana Pertersen</h4>\n                        <p class=\"text-muted\">Lead Developer</p>\n                        <ul class=\"list-inline social-buttons\">\n                            <li><a href=\"#\"><i class=\"fa fa-twitter\"></i></a>\n                            </li>\n                            <li><a href=\"#\"><i class=\"fa fa-facebook\"></i></a>\n                            </li>\n                            <li><a href=\"#\"><i class=\"fa fa-linkedin\"></i></a>\n                            </li>\n                        </ul>\n                    </div>\n                </div>\n            </div>\n            <div class=\"row\">\n                <div class=\"col-lg-8 col-lg-offset-2 text-center\">\n                    <p class=\"large text-muted\">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aut eaque, laboriosam veritatis, quos non quis ad perspiciatis, totam corporis ea, alias ut unde.</p>\n                </div>\n            </div>\n        </div>\n    </section>\n\n    <!-- Clients Aside -->\n    <aside class=\"clients\">\n        <div class=\"container\">\n            <div class=\"row\">\n                <div class=\"col-md-3 col-sm-6\">\n                    <a href=\"#\">\n                        <img src=\"img/logos/envato.jpg\" class=\"img-responsive img-centered\" alt=\"\">\n                    </a>\n                </div>\n                <div class=\"col-md-3 col-sm-6\">\n                    <a href=\"#\">\n                        <img src=\"img/logos/designmodo.jpg\" class=\"img-responsive img-centered\" alt=\"\">\n                    </a>\n                </div>\n                <div class=\"col-md-3 col-sm-6\">\n                    <a href=\"#\">\n                        <img src=\"img/logos/themeforest.jpg\" class=\"img-responsive img-centered\" alt=\"\">\n                    </a>\n                </div>\n                <div class=\"col-md-3 col-sm-6\">\n                    <a href=\"#\">\n                        <img src=\"img/logos/creative-market.jpg\" class=\"img-responsive img-centered\" alt=\"\">\n                    </a>\n                </div>\n            </div>\n        </div>\n    </aside>\n\n    <!-- Contact Section -->\n    <section id=\"contact\">\n        <div class=\"container\">\n            <div class=\"row\">\n                <div class=\"col-lg-12 text-center\">\n                    <h2 class=\"section-heading\">Contact Us</h2>\n                    <h3 class=\"section-subheading text-muted\">Lorem ipsum dolor sit amet consectetur.</h3>\n                </div>\n            </div>\n            <div class=\"row\">\n                <div class=\"col-lg-12\">\n                    <form name=\"sentMessage\" id=\"contactForm\" novalidate>\n                        <div class=\"row\">\n                            <div class=\"col-md-6\">\n                                <div class=\"form-group\">\n                                    <input type=\"text\" class=\"form-control\" placeholder=\"Your Name *\" id=\"name\" required data-validation-required-message=\"Please enter your name.\">\n                                    <p class=\"help-block text-danger\"></p>\n                                </div>\n                                <div class=\"form-group\">\n                                    <input type=\"email\" class=\"form-control\" placeholder=\"Your Email *\" id=\"email\" required data-validation-required-message=\"Please enter your email address.\">\n                                    <p class=\"help-block text-danger\"></p>\n                                </div>\n                                <div class=\"form-group\">\n                                    <input type=\"tel\" class=\"form-control\" placeholder=\"Your Phone *\" id=\"phone\" required data-validation-required-message=\"Please enter your phone number.\">\n                                    <p class=\"help-block text-danger\"></p>\n                                </div>\n                            </div>\n                            <div class=\"col-md-6\">\n                                <div class=\"form-group\">\n                                    <textarea class=\"form-control\" placeholder=\"Your Message *\" id=\"message\" required data-validation-required-message=\"Please enter a message.\"></textarea>\n                                    <p class=\"help-block text-danger\"></p>\n                                </div>\n                            </div>\n                            <div class=\"clearfix\"></div>\n                            <div class=\"col-lg-12 text-center\">\n                                <div id=\"success\"></div>\n                                <button type=\"submit\" class=\"btn btn-xl\">Send Message</button>\n                            </div>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </section>\n\n    <footer>\n        <div class=\"container\">\n            <div class=\"row\">\n                <div class=\"col-md-4\">\n                    <span class=\"copyright\">Copyright &copy; Your Website 2016</span>\n                </div>\n                <div class=\"col-md-4\">\n                    <ul class=\"list-inline social-buttons\">\n                        <li><a href=\"#\"><i class=\"fa fa-twitter\"></i></a>\n                        </li>\n                        <li><a href=\"#\"><i class=\"fa fa-facebook\"></i></a>\n                        </li>\n                        <li><a href=\"#\"><i class=\"fa fa-linkedin\"></i></a>\n                        </li>\n                    </ul>\n                </div>\n                <div class=\"col-md-4\">\n                    <ul class=\"list-inline quicklinks\">\n                        <li><a href=\"#\">Privacy Policy</a>\n                        </li>\n                        <li><a href=\"#\">Terms of Use</a>\n                        </li>\n                    </ul>\n                </div>\n            </div>\n        </div>\n    </footer>\n\n    <!-- Portfolio Modals -->\n    <!-- Use the modals below to showcase details about your portfolio projects! -->\n\n    <!-- Portfolio Modal 1 -->\n    <div class=\"portfolio-modal modal fade\" id=\"portfolioModal1\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n        <div class=\"modal-dialog\">\n            <div class=\"modal-content\">\n                <div class=\"close-modal\" data-dismiss=\"modal\">\n                    <div class=\"lr\">\n                        <div class=\"rl\">\n                        </div>\n                    </div>\n                </div>\n                <div class=\"container\">\n                    <div class=\"row\">\n                        <div class=\"col-lg-8 col-lg-offset-2\">\n                            <div class=\"modal-body\">\n                                <!-- Project Details Go Here -->\n                                <h2>Project Name</h2>\n                                <p class=\"item-intro text-muted\">Lorem ipsum dolor sit amet consectetur.</p>\n                                <img class=\"img-responsive img-centered\" src=\"img/portfolio/roundicons-free.png\" alt=\"\">\n                                <p>Use this area to describe your project. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Est blanditiis dolorem culpa incidunt minus dignissimos deserunt repellat aperiam quasi sunt officia expedita beatae cupiditate, maiores repudiandae, nostrum, reiciendis facere nemo!</p>\n                                <p>\n                                    <strong>Want these icons in this portfolio item sample?</strong>You can download 60 of them for free, courtesy of <a href=\"https://getdpd.com/cart/hoplink/18076?referrer=bvbo4kax5k8ogc\">RoundIcons.com</a>, or you can purchase the 1500 icon set <a href=\"https://getdpd.com/cart/hoplink/18076?referrer=bvbo4kax5k8ogc\">here</a>.</p>\n                                <ul class=\"list-inline\">\n                                    <li>Date: July 2014</li>\n                                    <li>Client: Round Icons</li>\n                                    <li>Category: Graphic Design</li>\n                                </ul>\n                                <button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\"><i class=\"fa fa-times\"></i> Close Project</button>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- Portfolio Modal 2 -->\n    <div class=\"portfolio-modal modal fade\" id=\"portfolioModal2\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n        <div class=\"modal-dialog\">\n            <div class=\"modal-content\">\n                <div class=\"close-modal\" data-dismiss=\"modal\">\n                    <div class=\"lr\">\n                        <div class=\"rl\">\n                        </div>\n                    </div>\n                </div>\n                <div class=\"container\">\n                    <div class=\"row\">\n                        <div class=\"col-lg-8 col-lg-offset-2\">\n                            <div class=\"modal-body\">\n                                <h2>Project Heading</h2>\n                                <p class=\"item-intro text-muted\">Lorem ipsum dolor sit amet consectetur.</p>\n                                <img class=\"img-responsive img-centered\" src=\"img/portfolio/startup-framework-preview.png\" alt=\"\">\n                                <p><a href=\"http://designmodo.com/startup/?u=787\">Startup Framework</a> is a website builder for professionals. Startup Framework contains components and complex blocks (PSD+HTML Bootstrap themes and templates) which can easily be integrated into almost any design. All of these components are made in the same style, and can easily be integrated into projects, allowing you to create hundreds of solutions for your future projects.</p>\n                                <p>You can preview Startup Framework <a href=\"http://designmodo.com/startup/?u=787\">here</a>.</p>\n                                <button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\"><i class=\"fa fa-times\"></i> Close Project</button>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- Portfolio Modal 3 -->\n    <div class=\"portfolio-modal modal fade\" id=\"portfolioModal3\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n        <div class=\"modal-dialog\">\n            <div class=\"modal-content\">\n                <div class=\"close-modal\" data-dismiss=\"modal\">\n                    <div class=\"lr\">\n                        <div class=\"rl\">\n                        </div>\n                    </div>\n                </div>\n                <div class=\"container\">\n                    <div class=\"row\">\n                        <div class=\"col-lg-8 col-lg-offset-2\">\n                            <div class=\"modal-body\">\n                                <!-- Project Details Go Here -->\n                                <h2>Project Name</h2>\n                                <p class=\"item-intro text-muted\">Lorem ipsum dolor sit amet consectetur.</p>\n                                <img class=\"img-responsive img-centered\" src=\"img/portfolio/treehouse-preview.png\" alt=\"\">\n                                <p>Treehouse is a free PSD web template built by <a href=\"https://www.behance.net/MathavanJaya\">Mathavan Jaya</a>. This is bright and spacious design perfect for people or startup companies looking to showcase their apps or other projects.</p>\n                                <p>You can download the PSD template in this portfolio sample item at <a href=\"http://freebiesxpress.com/gallery/treehouse-free-psd-web-template/\">FreebiesXpress.com</a>.</p>\n                                <button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\"><i class=\"fa fa-times\"></i> Close Project</button>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- Portfolio Modal 4 -->\n    <div class=\"portfolio-modal modal fade\" id=\"portfolioModal4\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n        <div class=\"modal-dialog\">\n            <div class=\"modal-content\">\n                <div class=\"close-modal\" data-dismiss=\"modal\">\n                    <div class=\"lr\">\n                        <div class=\"rl\">\n                        </div>\n                    </div>\n                </div>\n                <div class=\"container\">\n                    <div class=\"row\">\n                        <div class=\"col-lg-8 col-lg-offset-2\">\n                            <div class=\"modal-body\">\n                                <!-- Project Details Go Here -->\n                                <h2>Project Name</h2>\n                                <p class=\"item-intro text-muted\">Lorem ipsum dolor sit amet consectetur.</p>\n                                <img class=\"img-responsive img-centered\" src=\"img/portfolio/golden-preview.png\" alt=\"\">\n                                <p>Start Bootstrap's Agency theme is based on Golden, a free PSD website template built by <a href=\"https://www.behance.net/MathavanJaya\">Mathavan Jaya</a>. Golden is a modern and clean one page web template that was made exclusively for Best PSD Freebies. This template has a great portfolio, timeline, and meet your team sections that can be easily modified to fit your needs.</p>\n                                <p>You can download the PSD template in this portfolio sample item at <a href=\"http://freebiesxpress.com/gallery/golden-free-one-page-web-template/\">FreebiesXpress.com</a>.</p>\n                                <button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\"><i class=\"fa fa-times\"></i> Close Project</button>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- Portfolio Modal 5 -->\n    <div class=\"portfolio-modal modal fade\" id=\"portfolioModal5\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n        <div class=\"modal-dialog\">\n            <div class=\"modal-content\">\n                <div class=\"close-modal\" data-dismiss=\"modal\">\n                    <div class=\"lr\">\n                        <div class=\"rl\">\n                        </div>\n                    </div>\n                </div>\n                <div class=\"container\">\n                    <div class=\"row\">\n                        <div class=\"col-lg-8 col-lg-offset-2\">\n                            <div class=\"modal-body\">\n                                <!-- Project Details Go Here -->\n                                <h2>Project Name</h2>\n                                <p class=\"item-intro text-muted\">Lorem ipsum dolor sit amet consectetur.</p>\n                                <img class=\"img-responsive img-centered\" src=\"img/portfolio/escape-preview.png\" alt=\"\">\n                                <p>Escape is a free PSD web template built by <a href=\"https://www.behance.net/MathavanJaya\">Mathavan Jaya</a>. Escape is a one page web template that was designed with agencies in mind. This template is ideal for those looking for a simple one page solution to describe your business and offer your services.</p>\n                                <p>You can download the PSD template in this portfolio sample item at <a href=\"http://freebiesxpress.com/gallery/escape-one-page-psd-web-template/\">FreebiesXpress.com</a>.</p>\n                                <button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\"><i class=\"fa fa-times\"></i> Close Project</button>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- Portfolio Modal 6 -->\n    <div class=\"portfolio-modal modal fade\" id=\"portfolioModal6\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n        <div class=\"modal-dialog\">\n            <div class=\"modal-content\">\n                <div class=\"close-modal\" data-dismiss=\"modal\">\n                    <div class=\"lr\">\n                        <div class=\"rl\">\n                        </div>\n                    </div>\n                </div>\n                <div class=\"container\">\n                    <div class=\"row\">\n                        <div class=\"col-lg-8 col-lg-offset-2\">\n                            <div class=\"modal-body\">\n                                <!-- Project Details Go Here -->\n                                <h2>Project Name</h2>\n                                <p class=\"item-intro text-muted\">Lorem ipsum dolor sit amet consectetur.</p>\n                                <img class=\"img-responsive img-centered\" src=\"img/portfolio/dreams-preview.png\" alt=\"\">\n                                <p>Dreams is a free PSD web template built by <a href=\"https://www.behance.net/MathavanJaya\">Mathavan Jaya</a>. Dreams is a modern one page web template designed for almost any purpose. It’s a beautiful template that’s designed with the Bootstrap framework in mind.</p>\n                                <p>You can download the PSD template in this portfolio sample item at <a href=\"http://freebiesxpress.com/gallery/dreams-free-one-page-web-template/\">FreebiesXpress.com</a>.</p>\n                                <button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\"><i class=\"fa fa-times\"></i> Close Project</button>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- jQuery -->\n    <script src=\"vendor/jquery/jquery.min.js\"></script>\n\n    <!-- Bootstrap Core JavaScript -->\n    <script src=\"vendor/bootstrap/js/bootstrap.min.js\"></script>\n\n    <!-- Plugin JavaScript -->\n    <script src=\"http://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js\"></script>\n\n    <!-- Contact Form JavaScript -->\n    <script src=\"js/jqBootstrapValidation.js\"></script>\n    <script src=\"js/contact_me.js\"></script>\n\n    <!-- Theme JavaScript -->\n    <script src=\"js/agency.min.js\"></script>\n    <!-- Introjs -->\n    <script src=\"../../../dist/intro.js\"></script>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "example/bootstrap/v3/js/agency.js",
    "content": "// Agency Theme JavaScript\n\n(function($) {\n    \"use strict\"; // Start of use strict\n\n    // jQuery for page scrolling feature - requires jQuery Easing plugin\n    $('a.page-scroll').bind('click', function(event) {\n        var $anchor = $(this);\n        $('html, body').stop().animate({\n            scrollTop: ($($anchor.attr('href')).offset().top - 50)\n        }, 1250, 'easeInOutExpo');\n        event.preventDefault();\n    });\n\n    // Highlight the top nav as scrolling occurs\n    $('body').scrollspy({\n        target: '.navbar-fixed-top',\n        offset: 51\n    });\n\n    // Closes the Responsive Menu on Menu Item Click\n    $('.navbar-collapse ul li a:not(.dropdown-toggle)').click(function() {\n        $('.navbar-toggle:visible').click();\n    });\n\n    // Offset for Main Navigation\n    $('#mainNav').affix({\n        offset: {\n            top: 100\n        }\n    })\n\n})(jQuery); // End of use strict\n"
  },
  {
    "path": "example/bootstrap/v3/js/contact_me.js",
    "content": "// Contact Form Scripts\n\n$(function() {\n\n    $(\"#contactForm input,#contactForm textarea\").jqBootstrapValidation({\n        preventSubmit: true,\n        submitError: function($form, event, errors) {\n            // additional error messages or events\n        },\n        submitSuccess: function($form, event) {\n            event.preventDefault(); // prevent default submit behaviour\n            // get values from FORM\n            var name = $(\"input#name\").val();\n            var email = $(\"input#email\").val();\n            var phone = $(\"input#phone\").val();\n            var message = $(\"textarea#message\").val();\n            var firstName = name; // For Success/Failure Message\n            // Check for white space in name for Success/Fail message\n            if (firstName.indexOf(' ') >= 0) {\n                firstName = name.split(' ').slice(0, -1).join(' ');\n            }\n            $.ajax({\n                url: \"././mail/contact_me.php\",\n                type: \"POST\",\n                data: {\n                    name: name,\n                    phone: phone,\n                    email: email,\n                    message: message\n                },\n                cache: false,\n                success: function() {\n                    // Success message\n                    $('#success').html(\"<div class='alert alert-success'>\");\n                    $('#success > .alert-success').html(\"<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;\")\n                        .append(\"</button>\");\n                    $('#success > .alert-success')\n                        .append(\"<strong>Your message has been sent. </strong>\");\n                    $('#success > .alert-success')\n                        .append('</div>');\n\n                    //clear all fields\n                    $('#contactForm').trigger(\"reset\");\n                },\n                error: function() {\n                    // Fail message\n                    $('#success').html(\"<div class='alert alert-danger'>\");\n                    $('#success > .alert-danger').html(\"<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;\")\n                        .append(\"</button>\");\n                    $('#success > .alert-danger').append(\"<strong>Sorry \" + firstName + \", it seems that my mail server is not responding. Please try again later!\");\n                    $('#success > .alert-danger').append('</div>');\n                    //clear all fields\n                    $('#contactForm').trigger(\"reset\");\n                },\n            });\n        },\n        filter: function() {\n            return $(this).is(\":visible\");\n        },\n    });\n\n    $(\"a[data-toggle=\\\"tab\\\"]\").click(function(e) {\n        e.preventDefault();\n        $(this).tab(\"show\");\n    });\n});\n\n\n/*When clicking on Full hide fail/success boxes */\n$('#name').focus(function() {\n    $('#success').html('');\n});\n"
  },
  {
    "path": "example/bootstrap/v3/js/jqBootstrapValidation.js",
    "content": "/* jqBootstrapValidation\n * A plugin for automating validation on Twitter Bootstrap formatted forms.\n *\n * v1.3.6\n *\n * License: MIT <http://opensource.org/licenses/mit-license.php> - see LICENSE file\n *\n * http://ReactiveRaven.github.com/jqBootstrapValidation/\n */\n\n(function( $ ){\n\n\tvar createdElements = [];\n\n\tvar defaults = {\n\t\toptions: {\n\t\t\tprependExistingHelpBlock: false,\n\t\t\tsniffHtml: true, // sniff for 'required', 'maxlength', etc\n\t\t\tpreventSubmit: true, // stop the form submit event from firing if validation fails\n\t\t\tsubmitError: false, // function called if there is an error when trying to submit\n\t\t\tsubmitSuccess: false, // function called just before a successful submit event is sent to the server\n            semanticallyStrict: false, // set to true to tidy up generated HTML output\n\t\t\tautoAdd: {\n\t\t\t\thelpBlocks: true\n\t\t\t},\n            filter: function () {\n                // return $(this).is(\":visible\"); // only validate elements you can see\n                return true; // validate everything\n            }\n\t\t},\n    methods: {\n      init : function( options ) {\n\n        var settings = $.extend(true, {}, defaults);\n\n        settings.options = $.extend(true, settings.options, options);\n\n        var $siblingElements = this;\n\n        var uniqueForms = $.unique(\n          $siblingElements.map( function () {\n            return $(this).parents(\"form\")[0];\n          }).toArray()\n        );\n\n        $(uniqueForms).bind(\"submit\", function (e) {\n          var $form = $(this);\n          var warningsFound = 0;\n          var $inputs = $form.find(\"input,textarea,select\").not(\"[type=submit],[type=image]\").filter(settings.options.filter);\n          $inputs.trigger(\"submit.validation\").trigger(\"validationLostFocus.validation\");\n\n          $inputs.each(function (i, el) {\n            var $this = $(el),\n              $controlGroup = $this.parents(\".form-group\").first();\n            if (\n              $controlGroup.hasClass(\"warning\")\n            ) {\n              $controlGroup.removeClass(\"warning\").addClass(\"error\");\n              warningsFound++;\n            }\n          });\n\n          $inputs.trigger(\"validationLostFocus.validation\");\n\n          if (warningsFound) {\n            if (settings.options.preventSubmit) {\n              e.preventDefault();\n            }\n            $form.addClass(\"error\");\n            if ($.isFunction(settings.options.submitError)) {\n              settings.options.submitError($form, e, $inputs.jqBootstrapValidation(\"collectErrors\", true));\n            }\n          } else {\n            $form.removeClass(\"error\");\n            if ($.isFunction(settings.options.submitSuccess)) {\n              settings.options.submitSuccess($form, e);\n            }\n          }\n        });\n\n        return this.each(function(){\n\n          // Get references to everything we're interested in\n          var $this = $(this),\n            $controlGroup = $this.parents(\".form-group\").first(),\n            $helpBlock = $controlGroup.find(\".help-block\").first(),\n            $form = $this.parents(\"form\").first(),\n            validatorNames = [];\n\n          // create message container if not exists\n          if (!$helpBlock.length && settings.options.autoAdd && settings.options.autoAdd.helpBlocks) {\n              $helpBlock = $('<div class=\"help-block\" />');\n              $controlGroup.find('.controls').append($helpBlock);\n\t\t\t\t\t\t\tcreatedElements.push($helpBlock[0]);\n          }\n\n          // =============================================================\n          //                                     SNIFF HTML FOR VALIDATORS\n          // =============================================================\n\n          // *snort sniff snuffle*\n\n          if (settings.options.sniffHtml) {\n            var message = \"\";\n            // ---------------------------------------------------------\n            //                                                   PATTERN\n            // ---------------------------------------------------------\n            if ($this.attr(\"pattern\") !== undefined) {\n              message = \"Not in the expected format<!-- data-validation-pattern-message to override -->\";\n              if ($this.data(\"validationPatternMessage\")) {\n                message = $this.data(\"validationPatternMessage\");\n              }\n              $this.data(\"validationPatternMessage\", message);\n              $this.data(\"validationPatternRegex\", $this.attr(\"pattern\"));\n            }\n            // ---------------------------------------------------------\n            //                                                       MAX\n            // ---------------------------------------------------------\n            if ($this.attr(\"max\") !== undefined || $this.attr(\"aria-valuemax\") !== undefined) {\n              var max = ($this.attr(\"max\") !== undefined ? $this.attr(\"max\") : $this.attr(\"aria-valuemax\"));\n              message = \"Too high: Maximum of '\" + max + \"'<!-- data-validation-max-message to override -->\";\n              if ($this.data(\"validationMaxMessage\")) {\n                message = $this.data(\"validationMaxMessage\");\n              }\n              $this.data(\"validationMaxMessage\", message);\n              $this.data(\"validationMaxMax\", max);\n            }\n            // ---------------------------------------------------------\n            //                                                       MIN\n            // ---------------------------------------------------------\n            if ($this.attr(\"min\") !== undefined || $this.attr(\"aria-valuemin\") !== undefined) {\n              var min = ($this.attr(\"min\") !== undefined ? $this.attr(\"min\") : $this.attr(\"aria-valuemin\"));\n              message = \"Too low: Minimum of '\" + min + \"'<!-- data-validation-min-message to override -->\";\n              if ($this.data(\"validationMinMessage\")) {\n                message = $this.data(\"validationMinMessage\");\n              }\n              $this.data(\"validationMinMessage\", message);\n              $this.data(\"validationMinMin\", min);\n            }\n            // ---------------------------------------------------------\n            //                                                 MAXLENGTH\n            // ---------------------------------------------------------\n            if ($this.attr(\"maxlength\") !== undefined) {\n              message = \"Too long: Maximum of '\" + $this.attr(\"maxlength\") + \"' characters<!-- data-validation-maxlength-message to override -->\";\n              if ($this.data(\"validationMaxlengthMessage\")) {\n                message = $this.data(\"validationMaxlengthMessage\");\n              }\n              $this.data(\"validationMaxlengthMessage\", message);\n              $this.data(\"validationMaxlengthMaxlength\", $this.attr(\"maxlength\"));\n            }\n            // ---------------------------------------------------------\n            //                                                 MINLENGTH\n            // ---------------------------------------------------------\n            if ($this.attr(\"minlength\") !== undefined) {\n              message = \"Too short: Minimum of '\" + $this.attr(\"minlength\") + \"' characters<!-- data-validation-minlength-message to override -->\";\n              if ($this.data(\"validationMinlengthMessage\")) {\n                message = $this.data(\"validationMinlengthMessage\");\n              }\n              $this.data(\"validationMinlengthMessage\", message);\n              $this.data(\"validationMinlengthMinlength\", $this.attr(\"minlength\"));\n            }\n            // ---------------------------------------------------------\n            //                                                  REQUIRED\n            // ---------------------------------------------------------\n            if ($this.attr(\"required\") !== undefined || $this.attr(\"aria-required\") !== undefined) {\n              message = settings.builtInValidators.required.message;\n              if ($this.data(\"validationRequiredMessage\")) {\n                message = $this.data(\"validationRequiredMessage\");\n              }\n              $this.data(\"validationRequiredMessage\", message);\n            }\n            // ---------------------------------------------------------\n            //                                                    NUMBER\n            // ---------------------------------------------------------\n            if ($this.attr(\"type\") !== undefined && $this.attr(\"type\").toLowerCase() === \"number\") {\n              message = settings.builtInValidators.number.message;\n              if ($this.data(\"validationNumberMessage\")) {\n                message = $this.data(\"validationNumberMessage\");\n              }\n              $this.data(\"validationNumberMessage\", message);\n            }\n            // ---------------------------------------------------------\n            //                                                     EMAIL\n            // ---------------------------------------------------------\n            if ($this.attr(\"type\") !== undefined && $this.attr(\"type\").toLowerCase() === \"email\") {\n              message = \"Not a valid email address<!-- data-validator-validemail-message to override -->\";\n              if ($this.data(\"validationValidemailMessage\")) {\n                message = $this.data(\"validationValidemailMessage\");\n              } else if ($this.data(\"validationEmailMessage\")) {\n                message = $this.data(\"validationEmailMessage\");\n              }\n              $this.data(\"validationValidemailMessage\", message);\n            }\n            // ---------------------------------------------------------\n            //                                                MINCHECKED\n            // ---------------------------------------------------------\n            if ($this.attr(\"minchecked\") !== undefined) {\n              message = \"Not enough options checked; Minimum of '\" + $this.attr(\"minchecked\") + \"' required<!-- data-validation-minchecked-message to override -->\";\n              if ($this.data(\"validationMincheckedMessage\")) {\n                message = $this.data(\"validationMincheckedMessage\");\n              }\n              $this.data(\"validationMincheckedMessage\", message);\n              $this.data(\"validationMincheckedMinchecked\", $this.attr(\"minchecked\"));\n            }\n            // ---------------------------------------------------------\n            //                                                MAXCHECKED\n            // ---------------------------------------------------------\n            if ($this.attr(\"maxchecked\") !== undefined) {\n              message = \"Too many options checked; Maximum of '\" + $this.attr(\"maxchecked\") + \"' required<!-- data-validation-maxchecked-message to override -->\";\n              if ($this.data(\"validationMaxcheckedMessage\")) {\n                message = $this.data(\"validationMaxcheckedMessage\");\n              }\n              $this.data(\"validationMaxcheckedMessage\", message);\n              $this.data(\"validationMaxcheckedMaxchecked\", $this.attr(\"maxchecked\"));\n            }\n          }\n\n          // =============================================================\n          //                                       COLLECT VALIDATOR NAMES\n          // =============================================================\n\n          // Get named validators\n          if ($this.data(\"validation\") !== undefined) {\n            validatorNames = $this.data(\"validation\").split(\",\");\n          }\n\n          // Get extra ones defined on the element's data attributes\n          $.each($this.data(), function (i, el) {\n            var parts = i.replace(/([A-Z])/g, \",$1\").split(\",\");\n            if (parts[0] === \"validation\" && parts[1]) {\n              validatorNames.push(parts[1]);\n            }\n          });\n\n          // =============================================================\n          //                                     NORMALISE VALIDATOR NAMES\n          // =============================================================\n\n          var validatorNamesToInspect = validatorNames;\n          var newValidatorNamesToInspect = [];\n\n          do // repeatedly expand 'shortcut' validators into their real validators\n          {\n            // Uppercase only the first letter of each name\n            $.each(validatorNames, function (i, el) {\n              validatorNames[i] = formatValidatorName(el);\n            });\n\n            // Remove duplicate validator names\n            validatorNames = $.unique(validatorNames);\n\n            // Pull out the new validator names from each shortcut\n            newValidatorNamesToInspect = [];\n            $.each(validatorNamesToInspect, function(i, el) {\n              if ($this.data(\"validation\" + el + \"Shortcut\") !== undefined) {\n                // Are these custom validators?\n                // Pull them out!\n                $.each($this.data(\"validation\" + el + \"Shortcut\").split(\",\"), function(i2, el2) {\n                  newValidatorNamesToInspect.push(el2);\n                });\n              } else if (settings.builtInValidators[el.toLowerCase()]) {\n                // Is this a recognised built-in?\n                // Pull it out!\n                var validator = settings.builtInValidators[el.toLowerCase()];\n                if (validator.type.toLowerCase() === \"shortcut\") {\n                  $.each(validator.shortcut.split(\",\"), function (i, el) {\n                    el = formatValidatorName(el);\n                    newValidatorNamesToInspect.push(el);\n                    validatorNames.push(el);\n                  });\n                }\n              }\n            });\n\n            validatorNamesToInspect = newValidatorNamesToInspect;\n\n          } while (validatorNamesToInspect.length > 0)\n\n          // =============================================================\n          //                                       SET UP VALIDATOR ARRAYS\n          // =============================================================\n\n          var validators = {};\n\n          $.each(validatorNames, function (i, el) {\n            // Set up the 'override' message\n            var message = $this.data(\"validation\" + el + \"Message\");\n            var hasOverrideMessage = (message !== undefined);\n            var foundValidator = false;\n            message =\n              (\n                message\n                  ? message\n                  : \"'\" + el + \"' validation failed <!-- Add attribute 'data-validation-\" + el.toLowerCase() + \"-message' to input to change this message -->\"\n              )\n            ;\n\n            $.each(\n              settings.validatorTypes,\n              function (validatorType, validatorTemplate) {\n                if (validators[validatorType] === undefined) {\n                  validators[validatorType] = [];\n                }\n                if (!foundValidator && $this.data(\"validation\" + el + formatValidatorName(validatorTemplate.name)) !== undefined) {\n                  validators[validatorType].push(\n                    $.extend(\n                      true,\n                      {\n                        name: formatValidatorName(validatorTemplate.name),\n                        message: message\n                      },\n                      validatorTemplate.init($this, el)\n                    )\n                  );\n                  foundValidator = true;\n                }\n              }\n            );\n\n            if (!foundValidator && settings.builtInValidators[el.toLowerCase()]) {\n\n              var validator = $.extend(true, {}, settings.builtInValidators[el.toLowerCase()]);\n              if (hasOverrideMessage) {\n                validator.message = message;\n              }\n              var validatorType = validator.type.toLowerCase();\n\n              if (validatorType === \"shortcut\") {\n                foundValidator = true;\n              } else {\n                $.each(\n                  settings.validatorTypes,\n                  function (validatorTemplateType, validatorTemplate) {\n                    if (validators[validatorTemplateType] === undefined) {\n                      validators[validatorTemplateType] = [];\n                    }\n                    if (!foundValidator && validatorType === validatorTemplateType.toLowerCase()) {\n                      $this.data(\"validation\" + el + formatValidatorName(validatorTemplate.name), validator[validatorTemplate.name.toLowerCase()]);\n                      validators[validatorType].push(\n                        $.extend(\n                          validator,\n                          validatorTemplate.init($this, el)\n                        )\n                      );\n                      foundValidator = true;\n                    }\n                  }\n                );\n              }\n            }\n\n            if (! foundValidator) {\n              $.error(\"Cannot find validation info for '\" + el + \"'\");\n            }\n          });\n\n          // =============================================================\n          //                                         STORE FALLBACK VALUES\n          // =============================================================\n\n          $helpBlock.data(\n            \"original-contents\",\n            (\n              $helpBlock.data(\"original-contents\")\n                ? $helpBlock.data(\"original-contents\")\n                : $helpBlock.html()\n            )\n          );\n\n          $helpBlock.data(\n            \"original-role\",\n            (\n              $helpBlock.data(\"original-role\")\n                ? $helpBlock.data(\"original-role\")\n                : $helpBlock.attr(\"role\")\n            )\n          );\n\n          $controlGroup.data(\n            \"original-classes\",\n            (\n              $controlGroup.data(\"original-clases\")\n                ? $controlGroup.data(\"original-classes\")\n                : $controlGroup.attr(\"class\")\n            )\n          );\n\n          $this.data(\n            \"original-aria-invalid\",\n            (\n              $this.data(\"original-aria-invalid\")\n                ? $this.data(\"original-aria-invalid\")\n                : $this.attr(\"aria-invalid\")\n            )\n          );\n\n          // =============================================================\n          //                                                    VALIDATION\n          // =============================================================\n\n          $this.bind(\n            \"validation.validation\",\n            function (event, params) {\n\n              var value = getValue($this);\n\n              // Get a list of the errors to apply\n              var errorsFound = [];\n\n              $.each(validators, function (validatorType, validatorTypeArray) {\n                if (value || value.length || (params && params.includeEmpty) || (!!settings.validatorTypes[validatorType].blockSubmit && params && !!params.submitting)) {\n                  $.each(validatorTypeArray, function (i, validator) {\n                    if (settings.validatorTypes[validatorType].validate($this, value, validator)) {\n                      errorsFound.push(validator.message);\n                    }\n                  });\n                }\n              });\n\n              return errorsFound;\n            }\n          );\n\n          $this.bind(\n            \"getValidators.validation\",\n            function () {\n              return validators;\n            }\n          );\n\n          // =============================================================\n          //                                             WATCH FOR CHANGES\n          // =============================================================\n          $this.bind(\n            \"submit.validation\",\n            function () {\n              return $this.triggerHandler(\"change.validation\", {submitting: true});\n            }\n          );\n          $this.bind(\n            [\n              \"keyup\",\n              \"focus\",\n              \"blur\",\n              \"click\",\n              \"keydown\",\n              \"keypress\",\n              \"change\"\n            ].join(\".validation \") + \".validation\",\n            function (e, params) {\n\n              var value = getValue($this);\n\n              var errorsFound = [];\n\n              $controlGroup.find(\"input,textarea,select\").each(function (i, el) {\n                var oldCount = errorsFound.length;\n                $.each($(el).triggerHandler(\"validation.validation\", params), function (j, message) {\n                  errorsFound.push(message);\n                });\n                if (errorsFound.length > oldCount) {\n                  $(el).attr(\"aria-invalid\", \"true\");\n                } else {\n                  var original = $this.data(\"original-aria-invalid\");\n                  $(el).attr(\"aria-invalid\", (original !== undefined ? original : false));\n                }\n              });\n\n              $form.find(\"input,select,textarea\").not($this).not(\"[name=\\\"\" + $this.attr(\"name\") + \"\\\"]\").trigger(\"validationLostFocus.validation\");\n\n              errorsFound = $.unique(errorsFound.sort());\n\n              // Were there any errors?\n              if (errorsFound.length) {\n                // Better flag it up as a warning.\n                $controlGroup.removeClass(\"success error\").addClass(\"warning\");\n\n                // How many errors did we find?\n                if (settings.options.semanticallyStrict && errorsFound.length === 1) {\n                  // Only one? Being strict? Just output it.\n                  $helpBlock.html(errorsFound[0] + \n                    ( settings.options.prependExistingHelpBlock ? $helpBlock.data(\"original-contents\") : \"\" ));\n                } else {\n                  // Multiple? Being sloppy? Glue them together into an UL.\n                  $helpBlock.html(\"<ul role=\\\"alert\\\"><li>\" + errorsFound.join(\"</li><li>\") + \"</li></ul>\" +\n                    ( settings.options.prependExistingHelpBlock ? $helpBlock.data(\"original-contents\") : \"\" ));\n                }\n              } else {\n                $controlGroup.removeClass(\"warning error success\");\n                if (value.length > 0) {\n                  $controlGroup.addClass(\"success\");\n                }\n                $helpBlock.html($helpBlock.data(\"original-contents\"));\n              }\n\n              if (e.type === \"blur\") {\n                $controlGroup.removeClass(\"success\");\n              }\n            }\n          );\n          $this.bind(\"validationLostFocus.validation\", function () {\n            $controlGroup.removeClass(\"success\");\n          });\n        });\n      },\n      destroy : function( ) {\n\n        return this.each(\n          function() {\n\n            var\n              $this = $(this),\n              $controlGroup = $this.parents(\".form-group\").first(),\n              $helpBlock = $controlGroup.find(\".help-block\").first();\n\n            // remove our events\n            $this.unbind('.validation'); // events are namespaced.\n            // reset help text\n            $helpBlock.html($helpBlock.data(\"original-contents\"));\n            // reset classes\n            $controlGroup.attr(\"class\", $controlGroup.data(\"original-classes\"));\n            // reset aria\n            $this.attr(\"aria-invalid\", $this.data(\"original-aria-invalid\"));\n            // reset role\n            $helpBlock.attr(\"role\", $this.data(\"original-role\"));\n\t\t\t\t\t\t// remove all elements we created\n\t\t\t\t\t\tif (createdElements.indexOf($helpBlock[0]) > -1) {\n\t\t\t\t\t\t\t$helpBlock.remove();\n\t\t\t\t\t\t}\n\n          }\n        );\n\n      },\n      collectErrors : function(includeEmpty) {\n\n        var errorMessages = {};\n        this.each(function (i, el) {\n          var $el = $(el);\n          var name = $el.attr(\"name\");\n          var errors = $el.triggerHandler(\"validation.validation\", {includeEmpty: true});\n          errorMessages[name] = $.extend(true, errors, errorMessages[name]);\n        });\n\n        $.each(errorMessages, function (i, el) {\n          if (el.length === 0) {\n            delete errorMessages[i];\n          }\n        });\n\n        return errorMessages;\n\n      },\n      hasErrors: function() {\n\n        var errorMessages = [];\n\n        this.each(function (i, el) {\n          errorMessages = errorMessages.concat(\n            $(el).triggerHandler(\"getValidators.validation\") ? $(el).triggerHandler(\"validation.validation\", {submitting: true}) : []\n          );\n        });\n\n        return (errorMessages.length > 0);\n      },\n      override : function (newDefaults) {\n        defaults = $.extend(true, defaults, newDefaults);\n      }\n    },\n\t\tvalidatorTypes: {\n      callback: {\n        name: \"callback\",\n        init: function ($this, name) {\n          return {\n            validatorName: name,\n            callback: $this.data(\"validation\" + name + \"Callback\"),\n            lastValue: $this.val(),\n            lastValid: true,\n            lastFinished: true\n          };\n        },\n        validate: function ($this, value, validator) {\n          if (validator.lastValue === value && validator.lastFinished) {\n            return !validator.lastValid;\n          }\n\n          if (validator.lastFinished === true)\n          {\n            validator.lastValue = value;\n            validator.lastValid = true;\n            validator.lastFinished = false;\n\n            var rrjqbvValidator = validator;\n            var rrjqbvThis = $this;\n            executeFunctionByName(\n              validator.callback,\n              window,\n              $this,\n              value,\n              function (data) {\n                if (rrjqbvValidator.lastValue === data.value) {\n                  rrjqbvValidator.lastValid = data.valid;\n                  if (data.message) {\n                    rrjqbvValidator.message = data.message;\n                  }\n                  rrjqbvValidator.lastFinished = true;\n                  rrjqbvThis.data(\"validation\" + rrjqbvValidator.validatorName + \"Message\", rrjqbvValidator.message);\n                  // Timeout is set to avoid problems with the events being considered 'already fired'\n                  setTimeout(function () {\n                    rrjqbvThis.trigger(\"change.validation\");\n                  }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst\n                }\n              }\n            );\n          }\n\n          return false;\n\n        }\n      },\n      ajax: {\n        name: \"ajax\",\n        init: function ($this, name) {\n          return {\n            validatorName: name,\n            url: $this.data(\"validation\" + name + \"Ajax\"),\n            lastValue: $this.val(),\n            lastValid: true,\n            lastFinished: true\n          };\n        },\n        validate: function ($this, value, validator) {\n          if (\"\"+validator.lastValue === \"\"+value && validator.lastFinished === true) {\n            return validator.lastValid === false;\n          }\n\n          if (validator.lastFinished === true)\n          {\n            validator.lastValue = value;\n            validator.lastValid = true;\n            validator.lastFinished = false;\n            $.ajax({\n              url: validator.url,\n              data: \"value=\" + value + \"&field=\" + $this.attr(\"name\"),\n              dataType: \"json\",\n              success: function (data) {\n                if (\"\"+validator.lastValue === \"\"+data.value) {\n                  validator.lastValid = !!(data.valid);\n                  if (data.message) {\n                    validator.message = data.message;\n                  }\n                  validator.lastFinished = true;\n                  $this.data(\"validation\" + validator.validatorName + \"Message\", validator.message);\n                  // Timeout is set to avoid problems with the events being considered 'already fired'\n                  setTimeout(function () {\n                    $this.trigger(\"change.validation\");\n                  }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst\n                }\n              },\n              failure: function () {\n                validator.lastValid = true;\n                validator.message = \"ajax call failed\";\n                validator.lastFinished = true;\n                $this.data(\"validation\" + validator.validatorName + \"Message\", validator.message);\n                // Timeout is set to avoid problems with the events being considered 'already fired'\n                setTimeout(function () {\n                  $this.trigger(\"change.validation\");\n                }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst\n              }\n            });\n          }\n\n          return false;\n\n        }\n      },\n\t\t\tregex: {\n\t\t\t\tname: \"regex\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\treturn {regex: regexFromString($this.data(\"validation\" + name + \"Regex\"))};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn (!validator.regex.test(value) && ! validator.negative)\n\t\t\t\t\t\t|| (validator.regex.test(value) && validator.negative);\n\t\t\t\t}\n\t\t\t},\n\t\t\trequired: {\n\t\t\t\tname: \"required\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\treturn {};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn !!(value.length === 0  && ! validator.negative)\n\t\t\t\t\t\t|| !!(value.length > 0 && validator.negative);\n\t\t\t\t},\n        blockSubmit: true\n\t\t\t},\n\t\t\tmatch: {\n\t\t\t\tname: \"match\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\tvar element = $this.parents(\"form\").first().find(\"[name=\\\"\" + $this.data(\"validation\" + name + \"Match\") + \"\\\"]\").first();\n\t\t\t\t\telement.bind(\"validation.validation\", function () {\n\t\t\t\t\t\t$this.trigger(\"change.validation\", {submitting: true});\n\t\t\t\t\t});\n\t\t\t\t\treturn {\"element\": element};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn (value !== validator.element.val() && ! validator.negative)\n\t\t\t\t\t\t|| (value === validator.element.val() && validator.negative);\n\t\t\t\t},\n        blockSubmit: true\n\t\t\t},\n\t\t\tmax: {\n\t\t\t\tname: \"max\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\treturn {max: $this.data(\"validation\" + name + \"Max\")};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn (parseFloat(value, 10) > parseFloat(validator.max, 10) && ! validator.negative)\n\t\t\t\t\t\t|| (parseFloat(value, 10) <= parseFloat(validator.max, 10) && validator.negative);\n\t\t\t\t}\n\t\t\t},\n\t\t\tmin: {\n\t\t\t\tname: \"min\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\treturn {min: $this.data(\"validation\" + name + \"Min\")};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn (parseFloat(value) < parseFloat(validator.min) && ! validator.negative)\n\t\t\t\t\t\t|| (parseFloat(value) >= parseFloat(validator.min) && validator.negative);\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxlength: {\n\t\t\t\tname: \"maxlength\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\treturn {maxlength: $this.data(\"validation\" + name + \"Maxlength\")};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn ((value.length > validator.maxlength) && ! validator.negative)\n\t\t\t\t\t\t|| ((value.length <= validator.maxlength) && validator.negative);\n\t\t\t\t}\n\t\t\t},\n\t\t\tminlength: {\n\t\t\t\tname: \"minlength\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\treturn {minlength: $this.data(\"validation\" + name + \"Minlength\")};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn ((value.length < validator.minlength) && ! validator.negative)\n\t\t\t\t\t\t|| ((value.length >= validator.minlength) && validator.negative);\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxchecked: {\n\t\t\t\tname: \"maxchecked\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\tvar elements = $this.parents(\"form\").first().find(\"[name=\\\"\" + $this.attr(\"name\") + \"\\\"]\");\n\t\t\t\t\telements.bind(\"click.validation\", function () {\n\t\t\t\t\t\t$this.trigger(\"change.validation\", {includeEmpty: true});\n\t\t\t\t\t});\n\t\t\t\t\treturn {maxchecked: $this.data(\"validation\" + name + \"Maxchecked\"), elements: elements};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn (validator.elements.filter(\":checked\").length > validator.maxchecked && ! validator.negative)\n\t\t\t\t\t\t|| (validator.elements.filter(\":checked\").length <= validator.maxchecked && validator.negative);\n\t\t\t\t},\n        blockSubmit: true\n\t\t\t},\n\t\t\tminchecked: {\n\t\t\t\tname: \"minchecked\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\tvar elements = $this.parents(\"form\").first().find(\"[name=\\\"\" + $this.attr(\"name\") + \"\\\"]\");\n\t\t\t\t\telements.bind(\"click.validation\", function () {\n\t\t\t\t\t\t$this.trigger(\"change.validation\", {includeEmpty: true});\n\t\t\t\t\t});\n\t\t\t\t\treturn {minchecked: $this.data(\"validation\" + name + \"Minchecked\"), elements: elements};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn (validator.elements.filter(\":checked\").length < validator.minchecked && ! validator.negative)\n\t\t\t\t\t\t|| (validator.elements.filter(\":checked\").length >= validator.minchecked && validator.negative);\n\t\t\t\t},\n        blockSubmit: true\n\t\t\t}\n\t\t},\n\t\tbuiltInValidators: {\n\t\t\temail: {\n\t\t\t\tname: \"Email\",\n\t\t\t\ttype: \"shortcut\",\n\t\t\t\tshortcut: \"validemail\"\n\t\t\t},\n\t\t\tvalidemail: {\n\t\t\t\tname: \"Validemail\",\n\t\t\t\ttype: \"regex\",\n\t\t\t\tregex: \"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\\\.[A-Za-z]{2,4}\",\n\t\t\t\tmessage: \"Not a valid email address<!-- data-validator-validemail-message to override -->\"\n\t\t\t},\n\t\t\tpasswordagain: {\n\t\t\t\tname: \"Passwordagain\",\n\t\t\t\ttype: \"match\",\n\t\t\t\tmatch: \"password\",\n\t\t\t\tmessage: \"Does not match the given password<!-- data-validator-paswordagain-message to override -->\"\n\t\t\t},\n\t\t\tpositive: {\n\t\t\t\tname: \"Positive\",\n\t\t\t\ttype: \"shortcut\",\n\t\t\t\tshortcut: \"number,positivenumber\"\n\t\t\t},\n\t\t\tnegative: {\n\t\t\t\tname: \"Negative\",\n\t\t\t\ttype: \"shortcut\",\n\t\t\t\tshortcut: \"number,negativenumber\"\n\t\t\t},\n\t\t\tnumber: {\n\t\t\t\tname: \"Number\",\n\t\t\t\ttype: \"regex\",\n\t\t\t\tregex: \"([+-]?\\\\\\d+(\\\\\\.\\\\\\d*)?([eE][+-]?[0-9]+)?)?\",\n\t\t\t\tmessage: \"Must be a number<!-- data-validator-number-message to override -->\"\n\t\t\t},\n\t\t\tinteger: {\n\t\t\t\tname: \"Integer\",\n\t\t\t\ttype: \"regex\",\n\t\t\t\tregex: \"[+-]?\\\\\\d+\",\n\t\t\t\tmessage: \"No decimal places allowed<!-- data-validator-integer-message to override -->\"\n\t\t\t},\n\t\t\tpositivenumber: {\n\t\t\t\tname: \"Positivenumber\",\n\t\t\t\ttype: \"min\",\n\t\t\t\tmin: 0,\n\t\t\t\tmessage: \"Must be a positive number<!-- data-validator-positivenumber-message to override -->\"\n\t\t\t},\n\t\t\tnegativenumber: {\n\t\t\t\tname: \"Negativenumber\",\n\t\t\t\ttype: \"max\",\n\t\t\t\tmax: 0,\n\t\t\t\tmessage: \"Must be a negative number<!-- data-validator-negativenumber-message to override -->\"\n\t\t\t},\n\t\t\trequired: {\n\t\t\t\tname: \"Required\",\n\t\t\t\ttype: \"required\",\n\t\t\t\tmessage: \"This is required<!-- data-validator-required-message to override -->\"\n\t\t\t},\n\t\t\tcheckone: {\n\t\t\t\tname: \"Checkone\",\n\t\t\t\ttype: \"minchecked\",\n\t\t\t\tminchecked: 1,\n\t\t\t\tmessage: \"Check at least one option<!-- data-validation-checkone-message to override -->\"\n\t\t\t}\n\t\t}\n\t};\n\n\tvar formatValidatorName = function (name) {\n\t\treturn name\n\t\t\t.toLowerCase()\n\t\t\t.replace(\n\t\t\t\t/(^|\\s)([a-z])/g ,\n\t\t\t\tfunction(m,p1,p2) {\n\t\t\t\t\treturn p1+p2.toUpperCase();\n\t\t\t\t}\n\t\t\t)\n\t\t;\n\t};\n\n\tvar getValue = function ($this) {\n\t\t// Extract the value we're talking about\n\t\tvar value = $this.val();\n\t\tvar type = $this.attr(\"type\");\n\t\tif (type === \"checkbox\") {\n\t\t\tvalue = ($this.is(\":checked\") ? value : \"\");\n\t\t}\n\t\tif (type === \"radio\") {\n\t\t\tvalue = ($('input[name=\"' + $this.attr(\"name\") + '\"]:checked').length > 0 ? value : \"\");\n\t\t}\n\t\treturn value;\n\t};\n\n  function regexFromString(inputstring) {\n\t\treturn new RegExp(\"^\" + inputstring + \"$\");\n\t}\n\n  /**\n   * Thanks to Jason Bunting via StackOverflow.com\n   *\n   * http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string#answer-359910\n   * Short link: http://tinyurl.com/executeFunctionByName\n  **/\n  function executeFunctionByName(functionName, context /*, args*/) {\n    var args = Array.prototype.slice.call(arguments).splice(2);\n    var namespaces = functionName.split(\".\");\n    var func = namespaces.pop();\n    for(var i = 0; i < namespaces.length; i++) {\n      context = context[namespaces[i]];\n    }\n    return context[func].apply(this, args);\n  }\n\n\t$.fn.jqBootstrapValidation = function( method ) {\n\n\t\tif ( defaults.methods[method] ) {\n\t\t\treturn defaults.methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));\n\t\t} else if ( typeof method === 'object' || ! method ) {\n\t\t\treturn defaults.methods.init.apply( this, arguments );\n\t\t} else {\n\t\t$.error( 'Method ' +  method + ' does not exist on jQuery.jqBootstrapValidation' );\n\t\t\treturn null;\n\t\t}\n\n\t};\n\n  $.jqBootstrapValidation = function (options) {\n    $(\":input\").not(\"[type=image],[type=submit]\").jqBootstrapValidation.apply(this,arguments);\n  };\n\n})( jQuery );\n"
  },
  {
    "path": "example/bootstrap/v3/less/agency.less",
    "content": "@import \"variables.less\";\n@import \"mixins.less\";\n\n// Global Components\n\nbody {\n    overflow-x: hidden;\n    .body-font;\n}\n\n.text-muted {\n    color: @gray-light;\n}\n\n.text-primary {\n    color: @theme-primary;\n}\n\np {\n    font-size: 14px;\n    line-height: 1.75;\n}\n\np.large {\n    font-size: 16px;\n}\n\na,\na:hover,\na:focus,\na:active,\na.active {\n    outline: none;\n}\n\na {\n    color: @theme-primary;\n}\n\na:hover,\na:focus,\na:active,\na.active {\n    color: darken(@theme-primary, 10%);\n}\n\nh1, h2, h3, h4, h5, h6 {\n    .heading-font;\n    font-weight: 700;\n}\n\n.img-centered {\n    margin: 0 auto;\n}\n\n.bg-light-gray {\n    background-color: @gray-lighter;\n}\n\n.bg-darkest-gray {\n    background-color: @gray-darker;\n}\n\n// Restyled Primary Buttons\n\n.btn-primary {\n    .button-variant(white; @theme-primary; @theme-primary);\n    .heading-font;\n    font-weight: 700;\n}\n\n.btn-xl {\n    .button-variant(white; @theme-primary; @theme-primary);\n    .heading-font;\n    font-weight: 700;\n    border-radius: 3px;\n    font-size: 18px;\n    padding: 20px 40px;\n}\n\n// Custom Navigation Bar\n\n.navbar-custom {\n    background-color: @gray-darker;\n    border-color: transparent;\n    .navbar-brand {\n        color: @theme-primary;\n        .script-font;\n        &:hover,\n        &:focus,\n        &:active,\n        &.active {\n            color: darken(@theme-primary, 10%);\n        }\n    }\n    .navbar-collapse {\n        border-color: fade(white, 2%);\n    }\n    .navbar-toggle {\n        background-color: @theme-primary;\n        border-color: @theme-primary;\n        .heading-font;\n        color: white;\n        font-size: 12px;\n        &:hover,\n        &:focus {\n            background-color: @theme-primary;\n        }\n    }\n    .nav {\n        li {\n            a {\n                .heading-font;\n                font-weight: 400;\n                letter-spacing: 1px;\n                color: white;\n                &:hover,\n                &:focus {\n                    color: @theme-primary;\n                    outline: none;\n                }\n            }\n        }\n    }\n    .navbar-nav>.active>a {\n        border-radius: 0;\n        color: white;\n        background-color: @theme-primary;\n    }\n    .navbar-nav>.active>a:hover,\n    .navbar-nav>.active>a:focus {\n        color: white;\n        background-color: darken(@theme-primary, 10%);\n    }\n}\n\n@media(min-width:768px) {\n    .navbar-custom {\n        background-color: transparent;\n        padding: 25px 0;\n        -webkit-transition: padding 0.3s;\n        -moz-transition: padding 0.3s;\n        transition: padding 0.3s;\n        border: none;\n        .navbar-brand {\n            font-size: 2em;\n            -webkit-transition: all 0.3s;\n            -moz-transition: all 0.3s;\n            transition: all 0.3s;\n        }\n        .navbar-nav>.active>a {\n            border-radius: 3px;\n        }\n    }\n}\n\n// Navbar Change on Scroll\n\n@media(min-width:768px) {\n    .navbar-custom.affix {\n        background-color: @gray-darker;\n        padding: 10px 0;\n        .navbar-brand {\n            font-size: 1.5em;\n        }\n    }\n}\n\nheader {\n    background-image: url('../img/header-bg.jpg');\n    background-repeat: no-repeat;\n    background-attachment: scroll;\n    background-position: center center;\n    .background-cover;\n    text-align: center;\n    color: white;\n    .intro-text {\n        padding-top: 100px;\n        padding-bottom: 50px;\n        .intro-lead-in {\n            .serif-font;\n            font-style: italic;\n            font-size: 22px;\n            line-height: 22px;\n            margin-bottom: 25px;\n        }\n        .intro-heading {\n            .heading-font;\n            font-weight: 700;\n            font-size: 50px;\n            line-height: 50px;\n            margin-bottom: 25px;\n        }\n    }\n}\n\n@media(min-width:768px) {\n    header {\n        .intro-text {\n            padding-top: 300px;\n            padding-bottom: 200px;\n            .intro-lead-in {\n                .serif-font;\n                font-style: italic;\n                font-size: 40px;\n                line-height: 40px;\n                margin-bottom: 25px;\n            }\n            .intro-heading {\n                .heading-font;\n                font-weight: 700;\n                font-size: 75px;\n                line-height: 75px;\n                margin-bottom: 50px;\n            }\n        }\n    }\n}\n\n// Global Section Styles\n\nsection {\n    padding: 100px 0;\n    h2.section-heading {\n        font-size: 40px;\n        margin-top: 0;\n        margin-bottom: 15px;\n    }\n    h3.section-subheading {\n        font-size: 16px;\n        .serif-font;\n        text-transform: none;\n        font-style: italic;\n        font-weight: 400;\n        margin-bottom: 75px;\n    }\n}\n\n@media(min-width:768px) {\n    section {\n        padding: 150px 0;\n    }\n}\n\n// Services Section\n\n.service-heading {\n    margin: 15px 0;\n    text-transform: none;\n}\n\n// Portfolio Section\n\n#portfolio {\n    .portfolio-item {\n        margin: 0 0 15px;\n        right: 0;\n        .portfolio-link {\n            display: block;\n            position: relative;\n            max-width: 400px;\n            margin: 0 auto;\n            .portfolio-hover {\n                background: fade(@theme-primary, 90%);\n                position: absolute;\n                width: 100%;\n                height: 100%;\n                opacity: 0;\n                transition: all ease 0.5s;\n                -webkit-transition: all ease 0.5s;\n                -moz-transition: all ease 0.5s;\n                &:hover {\n                    opacity: 1;\n                }\n                .portfolio-hover-content {\n                    position: absolute;\n                    width: 100%;\n                    height: 20px;\n                    font-size: 20px;\n                    text-align: center;\n                    top: 50%;\n                    margin-top: -12px;\n                    color: white;\n                    i {\n                        margin-top: -12px;\n                    }\n                    h3,\n                    h4 {\n                        margin: 0;\n                    }\n                }                \n            }            \n        }\n        .portfolio-caption {\n            max-width: 400px;\n            margin: 0 auto;\n            background-color: white;\n            text-align: center;\n            padding: 25px;\n            h4 {\n                text-transform: none;\n                margin: 0;\n            }\n            p {\n                .serif-font;\n                font-style: italic;\n                font-size: 16px;\n                margin: 0;\n            }\n        }\n    }\n    * {\n        z-index: 2;\n    }\n}\n\n@media(min-width:767px) {\n    #portfolio {\n        .portfolio-item {\n            margin: 0 0 30px;\n        }\n    }\n}\n\n// Timeline\n\n.timeline {\n    list-style: none;\n    padding: 0;\n    position: relative;\n    &:before {\n        top: 0;\n        bottom: 0;\n        position: absolute;\n        content: \"\";\n        width: 2px;\n        background-color: #f1f1f1;\n        left: 40px;\n        margin-left: -1.5px;\n    }\n    > li {\n        margin-bottom: 50px;\n        position: relative;\n        min-height: 50px;\n        &:before,\n        &:after {\n            content: \" \";\n            display: table;\n        }\n        &:after {\n            clear: both;\n        }\n        .timeline-panel {\n            width: 100%;\n            float: right;\n            padding: 0 20px 0 100px;\n            position: relative;\n            text-align: left;\n            &:before {\n                border-left-width: 0;\n                border-right-width: 15px;\n                left: -15px;\n                right: auto;\n            }\n            &:after {\n                border-left-width: 0;\n                border-right-width: 14px;\n                left: -14px;\n                right: auto;\n            }\n        }\n        .timeline-image {\n            left: 0;\n            margin-left: 0;\n            width: 80px;\n            height: 80px;\n            position: absolute;\n            z-index: 100;\n            background-color: @theme-primary;\n            color: white;\n            border-radius: 100%;\n            border: 7px solid #f1f1f1;\n            text-align: center;\n            h4 {\n                font-size: 10px;\n                margin-top: 12px;\n                line-height: 14px;\n            }\n        }\n        &.timeline-inverted > .timeline-panel {\n            float: right;\n            text-align: left;\n            padding: 0 20px 0 100px;\n            &:before {\n                border-left-width: 0;\n                border-right-width: 15px;\n                left: -15px;\n                right: auto;\n            }\n            &:after {\n                border-left-width: 0;\n                border-right-width: 14px;\n                left: -14px;\n                right: auto;\n            }\n        }\n        &:last-child {\n            margin-bottom: 0;\n        }\n    }\n    .timeline-heading {\n        h4 {\n            margin-top: 0;\n            color: inherit;\n            &.subheading {\n                text-transform: none;\n            }\n        }\n    }\n    .timeline-body {\n        > p,\n        > ul {\n            margin-bottom: 0;\n        }\n    }\n}\n\n@media(min-width:768px) {\n    .timeline {\n        &:before {\n            left: 50%;\n        }\n        > li {\n            margin-bottom: 100px;\n            min-height: 100px;\n            .timeline-panel {\n                width: 41%;\n                float: left;\n                padding: 0 20px 20px 30px;\n                text-align: right;\n            }\n            .timeline-image {\n                width: 100px;\n                height: 100px;\n                left: 50%;\n                margin-left: -50px;\n                h4 {\n                    font-size: 13px;\n                    margin-top: 16px;\n                    line-height: 18px;\n                }\n            }\n            &.timeline-inverted > .timeline-panel {\n                float: right;\n                text-align: left;\n                padding: 0 30px 20px 20px;\n            }\n        }\n    }\n}\n\n@media(min-width:992px) {\n    .timeline {\n        > li {\n            min-height: 150px;\n            .timeline-panel {\n                padding: 0 20px 20px;\n            }\n            .timeline-image {\n                width: 150px;\n                height: 150px;\n                margin-left: -75px;\n                h4 {\n                    font-size: 18px;\n                    margin-top: 30px;\n                    line-height: 26px;\n                }\n            }\n            &.timeline-inverted > .timeline-panel {\n                padding: 0 20px 20px;\n            }\n        }\n    }\n}\n\n@media(min-width:1200px) {\n    .timeline {\n        > li {\n            min-height: 170px;\n            .timeline-panel {\n                padding: 0 20px 20px 100px;\n            }\n            .timeline-image {\n                width: 170px;\n                height: 170px;\n                margin-left: -85px;\n                h4 {\n                    margin-top: 40px;\n                }\n            }\n            &.timeline-inverted > .timeline-panel {\n                padding: 0 100px 20px 20px;\n            }\n        }\n    }\n}\n\n// Team Section\n\n.team-member {\n    text-align: center;\n    margin-bottom: 50px;\n    img {\n        margin: 0 auto;\n        border: 7px solid white;\n    }\n    h4 {\n        margin-top: 25px;\n        margin-bottom: 0;\n        text-transform: none;\n    }\n    p {\n        margin-top: 0;\n    }\n}\n\n// Clients Aside\n\naside.clients {\n    img {\n        margin: 50px auto;\n    }\n}\n\n// Contact Section\n\nsection#contact {\n    background-color: @gray-darker;\n    background-image: url('../img/map-image.png');\n    background-position: center;\n    background-repeat: no-repeat;\n    .section-heading {\n        color: white;\n    }\n    .form-group {\n        margin-bottom: 25px;\n        input,\n        textarea {\n            padding: 20px;\n        }\n        input.form-control {\n            height: auto;\n        }\n        textarea.form-control {\n            height: 236px;\n        }\n    }\n    .form-control:focus {\n        border-color: @theme-primary;\n        box-shadow: none;\n    }\n    ::-webkit-input-placeholder {\n       .heading-font;\n       font-weight: 700;\n       color: @gray-lighter;\n    }\n    :-moz-placeholder { /* Firefox 18- */\n       .heading-font;\n       font-weight: 700;\n       color: @gray-lighter;\n    }\n    ::-moz-placeholder {  /* Firefox 19+ */\n       .heading-font;\n       font-weight: 700;\n       color: @gray-lighter;\n    }\n    :-ms-input-placeholder {  \n       .heading-font;\n       font-weight: 700;\n       color: @gray-lighter;\n    }\n    .text-danger {\n        color: @theme-danger;\n    }\n}\n\n// Footer\n\nfooter {\n    padding: 25px 0;\n    text-align: center;\n    span.copyright {\n        line-height: 40px;\n        .heading-font;\n        text-transform: none;\n    }\n    ul.quicklinks {\n        margin-bottom: 0;\n        line-height: 40px;\n        .heading-font;\n        text-transform: none;\n    }\n}\n\n// Social Buttons\n\nul.social-buttons {\n    margin-bottom: 0;\n    li {\n        a {\n            display: block;\n            background-color: @gray-darker;\n            height: 40px;\n            width: 40px;\n            border-radius: 100%;\n            font-size: 20px;\n            line-height: 40px;\n            color: white;\n            outline: none;\n            -webkit-transition: all 0.3s;\n            -moz-transition: all 0.3s;\n            transition: all 0.3s;\n            &:hover,\n            &:focus,\n            &:active {\n                background-color: @theme-primary;\n            }\n        }\n    }\n}\n\n.btn:focus,\n.btn:active,\n.btn.active,\n.btn:active:focus {\n    outline: none;\n}\n\n.portfolio-modal {\n    .modal-dialog{\n        margin: 0;\n        height: 100%;\n        width: auto;\n    }\n    .modal-content {\n        border-radius: 0;\n        background-clip: border-box;\n        -webkit-box-shadow: none;\n        box-shadow: none;\n        border: none;\n        min-height: 100%;\n        padding: 100px 0;\n        text-align: center;\n        h2 {\n            margin-bottom: 15px;\n            font-size: 3em;\n        }\n        p {\n            margin-bottom: 30px;\n        }\n        p.item-intro {\n            margin: 20px 0 30px;\n            .serif-font;\n            font-style: italic;\n            font-size: 16px;\n        }\n        ul.list-inline {\n            margin-bottom: 30px;\n            margin-top: 0;\n        }\n        img {\n            margin-bottom: 30px;\n        }\n    }\n    .close-modal {\n        position: absolute;\n        width:75px;\n        height:75px;\n        background-color:transparent;\n        top: 25px;\n        right: 25px;\n        cursor: pointer;\n        &:hover {\n            opacity: 0.3;\n        }\n        .lr {\n            height:75px;\n            width:1px;\n            margin-left:35px;\n            background-color:@gray-darker;\n            transform: rotate(45deg);\n            -ms-transform: rotate(45deg);\n            /* IE 9 */\n            -webkit-transform: rotate(45deg);\n            /* Safari and Chrome */\n            z-index:1051;\n            .rl {\n                height:75px;\n                width:1px;\n                background-color:@gray-darker;\n                transform: rotate(90deg);\n                -ms-transform: rotate(90deg);\n                /* IE 9 */\n                -webkit-transform: rotate(90deg);\n                /* Safari and Chrome */\n                z-index:1052;\n            }            \n        }        \n    }\n    .modal-backdrop {\n        opacity: 0;\n        display: none;\n    }\n}\n\n// Highlight Color Customization\n\n::-moz-selection {\n    text-shadow: none;\n    background: @theme-primary;\n}\n\n::selection {\n    text-shadow: none;\n    background: @theme-primary;\n}\n\nimg::selection {\n    background: transparent;\n}\n\nimg::-moz-selection {\n    background: transparent;\n}\n\nbody {\n    webkit-tap-highlight-color: @theme-primary;\n}\n"
  },
  {
    "path": "example/bootstrap/v3/less/mixins.less",
    "content": "// Mixins\n\n// Bootstrap Button Variant\n\n.button-variant(@color; @background; @border) {\n  color: @color;\n  background-color: @background;\n  border-color: @border;\n\n  &:hover,\n  &:focus,\n  &:active,\n  &.active,\n  .open .dropdown-toggle& {\n    color: @color;\n    background-color: darken(@background, 10%);\n        border-color: darken(@border, 12%);\n  }\n  &:active,\n  &.active,\n  .open .dropdown-toggle& {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &,\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      background-color: @background;\n      border-color: @border;\n    }\n  }\n\n  .badge {\n    color: @background;\n    background-color: @color;\n  }\n}\n\n// Background Cover Mixin\n\n.background-cover() {\n    -webkit-background-size: cover;\n    -moz-background-size: cover;\n    background-size: cover;\n    -o-background-size: cover;\n}\n\n// Font Mixins\n\n.serif-font() {\n  font-family: \"Droid Serif\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n.script-font() {\n  font-family: \"Kaushan Script\", \"Helvetica Neue\", Helvetica, Arial, cursive;\n}\n\n.body-font() {\n  font-family: \"Roboto Slab\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n.heading-font() {\n  font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: uppercase;\n}"
  },
  {
    "path": "example/bootstrap/v3/less/variables.less",
    "content": "// Variables\n\n// Gray and Brand Colors for use across theme\n\n@theme-primary:    #fed136;\n@theme-danger:     #e74c3c;\n\n@gray-base:        #000;\n@gray-darker:      lighten(@gray-base, 13.5%); // #222\n@gray-dark:        lighten(@gray-base, 20%);   // #333\n@gray:             lighten(@gray-base, 33.5%); // #555\n@gray-light:       lighten(@gray-base, 46.7%); // #777\n@gray-lighter:     lighten(@gray-base, 93.5%); // #eee"
  },
  {
    "path": "example/bootstrap/v3/mail/contact_me.php",
    "content": "<?php\n// Check for empty fields\nif(empty($_POST['name'])      ||\n   empty($_POST['email'])     ||\n   empty($_POST['phone'])     ||\n   empty($_POST['message'])   ||\n   !filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))\n   {\n   echo \"No arguments Provided!\";\n   return false;\n   }\n   \n$name = strip_tags(htmlspecialchars($_POST['name']));\n$email_address = strip_tags(htmlspecialchars($_POST['email']));\n$phone = strip_tags(htmlspecialchars($_POST['phone']));\n$message = strip_tags(htmlspecialchars($_POST['message']));\n   \n// Create the email and send the message\n$to = 'yourname@yourdomain.com'; // Add your email address inbetween the '' replacing yourname@yourdomain.com - This is where the form will send a message to.\n$email_subject = \"Website Contact Form:  $name\";\n$email_body = \"You have received a new message from your website contact form.\\n\\n\".\"Here are the details:\\n\\nName: $name\\n\\nEmail: $email_address\\n\\nPhone: $phone\\n\\nMessage:\\n$message\";\n$headers = \"From: noreply@yourdomain.com\\n\"; // This is the email address the generated message will be from. We recommend using something like noreply@yourdomain.com.\n$headers .= \"Reply-To: $email_address\";   \nmail($to,$email_subject,$email_body,$headers);\nreturn true;         \n?>\n"
  },
  {
    "path": "example/bootstrap/v3/package.json",
    "content": "{\n  \"name\": \"agency\",\n  \"title\": \"Agency\",\n  \"version\": \"1.1.1\",\n  \"homepage\": \"http://startbootstrap.com/template-overviews/agency\",\n  \"author\": \"Start Bootstrap\",\n  \"license\": {\n    \"type\": \"MIT\",\n    \"url\": \"https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE\"\n  },\n  \"devDependencies\": {\n    \"bootstrap\": \"^3.3.7\",\n    \"browser-sync\": \"^2.13.0\",\n    \"font-awesome\": \"^4.6.3\",\n    \"gulp\": \"^3.9.1\",\n    \"gulp-clean-css\": \"^2.0.10\",\n    \"gulp-header\": \"^1.8.7\",\n    \"gulp-less\": \"^3.1.0\",\n    \"gulp-rename\": \"^1.2.2\",\n    \"gulp-uglify\": \"^1.5.4\",\n    \"jquery\": \"^1.11.3\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/BlackrockDigital/startbootstrap-agency.git\"\n  }\n}\n"
  },
  {
    "path": "example/bootstrap/v3/scss/_mixins.scss",
    "content": "// Bootstrap Button Variant\n\n@mixin button-variant($color, $background, $border) {\n  color: $color;\n  background-color: $background;\n  border-color: $border;\n  @at-root {\n    &.active,\n    &:active,\n    &:focus,\n    &:hover,\n    .open .dropdown-toggle#{&} {\n      color: $color;\n      background-color: darken($background, 10%);\n      border-color: darken($border, 12%);\n    }\n\n    &.active,\n    &:active,\n    .open .dropdown-toggle#{&} {\n      background-image: none;\n    }\n\n    &.disabled,\n    &[disabled],\n    fieldset[disabled] #{&} {\n      &,\n      &.active,\n      &:active,\n      &:focus,\n      &:hover {\n        background-color: $background;\n        border-color: $border;\n      }\n    }\n  }\n\n  .badge {\n    color: $background;\n    background-color: $color;\n  }\n}\n\n// Background Features\n\n@mixin background-cover {\n  -webkit-background-size: cover;\n  -moz-background-size: cover;\n  background-size: cover;\n  -o-background-size: cover;\n}\n\n// Font Selections\n\n@mixin serif-font {\n  font-family: \"Droid Serif\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n@mixin script-font {\n  font-family: \"Kaushan Script\", \"Helvetica Neue\", Helvetica, Arial, cursive;\n}\n\n@mixin body-font {\n  font-family: \"Roboto Slab\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n@mixin heading-font {\n  font-family: \"Montserrat\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  text-transform: uppercase;\n}\n"
  },
  {
    "path": "example/bootstrap/v3/scss/_variables.scss",
    "content": "// Variables\n\n$brand-primary: #fed136;\n$brand-danger: #e74c3c;\n$gray-darkest: #222;\n$gray: #777;\n$gray-lighter: #f7f7f7;\n$placeholder-text: #bbbbbb;\n"
  },
  {
    "path": "example/bootstrap/v3/scss/agency.scss",
    "content": "@import 'variables';\n@import 'mixins';\n\n// Global Components\n\nbody {\n  overflow-x: hidden;\n  @include body-font;\n}\n\n.text-muted {\n  color: $gray;\n}\n\n.text-primary {\n  color: $brand-primary;\n}\n\np {\n  font-size: 14px;\n  line-height: 1.75;\n}\n\np.large {\n  font-size: 16px;\n}\n\na,\na.active,\na:active,\na:focus,\na:hover {\n  outline: none;\n}\n\na {\n  color: $brand-primary;\n}\n\na.active,\na:active,\na:focus,\na:hover {\n  color: darken($brand-primary, 10%);\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  @include heading-font;\n  font-weight: 700;\n}\n\n.img-centered {\n  margin: 0 auto;\n}\n\n.bg-light-gray {\n  background-color: $gray-lighter;\n}\n\n.bg-darkest-gray {\n  background-color: $gray-darkest;\n}\n\n// Restyled Primary Buttons\n\n.btn-primary {\n  @include button-variant(white, $brand-primary, $brand-primary);\n  @include heading-font;\n  font-weight: 700;\n}\n\n.btn-xl {\n  @include button-variant(white, $brand-primary, $brand-primary);\n  @include heading-font;\n  font-weight: 700;\n  border-radius: 3px;\n  font-size: 18px;\n  padding: 20px 40px;\n}\n\n// Custom Navigation Bar\n\n.navbar-default {\n  background-color: $gray-darkest;\n  border-color: transparent;\n\n  .navbar-brand {\n    color: $brand-primary;\n    @include script-font;\n\n    &.active,\n    &:active,\n    &:focus,\n    &:hover {\n      color: darken($brand-primary, 10%);\n    }\n  }\n\n  .navbar-collapse {\n    border-color: fade(white, 2%);\n  }\n\n  .navbar-toggle {\n    background-color: $brand-primary;\n    border-color: $brand-primary;\n\n    .icon-bar {\n      background-color: white;\n    }\n\n    &:focus,\n    &:hover {\n      background-color: $brand-primary;\n    }\n  }\n\n  .nav {\n    li {\n      a {\n        @include heading-font;\n        font-weight: 400;\n        letter-spacing: 1px;\n        color: white;\n\n        &:focus,\n        &:hover {\n          color: $brand-primary;\n          outline: none;\n        }\n      }\n    }\n  }\n\n  .navbar-nav > .active > a {\n    border-radius: 0;\n    color: white;\n    background-color: $brand-primary;\n  }\n\n  .navbar-nav > .active > a:focus,\n  .navbar-nav > .active > a:hover {\n    color: white;\n    background-color: darken($brand-primary, 10%);\n  }\n}\n\n@media(min-width:768px) {\n  .navbar-default {\n    background-color: transparent;\n    padding: 25px 0;\n    -webkit-transition: padding 0.3s;\n    -moz-transition: padding 0.3s;\n    transition: padding 0.3s;\n    border: none;\n\n    .navbar-brand {\n      font-size: 2em;\n      -webkit-transition: all 0.3s;\n      -moz-transition: all 0.3s;\n      transition: all 0.3s;\n    }\n\n    .navbar-nav > .active > a {\n      border-radius: 3px;\n    }\n  }\n\n  .navbar-default.navbar-shrink {\n    background-color: $gray-darkest;\n    padding: 10px 0;\n\n    .navbar-brand {\n      font-size: 1.5em;\n    }\n  }\n}\n\nheader {\n  background-image: url('../img/header-bg.jpg');\n  background-repeat: none;\n  background-attachment: scroll;\n  background-position: center center;\n  @include background-cover;\n  text-align: center;\n  color: white;\n\n  .intro-text {\n    padding-top: 100px;\n    padding-bottom: 50px;\n\n    .intro-lead-in {\n      @include serif-font;\n      font-style: italic;\n      font-size: 22px;\n      line-height: 22px;\n      margin-bottom: 25px;\n    }\n\n    .intro-heading {\n      @include heading-font;\n      font-weight: 700;\n      font-size: 50px;\n      line-height: 50px;\n      margin-bottom: 25px;\n    }\n  }\n}\n\n@media(min-width:768px) {\n  header {\n    .intro-text {\n      padding-top: 300px;\n      padding-bottom: 200px;\n\n      .intro-lead-in {\n        @include serif-font;\n        font-style: italic;\n        font-size: 40px;\n        line-height: 40px;\n        margin-bottom: 25px;\n      }\n\n      .intro-heading {\n        @include heading-font;\n        font-weight: 700;\n        font-size: 75px;\n        line-height: 75px;\n        margin-bottom: 50px;\n      }\n    }\n  }\n}\n\n// Global Section Styles\n\nsection {\n  padding: 100px 0;\n\n  h2.section-heading {\n    font-size: 40px;\n    margin-top: 0;\n    margin-bottom: 15px;\n  }\n\n  h3.section-subheading {\n    font-size: 16px;\n    @include serif-font;\n    text-transform: none;\n    font-style: italic;\n    font-weight: 400;\n    margin-bottom: 75px;\n  }\n}\n\n@media(min-width:768px) {\n  section {\n    padding: 150px 0;\n  }\n}\n\n// Services Section\n\n.service-heading {\n  margin: 15px 0;\n  text-transform: none;\n}\n\n// Portfolio Section\n\n#portfolio {\n  .portfolio-item {\n    margin: 0 0 15px;\n    right: 0;\n\n    .portfolio-link {\n      display: block;\n      position: relative;\n      max-width: 400px;\n      margin: 0 auto;\n\n      .portfolio-hover {\n        background: fade($brand-primary, 90%);\n        position: absolute;\n        width: 100%;\n        height: 100%;\n        opacity: 0;\n        transition: all ease 0.5s;\n        -webkit-transition: all ease 0.5s;\n        -moz-transition: all ease 0.5s;\n\n        &:hover {\n          opacity: 1;\n        }\n\n        .portfolio-hover-content {\n          position: absolute;\n          width: 100%;\n          height: 20px;\n          font-size: 20px;\n          text-align: center;\n          top: 50%;\n          margin-top: -12px;\n          color: white;\n\n          i {\n            margin-top: -12px;\n          }\n\n          h3,\n          h4 {\n            margin: 0;\n          }\n        }\n      }\n    }\n\n    .portfolio-caption {\n      max-width: 400px;\n      margin: 0 auto;\n      background-color: white;\n      text-align: center;\n      padding: 25px;\n\n      h4 {\n        text-transform: none;\n        margin: 0;\n      }\n\n      p {\n        @include serif-font;\n        font-style: italic;\n        font-size: 16px;\n        margin: 0;\n      }\n    }\n  }\n\n  * {\n    z-index: 2;\n  }\n}\n\n@media(min-width:767px) {\n  #portfolio {\n    .portfolio-item {\n      margin: 0 0 30px;\n    }\n  }\n}\n\n// Timeline\n\n.timeline {\n  list-style: none;\n  padding: 0;\n  position: relative;\n\n  &:before {\n    top: 0;\n    bottom: 0;\n    position: absolute;\n    content: \"\";\n    width: 2px;\n    background-color: #f1f1f1;\n    left: 40px;\n    margin-left: -1.5px;\n  }\n\n  > li {\n    margin-bottom: 50px;\n    position: relative;\n    min-height: 50px;\n\n    &:after,\n    &:before {\n      content: \" \";\n      display: table;\n    }\n\n    &:after {\n      clear: both;\n    }\n\n    .timeline-panel {\n      width: 100%;\n      float: right;\n      padding: 0 20px 0 100px;\n      position: relative;\n      text-align: left;\n\n      &:before {\n        border-left-width: 0;\n        border-right-width: 15px;\n        left: -15px;\n        right: auto;\n      }\n\n      &:after {\n        border-left-width: 0;\n        border-right-width: 14px;\n        left: -14px;\n        right: auto;\n      }\n    }\n\n    .timeline-image {\n      left: 0;\n      margin-left: 0;\n      width: 80px;\n      height: 80px;\n      position: absolute;\n      z-index: 100;\n      background-color: $brand-primary;\n      color: white;\n      border-radius: 100%;\n      border: 7px solid #f1f1f1;\n      text-align: center;\n\n      h4 {\n        font-size: 10px;\n        margin-top: 12px;\n        line-height: 14px;\n      }\n    }\n\n    &.timeline-inverted > .timeline-panel {\n      float: right;\n      text-align: left;\n      padding: 0 20px 0 100px;\n\n      &:before {\n        border-left-width: 0;\n        border-right-width: 15px;\n        left: -15px;\n        right: auto;\n      }\n\n      &:after {\n        border-left-width: 0;\n        border-right-width: 14px;\n        left: -14px;\n        right: auto;\n      }\n    }\n\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  .timeline-heading {\n    h4 {\n      margin-top: 0;\n      color: inherit;\n\n      &.subheading {\n        text-transform: none;\n      }\n    }\n  }\n\n  .timeline-body {\n     > p,\n    > ul {\n      margin-bottom: 0;\n    }\n  }\n}\n\n@media(min-width:768px) {\n  .timeline {\n    &:before {\n      left: 50%;\n    }\n\n    > li {\n      margin-bottom: 100px;\n      min-height: 100px;\n\n      .timeline-panel {\n        width: 41%;\n        float: left;\n        padding: 0 20px 20px 30px;\n        text-align: right;\n      }\n\n      .timeline-image {\n        width: 100px;\n        height: 100px;\n        left: 50%;\n        margin-left: -50px;\n\n        h4 {\n          font-size: 13px;\n          margin-top: 16px;\n          line-height: 18px;\n        }\n      }\n\n      &.timeline-inverted > .timeline-panel {\n        float: right;\n        text-align: left;\n        padding: 0 30px 20px 20px;\n      }\n    }\n  }\n}\n\n@media(min-width:992px) {\n  .timeline {\n    > li {\n      min-height: 150px;\n\n      .timeline-panel {\n        padding: 0 20px 20px;\n      }\n\n      .timeline-image {\n        width: 150px;\n        height: 150px;\n        margin-left: -75px;\n\n        h4 {\n          font-size: 18px;\n          margin-top: 30px;\n          line-height: 26px;\n        }\n      }\n\n      &.timeline-inverted > .timeline-panel {\n        padding: 0 20px 20px;\n      }\n    }\n  }\n}\n\n@media(min-width:1200px) {\n  .timeline {\n    > li {\n      min-height: 170px;\n\n      .timeline-panel {\n        padding: 0 20px 20px 100px;\n      }\n\n      .timeline-image {\n        width: 170px;\n        height: 170px;\n        margin-left: -85px;\n\n        h4 {\n          margin-top: 40px;\n        }\n      }\n\n      &.timeline-inverted > .timeline-panel {\n        padding: 0 100px 20px 20px;\n      }\n    }\n  }\n}\n\n// Team Section\n\n.team-member {\n  text-align: center;\n  margin-bottom: 50px;\n\n  img {\n    margin: 0 auto;\n    border: 7px solid white;\n  }\n\n  h4 {\n    margin-top: 25px;\n    margin-bottom: 0;\n    text-transform: none;\n  }\n\n  p {\n    margin-top: 0;\n  }\n}\n\n// Clients Aside\n\naside.clients {\n  img {\n    margin: 50px auto;\n  }\n}\n\n// Contact Section\n\nsection#contact {\n  background-color: $gray-darkest;\n  background-image: url('../img/map-image.png');\n  background-position: center;\n  background-repeat: no-repeat;\n\n  .section-heading {\n    color: white;\n  }\n\n  .form-group {\n    margin-bottom: 25px;\n\n    input,\n    textarea {\n      padding: 20px;\n    }\n\n    input.form-control {\n      height: auto;\n    }\n\n    textarea.form-control {\n      height: 236px;\n    }\n  }\n\n  .form-control:focus {\n    border-color: $brand-primary;\n    box-shadow: none;\n  }\n\n  ::-webkit-input-placeholder {\n    @include heading-font;\n    font-weight: 700;\n    color: $placeholder-text;\n  }\n\n  :-moz-placeholder {\n    /* Firefox 18- */\n    @include heading-font;\n    font-weight: 700;\n    color: $placeholder-text;\n  }\n\n  ::-moz-placeholder {\n    /* Firefox 19+ */\n    @include heading-font;\n    font-weight: 700;\n    color: $placeholder-text;\n  }\n\n  :-ms-input-placeholder {\n    @include heading-font;\n    font-weight: 700;\n    color: $placeholder-text;\n  }\n\n  .text-danger {\n    color: $brand-danger;\n  }\n}\n\n// Footer\n\nfooter {\n  padding: 25px 0;\n  text-align: center;\n\n  span.copyright {\n    line-height: 40px;\n    @include heading-font;\n    text-transform: none;\n  }\n\n  ul.quicklinks {\n    margin-bottom: 0;\n    line-height: 40px;\n    @include heading-font;\n    text-transform: none;\n  }\n}\n\n// Social Buttons\n\nul.social-buttons {\n  margin-bottom: 0;\n\n  li {\n    a {\n      display: block;\n      background-color: $gray-darkest;\n      height: 40px;\n      width: 40px;\n      border-radius: 100%;\n      font-size: 20px;\n      line-height: 40px;\n      color: white;\n      outline: none;\n      -webkit-transition: all 0.3s;\n      -moz-transition: all 0.3s;\n      transition: all 0.3s;\n\n      &:active,\n      &:focus,\n      &:hover {\n        background-color: $brand-primary;\n      }\n    }\n  }\n}\n\n.btn.active,\n.btn:active,\n.btn:active:focus,\n.btn:focus {\n  outline: none;\n}\n\n.portfolio-modal {\n  .modal-dialog{\n    margin: 0;\n    height: 100%;\n    width: auto;\n  }\n  .modal-content {\n    border-radius: 0;\n    background-clip: border-box;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n    border: none;\n    min-height: 100%;\n    padding: 100px 0;\n    text-align: center;\n\n    h2 {\n      margin-bottom: 15px;\n      font-size: 3em;\n    }\n\n    p {\n      margin-bottom: 30px;\n    }\n\n    p.item-intro {\n      margin: 20px 0 30px;\n      @include serif-font;\n      font-style: italic;\n      font-size: 16px;\n    }\n\n    ul.list-inline {\n      margin-bottom: 30px;\n      margin-top: 0;\n    }\n\n    img {\n      margin-bottom: 30px;\n    }\n  }\n\n  .close-modal {\n    position: absolute;\n    width: 75px;\n    height: 75px;\n    background-color: transparent;\n    top: 25px;\n    right: 25px;\n    cursor: pointer;\n\n    &:hover {\n      opacity: 0.3;\n    }\n\n    .lr {\n      height: 75px;\n      width: 1px;\n      margin-left: 35px;\n      background-color: $gray-darkest;\n      transform: rotate(45deg);\n      -ms-transform: rotate(45deg);\n      /* IE 9 */\n      -webkit-transform: rotate(45deg);\n      /* Safari and Chrome */\n      z-index: 1051;\n\n      .rl {\n        height: 75px;\n        width: 1px;\n        background-color: $gray-darkest;\n        transform: rotate(90deg);\n        -ms-transform: rotate(90deg);\n        /* IE 9 */\n        -webkit-transform: rotate(90deg);\n        /* Safari and Chrome */\n        z-index: 1052;\n      }\n    }\n  }\n\n  .modal-backdrop {\n    opacity: 0;\n    display: none;\n  }\n}\n\n// Highlight Color Customization\n\n::-moz-selection {\n  text-shadow: none;\n  background: $brand-primary;\n}\n\n::selection {\n  text-shadow: none;\n  background: $brand-primary;\n}\n\nimg::selection {\n  background: transparent;\n}\n\nimg::-moz-selection {\n  background: transparent;\n}\n\nbody {\n  -webkit-tap-highlight-color: $brand-primary;\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/bootstrap/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\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,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  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/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\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^=\"#\"]:after,\n  a[href^=\"javascript:\"]: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  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n\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.woff2') format('woff2'), 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: \"\\002a\";\n}\n.glyphicon-plus:before {\n  content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.glyphicon-cd:before {\n  content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n  content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n  content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n  content: \"\\e204\";\n}\n.glyphicon-copy:before {\n  content: \"\\e205\";\n}\n.glyphicon-paste:before {\n  content: \"\\e206\";\n}\n.glyphicon-alert:before {\n  content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n  content: \"\\e210\";\n}\n.glyphicon-king:before {\n  content: \"\\e211\";\n}\n.glyphicon-queen:before {\n  content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n  content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n  content: \"\\e214\";\n}\n.glyphicon-knight:before {\n  content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n  content: \"\\e216\";\n}\n.glyphicon-tent:before {\n  content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n  content: \"\\e218\";\n}\n.glyphicon-bed:before {\n  content: \"\\e219\";\n}\n.glyphicon-apple:before {\n  content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n  content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n  content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n  content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n  content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n  content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n  content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n  content: \"\\e227\";\n}\n.glyphicon-btc:before {\n  content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n  content: \"\\e227\";\n}\n.glyphicon-yen:before {\n  content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n  content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n  content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n  content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n  content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n  content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n  content: \"\\e232\";\n}\n.glyphicon-education:before {\n  content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n  content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n  content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n  content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n  content: \"\\e237\";\n}\n.glyphicon-oil:before {\n  content: \"\\e238\";\n}\n.glyphicon-grain:before {\n  content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n  content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n  content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n  content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n  content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n  content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n  content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n  content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n  content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n  content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n  content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n  content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n  content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n  content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n  content: \"\\e253\";\n}\n.glyphicon-console:before {\n  content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n  content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n  content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n  content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n  content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n  content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n  content: \"\\e260\";\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: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\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}\n[role=\"button\"] {\n  cursor: pointer;\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}\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: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\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}\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  font-weight: bold;\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}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #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-of-type(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  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.table-responsive {\n  min-height: .01%;\n  overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #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: 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: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control::-ms-expand {\n  background-color: transparent;\n  border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  background-color: #eee;\n  opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"].form-control,\n  input[type=\"time\"].form-control,\n  input[type=\"datetime-local\"].form-control,\n  input[type=\"month\"].form-control {\n    line-height: 34px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm,\n  .input-group-sm input[type=\"date\"],\n  .input-group-sm input[type=\"time\"],\n  .input-group-sm input[type=\"datetime-local\"],\n  .input-group-sm input[type=\"month\"] {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg,\n  .input-group-lg input[type=\"date\"],\n  .input-group-lg input[type=\"time\"],\n  .input-group-lg input[type=\"datetime-local\"],\n  .input-group-lg input[type=\"month\"] {\n    line-height: 46px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-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  position: relative;\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  min-height: 34px;\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  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.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}\n.form-group-sm select.form-control {\n  height: 30px;\n  line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n  height: auto;\n}\n.form-group-sm .form-control-static {\n  height: 30px;\n  min-height: 32px;\n  padding: 6px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\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.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\n.form-group-lg select.form-control {\n  height: 46px;\n  line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n  height: auto;\n}\n.form-group-lg .form-control-static {\n  height: 46px;\n  min-height: 38px;\n  padding: 11px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -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.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -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.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -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 ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  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  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 11px;\n    font-size: 18px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n    font-size: 12px;\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  -ms-touch-action: manipulation;\n      touch-action: manipulation;\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.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\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  cursor: not-allowed;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  opacity: .65;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n  pointer-events: none;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #8c8c8c;\n}\n.btn-default:hover {\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  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n  color: #333;\n  background-color: #d4d4d4;\n  border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n  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: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n  color: #fff;\n  background-color: #286090;\n  border-color: #122b40;\n}\n.btn-primary:hover {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n  color: #fff;\n  background-color: #204d74;\n  border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #255625;\n}\n.btn-success:hover {\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  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n  color: #fff;\n  background-color: #398439;\n  border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n  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:focus,\n.btn-info.focus {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #1b6d85;\n}\n.btn-info:hover {\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  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n  color: #fff;\n  background-color: #269abc;\n  border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n  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:focus,\n.btn-warning.focus {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #985f0d;\n}\n.btn-warning:hover {\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  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n  color: #fff;\n  background-color: #d58512;\n  border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n  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:focus,\n.btn-danger.focus {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #761c19;\n}\n.btn-danger:hover {\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  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n  color: #fff;\n  background-color: #ac2925;\n  border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n  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: #337ab7;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -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: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #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.3333333;\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-timing-function: ease;\n       -o-transition-timing-function: ease;\n          transition-timing-function: ease;\n  -webkit-transition-duration: .35s;\n       -o-transition-duration: .35s;\n          transition-duration: .35s;\n  -webkit-transition-property: height, visibility;\n       -o-transition-property: height, visibility;\n          transition-property: height, visibility;\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 dashed;\n  border-top: 4px solid \\9;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropup,\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: #337ab7;\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 dashed;\n  border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 2px;\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 + .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,\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:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-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-left-radius: 4px;\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-right-radius: 4px;\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-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-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 .form-control:focus {\n  z-index: 3;\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.3333333;\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  z-index: 2;\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: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #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: #337ab7;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  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-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  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.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  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}\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 .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    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}\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  margin-bottom: 0;\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #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: #9d9d9d;\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: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #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: #9d9d9d;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #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: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\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: #337ab7;\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  z-index: 2;\n  color: #23527c;\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: 3;\n  color: #fff;\n  cursor: default;\n  background-color: #337ab7;\n  border-color: #337ab7;\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  line-height: 1.3333333;\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  line-height: 1.5;\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: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\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.btn-group-xs > .btn .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}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding-top: 30px;\n  padding-bottom: 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.container-fluid .jumbotron {\n  padding-right: 15px;\n  padding-left: 15px;\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  .container-fluid .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: border .2s ease-in-out;\n       -o-transition: border .2s ease-in-out;\n          transition: border .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: #337ab7;\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: #337ab7;\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-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  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n.media-body {\n  width: 10000px;\n}\n.media-object {\n  display: block;\n}\n.media-object.img-thumbnail {\n  max-width: none;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  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}\na.list-group-item,\nbutton.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n  color: #555;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\nbutton.list-group-item {\n  width: 100%;\n  text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  color: #777;\n  cursor: not-allowed;\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: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.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,\nbutton.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.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,\nbutton.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.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,\nbutton.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.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.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > 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.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-right: 15px;\n  padding-left: 15px;\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,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-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.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\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.panel-group .panel-heading + .panel-collapse > .list-group {\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: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.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: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n       -o-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n       -o-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #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  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-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.42857143;\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  word-wrap: normal;\n  white-space: normal;\n  filter: alpha(opacity=0);\n  opacity: 0;\n\n  line-break: auto;\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  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  right: 5px;\n  bottom: 0;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #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  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #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  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.42857143;\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  word-wrap: normal;\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  line-break: auto;\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  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@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    -webkit-transition: -webkit-transform .6s ease-in-out;\n         -o-transition:      -o-transform .6s ease-in-out;\n            transition:         transform .6s ease-in-out;\n\n    -webkit-backface-visibility: hidden;\n            backface-visibility: hidden;\n    -webkit-perspective: 1000px;\n            perspective: 1000px;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    left: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    left: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    left: 0;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  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  background-color: rgba(0, 0, 0, 0);\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  margin-top: -10px;\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  font-family: serif;\n  line-height: 1;\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: -10px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -10px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -10px;\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-header:before,\n.modal-header: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-header: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}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table !important;\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 !important;\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 !important;\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 !important;\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 !important;\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": "example/bootstrap/v3/vendor/bootstrap/js/bootstrap.js",
    "content": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under the MIT license\n */\n\nif (typeof jQuery === 'undefined') {\n  throw new Error('Bootstrap\\'s JavaScript requires jQuery')\n}\n\n+function ($) {\n  'use strict';\n  var version = $.fn.jquery.split(' ')[0].split('.')\n  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {\n    throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')\n  }\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: transition.js v3.3.7\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      WebkitTransition : 'webkitTransitionEnd',\n      MozTransition    : 'transitionend',\n      OTransition      : 'oTransitionEnd otransitionend',\n      transition       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false\n    var $el = this\n    $(this).one('bsTransitionEnd', function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n\n    if (!$.support.transition) return\n\n    $.event.special.bsTransitionEnd = {\n      bindType: $.support.transition.end,\n      delegateType: $.support.transition.end,\n      handle: function (e) {\n        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n      }\n    }\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.3.7\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.VERSION = '3.3.7'\n\n  Alert.TRANSITION_DURATION = 150\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector === '#' ? [] : selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.closest('.alert')\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      // detach from parent, fire event then clean up data\n      $parent.detach().trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one('bsTransitionEnd', removeElement)\n        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.alert\n\n  $.fn.alert             = Plugin\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.3.7\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.VERSION  = '3.3.7'\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state += 'Text'\n\n    if (data.resetText == null) $el.data('resetText', $el[val]())\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      $el[val](data[state] == null ? this.options[state] : data[state])\n\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d).prop(d, true)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d).prop(d, false)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked')) changed = false\n        $parent.find('.active').removeClass('active')\n        this.$element.addClass('active')\n      } else if ($input.prop('type') == 'checkbox') {\n        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false\n        this.$element.toggleClass('active')\n      }\n      $input.prop('checked', this.$element.hasClass('active'))\n      if (changed) $input.trigger('change')\n    } else {\n      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))\n      this.$element.toggleClass('active')\n    }\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  var old = $.fn.button\n\n  $.fn.button             = Plugin\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document)\n    .on('click.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      var $btn = $(e.target).closest('.btn')\n      Plugin.call($btn, 'toggle')\n      if (!($(e.target).is('input[type=\"radio\"], input[type=\"checkbox\"]'))) {\n        // Prevent double click on radios, and the double selections (so cancellation) on checkboxes\n        e.preventDefault()\n        // The target component still receive the focus\n        if ($btn.is('input,button')) $btn.trigger('focus')\n        else $btn.find('input:visible,button:visible').first().trigger('focus')\n      }\n    })\n    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))\n    })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.3.7\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      = null\n    this.sliding     = null\n    this.interval    = null\n    this.$active     = null\n    this.$items      = null\n\n    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))\n\n    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element\n      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n  }\n\n  Carousel.VERSION  = '3.3.7'\n\n  Carousel.TRANSITION_DURATION = 600\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true,\n    keyboard: true\n  }\n\n  Carousel.prototype.keydown = function (e) {\n    if (/input|textarea/i.test(e.target.tagName)) return\n    switch (e.which) {\n      case 37: this.prev(); break\n      case 39: this.next(); break\n      default: return\n    }\n\n    e.preventDefault()\n  }\n\n  Carousel.prototype.cycle = function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getItemIndex = function (item) {\n    this.$items = item.parent().children('.item')\n    return this.$items.index(item || this.$active)\n  }\n\n  Carousel.prototype.getItemForDirection = function (direction, active) {\n    var activeIndex = this.getItemIndex(active)\n    var willWrap = (direction == 'prev' && activeIndex === 0)\n                || (direction == 'next' && activeIndex == (this.$items.length - 1))\n    if (willWrap && !this.options.wrap) return active\n    var delta = direction == 'prev' ? -1 : 1\n    var itemIndex = (activeIndex + delta) % this.$items.length\n    return this.$items.eq(itemIndex)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || this.getItemForDirection(type, $active)\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var that      = this\n\n    if ($next.hasClass('active')) return (this.sliding = false)\n\n    var relatedTarget = $next[0]\n    var slideEvent = $.Event('slide.bs.carousel', {\n      relatedTarget: relatedTarget,\n      direction: direction\n    })\n    this.$element.trigger(slideEvent)\n    if (slideEvent.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n      $nextIndicator && $nextIndicator.addClass('active')\n    }\n\n    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one('bsTransitionEnd', function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () {\n            that.$element.trigger(slidEvent)\n          }, 0)\n        })\n        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger(slidEvent)\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  var old = $.fn.carousel\n\n  $.fn.carousel             = Plugin\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  var clickHandler = function (e) {\n    var href\n    var $this   = $(this)\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n    if (!$target.hasClass('carousel')) return\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    Plugin.call($target, options)\n\n    if (slideIndex) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  }\n\n  $(document)\n    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)\n    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      Plugin.call($carousel, $carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.3.7\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n/* jshint latedef: false */\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.$trigger      = $('[data-toggle=\"collapse\"][href=\"#' + element.id + '\"],' +\n                           '[data-toggle=\"collapse\"][data-target=\"#' + element.id + '\"]')\n    this.transitioning = null\n\n    if (this.options.parent) {\n      this.$parent = this.getParent()\n    } else {\n      this.addAriaAndCollapsedClass(this.$element, this.$trigger)\n    }\n\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.VERSION  = '3.3.7'\n\n  Collapse.TRANSITION_DURATION = 350\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var activesData\n    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')\n\n    if (actives && actives.length) {\n      activesData = actives.data('bs.collapse')\n      if (activesData && activesData.transitioning) return\n    }\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    if (actives && actives.length) {\n      Plugin.call(actives, 'hide')\n      activesData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')[dimension](0)\n      .attr('aria-expanded', true)\n\n    this.$trigger\n      .removeClass('collapsed')\n      .attr('aria-expanded', true)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')[dimension]('')\n      this.transitioning = 0\n      this.$element\n        .trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element[dimension](this.$element[dimension]())[0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse in')\n      .attr('aria-expanded', false)\n\n    this.$trigger\n      .addClass('collapsed')\n      .attr('aria-expanded', false)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse')\n        .trigger('hidden.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n  Collapse.prototype.getParent = function () {\n    return $(this.options.parent)\n      .find('[data-toggle=\"collapse\"][data-parent=\"' + this.options.parent + '\"]')\n      .each($.proxy(function (i, element) {\n        var $element = $(element)\n        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)\n      }, this))\n      .end()\n  }\n\n  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {\n    var isOpen = $element.hasClass('in')\n\n    $element.attr('aria-expanded', isOpen)\n    $trigger\n      .toggleClass('collapsed', !isOpen)\n      .attr('aria-expanded', isOpen)\n  }\n\n  function getTargetFromTrigger($trigger) {\n    var href\n    var target = $trigger.attr('data-target')\n      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n\n    return $(target)\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.collapse\n\n  $.fn.collapse             = Plugin\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=\"collapse\"]', function (e) {\n    var $this   = $(this)\n\n    if (!$this.attr('data-target')) e.preventDefault()\n\n    var $target = getTargetFromTrigger($this)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n\n    Plugin.call($target, option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.3.7\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=\"dropdown\"]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.VERSION = '3.3.7'\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n  function clearMenus(e) {\n    if (e && e.which === 3) return\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $this         = $(this)\n      var $parent       = getParent($this)\n      var relatedTarget = { relatedTarget: this }\n\n      if (!$parent.hasClass('open')) return\n\n      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return\n\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this.attr('aria-expanded', 'false')\n      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))\n    })\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $(document.createElement('div'))\n          .addClass('dropdown-backdrop')\n          .insertAfter($(this))\n          .on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this\n        .trigger('focus')\n        .attr('aria-expanded', 'true')\n\n      $parent\n        .toggleClass('open')\n        .trigger($.Event('shown.bs.dropdown', relatedTarget))\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive && e.which != 27 || isActive && e.which == 27) {\n      if (e.which == 27) $parent.find(toggle).trigger('focus')\n      return $this.trigger('click')\n    }\n\n    var desc = ' li:not(.disabled):visible a'\n    var $items = $parent.find('.dropdown-menu' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index(e.target)\n\n    if (e.which == 38 && index > 0)                 index--         // up\n    if (e.which == 40 && index < $items.length - 1) index++         // down\n    if (!~index)                                    index = 0\n\n    $items.eq(index).trigger('focus')\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown             = Plugin\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.3.7\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options             = options\n    this.$body               = $(document.body)\n    this.$element            = $(element)\n    this.$dialog             = this.$element.find('.modal-dialog')\n    this.$backdrop           = null\n    this.isShown             = null\n    this.originalBodyPad     = null\n    this.scrollbarWidth      = 0\n    this.ignoreBackdropClick = false\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.VERSION  = '3.3.7'\n\n  Modal.TRANSITION_DURATION = 300\n  Modal.BACKDROP_TRANSITION_DURATION = 150\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this.isShown ? this.hide() : this.show(_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.checkScrollbar()\n    this.setScrollbar()\n    this.$body.addClass('modal-open')\n\n    this.escape()\n    this.resize()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.$dialog.on('mousedown.dismiss.bs.modal', function () {\n      that.$element.one('mouseup.dismiss.bs.modal', function (e) {\n        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true\n      })\n    })\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(that.$body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      that.adjustDialog()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element.addClass('in')\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$dialog // wait for modal to slide in\n          .one('bsTransitionEnd', function () {\n            that.$element.trigger('focus').trigger(e)\n          })\n          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n        that.$element.trigger('focus').trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n    this.resize()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .off('click.dismiss.bs.modal')\n      .off('mouseup.dismiss.bs.modal')\n\n    this.$dialog.off('mousedown.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (document !== e.target &&\n            this.$element[0] !== e.target &&\n            !this.$element.has(e.target).length) {\n          this.$element.trigger('focus')\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keydown.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.resize = function () {\n    if (this.isShown) {\n      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))\n    } else {\n      $(window).off('resize.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.$body.removeClass('modal-open')\n      that.resetAdjustments()\n      that.resetScrollbar()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $(document.createElement('div'))\n        .addClass('modal-backdrop ' + animate)\n        .appendTo(this.$body)\n\n      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {\n        if (this.ignoreBackdropClick) {\n          this.ignoreBackdropClick = false\n          return\n        }\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus()\n          : this.hide()\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one('bsTransitionEnd', callback)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      var callbackRemove = function () {\n        that.removeBackdrop()\n        callback && callback()\n      }\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one('bsTransitionEnd', callbackRemove)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callbackRemove()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  // these following methods are used to handle overflowing modals\n\n  Modal.prototype.handleUpdate = function () {\n    this.adjustDialog()\n  }\n\n  Modal.prototype.adjustDialog = function () {\n    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight\n\n    this.$element.css({\n      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',\n      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''\n    })\n  }\n\n  Modal.prototype.resetAdjustments = function () {\n    this.$element.css({\n      paddingLeft: '',\n      paddingRight: ''\n    })\n  }\n\n  Modal.prototype.checkScrollbar = function () {\n    var fullWindowWidth = window.innerWidth\n    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8\n      var documentElementRect = document.documentElement.getBoundingClientRect()\n      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)\n    }\n    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth\n    this.scrollbarWidth = this.measureScrollbar()\n  }\n\n  Modal.prototype.setScrollbar = function () {\n    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n    this.originalBodyPad = document.body.style.paddingRight || ''\n    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)\n  }\n\n  Modal.prototype.resetScrollbar = function () {\n    this.$body.css('padding-right', this.originalBodyPad)\n  }\n\n  Modal.prototype.measureScrollbar = function () { // thx walsh\n    var scrollDiv = document.createElement('div')\n    scrollDiv.className = 'modal-scrollbar-measure'\n    this.$body.append(scrollDiv)\n    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n    this.$body[0].removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  var old = $.fn.modal\n\n  $.fn.modal             = Plugin\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) // strip for ie7\n    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target.one('show.bs.modal', function (showEvent) {\n      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n      $target.one('hidden.bs.modal', function () {\n        $this.is(':visible') && $this.trigger('focus')\n      })\n    })\n    Plugin.call($target, option, this)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.3.7\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       = null\n    this.options    = null\n    this.enabled    = null\n    this.timeout    = null\n    this.hoverState = null\n    this.$element   = null\n    this.inState    = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.VERSION  = '3.3.7'\n\n  Tooltip.TRANSITION_DURATION = 150\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false,\n    viewport: {\n      selector: 'body',\n      padding: 0\n    }\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled   = true\n    this.type      = type\n    this.$element  = $(element)\n    this.options   = this.getOptions(options)\n    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))\n    this.inState   = { click: false, hover: false, focus: false }\n\n    if (this.$element[0] instanceof document.constructor && !this.options.selector) {\n      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')\n    }\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    if (obj instanceof $.Event) {\n      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true\n    }\n\n    if (self.tip().hasClass('in') || self.hoverState == 'in') {\n      self.hoverState = 'in'\n      return\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.isInStateTrue = function () {\n    for (var key in this.inState) {\n      if (this.inState[key]) return true\n    }\n\n    return false\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    if (obj instanceof $.Event) {\n      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false\n    }\n\n    if (self.isInStateTrue()) return\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])\n      if (e.isDefaultPrevented() || !inDom) return\n      var that = this\n\n      var $tip = this.tip()\n\n      var tipId = this.getUID(this.type)\n\n      this.setContent()\n      $tip.attr('id', tipId)\n      this.$element.attr('aria-describedby', tipId)\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n        .data('bs.' + this.type, this)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n      this.$element.trigger('inserted.bs.' + this.type)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var orgPlacement = placement\n        var viewportDim = this.getPosition(this.$viewport)\n\n        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :\n                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :\n                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :\n                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n\n      var complete = function () {\n        var prevHoverState = that.hoverState\n        that.$element.trigger('shown.bs.' + that.type)\n        that.hoverState = null\n\n        if (prevHoverState == 'out') that.leave(that)\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one('bsTransitionEnd', complete)\n          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  += marginTop\n    offset.left += marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      offset.top = offset.top + height - actualHeight\n    }\n\n    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\n\n    if (delta.left) offset.left += delta.left\n    else offset.top += delta.top\n\n    var isVertical          = /top|bottom/.test(placement)\n    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\n    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'\n\n    $tip.offset(offset)\n    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {\n    this.arrow()\n      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')\n      .css(isVertical ? 'top' : 'left', '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function (callback) {\n    var that = this\n    var $tip = $(this.$tip)\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.\n        that.$element\n          .removeAttr('aria-describedby')\n          .trigger('hidden.bs.' + that.type)\n      }\n      callback && callback()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && $tip.hasClass('fade') ?\n      $tip\n        .one('bsTransitionEnd', complete)\n        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function ($element) {\n    $element   = $element || this.$element\n\n    var el     = $element[0]\n    var isBody = el.tagName == 'BODY'\n\n    var elRect    = el.getBoundingClientRect()\n    if (elRect.width == null) {\n      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093\n      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })\n    }\n    var isSvg = window.SVGElement && el instanceof window.SVGElement\n    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.\n    // See https://github.com/twbs/bootstrap/issues/20280\n    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())\n    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }\n    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null\n\n    return $.extend({}, elRect, scroll, outerDims, elOffset)\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }\n\n  }\n\n  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\n    var delta = { top: 0, left: 0 }\n    if (!this.$viewport) return delta\n\n    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\n    var viewportDimensions = this.getPosition(this.$viewport)\n\n    if (/right|left/.test(placement)) {\n      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll\n      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\n      if (topEdgeOffset < viewportDimensions.top) { // top overflow\n        delta.top = viewportDimensions.top - topEdgeOffset\n      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\n        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\n      }\n    } else {\n      var leftEdgeOffset  = pos.left - viewportPadding\n      var rightEdgeOffset = pos.left + viewportPadding + actualWidth\n      if (leftEdgeOffset < viewportDimensions.left) { // left overflow\n        delta.left = viewportDimensions.left - leftEdgeOffset\n      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow\n        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\n      }\n    }\n\n    return delta\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.getUID = function (prefix) {\n    do prefix += ~~(Math.random() * 1000000)\n    while (document.getElementById(prefix))\n    return prefix\n  }\n\n  Tooltip.prototype.tip = function () {\n    if (!this.$tip) {\n      this.$tip = $(this.options.template)\n      if (this.$tip.length != 1) {\n        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')\n      }\n    }\n    return this.$tip\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = this\n    if (e) {\n      self = $(e.currentTarget).data('bs.' + this.type)\n      if (!self) {\n        self = new this.constructor(e.currentTarget, this.getDelegateOptions())\n        $(e.currentTarget).data('bs.' + this.type, self)\n      }\n    }\n\n    if (e) {\n      self.inState.click = !self.inState.click\n      if (self.isInStateTrue()) self.enter(self)\n      else self.leave(self)\n    } else {\n      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n    }\n  }\n\n  Tooltip.prototype.destroy = function () {\n    var that = this\n    clearTimeout(this.timeout)\n    this.hide(function () {\n      that.$element.off('.' + that.type).removeData('bs.' + that.type)\n      if (that.$tip) {\n        that.$tip.detach()\n      }\n      that.$tip = null\n      that.$arrow = null\n      that.$viewport = null\n      that.$element = null\n    })\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data && /destroy|hide/.test(option)) return\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip             = Plugin\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.3.7\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.VERSION  = '3.3.7'\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events\n      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'\n    ](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data && /destroy|hide/.test(option)) return\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.popover\n\n  $.fn.popover             = Plugin\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.3.7\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    this.$body          = $(document.body)\n    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target || '') + ' .nav li > a'\n    this.offsets        = []\n    this.targets        = []\n    this.activeTarget   = null\n    this.scrollHeight   = 0\n\n    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.VERSION  = '3.3.7'\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.getScrollHeight = function () {\n    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var that          = this\n    var offsetMethod  = 'offset'\n    var offsetBase    = 0\n\n    this.offsets      = []\n    this.targets      = []\n    this.scrollHeight = this.getScrollHeight()\n\n    if (!$.isWindow(this.$scrollElement[0])) {\n      offsetMethod = 'position'\n      offsetBase   = this.$scrollElement.scrollTop()\n    }\n\n    this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[$href[offsetMethod]().top + offsetBase, href]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        that.offsets.push(this[0])\n        that.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.getScrollHeight()\n    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (this.scrollHeight != scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop < offsets[0]) {\n      this.activeTarget = null\n      return this.clear()\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])\n        && this.activate(targets[i])\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    this.clear()\n\n    var selector = this.selector +\n      '[data-target=\"' + target + '\"],' +\n      this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n  ScrollSpy.prototype.clear = function () {\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy             = Plugin\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load.bs.scrollspy.data-api', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      Plugin.call($spy, $spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.3.7\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    // jscs:disable requireDollarBeforejQueryAssignment\n    this.element = $(element)\n    // jscs:enable requireDollarBeforejQueryAssignment\n  }\n\n  Tab.VERSION = '3.3.7'\n\n  Tab.TRANSITION_DURATION = 150\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var $previous = $ul.find('.active:last a')\n    var hideEvent = $.Event('hide.bs.tab', {\n      relatedTarget: $this[0]\n    })\n    var showEvent = $.Event('show.bs.tab', {\n      relatedTarget: $previous[0]\n    })\n\n    $previous.trigger(hideEvent)\n    $this.trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.closest('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $previous.trigger({\n        type: 'hidden.bs.tab',\n        relatedTarget: $this[0]\n      })\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: $previous[0]\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n          .removeClass('active')\n        .end()\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', false)\n\n      element\n        .addClass('active')\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', true)\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu').length) {\n        element\n          .closest('li.dropdown')\n            .addClass('active')\n          .end()\n          .find('[data-toggle=\"tab\"]')\n            .attr('aria-expanded', true)\n      }\n\n      callback && callback()\n    }\n\n    $active.length && transition ?\n      $active\n        .one('bsTransitionEnd', next)\n        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tab\n\n  $.fn.tab             = Plugin\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  var clickHandler = function (e) {\n    e.preventDefault()\n    Plugin.call($(this), 'show')\n  }\n\n  $(document)\n    .on('click.bs.tab.data-api', '[data-toggle=\"tab\"]', clickHandler)\n    .on('click.bs.tab.data-api', '[data-toggle=\"pill\"]', clickHandler)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.3.7\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n\n    this.$target = $(this.options.target)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      = null\n    this.unpin        = null\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.VERSION  = '3.3.7'\n\n  Affix.RESET    = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0,\n    target: window\n  }\n\n  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {\n    var scrollTop    = this.$target.scrollTop()\n    var position     = this.$element.offset()\n    var targetHeight = this.$target.height()\n\n    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false\n\n    if (this.affixed == 'bottom') {\n      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'\n      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'\n    }\n\n    var initializing   = this.affixed == null\n    var colliderTop    = initializing ? scrollTop : position.top\n    var colliderHeight = initializing ? targetHeight : height\n\n    if (offsetTop != null && scrollTop <= offsetTop) return 'top'\n    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'\n\n    return false\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$target.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var height       = this.$element.height()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n    var scrollHeight = Math.max($(document).height(), $(document.body).height())\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)\n\n    if (this.affixed != affix) {\n      if (this.unpin != null) this.$element.css('top', '')\n\n      var affixType = 'affix' + (affix ? '-' + affix : '')\n      var e         = $.Event(affixType + '.bs.affix')\n\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      this.affixed = affix\n      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n      this.$element\n        .removeClass(Affix.RESET)\n        .addClass(affixType)\n        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')\n    }\n\n    if (affix == 'bottom') {\n      this.$element.offset({\n        top: scrollHeight - height - offsetBottom\n      })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.affix\n\n  $.fn.affix             = Plugin\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop    != null) data.offset.top    = data.offsetTop\n\n      Plugin.call($spy, data)\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/css/font-awesome.css",
    "content": "/*!\n *  Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n/* FONT PATH\n * -------------------------- */\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('../fonts/fontawesome-webfont.eot?v=4.6.3');\n  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n.fa {\n  display: inline-block;\n  font: normal normal normal 14px/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n/* makes the font 33% larger relative to the icon container */\n.fa-lg {\n  font-size: 1.33333333em;\n  line-height: 0.75em;\n  vertical-align: -15%;\n}\n.fa-2x {\n  font-size: 2em;\n}\n.fa-3x {\n  font-size: 3em;\n}\n.fa-4x {\n  font-size: 4em;\n}\n.fa-5x {\n  font-size: 5em;\n}\n.fa-fw {\n  width: 1.28571429em;\n  text-align: center;\n}\n.fa-ul {\n  padding-left: 0;\n  margin-left: 2.14285714em;\n  list-style-type: none;\n}\n.fa-ul > li {\n  position: relative;\n}\n.fa-li {\n  position: absolute;\n  left: -2.14285714em;\n  width: 2.14285714em;\n  top: 0.14285714em;\n  text-align: center;\n}\n.fa-li.fa-lg {\n  left: -1.85714286em;\n}\n.fa-border {\n  padding: .2em .25em .15em;\n  border: solid 0.08em #eeeeee;\n  border-radius: .1em;\n}\n.fa-pull-left {\n  float: left;\n}\n.fa-pull-right {\n  float: right;\n}\n.fa.fa-pull-left {\n  margin-right: .3em;\n}\n.fa.fa-pull-right {\n  margin-left: .3em;\n}\n/* Deprecated as of 4.4.0 */\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n.fa.pull-left {\n  margin-right: .3em;\n}\n.fa.pull-right {\n  margin-left: .3em;\n}\n.fa-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n  animation: fa-spin 2s infinite linear;\n}\n.fa-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n  animation: fa-spin 1s infinite steps(8);\n}\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n.fa-rotate-90 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";\n  -webkit-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  transform: rotate(90deg);\n}\n.fa-rotate-180 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";\n  -webkit-transform: rotate(180deg);\n  -ms-transform: rotate(180deg);\n  transform: rotate(180deg);\n}\n.fa-rotate-270 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";\n  -webkit-transform: rotate(270deg);\n  -ms-transform: rotate(270deg);\n  transform: rotate(270deg);\n}\n.fa-flip-horizontal {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";\n  -webkit-transform: scale(-1, 1);\n  -ms-transform: scale(-1, 1);\n  transform: scale(-1, 1);\n}\n.fa-flip-vertical {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n  -webkit-transform: scale(1, -1);\n  -ms-transform: scale(1, -1);\n  transform: scale(1, -1);\n}\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n  filter: none;\n}\n.fa-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.fa-stack-1x,\n.fa-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.fa-stack-1x {\n  line-height: inherit;\n}\n.fa-stack-2x {\n  font-size: 2em;\n}\n.fa-inverse {\n  color: #ffffff;\n}\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n.fa-glass:before {\n  content: \"\\f000\";\n}\n.fa-music:before {\n  content: \"\\f001\";\n}\n.fa-search:before {\n  content: \"\\f002\";\n}\n.fa-envelope-o:before {\n  content: \"\\f003\";\n}\n.fa-heart:before {\n  content: \"\\f004\";\n}\n.fa-star:before {\n  content: \"\\f005\";\n}\n.fa-star-o:before {\n  content: \"\\f006\";\n}\n.fa-user:before {\n  content: \"\\f007\";\n}\n.fa-film:before {\n  content: \"\\f008\";\n}\n.fa-th-large:before {\n  content: \"\\f009\";\n}\n.fa-th:before {\n  content: \"\\f00a\";\n}\n.fa-th-list:before {\n  content: \"\\f00b\";\n}\n.fa-check:before {\n  content: \"\\f00c\";\n}\n.fa-remove:before,\n.fa-close:before,\n.fa-times:before {\n  content: \"\\f00d\";\n}\n.fa-search-plus:before {\n  content: \"\\f00e\";\n}\n.fa-search-minus:before {\n  content: \"\\f010\";\n}\n.fa-power-off:before {\n  content: \"\\f011\";\n}\n.fa-signal:before {\n  content: \"\\f012\";\n}\n.fa-gear:before,\n.fa-cog:before {\n  content: \"\\f013\";\n}\n.fa-trash-o:before {\n  content: \"\\f014\";\n}\n.fa-home:before {\n  content: \"\\f015\";\n}\n.fa-file-o:before {\n  content: \"\\f016\";\n}\n.fa-clock-o:before {\n  content: \"\\f017\";\n}\n.fa-road:before {\n  content: \"\\f018\";\n}\n.fa-download:before {\n  content: \"\\f019\";\n}\n.fa-arrow-circle-o-down:before {\n  content: \"\\f01a\";\n}\n.fa-arrow-circle-o-up:before {\n  content: \"\\f01b\";\n}\n.fa-inbox:before {\n  content: \"\\f01c\";\n}\n.fa-play-circle-o:before {\n  content: \"\\f01d\";\n}\n.fa-rotate-right:before,\n.fa-repeat:before {\n  content: \"\\f01e\";\n}\n.fa-refresh:before {\n  content: \"\\f021\";\n}\n.fa-list-alt:before {\n  content: \"\\f022\";\n}\n.fa-lock:before {\n  content: \"\\f023\";\n}\n.fa-flag:before {\n  content: \"\\f024\";\n}\n.fa-headphones:before {\n  content: \"\\f025\";\n}\n.fa-volume-off:before {\n  content: \"\\f026\";\n}\n.fa-volume-down:before {\n  content: \"\\f027\";\n}\n.fa-volume-up:before {\n  content: \"\\f028\";\n}\n.fa-qrcode:before {\n  content: \"\\f029\";\n}\n.fa-barcode:before {\n  content: \"\\f02a\";\n}\n.fa-tag:before {\n  content: \"\\f02b\";\n}\n.fa-tags:before {\n  content: \"\\f02c\";\n}\n.fa-book:before {\n  content: \"\\f02d\";\n}\n.fa-bookmark:before {\n  content: \"\\f02e\";\n}\n.fa-print:before {\n  content: \"\\f02f\";\n}\n.fa-camera:before {\n  content: \"\\f030\";\n}\n.fa-font:before {\n  content: \"\\f031\";\n}\n.fa-bold:before {\n  content: \"\\f032\";\n}\n.fa-italic:before {\n  content: \"\\f033\";\n}\n.fa-text-height:before {\n  content: \"\\f034\";\n}\n.fa-text-width:before {\n  content: \"\\f035\";\n}\n.fa-align-left:before {\n  content: \"\\f036\";\n}\n.fa-align-center:before {\n  content: \"\\f037\";\n}\n.fa-align-right:before {\n  content: \"\\f038\";\n}\n.fa-align-justify:before {\n  content: \"\\f039\";\n}\n.fa-list:before {\n  content: \"\\f03a\";\n}\n.fa-dedent:before,\n.fa-outdent:before {\n  content: \"\\f03b\";\n}\n.fa-indent:before {\n  content: \"\\f03c\";\n}\n.fa-video-camera:before {\n  content: \"\\f03d\";\n}\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n  content: \"\\f03e\";\n}\n.fa-pencil:before {\n  content: \"\\f040\";\n}\n.fa-map-marker:before {\n  content: \"\\f041\";\n}\n.fa-adjust:before {\n  content: \"\\f042\";\n}\n.fa-tint:before {\n  content: \"\\f043\";\n}\n.fa-edit:before,\n.fa-pencil-square-o:before {\n  content: \"\\f044\";\n}\n.fa-share-square-o:before {\n  content: \"\\f045\";\n}\n.fa-check-square-o:before {\n  content: \"\\f046\";\n}\n.fa-arrows:before {\n  content: \"\\f047\";\n}\n.fa-step-backward:before {\n  content: \"\\f048\";\n}\n.fa-fast-backward:before {\n  content: \"\\f049\";\n}\n.fa-backward:before {\n  content: \"\\f04a\";\n}\n.fa-play:before {\n  content: \"\\f04b\";\n}\n.fa-pause:before {\n  content: \"\\f04c\";\n}\n.fa-stop:before {\n  content: \"\\f04d\";\n}\n.fa-forward:before {\n  content: \"\\f04e\";\n}\n.fa-fast-forward:before {\n  content: \"\\f050\";\n}\n.fa-step-forward:before {\n  content: \"\\f051\";\n}\n.fa-eject:before {\n  content: \"\\f052\";\n}\n.fa-chevron-left:before {\n  content: \"\\f053\";\n}\n.fa-chevron-right:before {\n  content: \"\\f054\";\n}\n.fa-plus-circle:before {\n  content: \"\\f055\";\n}\n.fa-minus-circle:before {\n  content: \"\\f056\";\n}\n.fa-times-circle:before {\n  content: \"\\f057\";\n}\n.fa-check-circle:before {\n  content: \"\\f058\";\n}\n.fa-question-circle:before {\n  content: \"\\f059\";\n}\n.fa-info-circle:before {\n  content: \"\\f05a\";\n}\n.fa-crosshairs:before {\n  content: \"\\f05b\";\n}\n.fa-times-circle-o:before {\n  content: \"\\f05c\";\n}\n.fa-check-circle-o:before {\n  content: \"\\f05d\";\n}\n.fa-ban:before {\n  content: \"\\f05e\";\n}\n.fa-arrow-left:before {\n  content: \"\\f060\";\n}\n.fa-arrow-right:before {\n  content: \"\\f061\";\n}\n.fa-arrow-up:before {\n  content: \"\\f062\";\n}\n.fa-arrow-down:before {\n  content: \"\\f063\";\n}\n.fa-mail-forward:before,\n.fa-share:before {\n  content: \"\\f064\";\n}\n.fa-expand:before {\n  content: \"\\f065\";\n}\n.fa-compress:before {\n  content: \"\\f066\";\n}\n.fa-plus:before {\n  content: \"\\f067\";\n}\n.fa-minus:before {\n  content: \"\\f068\";\n}\n.fa-asterisk:before {\n  content: \"\\f069\";\n}\n.fa-exclamation-circle:before {\n  content: \"\\f06a\";\n}\n.fa-gift:before {\n  content: \"\\f06b\";\n}\n.fa-leaf:before {\n  content: \"\\f06c\";\n}\n.fa-fire:before {\n  content: \"\\f06d\";\n}\n.fa-eye:before {\n  content: \"\\f06e\";\n}\n.fa-eye-slash:before {\n  content: \"\\f070\";\n}\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n  content: \"\\f071\";\n}\n.fa-plane:before {\n  content: \"\\f072\";\n}\n.fa-calendar:before {\n  content: \"\\f073\";\n}\n.fa-random:before {\n  content: \"\\f074\";\n}\n.fa-comment:before {\n  content: \"\\f075\";\n}\n.fa-magnet:before {\n  content: \"\\f076\";\n}\n.fa-chevron-up:before {\n  content: \"\\f077\";\n}\n.fa-chevron-down:before {\n  content: \"\\f078\";\n}\n.fa-retweet:before {\n  content: \"\\f079\";\n}\n.fa-shopping-cart:before {\n  content: \"\\f07a\";\n}\n.fa-folder:before {\n  content: \"\\f07b\";\n}\n.fa-folder-open:before {\n  content: \"\\f07c\";\n}\n.fa-arrows-v:before {\n  content: \"\\f07d\";\n}\n.fa-arrows-h:before {\n  content: \"\\f07e\";\n}\n.fa-bar-chart-o:before,\n.fa-bar-chart:before {\n  content: \"\\f080\";\n}\n.fa-twitter-square:before {\n  content: \"\\f081\";\n}\n.fa-facebook-square:before {\n  content: \"\\f082\";\n}\n.fa-camera-retro:before {\n  content: \"\\f083\";\n}\n.fa-key:before {\n  content: \"\\f084\";\n}\n.fa-gears:before,\n.fa-cogs:before {\n  content: \"\\f085\";\n}\n.fa-comments:before {\n  content: \"\\f086\";\n}\n.fa-thumbs-o-up:before {\n  content: \"\\f087\";\n}\n.fa-thumbs-o-down:before {\n  content: \"\\f088\";\n}\n.fa-star-half:before {\n  content: \"\\f089\";\n}\n.fa-heart-o:before {\n  content: \"\\f08a\";\n}\n.fa-sign-out:before {\n  content: \"\\f08b\";\n}\n.fa-linkedin-square:before {\n  content: \"\\f08c\";\n}\n.fa-thumb-tack:before {\n  content: \"\\f08d\";\n}\n.fa-external-link:before {\n  content: \"\\f08e\";\n}\n.fa-sign-in:before {\n  content: \"\\f090\";\n}\n.fa-trophy:before {\n  content: \"\\f091\";\n}\n.fa-github-square:before {\n  content: \"\\f092\";\n}\n.fa-upload:before {\n  content: \"\\f093\";\n}\n.fa-lemon-o:before {\n  content: \"\\f094\";\n}\n.fa-phone:before {\n  content: \"\\f095\";\n}\n.fa-square-o:before {\n  content: \"\\f096\";\n}\n.fa-bookmark-o:before {\n  content: \"\\f097\";\n}\n.fa-phone-square:before {\n  content: \"\\f098\";\n}\n.fa-twitter:before {\n  content: \"\\f099\";\n}\n.fa-facebook-f:before,\n.fa-facebook:before {\n  content: \"\\f09a\";\n}\n.fa-github:before {\n  content: \"\\f09b\";\n}\n.fa-unlock:before {\n  content: \"\\f09c\";\n}\n.fa-credit-card:before {\n  content: \"\\f09d\";\n}\n.fa-feed:before,\n.fa-rss:before {\n  content: \"\\f09e\";\n}\n.fa-hdd-o:before {\n  content: \"\\f0a0\";\n}\n.fa-bullhorn:before {\n  content: \"\\f0a1\";\n}\n.fa-bell:before {\n  content: \"\\f0f3\";\n}\n.fa-certificate:before {\n  content: \"\\f0a3\";\n}\n.fa-hand-o-right:before {\n  content: \"\\f0a4\";\n}\n.fa-hand-o-left:before {\n  content: \"\\f0a5\";\n}\n.fa-hand-o-up:before {\n  content: \"\\f0a6\";\n}\n.fa-hand-o-down:before {\n  content: \"\\f0a7\";\n}\n.fa-arrow-circle-left:before {\n  content: \"\\f0a8\";\n}\n.fa-arrow-circle-right:before {\n  content: \"\\f0a9\";\n}\n.fa-arrow-circle-up:before {\n  content: \"\\f0aa\";\n}\n.fa-arrow-circle-down:before {\n  content: \"\\f0ab\";\n}\n.fa-globe:before {\n  content: \"\\f0ac\";\n}\n.fa-wrench:before {\n  content: \"\\f0ad\";\n}\n.fa-tasks:before {\n  content: \"\\f0ae\";\n}\n.fa-filter:before {\n  content: \"\\f0b0\";\n}\n.fa-briefcase:before {\n  content: \"\\f0b1\";\n}\n.fa-arrows-alt:before {\n  content: \"\\f0b2\";\n}\n.fa-group:before,\n.fa-users:before {\n  content: \"\\f0c0\";\n}\n.fa-chain:before,\n.fa-link:before {\n  content: \"\\f0c1\";\n}\n.fa-cloud:before {\n  content: \"\\f0c2\";\n}\n.fa-flask:before {\n  content: \"\\f0c3\";\n}\n.fa-cut:before,\n.fa-scissors:before {\n  content: \"\\f0c4\";\n}\n.fa-copy:before,\n.fa-files-o:before {\n  content: \"\\f0c5\";\n}\n.fa-paperclip:before {\n  content: \"\\f0c6\";\n}\n.fa-save:before,\n.fa-floppy-o:before {\n  content: \"\\f0c7\";\n}\n.fa-square:before {\n  content: \"\\f0c8\";\n}\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n  content: \"\\f0c9\";\n}\n.fa-list-ul:before {\n  content: \"\\f0ca\";\n}\n.fa-list-ol:before {\n  content: \"\\f0cb\";\n}\n.fa-strikethrough:before {\n  content: \"\\f0cc\";\n}\n.fa-underline:before {\n  content: \"\\f0cd\";\n}\n.fa-table:before {\n  content: \"\\f0ce\";\n}\n.fa-magic:before {\n  content: \"\\f0d0\";\n}\n.fa-truck:before {\n  content: \"\\f0d1\";\n}\n.fa-pinterest:before {\n  content: \"\\f0d2\";\n}\n.fa-pinterest-square:before {\n  content: \"\\f0d3\";\n}\n.fa-google-plus-square:before {\n  content: \"\\f0d4\";\n}\n.fa-google-plus:before {\n  content: \"\\f0d5\";\n}\n.fa-money:before {\n  content: \"\\f0d6\";\n}\n.fa-caret-down:before {\n  content: \"\\f0d7\";\n}\n.fa-caret-up:before {\n  content: \"\\f0d8\";\n}\n.fa-caret-left:before {\n  content: \"\\f0d9\";\n}\n.fa-caret-right:before {\n  content: \"\\f0da\";\n}\n.fa-columns:before {\n  content: \"\\f0db\";\n}\n.fa-unsorted:before,\n.fa-sort:before {\n  content: \"\\f0dc\";\n}\n.fa-sort-down:before,\n.fa-sort-desc:before {\n  content: \"\\f0dd\";\n}\n.fa-sort-up:before,\n.fa-sort-asc:before {\n  content: \"\\f0de\";\n}\n.fa-envelope:before {\n  content: \"\\f0e0\";\n}\n.fa-linkedin:before {\n  content: \"\\f0e1\";\n}\n.fa-rotate-left:before,\n.fa-undo:before {\n  content: \"\\f0e2\";\n}\n.fa-legal:before,\n.fa-gavel:before {\n  content: \"\\f0e3\";\n}\n.fa-dashboard:before,\n.fa-tachometer:before {\n  content: \"\\f0e4\";\n}\n.fa-comment-o:before {\n  content: \"\\f0e5\";\n}\n.fa-comments-o:before {\n  content: \"\\f0e6\";\n}\n.fa-flash:before,\n.fa-bolt:before {\n  content: \"\\f0e7\";\n}\n.fa-sitemap:before {\n  content: \"\\f0e8\";\n}\n.fa-umbrella:before {\n  content: \"\\f0e9\";\n}\n.fa-paste:before,\n.fa-clipboard:before {\n  content: \"\\f0ea\";\n}\n.fa-lightbulb-o:before {\n  content: \"\\f0eb\";\n}\n.fa-exchange:before {\n  content: \"\\f0ec\";\n}\n.fa-cloud-download:before {\n  content: \"\\f0ed\";\n}\n.fa-cloud-upload:before {\n  content: \"\\f0ee\";\n}\n.fa-user-md:before {\n  content: \"\\f0f0\";\n}\n.fa-stethoscope:before {\n  content: \"\\f0f1\";\n}\n.fa-suitcase:before {\n  content: \"\\f0f2\";\n}\n.fa-bell-o:before {\n  content: \"\\f0a2\";\n}\n.fa-coffee:before {\n  content: \"\\f0f4\";\n}\n.fa-cutlery:before {\n  content: \"\\f0f5\";\n}\n.fa-file-text-o:before {\n  content: \"\\f0f6\";\n}\n.fa-building-o:before {\n  content: \"\\f0f7\";\n}\n.fa-hospital-o:before {\n  content: \"\\f0f8\";\n}\n.fa-ambulance:before {\n  content: \"\\f0f9\";\n}\n.fa-medkit:before {\n  content: \"\\f0fa\";\n}\n.fa-fighter-jet:before {\n  content: \"\\f0fb\";\n}\n.fa-beer:before {\n  content: \"\\f0fc\";\n}\n.fa-h-square:before {\n  content: \"\\f0fd\";\n}\n.fa-plus-square:before {\n  content: \"\\f0fe\";\n}\n.fa-angle-double-left:before {\n  content: \"\\f100\";\n}\n.fa-angle-double-right:before {\n  content: \"\\f101\";\n}\n.fa-angle-double-up:before {\n  content: \"\\f102\";\n}\n.fa-angle-double-down:before {\n  content: \"\\f103\";\n}\n.fa-angle-left:before {\n  content: \"\\f104\";\n}\n.fa-angle-right:before {\n  content: \"\\f105\";\n}\n.fa-angle-up:before {\n  content: \"\\f106\";\n}\n.fa-angle-down:before {\n  content: \"\\f107\";\n}\n.fa-desktop:before {\n  content: \"\\f108\";\n}\n.fa-laptop:before {\n  content: \"\\f109\";\n}\n.fa-tablet:before {\n  content: \"\\f10a\";\n}\n.fa-mobile-phone:before,\n.fa-mobile:before {\n  content: \"\\f10b\";\n}\n.fa-circle-o:before {\n  content: \"\\f10c\";\n}\n.fa-quote-left:before {\n  content: \"\\f10d\";\n}\n.fa-quote-right:before {\n  content: \"\\f10e\";\n}\n.fa-spinner:before {\n  content: \"\\f110\";\n}\n.fa-circle:before {\n  content: \"\\f111\";\n}\n.fa-mail-reply:before,\n.fa-reply:before {\n  content: \"\\f112\";\n}\n.fa-github-alt:before {\n  content: \"\\f113\";\n}\n.fa-folder-o:before {\n  content: \"\\f114\";\n}\n.fa-folder-open-o:before {\n  content: \"\\f115\";\n}\n.fa-smile-o:before {\n  content: \"\\f118\";\n}\n.fa-frown-o:before {\n  content: \"\\f119\";\n}\n.fa-meh-o:before {\n  content: \"\\f11a\";\n}\n.fa-gamepad:before {\n  content: \"\\f11b\";\n}\n.fa-keyboard-o:before {\n  content: \"\\f11c\";\n}\n.fa-flag-o:before {\n  content: \"\\f11d\";\n}\n.fa-flag-checkered:before {\n  content: \"\\f11e\";\n}\n.fa-terminal:before {\n  content: \"\\f120\";\n}\n.fa-code:before {\n  content: \"\\f121\";\n}\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n  content: \"\\f122\";\n}\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n  content: \"\\f123\";\n}\n.fa-location-arrow:before {\n  content: \"\\f124\";\n}\n.fa-crop:before {\n  content: \"\\f125\";\n}\n.fa-code-fork:before {\n  content: \"\\f126\";\n}\n.fa-unlink:before,\n.fa-chain-broken:before {\n  content: \"\\f127\";\n}\n.fa-question:before {\n  content: \"\\f128\";\n}\n.fa-info:before {\n  content: \"\\f129\";\n}\n.fa-exclamation:before {\n  content: \"\\f12a\";\n}\n.fa-superscript:before {\n  content: \"\\f12b\";\n}\n.fa-subscript:before {\n  content: \"\\f12c\";\n}\n.fa-eraser:before {\n  content: \"\\f12d\";\n}\n.fa-puzzle-piece:before {\n  content: \"\\f12e\";\n}\n.fa-microphone:before {\n  content: \"\\f130\";\n}\n.fa-microphone-slash:before {\n  content: \"\\f131\";\n}\n.fa-shield:before {\n  content: \"\\f132\";\n}\n.fa-calendar-o:before {\n  content: \"\\f133\";\n}\n.fa-fire-extinguisher:before {\n  content: \"\\f134\";\n}\n.fa-rocket:before {\n  content: \"\\f135\";\n}\n.fa-maxcdn:before {\n  content: \"\\f136\";\n}\n.fa-chevron-circle-left:before {\n  content: \"\\f137\";\n}\n.fa-chevron-circle-right:before {\n  content: \"\\f138\";\n}\n.fa-chevron-circle-up:before {\n  content: \"\\f139\";\n}\n.fa-chevron-circle-down:before {\n  content: \"\\f13a\";\n}\n.fa-html5:before {\n  content: \"\\f13b\";\n}\n.fa-css3:before {\n  content: \"\\f13c\";\n}\n.fa-anchor:before {\n  content: \"\\f13d\";\n}\n.fa-unlock-alt:before {\n  content: \"\\f13e\";\n}\n.fa-bullseye:before {\n  content: \"\\f140\";\n}\n.fa-ellipsis-h:before {\n  content: \"\\f141\";\n}\n.fa-ellipsis-v:before {\n  content: \"\\f142\";\n}\n.fa-rss-square:before {\n  content: \"\\f143\";\n}\n.fa-play-circle:before {\n  content: \"\\f144\";\n}\n.fa-ticket:before {\n  content: \"\\f145\";\n}\n.fa-minus-square:before {\n  content: \"\\f146\";\n}\n.fa-minus-square-o:before {\n  content: \"\\f147\";\n}\n.fa-level-up:before {\n  content: \"\\f148\";\n}\n.fa-level-down:before {\n  content: \"\\f149\";\n}\n.fa-check-square:before {\n  content: \"\\f14a\";\n}\n.fa-pencil-square:before {\n  content: \"\\f14b\";\n}\n.fa-external-link-square:before {\n  content: \"\\f14c\";\n}\n.fa-share-square:before {\n  content: \"\\f14d\";\n}\n.fa-compass:before {\n  content: \"\\f14e\";\n}\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n  content: \"\\f150\";\n}\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n  content: \"\\f151\";\n}\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n  content: \"\\f152\";\n}\n.fa-euro:before,\n.fa-eur:before {\n  content: \"\\f153\";\n}\n.fa-gbp:before {\n  content: \"\\f154\";\n}\n.fa-dollar:before,\n.fa-usd:before {\n  content: \"\\f155\";\n}\n.fa-rupee:before,\n.fa-inr:before {\n  content: \"\\f156\";\n}\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n  content: \"\\f157\";\n}\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n  content: \"\\f158\";\n}\n.fa-won:before,\n.fa-krw:before {\n  content: \"\\f159\";\n}\n.fa-bitcoin:before,\n.fa-btc:before {\n  content: \"\\f15a\";\n}\n.fa-file:before {\n  content: \"\\f15b\";\n}\n.fa-file-text:before {\n  content: \"\\f15c\";\n}\n.fa-sort-alpha-asc:before {\n  content: \"\\f15d\";\n}\n.fa-sort-alpha-desc:before {\n  content: \"\\f15e\";\n}\n.fa-sort-amount-asc:before {\n  content: \"\\f160\";\n}\n.fa-sort-amount-desc:before {\n  content: \"\\f161\";\n}\n.fa-sort-numeric-asc:before {\n  content: \"\\f162\";\n}\n.fa-sort-numeric-desc:before {\n  content: \"\\f163\";\n}\n.fa-thumbs-up:before {\n  content: \"\\f164\";\n}\n.fa-thumbs-down:before {\n  content: \"\\f165\";\n}\n.fa-youtube-square:before {\n  content: \"\\f166\";\n}\n.fa-youtube:before {\n  content: \"\\f167\";\n}\n.fa-xing:before {\n  content: \"\\f168\";\n}\n.fa-xing-square:before {\n  content: \"\\f169\";\n}\n.fa-youtube-play:before {\n  content: \"\\f16a\";\n}\n.fa-dropbox:before {\n  content: \"\\f16b\";\n}\n.fa-stack-overflow:before {\n  content: \"\\f16c\";\n}\n.fa-instagram:before {\n  content: \"\\f16d\";\n}\n.fa-flickr:before {\n  content: \"\\f16e\";\n}\n.fa-adn:before {\n  content: \"\\f170\";\n}\n.fa-bitbucket:before {\n  content: \"\\f171\";\n}\n.fa-bitbucket-square:before {\n  content: \"\\f172\";\n}\n.fa-tumblr:before {\n  content: \"\\f173\";\n}\n.fa-tumblr-square:before {\n  content: \"\\f174\";\n}\n.fa-long-arrow-down:before {\n  content: \"\\f175\";\n}\n.fa-long-arrow-up:before {\n  content: \"\\f176\";\n}\n.fa-long-arrow-left:before {\n  content: \"\\f177\";\n}\n.fa-long-arrow-right:before {\n  content: \"\\f178\";\n}\n.fa-apple:before {\n  content: \"\\f179\";\n}\n.fa-windows:before {\n  content: \"\\f17a\";\n}\n.fa-android:before {\n  content: \"\\f17b\";\n}\n.fa-linux:before {\n  content: \"\\f17c\";\n}\n.fa-dribbble:before {\n  content: \"\\f17d\";\n}\n.fa-skype:before {\n  content: \"\\f17e\";\n}\n.fa-foursquare:before {\n  content: \"\\f180\";\n}\n.fa-trello:before {\n  content: \"\\f181\";\n}\n.fa-female:before {\n  content: \"\\f182\";\n}\n.fa-male:before {\n  content: \"\\f183\";\n}\n.fa-gittip:before,\n.fa-gratipay:before {\n  content: \"\\f184\";\n}\n.fa-sun-o:before {\n  content: \"\\f185\";\n}\n.fa-moon-o:before {\n  content: \"\\f186\";\n}\n.fa-archive:before {\n  content: \"\\f187\";\n}\n.fa-bug:before {\n  content: \"\\f188\";\n}\n.fa-vk:before {\n  content: \"\\f189\";\n}\n.fa-weibo:before {\n  content: \"\\f18a\";\n}\n.fa-renren:before {\n  content: \"\\f18b\";\n}\n.fa-pagelines:before {\n  content: \"\\f18c\";\n}\n.fa-stack-exchange:before {\n  content: \"\\f18d\";\n}\n.fa-arrow-circle-o-right:before {\n  content: \"\\f18e\";\n}\n.fa-arrow-circle-o-left:before {\n  content: \"\\f190\";\n}\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n  content: \"\\f191\";\n}\n.fa-dot-circle-o:before {\n  content: \"\\f192\";\n}\n.fa-wheelchair:before {\n  content: \"\\f193\";\n}\n.fa-vimeo-square:before {\n  content: \"\\f194\";\n}\n.fa-turkish-lira:before,\n.fa-try:before {\n  content: \"\\f195\";\n}\n.fa-plus-square-o:before {\n  content: \"\\f196\";\n}\n.fa-space-shuttle:before {\n  content: \"\\f197\";\n}\n.fa-slack:before {\n  content: \"\\f198\";\n}\n.fa-envelope-square:before {\n  content: \"\\f199\";\n}\n.fa-wordpress:before {\n  content: \"\\f19a\";\n}\n.fa-openid:before {\n  content: \"\\f19b\";\n}\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n  content: \"\\f19c\";\n}\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n  content: \"\\f19d\";\n}\n.fa-yahoo:before {\n  content: \"\\f19e\";\n}\n.fa-google:before {\n  content: \"\\f1a0\";\n}\n.fa-reddit:before {\n  content: \"\\f1a1\";\n}\n.fa-reddit-square:before {\n  content: \"\\f1a2\";\n}\n.fa-stumbleupon-circle:before {\n  content: \"\\f1a3\";\n}\n.fa-stumbleupon:before {\n  content: \"\\f1a4\";\n}\n.fa-delicious:before {\n  content: \"\\f1a5\";\n}\n.fa-digg:before {\n  content: \"\\f1a6\";\n}\n.fa-pied-piper-pp:before {\n  content: \"\\f1a7\";\n}\n.fa-pied-piper-alt:before {\n  content: \"\\f1a8\";\n}\n.fa-drupal:before {\n  content: \"\\f1a9\";\n}\n.fa-joomla:before {\n  content: \"\\f1aa\";\n}\n.fa-language:before {\n  content: \"\\f1ab\";\n}\n.fa-fax:before {\n  content: \"\\f1ac\";\n}\n.fa-building:before {\n  content: \"\\f1ad\";\n}\n.fa-child:before {\n  content: \"\\f1ae\";\n}\n.fa-paw:before {\n  content: \"\\f1b0\";\n}\n.fa-spoon:before {\n  content: \"\\f1b1\";\n}\n.fa-cube:before {\n  content: \"\\f1b2\";\n}\n.fa-cubes:before {\n  content: \"\\f1b3\";\n}\n.fa-behance:before {\n  content: \"\\f1b4\";\n}\n.fa-behance-square:before {\n  content: \"\\f1b5\";\n}\n.fa-steam:before {\n  content: \"\\f1b6\";\n}\n.fa-steam-square:before {\n  content: \"\\f1b7\";\n}\n.fa-recycle:before {\n  content: \"\\f1b8\";\n}\n.fa-automobile:before,\n.fa-car:before {\n  content: \"\\f1b9\";\n}\n.fa-cab:before,\n.fa-taxi:before {\n  content: \"\\f1ba\";\n}\n.fa-tree:before {\n  content: \"\\f1bb\";\n}\n.fa-spotify:before {\n  content: \"\\f1bc\";\n}\n.fa-deviantart:before {\n  content: \"\\f1bd\";\n}\n.fa-soundcloud:before {\n  content: \"\\f1be\";\n}\n.fa-database:before {\n  content: \"\\f1c0\";\n}\n.fa-file-pdf-o:before {\n  content: \"\\f1c1\";\n}\n.fa-file-word-o:before {\n  content: \"\\f1c2\";\n}\n.fa-file-excel-o:before {\n  content: \"\\f1c3\";\n}\n.fa-file-powerpoint-o:before {\n  content: \"\\f1c4\";\n}\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n  content: \"\\f1c5\";\n}\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n  content: \"\\f1c6\";\n}\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n  content: \"\\f1c7\";\n}\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n  content: \"\\f1c8\";\n}\n.fa-file-code-o:before {\n  content: \"\\f1c9\";\n}\n.fa-vine:before {\n  content: \"\\f1ca\";\n}\n.fa-codepen:before {\n  content: \"\\f1cb\";\n}\n.fa-jsfiddle:before {\n  content: \"\\f1cc\";\n}\n.fa-life-bouy:before,\n.fa-life-buoy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n  content: \"\\f1cd\";\n}\n.fa-circle-o-notch:before {\n  content: \"\\f1ce\";\n}\n.fa-ra:before,\n.fa-resistance:before,\n.fa-rebel:before {\n  content: \"\\f1d0\";\n}\n.fa-ge:before,\n.fa-empire:before {\n  content: \"\\f1d1\";\n}\n.fa-git-square:before {\n  content: \"\\f1d2\";\n}\n.fa-git:before {\n  content: \"\\f1d3\";\n}\n.fa-y-combinator-square:before,\n.fa-yc-square:before,\n.fa-hacker-news:before {\n  content: \"\\f1d4\";\n}\n.fa-tencent-weibo:before {\n  content: \"\\f1d5\";\n}\n.fa-qq:before {\n  content: \"\\f1d6\";\n}\n.fa-wechat:before,\n.fa-weixin:before {\n  content: \"\\f1d7\";\n}\n.fa-send:before,\n.fa-paper-plane:before {\n  content: \"\\f1d8\";\n}\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n  content: \"\\f1d9\";\n}\n.fa-history:before {\n  content: \"\\f1da\";\n}\n.fa-circle-thin:before {\n  content: \"\\f1db\";\n}\n.fa-header:before {\n  content: \"\\f1dc\";\n}\n.fa-paragraph:before {\n  content: \"\\f1dd\";\n}\n.fa-sliders:before {\n  content: \"\\f1de\";\n}\n.fa-share-alt:before {\n  content: \"\\f1e0\";\n}\n.fa-share-alt-square:before {\n  content: \"\\f1e1\";\n}\n.fa-bomb:before {\n  content: \"\\f1e2\";\n}\n.fa-soccer-ball-o:before,\n.fa-futbol-o:before {\n  content: \"\\f1e3\";\n}\n.fa-tty:before {\n  content: \"\\f1e4\";\n}\n.fa-binoculars:before {\n  content: \"\\f1e5\";\n}\n.fa-plug:before {\n  content: \"\\f1e6\";\n}\n.fa-slideshare:before {\n  content: \"\\f1e7\";\n}\n.fa-twitch:before {\n  content: \"\\f1e8\";\n}\n.fa-yelp:before {\n  content: \"\\f1e9\";\n}\n.fa-newspaper-o:before {\n  content: \"\\f1ea\";\n}\n.fa-wifi:before {\n  content: \"\\f1eb\";\n}\n.fa-calculator:before {\n  content: \"\\f1ec\";\n}\n.fa-paypal:before {\n  content: \"\\f1ed\";\n}\n.fa-google-wallet:before {\n  content: \"\\f1ee\";\n}\n.fa-cc-visa:before {\n  content: \"\\f1f0\";\n}\n.fa-cc-mastercard:before {\n  content: \"\\f1f1\";\n}\n.fa-cc-discover:before {\n  content: \"\\f1f2\";\n}\n.fa-cc-amex:before {\n  content: \"\\f1f3\";\n}\n.fa-cc-paypal:before {\n  content: \"\\f1f4\";\n}\n.fa-cc-stripe:before {\n  content: \"\\f1f5\";\n}\n.fa-bell-slash:before {\n  content: \"\\f1f6\";\n}\n.fa-bell-slash-o:before {\n  content: \"\\f1f7\";\n}\n.fa-trash:before {\n  content: \"\\f1f8\";\n}\n.fa-copyright:before {\n  content: \"\\f1f9\";\n}\n.fa-at:before {\n  content: \"\\f1fa\";\n}\n.fa-eyedropper:before {\n  content: \"\\f1fb\";\n}\n.fa-paint-brush:before {\n  content: \"\\f1fc\";\n}\n.fa-birthday-cake:before {\n  content: \"\\f1fd\";\n}\n.fa-area-chart:before {\n  content: \"\\f1fe\";\n}\n.fa-pie-chart:before {\n  content: \"\\f200\";\n}\n.fa-line-chart:before {\n  content: \"\\f201\";\n}\n.fa-lastfm:before {\n  content: \"\\f202\";\n}\n.fa-lastfm-square:before {\n  content: \"\\f203\";\n}\n.fa-toggle-off:before {\n  content: \"\\f204\";\n}\n.fa-toggle-on:before {\n  content: \"\\f205\";\n}\n.fa-bicycle:before {\n  content: \"\\f206\";\n}\n.fa-bus:before {\n  content: \"\\f207\";\n}\n.fa-ioxhost:before {\n  content: \"\\f208\";\n}\n.fa-angellist:before {\n  content: \"\\f209\";\n}\n.fa-cc:before {\n  content: \"\\f20a\";\n}\n.fa-shekel:before,\n.fa-sheqel:before,\n.fa-ils:before {\n  content: \"\\f20b\";\n}\n.fa-meanpath:before {\n  content: \"\\f20c\";\n}\n.fa-buysellads:before {\n  content: \"\\f20d\";\n}\n.fa-connectdevelop:before {\n  content: \"\\f20e\";\n}\n.fa-dashcube:before {\n  content: \"\\f210\";\n}\n.fa-forumbee:before {\n  content: \"\\f211\";\n}\n.fa-leanpub:before {\n  content: \"\\f212\";\n}\n.fa-sellsy:before {\n  content: \"\\f213\";\n}\n.fa-shirtsinbulk:before {\n  content: \"\\f214\";\n}\n.fa-simplybuilt:before {\n  content: \"\\f215\";\n}\n.fa-skyatlas:before {\n  content: \"\\f216\";\n}\n.fa-cart-plus:before {\n  content: \"\\f217\";\n}\n.fa-cart-arrow-down:before {\n  content: \"\\f218\";\n}\n.fa-diamond:before {\n  content: \"\\f219\";\n}\n.fa-ship:before {\n  content: \"\\f21a\";\n}\n.fa-user-secret:before {\n  content: \"\\f21b\";\n}\n.fa-motorcycle:before {\n  content: \"\\f21c\";\n}\n.fa-street-view:before {\n  content: \"\\f21d\";\n}\n.fa-heartbeat:before {\n  content: \"\\f21e\";\n}\n.fa-venus:before {\n  content: \"\\f221\";\n}\n.fa-mars:before {\n  content: \"\\f222\";\n}\n.fa-mercury:before {\n  content: \"\\f223\";\n}\n.fa-intersex:before,\n.fa-transgender:before {\n  content: \"\\f224\";\n}\n.fa-transgender-alt:before {\n  content: \"\\f225\";\n}\n.fa-venus-double:before {\n  content: \"\\f226\";\n}\n.fa-mars-double:before {\n  content: \"\\f227\";\n}\n.fa-venus-mars:before {\n  content: \"\\f228\";\n}\n.fa-mars-stroke:before {\n  content: \"\\f229\";\n}\n.fa-mars-stroke-v:before {\n  content: \"\\f22a\";\n}\n.fa-mars-stroke-h:before {\n  content: \"\\f22b\";\n}\n.fa-neuter:before {\n  content: \"\\f22c\";\n}\n.fa-genderless:before {\n  content: \"\\f22d\";\n}\n.fa-facebook-official:before {\n  content: \"\\f230\";\n}\n.fa-pinterest-p:before {\n  content: \"\\f231\";\n}\n.fa-whatsapp:before {\n  content: \"\\f232\";\n}\n.fa-server:before {\n  content: \"\\f233\";\n}\n.fa-user-plus:before {\n  content: \"\\f234\";\n}\n.fa-user-times:before {\n  content: \"\\f235\";\n}\n.fa-hotel:before,\n.fa-bed:before {\n  content: \"\\f236\";\n}\n.fa-viacoin:before {\n  content: \"\\f237\";\n}\n.fa-train:before {\n  content: \"\\f238\";\n}\n.fa-subway:before {\n  content: \"\\f239\";\n}\n.fa-medium:before {\n  content: \"\\f23a\";\n}\n.fa-yc:before,\n.fa-y-combinator:before {\n  content: \"\\f23b\";\n}\n.fa-optin-monster:before {\n  content: \"\\f23c\";\n}\n.fa-opencart:before {\n  content: \"\\f23d\";\n}\n.fa-expeditedssl:before {\n  content: \"\\f23e\";\n}\n.fa-battery-4:before,\n.fa-battery-full:before {\n  content: \"\\f240\";\n}\n.fa-battery-3:before,\n.fa-battery-three-quarters:before {\n  content: \"\\f241\";\n}\n.fa-battery-2:before,\n.fa-battery-half:before {\n  content: \"\\f242\";\n}\n.fa-battery-1:before,\n.fa-battery-quarter:before {\n  content: \"\\f243\";\n}\n.fa-battery-0:before,\n.fa-battery-empty:before {\n  content: \"\\f244\";\n}\n.fa-mouse-pointer:before {\n  content: \"\\f245\";\n}\n.fa-i-cursor:before {\n  content: \"\\f246\";\n}\n.fa-object-group:before {\n  content: \"\\f247\";\n}\n.fa-object-ungroup:before {\n  content: \"\\f248\";\n}\n.fa-sticky-note:before {\n  content: \"\\f249\";\n}\n.fa-sticky-note-o:before {\n  content: \"\\f24a\";\n}\n.fa-cc-jcb:before {\n  content: \"\\f24b\";\n}\n.fa-cc-diners-club:before {\n  content: \"\\f24c\";\n}\n.fa-clone:before {\n  content: \"\\f24d\";\n}\n.fa-balance-scale:before {\n  content: \"\\f24e\";\n}\n.fa-hourglass-o:before {\n  content: \"\\f250\";\n}\n.fa-hourglass-1:before,\n.fa-hourglass-start:before {\n  content: \"\\f251\";\n}\n.fa-hourglass-2:before,\n.fa-hourglass-half:before {\n  content: \"\\f252\";\n}\n.fa-hourglass-3:before,\n.fa-hourglass-end:before {\n  content: \"\\f253\";\n}\n.fa-hourglass:before {\n  content: \"\\f254\";\n}\n.fa-hand-grab-o:before,\n.fa-hand-rock-o:before {\n  content: \"\\f255\";\n}\n.fa-hand-stop-o:before,\n.fa-hand-paper-o:before {\n  content: \"\\f256\";\n}\n.fa-hand-scissors-o:before {\n  content: \"\\f257\";\n}\n.fa-hand-lizard-o:before {\n  content: \"\\f258\";\n}\n.fa-hand-spock-o:before {\n  content: \"\\f259\";\n}\n.fa-hand-pointer-o:before {\n  content: \"\\f25a\";\n}\n.fa-hand-peace-o:before {\n  content: \"\\f25b\";\n}\n.fa-trademark:before {\n  content: \"\\f25c\";\n}\n.fa-registered:before {\n  content: \"\\f25d\";\n}\n.fa-creative-commons:before {\n  content: \"\\f25e\";\n}\n.fa-gg:before {\n  content: \"\\f260\";\n}\n.fa-gg-circle:before {\n  content: \"\\f261\";\n}\n.fa-tripadvisor:before {\n  content: \"\\f262\";\n}\n.fa-odnoklassniki:before {\n  content: \"\\f263\";\n}\n.fa-odnoklassniki-square:before {\n  content: \"\\f264\";\n}\n.fa-get-pocket:before {\n  content: \"\\f265\";\n}\n.fa-wikipedia-w:before {\n  content: \"\\f266\";\n}\n.fa-safari:before {\n  content: \"\\f267\";\n}\n.fa-chrome:before {\n  content: \"\\f268\";\n}\n.fa-firefox:before {\n  content: \"\\f269\";\n}\n.fa-opera:before {\n  content: \"\\f26a\";\n}\n.fa-internet-explorer:before {\n  content: \"\\f26b\";\n}\n.fa-tv:before,\n.fa-television:before {\n  content: \"\\f26c\";\n}\n.fa-contao:before {\n  content: \"\\f26d\";\n}\n.fa-500px:before {\n  content: \"\\f26e\";\n}\n.fa-amazon:before {\n  content: \"\\f270\";\n}\n.fa-calendar-plus-o:before {\n  content: \"\\f271\";\n}\n.fa-calendar-minus-o:before {\n  content: \"\\f272\";\n}\n.fa-calendar-times-o:before {\n  content: \"\\f273\";\n}\n.fa-calendar-check-o:before {\n  content: \"\\f274\";\n}\n.fa-industry:before {\n  content: \"\\f275\";\n}\n.fa-map-pin:before {\n  content: \"\\f276\";\n}\n.fa-map-signs:before {\n  content: \"\\f277\";\n}\n.fa-map-o:before {\n  content: \"\\f278\";\n}\n.fa-map:before {\n  content: \"\\f279\";\n}\n.fa-commenting:before {\n  content: \"\\f27a\";\n}\n.fa-commenting-o:before {\n  content: \"\\f27b\";\n}\n.fa-houzz:before {\n  content: \"\\f27c\";\n}\n.fa-vimeo:before {\n  content: \"\\f27d\";\n}\n.fa-black-tie:before {\n  content: \"\\f27e\";\n}\n.fa-fonticons:before {\n  content: \"\\f280\";\n}\n.fa-reddit-alien:before {\n  content: \"\\f281\";\n}\n.fa-edge:before {\n  content: \"\\f282\";\n}\n.fa-credit-card-alt:before {\n  content: \"\\f283\";\n}\n.fa-codiepie:before {\n  content: \"\\f284\";\n}\n.fa-modx:before {\n  content: \"\\f285\";\n}\n.fa-fort-awesome:before {\n  content: \"\\f286\";\n}\n.fa-usb:before {\n  content: \"\\f287\";\n}\n.fa-product-hunt:before {\n  content: \"\\f288\";\n}\n.fa-mixcloud:before {\n  content: \"\\f289\";\n}\n.fa-scribd:before {\n  content: \"\\f28a\";\n}\n.fa-pause-circle:before {\n  content: \"\\f28b\";\n}\n.fa-pause-circle-o:before {\n  content: \"\\f28c\";\n}\n.fa-stop-circle:before {\n  content: \"\\f28d\";\n}\n.fa-stop-circle-o:before {\n  content: \"\\f28e\";\n}\n.fa-shopping-bag:before {\n  content: \"\\f290\";\n}\n.fa-shopping-basket:before {\n  content: \"\\f291\";\n}\n.fa-hashtag:before {\n  content: \"\\f292\";\n}\n.fa-bluetooth:before {\n  content: \"\\f293\";\n}\n.fa-bluetooth-b:before {\n  content: \"\\f294\";\n}\n.fa-percent:before {\n  content: \"\\f295\";\n}\n.fa-gitlab:before {\n  content: \"\\f296\";\n}\n.fa-wpbeginner:before {\n  content: \"\\f297\";\n}\n.fa-wpforms:before {\n  content: \"\\f298\";\n}\n.fa-envira:before {\n  content: \"\\f299\";\n}\n.fa-universal-access:before {\n  content: \"\\f29a\";\n}\n.fa-wheelchair-alt:before {\n  content: \"\\f29b\";\n}\n.fa-question-circle-o:before {\n  content: \"\\f29c\";\n}\n.fa-blind:before {\n  content: \"\\f29d\";\n}\n.fa-audio-description:before {\n  content: \"\\f29e\";\n}\n.fa-volume-control-phone:before {\n  content: \"\\f2a0\";\n}\n.fa-braille:before {\n  content: \"\\f2a1\";\n}\n.fa-assistive-listening-systems:before {\n  content: \"\\f2a2\";\n}\n.fa-asl-interpreting:before,\n.fa-american-sign-language-interpreting:before {\n  content: \"\\f2a3\";\n}\n.fa-deafness:before,\n.fa-hard-of-hearing:before,\n.fa-deaf:before {\n  content: \"\\f2a4\";\n}\n.fa-glide:before {\n  content: \"\\f2a5\";\n}\n.fa-glide-g:before {\n  content: \"\\f2a6\";\n}\n.fa-signing:before,\n.fa-sign-language:before {\n  content: \"\\f2a7\";\n}\n.fa-low-vision:before {\n  content: \"\\f2a8\";\n}\n.fa-viadeo:before {\n  content: \"\\f2a9\";\n}\n.fa-viadeo-square:before {\n  content: \"\\f2aa\";\n}\n.fa-snapchat:before {\n  content: \"\\f2ab\";\n}\n.fa-snapchat-ghost:before {\n  content: \"\\f2ac\";\n}\n.fa-snapchat-square:before {\n  content: \"\\f2ad\";\n}\n.fa-pied-piper:before {\n  content: \"\\f2ae\";\n}\n.fa-first-order:before {\n  content: \"\\f2b0\";\n}\n.fa-yoast:before {\n  content: \"\\f2b1\";\n}\n.fa-themeisle:before {\n  content: \"\\f2b2\";\n}\n.fa-google-plus-circle:before,\n.fa-google-plus-official:before {\n  content: \"\\f2b3\";\n}\n.fa-fa:before,\n.fa-font-awesome:before {\n  content: \"\\f2b4\";\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}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/less/animated.less",
    "content": "// Animated Icons\n// --------------------------\n\n.@{fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n          animation: fa-spin 2s infinite linear;\n}\n\n.@{fa-css-prefix}-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n          animation: fa-spin 1s infinite steps(8);\n}\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/less/bordered-pulled.less",
    "content": "// Bordered & Pulled\n// -------------------------\n\n.@{fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: solid .08em @fa-border-color;\n  border-radius: .1em;\n}\n\n.@{fa-css-prefix}-pull-left { float: left; }\n.@{fa-css-prefix}-pull-right { float: right; }\n\n.@{fa-css-prefix} {\n  &.@{fa-css-prefix}-pull-left { margin-right: .3em; }\n  &.@{fa-css-prefix}-pull-right { margin-left: .3em; }\n}\n\n/* Deprecated as of 4.4.0 */\n.pull-right { float: right; }\n.pull-left { float: left; }\n\n.@{fa-css-prefix} {\n  &.pull-left { margin-right: .3em; }\n  &.pull-right { margin-left: .3em; }\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/less/core.less",
    "content": "// Base Class Definition\n// -------------------------\n\n.@{fa-css-prefix} {\n  display: inline-block;\n  font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/less/fixed-width.less",
    "content": "// Fixed Width Icons\n// -------------------------\n.@{fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/less/font-awesome.less",
    "content": "/*!\n *  Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables.less\";\n@import \"mixins.less\";\n@import \"path.less\";\n@import \"core.less\";\n@import \"larger.less\";\n@import \"fixed-width.less\";\n@import \"list.less\";\n@import \"bordered-pulled.less\";\n@import \"animated.less\";\n@import \"rotated-flipped.less\";\n@import \"stacked.less\";\n@import \"icons.less\";\n@import \"screen-reader.less\";\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/less/icons.less",
    "content": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n\n.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }\n.@{fa-css-prefix}-music:before { content: @fa-var-music; }\n.@{fa-css-prefix}-search:before { content: @fa-var-search; }\n.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }\n.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }\n.@{fa-css-prefix}-star:before { content: @fa-var-star; }\n.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }\n.@{fa-css-prefix}-user:before { content: @fa-var-user; }\n.@{fa-css-prefix}-film:before { content: @fa-var-film; }\n.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }\n.@{fa-css-prefix}-th:before { content: @fa-var-th; }\n.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }\n.@{fa-css-prefix}-check:before { content: @fa-var-check; }\n.@{fa-css-prefix}-remove:before,\n.@{fa-css-prefix}-close:before,\n.@{fa-css-prefix}-times:before { content: @fa-var-times; }\n.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }\n.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }\n.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }\n.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }\n.@{fa-css-prefix}-gear:before,\n.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }\n.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }\n.@{fa-css-prefix}-home:before { content: @fa-var-home; }\n.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }\n.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }\n.@{fa-css-prefix}-road:before { content: @fa-var-road; }\n.@{fa-css-prefix}-download:before { content: @fa-var-download; }\n.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }\n.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }\n.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }\n.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }\n.@{fa-css-prefix}-rotate-right:before,\n.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }\n.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }\n.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }\n.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }\n.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }\n.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }\n.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }\n.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }\n.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }\n.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }\n.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }\n.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }\n.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }\n.@{fa-css-prefix}-book:before { content: @fa-var-book; }\n.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }\n.@{fa-css-prefix}-print:before { content: @fa-var-print; }\n.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }\n.@{fa-css-prefix}-font:before { content: @fa-var-font; }\n.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }\n.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }\n.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }\n.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }\n.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }\n.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }\n.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }\n.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }\n.@{fa-css-prefix}-list:before { content: @fa-var-list; }\n.@{fa-css-prefix}-dedent:before,\n.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }\n.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }\n.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }\n.@{fa-css-prefix}-photo:before,\n.@{fa-css-prefix}-image:before,\n.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }\n.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }\n.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }\n.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }\n.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }\n.@{fa-css-prefix}-edit:before,\n.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }\n.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }\n.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }\n.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }\n.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }\n.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }\n.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }\n.@{fa-css-prefix}-play:before { content: @fa-var-play; }\n.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }\n.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }\n.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }\n.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }\n.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }\n.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }\n.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }\n.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }\n.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }\n.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }\n.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }\n.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }\n.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }\n.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }\n.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }\n.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }\n.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }\n.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }\n.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }\n.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }\n.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }\n.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }\n.@{fa-css-prefix}-mail-forward:before,\n.@{fa-css-prefix}-share:before { content: @fa-var-share; }\n.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }\n.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }\n.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }\n.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }\n.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }\n.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }\n.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }\n.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }\n.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }\n.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }\n.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }\n.@{fa-css-prefix}-warning:before,\n.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }\n.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }\n.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }\n.@{fa-css-prefix}-random:before { content: @fa-var-random; }\n.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }\n.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }\n.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }\n.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }\n.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }\n.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }\n.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }\n.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }\n.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }\n.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }\n.@{fa-css-prefix}-bar-chart-o:before,\n.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }\n.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }\n.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }\n.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }\n.@{fa-css-prefix}-key:before { content: @fa-var-key; }\n.@{fa-css-prefix}-gears:before,\n.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }\n.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }\n.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }\n.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }\n.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }\n.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }\n.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }\n.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }\n.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }\n.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }\n.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }\n.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }\n.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }\n.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }\n.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }\n.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }\n.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }\n.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }\n.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }\n.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }\n.@{fa-css-prefix}-facebook-f:before,\n.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }\n.@{fa-css-prefix}-github:before { content: @fa-var-github; }\n.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }\n.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }\n.@{fa-css-prefix}-feed:before,\n.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }\n.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }\n.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }\n.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }\n.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }\n.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }\n.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }\n.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }\n.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }\n.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }\n.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }\n.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }\n.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }\n.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }\n.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }\n.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }\n.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }\n.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }\n.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }\n.@{fa-css-prefix}-group:before,\n.@{fa-css-prefix}-users:before { content: @fa-var-users; }\n.@{fa-css-prefix}-chain:before,\n.@{fa-css-prefix}-link:before { content: @fa-var-link; }\n.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }\n.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }\n.@{fa-css-prefix}-cut:before,\n.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }\n.@{fa-css-prefix}-copy:before,\n.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }\n.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }\n.@{fa-css-prefix}-save:before,\n.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }\n.@{fa-css-prefix}-square:before { content: @fa-var-square; }\n.@{fa-css-prefix}-navicon:before,\n.@{fa-css-prefix}-reorder:before,\n.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }\n.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }\n.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }\n.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }\n.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }\n.@{fa-css-prefix}-table:before { content: @fa-var-table; }\n.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }\n.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }\n.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }\n.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }\n.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }\n.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }\n.@{fa-css-prefix}-money:before { content: @fa-var-money; }\n.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }\n.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }\n.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }\n.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }\n.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }\n.@{fa-css-prefix}-unsorted:before,\n.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }\n.@{fa-css-prefix}-sort-down:before,\n.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }\n.@{fa-css-prefix}-sort-up:before,\n.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }\n.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }\n.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }\n.@{fa-css-prefix}-rotate-left:before,\n.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }\n.@{fa-css-prefix}-legal:before,\n.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }\n.@{fa-css-prefix}-dashboard:before,\n.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }\n.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }\n.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }\n.@{fa-css-prefix}-flash:before,\n.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }\n.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }\n.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }\n.@{fa-css-prefix}-paste:before,\n.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }\n.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }\n.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }\n.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }\n.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }\n.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }\n.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }\n.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }\n.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }\n.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }\n.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }\n.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }\n.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }\n.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }\n.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }\n.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }\n.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }\n.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }\n.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }\n.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }\n.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }\n.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }\n.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }\n.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }\n.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }\n.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }\n.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }\n.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }\n.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }\n.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }\n.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }\n.@{fa-css-prefix}-mobile-phone:before,\n.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }\n.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }\n.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }\n.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }\n.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }\n.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }\n.@{fa-css-prefix}-mail-reply:before,\n.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }\n.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }\n.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }\n.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }\n.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }\n.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }\n.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }\n.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }\n.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }\n.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }\n.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }\n.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }\n.@{fa-css-prefix}-code:before { content: @fa-var-code; }\n.@{fa-css-prefix}-mail-reply-all:before,\n.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }\n.@{fa-css-prefix}-star-half-empty:before,\n.@{fa-css-prefix}-star-half-full:before,\n.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }\n.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }\n.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }\n.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }\n.@{fa-css-prefix}-unlink:before,\n.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }\n.@{fa-css-prefix}-question:before { content: @fa-var-question; }\n.@{fa-css-prefix}-info:before { content: @fa-var-info; }\n.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }\n.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }\n.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }\n.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }\n.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }\n.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }\n.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }\n.@{fa-css-prefix}-shield:before { content: @fa-var-shield; }\n.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }\n.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }\n.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }\n.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }\n.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }\n.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }\n.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }\n.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }\n.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }\n.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }\n.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }\n.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }\n.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }\n.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }\n.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }\n.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }\n.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }\n.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }\n.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }\n.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }\n.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }\n.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }\n.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }\n.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }\n.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }\n.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }\n.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }\n.@{fa-css-prefix}-toggle-down:before,\n.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }\n.@{fa-css-prefix}-toggle-up:before,\n.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }\n.@{fa-css-prefix}-toggle-right:before,\n.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }\n.@{fa-css-prefix}-euro:before,\n.@{fa-css-prefix}-eur:before { content: @fa-var-eur; }\n.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }\n.@{fa-css-prefix}-dollar:before,\n.@{fa-css-prefix}-usd:before { content: @fa-var-usd; }\n.@{fa-css-prefix}-rupee:before,\n.@{fa-css-prefix}-inr:before { content: @fa-var-inr; }\n.@{fa-css-prefix}-cny:before,\n.@{fa-css-prefix}-rmb:before,\n.@{fa-css-prefix}-yen:before,\n.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }\n.@{fa-css-prefix}-ruble:before,\n.@{fa-css-prefix}-rouble:before,\n.@{fa-css-prefix}-rub:before { content: @fa-var-rub; }\n.@{fa-css-prefix}-won:before,\n.@{fa-css-prefix}-krw:before { content: @fa-var-krw; }\n.@{fa-css-prefix}-bitcoin:before,\n.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }\n.@{fa-css-prefix}-file:before { content: @fa-var-file; }\n.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }\n.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }\n.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }\n.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }\n.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }\n.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }\n.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }\n.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }\n.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }\n.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }\n.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }\n.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }\n.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }\n.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }\n.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }\n.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }\n.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }\n.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }\n.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }\n.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }\n.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }\n.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }\n.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }\n.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }\n.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }\n.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }\n.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }\n.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }\n.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }\n.@{fa-css-prefix}-android:before { content: @fa-var-android; }\n.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }\n.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }\n.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }\n.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }\n.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }\n.@{fa-css-prefix}-female:before { content: @fa-var-female; }\n.@{fa-css-prefix}-male:before { content: @fa-var-male; }\n.@{fa-css-prefix}-gittip:before,\n.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; }\n.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }\n.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }\n.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }\n.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }\n.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }\n.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }\n.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }\n.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }\n.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }\n.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }\n.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }\n.@{fa-css-prefix}-toggle-left:before,\n.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }\n.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }\n.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }\n.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }\n.@{fa-css-prefix}-turkish-lira:before,\n.@{fa-css-prefix}-try:before { content: @fa-var-try; }\n.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }\n.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }\n.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }\n.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }\n.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }\n.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }\n.@{fa-css-prefix}-institution:before,\n.@{fa-css-prefix}-bank:before,\n.@{fa-css-prefix}-university:before { content: @fa-var-university; }\n.@{fa-css-prefix}-mortar-board:before,\n.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }\n.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }\n.@{fa-css-prefix}-google:before { content: @fa-var-google; }\n.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }\n.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }\n.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }\n.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }\n.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }\n.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }\n.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; }\n.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }\n.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }\n.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }\n.@{fa-css-prefix}-language:before { content: @fa-var-language; }\n.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }\n.@{fa-css-prefix}-building:before { content: @fa-var-building; }\n.@{fa-css-prefix}-child:before { content: @fa-var-child; }\n.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }\n.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }\n.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }\n.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }\n.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }\n.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }\n.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }\n.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }\n.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }\n.@{fa-css-prefix}-automobile:before,\n.@{fa-css-prefix}-car:before { content: @fa-var-car; }\n.@{fa-css-prefix}-cab:before,\n.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }\n.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }\n.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }\n.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }\n.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }\n.@{fa-css-prefix}-database:before { content: @fa-var-database; }\n.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }\n.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }\n.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }\n.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }\n.@{fa-css-prefix}-file-photo-o:before,\n.@{fa-css-prefix}-file-picture-o:before,\n.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }\n.@{fa-css-prefix}-file-zip-o:before,\n.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }\n.@{fa-css-prefix}-file-sound-o:before,\n.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }\n.@{fa-css-prefix}-file-movie-o:before,\n.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }\n.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }\n.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }\n.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }\n.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }\n.@{fa-css-prefix}-life-bouy:before,\n.@{fa-css-prefix}-life-buoy:before,\n.@{fa-css-prefix}-life-saver:before,\n.@{fa-css-prefix}-support:before,\n.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }\n.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }\n.@{fa-css-prefix}-ra:before,\n.@{fa-css-prefix}-resistance:before,\n.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }\n.@{fa-css-prefix}-ge:before,\n.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }\n.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }\n.@{fa-css-prefix}-git:before { content: @fa-var-git; }\n.@{fa-css-prefix}-y-combinator-square:before,\n.@{fa-css-prefix}-yc-square:before,\n.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }\n.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }\n.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }\n.@{fa-css-prefix}-wechat:before,\n.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }\n.@{fa-css-prefix}-send:before,\n.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }\n.@{fa-css-prefix}-send-o:before,\n.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }\n.@{fa-css-prefix}-history:before { content: @fa-var-history; }\n.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }\n.@{fa-css-prefix}-header:before { content: @fa-var-header; }\n.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }\n.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }\n.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }\n.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }\n.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }\n.@{fa-css-prefix}-soccer-ball-o:before,\n.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }\n.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }\n.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }\n.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }\n.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }\n.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }\n.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }\n.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }\n.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }\n.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }\n.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }\n.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }\n.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }\n.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }\n.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }\n.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }\n.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }\n.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }\n.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }\n.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }\n.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }\n.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }\n.@{fa-css-prefix}-at:before { content: @fa-var-at; }\n.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }\n.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }\n.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }\n.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }\n.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }\n.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }\n.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }\n.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }\n.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }\n.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }\n.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }\n.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }\n.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }\n.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }\n.@{fa-css-prefix}-cc:before { content: @fa-var-cc; }\n.@{fa-css-prefix}-shekel:before,\n.@{fa-css-prefix}-sheqel:before,\n.@{fa-css-prefix}-ils:before { content: @fa-var-ils; }\n.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }\n.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; }\n.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; }\n.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; }\n.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; }\n.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; }\n.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; }\n.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; }\n.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; }\n.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; }\n.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; }\n.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; }\n.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; }\n.@{fa-css-prefix}-ship:before { content: @fa-var-ship; }\n.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; }\n.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; }\n.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; }\n.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; }\n.@{fa-css-prefix}-venus:before { content: @fa-var-venus; }\n.@{fa-css-prefix}-mars:before { content: @fa-var-mars; }\n.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; }\n.@{fa-css-prefix}-intersex:before,\n.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; }\n.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; }\n.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; }\n.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; }\n.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; }\n.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; }\n.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; }\n.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; }\n.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; }\n.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; }\n.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; }\n.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; }\n.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; }\n.@{fa-css-prefix}-server:before { content: @fa-var-server; }\n.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; }\n.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; }\n.@{fa-css-prefix}-hotel:before,\n.@{fa-css-prefix}-bed:before { content: @fa-var-bed; }\n.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; }\n.@{fa-css-prefix}-train:before { content: @fa-var-train; }\n.@{fa-css-prefix}-subway:before { content: @fa-var-subway; }\n.@{fa-css-prefix}-medium:before { content: @fa-var-medium; }\n.@{fa-css-prefix}-yc:before,\n.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; }\n.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; }\n.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; }\n.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; }\n.@{fa-css-prefix}-battery-4:before,\n.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; }\n.@{fa-css-prefix}-battery-3:before,\n.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; }\n.@{fa-css-prefix}-battery-2:before,\n.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; }\n.@{fa-css-prefix}-battery-1:before,\n.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; }\n.@{fa-css-prefix}-battery-0:before,\n.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; }\n.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; }\n.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; }\n.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; }\n.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; }\n.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; }\n.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; }\n.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; }\n.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; }\n.@{fa-css-prefix}-clone:before { content: @fa-var-clone; }\n.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; }\n.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; }\n.@{fa-css-prefix}-hourglass-1:before,\n.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; }\n.@{fa-css-prefix}-hourglass-2:before,\n.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; }\n.@{fa-css-prefix}-hourglass-3:before,\n.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; }\n.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; }\n.@{fa-css-prefix}-hand-grab-o:before,\n.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; }\n.@{fa-css-prefix}-hand-stop-o:before,\n.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; }\n.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; }\n.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; }\n.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; }\n.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; }\n.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; }\n.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; }\n.@{fa-css-prefix}-registered:before { content: @fa-var-registered; }\n.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; }\n.@{fa-css-prefix}-gg:before { content: @fa-var-gg; }\n.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; }\n.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; }\n.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; }\n.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; }\n.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; }\n.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; }\n.@{fa-css-prefix}-safari:before { content: @fa-var-safari; }\n.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; }\n.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; }\n.@{fa-css-prefix}-opera:before { content: @fa-var-opera; }\n.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; }\n.@{fa-css-prefix}-tv:before,\n.@{fa-css-prefix}-television:before { content: @fa-var-television; }\n.@{fa-css-prefix}-contao:before { content: @fa-var-contao; }\n.@{fa-css-prefix}-500px:before { content: @fa-var-500px; }\n.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; }\n.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; }\n.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; }\n.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; }\n.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; }\n.@{fa-css-prefix}-industry:before { content: @fa-var-industry; }\n.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; }\n.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; }\n.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; }\n.@{fa-css-prefix}-map:before { content: @fa-var-map; }\n.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; }\n.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; }\n.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; }\n.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; }\n.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; }\n.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; }\n.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; }\n.@{fa-css-prefix}-edge:before { content: @fa-var-edge; }\n.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; }\n.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; }\n.@{fa-css-prefix}-modx:before { content: @fa-var-modx; }\n.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; }\n.@{fa-css-prefix}-usb:before { content: @fa-var-usb; }\n.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; }\n.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; }\n.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; }\n.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; }\n.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; }\n.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; }\n.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; }\n.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; }\n.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; }\n.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; }\n.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; }\n.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; }\n.@{fa-css-prefix}-percent:before { content: @fa-var-percent; }\n.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; }\n.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; }\n.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; }\n.@{fa-css-prefix}-envira:before { content: @fa-var-envira; }\n.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; }\n.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; }\n.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; }\n.@{fa-css-prefix}-blind:before { content: @fa-var-blind; }\n.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; }\n.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; }\n.@{fa-css-prefix}-braille:before { content: @fa-var-braille; }\n.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; }\n.@{fa-css-prefix}-asl-interpreting:before,\n.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; }\n.@{fa-css-prefix}-deafness:before,\n.@{fa-css-prefix}-hard-of-hearing:before,\n.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; }\n.@{fa-css-prefix}-glide:before { content: @fa-var-glide; }\n.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; }\n.@{fa-css-prefix}-signing:before,\n.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; }\n.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; }\n.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; }\n.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; }\n.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; }\n.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; }\n.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; }\n.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }\n.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; }\n.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; }\n.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; }\n.@{fa-css-prefix}-google-plus-circle:before,\n.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; }\n.@{fa-css-prefix}-fa:before,\n.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; }\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/less/larger.less",
    "content": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.@{fa-css-prefix}-lg {\n  font-size: (4em / 3);\n  line-height: (3em / 4);\n  vertical-align: -15%;\n}\n.@{fa-css-prefix}-2x { font-size: 2em; }\n.@{fa-css-prefix}-3x { font-size: 3em; }\n.@{fa-css-prefix}-4x { font-size: 4em; }\n.@{fa-css-prefix}-5x { font-size: 5em; }\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/less/list.less",
    "content": "// List Icons\n// -------------------------\n\n.@{fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: @fa-li-width;\n  list-style-type: none;\n  > li { position: relative; }\n}\n.@{fa-css-prefix}-li {\n  position: absolute;\n  left: -@fa-li-width;\n  width: @fa-li-width;\n  top: (2em / 14);\n  text-align: center;\n  &.@{fa-css-prefix}-lg {\n    left: (-@fa-li-width + (4em / 14));\n  }\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/less/mixins.less",
    "content": "// Mixins\n// --------------------------\n\n.fa-icon() {\n  display: inline-block;\n  font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n}\n\n.fa-icon-rotate(@degrees, @rotation) {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})\";\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n\n.fa-icon-flip(@horiz, @vert, @rotation) {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)\";\n  -webkit-transform: scale(@horiz, @vert);\n      -ms-transform: scale(@horiz, @vert);\n          transform: scale(@horiz, @vert);\n}\n\n\n// Only display content to screen readers. A la Bootstrap 4.\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only() {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable() {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/less/path.less",
    "content": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');\n  src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),\n    url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),\n    url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),\n    url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),\n    url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');\n  // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/less/rotated-flipped.less",
    "content": "// Rotated & Flipped Icons\n// -------------------------\n\n.@{fa-css-prefix}-rotate-90  { .fa-icon-rotate(90deg, 1);  }\n.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }\n.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }\n\n.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }\n.@{fa-css-prefix}-flip-vertical   { .fa-icon-flip(1, -1, 2); }\n\n// Hook for IE8-9\n// -------------------------\n\n:root .@{fa-css-prefix}-rotate-90,\n:root .@{fa-css-prefix}-rotate-180,\n:root .@{fa-css-prefix}-rotate-270,\n:root .@{fa-css-prefix}-flip-horizontal,\n:root .@{fa-css-prefix}-flip-vertical {\n  filter: none;\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/less/screen-reader.less",
    "content": "// Screen Readers\n// -------------------------\n\n.sr-only { .sr-only(); }\n.sr-only-focusable { .sr-only-focusable(); }\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/less/stacked.less",
    "content": "// Stacked Icons\n// -------------------------\n\n.@{fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.@{fa-css-prefix}-stack-1x { line-height: inherit; }\n.@{fa-css-prefix}-stack-2x { font-size: 2em; }\n.@{fa-css-prefix}-inverse { color: @fa-inverse; }\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/less/variables.less",
    "content": "// Variables\n// --------------------------\n\n@fa-font-path:        \"../fonts\";\n@fa-font-size-base:   14px;\n@fa-line-height-base: 1;\n//@fa-font-path:        \"//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts\"; // for referencing Bootstrap CDN font files directly\n@fa-css-prefix:       fa;\n@fa-version:          \"4.6.3\";\n@fa-border-color:     #eee;\n@fa-inverse:          #fff;\n@fa-li-width:         (30em / 14);\n\n@fa-var-500px: \"\\f26e\";\n@fa-var-adjust: \"\\f042\";\n@fa-var-adn: \"\\f170\";\n@fa-var-align-center: \"\\f037\";\n@fa-var-align-justify: \"\\f039\";\n@fa-var-align-left: \"\\f036\";\n@fa-var-align-right: \"\\f038\";\n@fa-var-amazon: \"\\f270\";\n@fa-var-ambulance: \"\\f0f9\";\n@fa-var-american-sign-language-interpreting: \"\\f2a3\";\n@fa-var-anchor: \"\\f13d\";\n@fa-var-android: \"\\f17b\";\n@fa-var-angellist: \"\\f209\";\n@fa-var-angle-double-down: \"\\f103\";\n@fa-var-angle-double-left: \"\\f100\";\n@fa-var-angle-double-right: \"\\f101\";\n@fa-var-angle-double-up: \"\\f102\";\n@fa-var-angle-down: \"\\f107\";\n@fa-var-angle-left: \"\\f104\";\n@fa-var-angle-right: \"\\f105\";\n@fa-var-angle-up: \"\\f106\";\n@fa-var-apple: \"\\f179\";\n@fa-var-archive: \"\\f187\";\n@fa-var-area-chart: \"\\f1fe\";\n@fa-var-arrow-circle-down: \"\\f0ab\";\n@fa-var-arrow-circle-left: \"\\f0a8\";\n@fa-var-arrow-circle-o-down: \"\\f01a\";\n@fa-var-arrow-circle-o-left: \"\\f190\";\n@fa-var-arrow-circle-o-right: \"\\f18e\";\n@fa-var-arrow-circle-o-up: \"\\f01b\";\n@fa-var-arrow-circle-right: \"\\f0a9\";\n@fa-var-arrow-circle-up: \"\\f0aa\";\n@fa-var-arrow-down: \"\\f063\";\n@fa-var-arrow-left: \"\\f060\";\n@fa-var-arrow-right: \"\\f061\";\n@fa-var-arrow-up: \"\\f062\";\n@fa-var-arrows: \"\\f047\";\n@fa-var-arrows-alt: \"\\f0b2\";\n@fa-var-arrows-h: \"\\f07e\";\n@fa-var-arrows-v: \"\\f07d\";\n@fa-var-asl-interpreting: \"\\f2a3\";\n@fa-var-assistive-listening-systems: \"\\f2a2\";\n@fa-var-asterisk: \"\\f069\";\n@fa-var-at: \"\\f1fa\";\n@fa-var-audio-description: \"\\f29e\";\n@fa-var-automobile: \"\\f1b9\";\n@fa-var-backward: \"\\f04a\";\n@fa-var-balance-scale: \"\\f24e\";\n@fa-var-ban: \"\\f05e\";\n@fa-var-bank: \"\\f19c\";\n@fa-var-bar-chart: \"\\f080\";\n@fa-var-bar-chart-o: \"\\f080\";\n@fa-var-barcode: \"\\f02a\";\n@fa-var-bars: \"\\f0c9\";\n@fa-var-battery-0: \"\\f244\";\n@fa-var-battery-1: \"\\f243\";\n@fa-var-battery-2: \"\\f242\";\n@fa-var-battery-3: \"\\f241\";\n@fa-var-battery-4: \"\\f240\";\n@fa-var-battery-empty: \"\\f244\";\n@fa-var-battery-full: \"\\f240\";\n@fa-var-battery-half: \"\\f242\";\n@fa-var-battery-quarter: \"\\f243\";\n@fa-var-battery-three-quarters: \"\\f241\";\n@fa-var-bed: \"\\f236\";\n@fa-var-beer: \"\\f0fc\";\n@fa-var-behance: \"\\f1b4\";\n@fa-var-behance-square: \"\\f1b5\";\n@fa-var-bell: \"\\f0f3\";\n@fa-var-bell-o: \"\\f0a2\";\n@fa-var-bell-slash: \"\\f1f6\";\n@fa-var-bell-slash-o: \"\\f1f7\";\n@fa-var-bicycle: \"\\f206\";\n@fa-var-binoculars: \"\\f1e5\";\n@fa-var-birthday-cake: \"\\f1fd\";\n@fa-var-bitbucket: \"\\f171\";\n@fa-var-bitbucket-square: \"\\f172\";\n@fa-var-bitcoin: \"\\f15a\";\n@fa-var-black-tie: \"\\f27e\";\n@fa-var-blind: \"\\f29d\";\n@fa-var-bluetooth: \"\\f293\";\n@fa-var-bluetooth-b: \"\\f294\";\n@fa-var-bold: \"\\f032\";\n@fa-var-bolt: \"\\f0e7\";\n@fa-var-bomb: \"\\f1e2\";\n@fa-var-book: \"\\f02d\";\n@fa-var-bookmark: \"\\f02e\";\n@fa-var-bookmark-o: \"\\f097\";\n@fa-var-braille: \"\\f2a1\";\n@fa-var-briefcase: \"\\f0b1\";\n@fa-var-btc: \"\\f15a\";\n@fa-var-bug: \"\\f188\";\n@fa-var-building: \"\\f1ad\";\n@fa-var-building-o: \"\\f0f7\";\n@fa-var-bullhorn: \"\\f0a1\";\n@fa-var-bullseye: \"\\f140\";\n@fa-var-bus: \"\\f207\";\n@fa-var-buysellads: \"\\f20d\";\n@fa-var-cab: \"\\f1ba\";\n@fa-var-calculator: \"\\f1ec\";\n@fa-var-calendar: \"\\f073\";\n@fa-var-calendar-check-o: \"\\f274\";\n@fa-var-calendar-minus-o: \"\\f272\";\n@fa-var-calendar-o: \"\\f133\";\n@fa-var-calendar-plus-o: \"\\f271\";\n@fa-var-calendar-times-o: \"\\f273\";\n@fa-var-camera: \"\\f030\";\n@fa-var-camera-retro: \"\\f083\";\n@fa-var-car: \"\\f1b9\";\n@fa-var-caret-down: \"\\f0d7\";\n@fa-var-caret-left: \"\\f0d9\";\n@fa-var-caret-right: \"\\f0da\";\n@fa-var-caret-square-o-down: \"\\f150\";\n@fa-var-caret-square-o-left: \"\\f191\";\n@fa-var-caret-square-o-right: \"\\f152\";\n@fa-var-caret-square-o-up: \"\\f151\";\n@fa-var-caret-up: \"\\f0d8\";\n@fa-var-cart-arrow-down: \"\\f218\";\n@fa-var-cart-plus: \"\\f217\";\n@fa-var-cc: \"\\f20a\";\n@fa-var-cc-amex: \"\\f1f3\";\n@fa-var-cc-diners-club: \"\\f24c\";\n@fa-var-cc-discover: \"\\f1f2\";\n@fa-var-cc-jcb: \"\\f24b\";\n@fa-var-cc-mastercard: \"\\f1f1\";\n@fa-var-cc-paypal: \"\\f1f4\";\n@fa-var-cc-stripe: \"\\f1f5\";\n@fa-var-cc-visa: \"\\f1f0\";\n@fa-var-certificate: \"\\f0a3\";\n@fa-var-chain: \"\\f0c1\";\n@fa-var-chain-broken: \"\\f127\";\n@fa-var-check: \"\\f00c\";\n@fa-var-check-circle: \"\\f058\";\n@fa-var-check-circle-o: \"\\f05d\";\n@fa-var-check-square: \"\\f14a\";\n@fa-var-check-square-o: \"\\f046\";\n@fa-var-chevron-circle-down: \"\\f13a\";\n@fa-var-chevron-circle-left: \"\\f137\";\n@fa-var-chevron-circle-right: \"\\f138\";\n@fa-var-chevron-circle-up: \"\\f139\";\n@fa-var-chevron-down: \"\\f078\";\n@fa-var-chevron-left: \"\\f053\";\n@fa-var-chevron-right: \"\\f054\";\n@fa-var-chevron-up: \"\\f077\";\n@fa-var-child: \"\\f1ae\";\n@fa-var-chrome: \"\\f268\";\n@fa-var-circle: \"\\f111\";\n@fa-var-circle-o: \"\\f10c\";\n@fa-var-circle-o-notch: \"\\f1ce\";\n@fa-var-circle-thin: \"\\f1db\";\n@fa-var-clipboard: \"\\f0ea\";\n@fa-var-clock-o: \"\\f017\";\n@fa-var-clone: \"\\f24d\";\n@fa-var-close: \"\\f00d\";\n@fa-var-cloud: \"\\f0c2\";\n@fa-var-cloud-download: \"\\f0ed\";\n@fa-var-cloud-upload: \"\\f0ee\";\n@fa-var-cny: \"\\f157\";\n@fa-var-code: \"\\f121\";\n@fa-var-code-fork: \"\\f126\";\n@fa-var-codepen: \"\\f1cb\";\n@fa-var-codiepie: \"\\f284\";\n@fa-var-coffee: \"\\f0f4\";\n@fa-var-cog: \"\\f013\";\n@fa-var-cogs: \"\\f085\";\n@fa-var-columns: \"\\f0db\";\n@fa-var-comment: \"\\f075\";\n@fa-var-comment-o: \"\\f0e5\";\n@fa-var-commenting: \"\\f27a\";\n@fa-var-commenting-o: \"\\f27b\";\n@fa-var-comments: \"\\f086\";\n@fa-var-comments-o: \"\\f0e6\";\n@fa-var-compass: \"\\f14e\";\n@fa-var-compress: \"\\f066\";\n@fa-var-connectdevelop: \"\\f20e\";\n@fa-var-contao: \"\\f26d\";\n@fa-var-copy: \"\\f0c5\";\n@fa-var-copyright: \"\\f1f9\";\n@fa-var-creative-commons: \"\\f25e\";\n@fa-var-credit-card: \"\\f09d\";\n@fa-var-credit-card-alt: \"\\f283\";\n@fa-var-crop: \"\\f125\";\n@fa-var-crosshairs: \"\\f05b\";\n@fa-var-css3: \"\\f13c\";\n@fa-var-cube: \"\\f1b2\";\n@fa-var-cubes: \"\\f1b3\";\n@fa-var-cut: \"\\f0c4\";\n@fa-var-cutlery: \"\\f0f5\";\n@fa-var-dashboard: \"\\f0e4\";\n@fa-var-dashcube: \"\\f210\";\n@fa-var-database: \"\\f1c0\";\n@fa-var-deaf: \"\\f2a4\";\n@fa-var-deafness: \"\\f2a4\";\n@fa-var-dedent: \"\\f03b\";\n@fa-var-delicious: \"\\f1a5\";\n@fa-var-desktop: \"\\f108\";\n@fa-var-deviantart: \"\\f1bd\";\n@fa-var-diamond: \"\\f219\";\n@fa-var-digg: \"\\f1a6\";\n@fa-var-dollar: \"\\f155\";\n@fa-var-dot-circle-o: \"\\f192\";\n@fa-var-download: \"\\f019\";\n@fa-var-dribbble: \"\\f17d\";\n@fa-var-dropbox: \"\\f16b\";\n@fa-var-drupal: \"\\f1a9\";\n@fa-var-edge: \"\\f282\";\n@fa-var-edit: \"\\f044\";\n@fa-var-eject: \"\\f052\";\n@fa-var-ellipsis-h: \"\\f141\";\n@fa-var-ellipsis-v: \"\\f142\";\n@fa-var-empire: \"\\f1d1\";\n@fa-var-envelope: \"\\f0e0\";\n@fa-var-envelope-o: \"\\f003\";\n@fa-var-envelope-square: \"\\f199\";\n@fa-var-envira: \"\\f299\";\n@fa-var-eraser: \"\\f12d\";\n@fa-var-eur: \"\\f153\";\n@fa-var-euro: \"\\f153\";\n@fa-var-exchange: \"\\f0ec\";\n@fa-var-exclamation: \"\\f12a\";\n@fa-var-exclamation-circle: \"\\f06a\";\n@fa-var-exclamation-triangle: \"\\f071\";\n@fa-var-expand: \"\\f065\";\n@fa-var-expeditedssl: \"\\f23e\";\n@fa-var-external-link: \"\\f08e\";\n@fa-var-external-link-square: \"\\f14c\";\n@fa-var-eye: \"\\f06e\";\n@fa-var-eye-slash: \"\\f070\";\n@fa-var-eyedropper: \"\\f1fb\";\n@fa-var-fa: \"\\f2b4\";\n@fa-var-facebook: \"\\f09a\";\n@fa-var-facebook-f: \"\\f09a\";\n@fa-var-facebook-official: \"\\f230\";\n@fa-var-facebook-square: \"\\f082\";\n@fa-var-fast-backward: \"\\f049\";\n@fa-var-fast-forward: \"\\f050\";\n@fa-var-fax: \"\\f1ac\";\n@fa-var-feed: \"\\f09e\";\n@fa-var-female: \"\\f182\";\n@fa-var-fighter-jet: \"\\f0fb\";\n@fa-var-file: \"\\f15b\";\n@fa-var-file-archive-o: \"\\f1c6\";\n@fa-var-file-audio-o: \"\\f1c7\";\n@fa-var-file-code-o: \"\\f1c9\";\n@fa-var-file-excel-o: \"\\f1c3\";\n@fa-var-file-image-o: \"\\f1c5\";\n@fa-var-file-movie-o: \"\\f1c8\";\n@fa-var-file-o: \"\\f016\";\n@fa-var-file-pdf-o: \"\\f1c1\";\n@fa-var-file-photo-o: \"\\f1c5\";\n@fa-var-file-picture-o: \"\\f1c5\";\n@fa-var-file-powerpoint-o: \"\\f1c4\";\n@fa-var-file-sound-o: \"\\f1c7\";\n@fa-var-file-text: \"\\f15c\";\n@fa-var-file-text-o: \"\\f0f6\";\n@fa-var-file-video-o: \"\\f1c8\";\n@fa-var-file-word-o: \"\\f1c2\";\n@fa-var-file-zip-o: \"\\f1c6\";\n@fa-var-files-o: \"\\f0c5\";\n@fa-var-film: \"\\f008\";\n@fa-var-filter: \"\\f0b0\";\n@fa-var-fire: \"\\f06d\";\n@fa-var-fire-extinguisher: \"\\f134\";\n@fa-var-firefox: \"\\f269\";\n@fa-var-first-order: \"\\f2b0\";\n@fa-var-flag: \"\\f024\";\n@fa-var-flag-checkered: \"\\f11e\";\n@fa-var-flag-o: \"\\f11d\";\n@fa-var-flash: \"\\f0e7\";\n@fa-var-flask: \"\\f0c3\";\n@fa-var-flickr: \"\\f16e\";\n@fa-var-floppy-o: \"\\f0c7\";\n@fa-var-folder: \"\\f07b\";\n@fa-var-folder-o: \"\\f114\";\n@fa-var-folder-open: \"\\f07c\";\n@fa-var-folder-open-o: \"\\f115\";\n@fa-var-font: \"\\f031\";\n@fa-var-font-awesome: \"\\f2b4\";\n@fa-var-fonticons: \"\\f280\";\n@fa-var-fort-awesome: \"\\f286\";\n@fa-var-forumbee: \"\\f211\";\n@fa-var-forward: \"\\f04e\";\n@fa-var-foursquare: \"\\f180\";\n@fa-var-frown-o: \"\\f119\";\n@fa-var-futbol-o: \"\\f1e3\";\n@fa-var-gamepad: \"\\f11b\";\n@fa-var-gavel: \"\\f0e3\";\n@fa-var-gbp: \"\\f154\";\n@fa-var-ge: \"\\f1d1\";\n@fa-var-gear: \"\\f013\";\n@fa-var-gears: \"\\f085\";\n@fa-var-genderless: \"\\f22d\";\n@fa-var-get-pocket: \"\\f265\";\n@fa-var-gg: \"\\f260\";\n@fa-var-gg-circle: \"\\f261\";\n@fa-var-gift: \"\\f06b\";\n@fa-var-git: \"\\f1d3\";\n@fa-var-git-square: \"\\f1d2\";\n@fa-var-github: \"\\f09b\";\n@fa-var-github-alt: \"\\f113\";\n@fa-var-github-square: \"\\f092\";\n@fa-var-gitlab: \"\\f296\";\n@fa-var-gittip: \"\\f184\";\n@fa-var-glass: \"\\f000\";\n@fa-var-glide: \"\\f2a5\";\n@fa-var-glide-g: \"\\f2a6\";\n@fa-var-globe: \"\\f0ac\";\n@fa-var-google: \"\\f1a0\";\n@fa-var-google-plus: \"\\f0d5\";\n@fa-var-google-plus-circle: \"\\f2b3\";\n@fa-var-google-plus-official: \"\\f2b3\";\n@fa-var-google-plus-square: \"\\f0d4\";\n@fa-var-google-wallet: \"\\f1ee\";\n@fa-var-graduation-cap: \"\\f19d\";\n@fa-var-gratipay: \"\\f184\";\n@fa-var-group: \"\\f0c0\";\n@fa-var-h-square: \"\\f0fd\";\n@fa-var-hacker-news: \"\\f1d4\";\n@fa-var-hand-grab-o: \"\\f255\";\n@fa-var-hand-lizard-o: \"\\f258\";\n@fa-var-hand-o-down: \"\\f0a7\";\n@fa-var-hand-o-left: \"\\f0a5\";\n@fa-var-hand-o-right: \"\\f0a4\";\n@fa-var-hand-o-up: \"\\f0a6\";\n@fa-var-hand-paper-o: \"\\f256\";\n@fa-var-hand-peace-o: \"\\f25b\";\n@fa-var-hand-pointer-o: \"\\f25a\";\n@fa-var-hand-rock-o: \"\\f255\";\n@fa-var-hand-scissors-o: \"\\f257\";\n@fa-var-hand-spock-o: \"\\f259\";\n@fa-var-hand-stop-o: \"\\f256\";\n@fa-var-hard-of-hearing: \"\\f2a4\";\n@fa-var-hashtag: \"\\f292\";\n@fa-var-hdd-o: \"\\f0a0\";\n@fa-var-header: \"\\f1dc\";\n@fa-var-headphones: \"\\f025\";\n@fa-var-heart: \"\\f004\";\n@fa-var-heart-o: \"\\f08a\";\n@fa-var-heartbeat: \"\\f21e\";\n@fa-var-history: \"\\f1da\";\n@fa-var-home: \"\\f015\";\n@fa-var-hospital-o: \"\\f0f8\";\n@fa-var-hotel: \"\\f236\";\n@fa-var-hourglass: \"\\f254\";\n@fa-var-hourglass-1: \"\\f251\";\n@fa-var-hourglass-2: \"\\f252\";\n@fa-var-hourglass-3: \"\\f253\";\n@fa-var-hourglass-end: \"\\f253\";\n@fa-var-hourglass-half: \"\\f252\";\n@fa-var-hourglass-o: \"\\f250\";\n@fa-var-hourglass-start: \"\\f251\";\n@fa-var-houzz: \"\\f27c\";\n@fa-var-html5: \"\\f13b\";\n@fa-var-i-cursor: \"\\f246\";\n@fa-var-ils: \"\\f20b\";\n@fa-var-image: \"\\f03e\";\n@fa-var-inbox: \"\\f01c\";\n@fa-var-indent: \"\\f03c\";\n@fa-var-industry: \"\\f275\";\n@fa-var-info: \"\\f129\";\n@fa-var-info-circle: \"\\f05a\";\n@fa-var-inr: \"\\f156\";\n@fa-var-instagram: \"\\f16d\";\n@fa-var-institution: \"\\f19c\";\n@fa-var-internet-explorer: \"\\f26b\";\n@fa-var-intersex: \"\\f224\";\n@fa-var-ioxhost: \"\\f208\";\n@fa-var-italic: \"\\f033\";\n@fa-var-joomla: \"\\f1aa\";\n@fa-var-jpy: \"\\f157\";\n@fa-var-jsfiddle: \"\\f1cc\";\n@fa-var-key: \"\\f084\";\n@fa-var-keyboard-o: \"\\f11c\";\n@fa-var-krw: \"\\f159\";\n@fa-var-language: \"\\f1ab\";\n@fa-var-laptop: \"\\f109\";\n@fa-var-lastfm: \"\\f202\";\n@fa-var-lastfm-square: \"\\f203\";\n@fa-var-leaf: \"\\f06c\";\n@fa-var-leanpub: \"\\f212\";\n@fa-var-legal: \"\\f0e3\";\n@fa-var-lemon-o: \"\\f094\";\n@fa-var-level-down: \"\\f149\";\n@fa-var-level-up: \"\\f148\";\n@fa-var-life-bouy: \"\\f1cd\";\n@fa-var-life-buoy: \"\\f1cd\";\n@fa-var-life-ring: \"\\f1cd\";\n@fa-var-life-saver: \"\\f1cd\";\n@fa-var-lightbulb-o: \"\\f0eb\";\n@fa-var-line-chart: \"\\f201\";\n@fa-var-link: \"\\f0c1\";\n@fa-var-linkedin: \"\\f0e1\";\n@fa-var-linkedin-square: \"\\f08c\";\n@fa-var-linux: \"\\f17c\";\n@fa-var-list: \"\\f03a\";\n@fa-var-list-alt: \"\\f022\";\n@fa-var-list-ol: \"\\f0cb\";\n@fa-var-list-ul: \"\\f0ca\";\n@fa-var-location-arrow: \"\\f124\";\n@fa-var-lock: \"\\f023\";\n@fa-var-long-arrow-down: \"\\f175\";\n@fa-var-long-arrow-left: \"\\f177\";\n@fa-var-long-arrow-right: \"\\f178\";\n@fa-var-long-arrow-up: \"\\f176\";\n@fa-var-low-vision: \"\\f2a8\";\n@fa-var-magic: \"\\f0d0\";\n@fa-var-magnet: \"\\f076\";\n@fa-var-mail-forward: \"\\f064\";\n@fa-var-mail-reply: \"\\f112\";\n@fa-var-mail-reply-all: \"\\f122\";\n@fa-var-male: \"\\f183\";\n@fa-var-map: \"\\f279\";\n@fa-var-map-marker: \"\\f041\";\n@fa-var-map-o: \"\\f278\";\n@fa-var-map-pin: \"\\f276\";\n@fa-var-map-signs: \"\\f277\";\n@fa-var-mars: \"\\f222\";\n@fa-var-mars-double: \"\\f227\";\n@fa-var-mars-stroke: \"\\f229\";\n@fa-var-mars-stroke-h: \"\\f22b\";\n@fa-var-mars-stroke-v: \"\\f22a\";\n@fa-var-maxcdn: \"\\f136\";\n@fa-var-meanpath: \"\\f20c\";\n@fa-var-medium: \"\\f23a\";\n@fa-var-medkit: \"\\f0fa\";\n@fa-var-meh-o: \"\\f11a\";\n@fa-var-mercury: \"\\f223\";\n@fa-var-microphone: \"\\f130\";\n@fa-var-microphone-slash: \"\\f131\";\n@fa-var-minus: \"\\f068\";\n@fa-var-minus-circle: \"\\f056\";\n@fa-var-minus-square: \"\\f146\";\n@fa-var-minus-square-o: \"\\f147\";\n@fa-var-mixcloud: \"\\f289\";\n@fa-var-mobile: \"\\f10b\";\n@fa-var-mobile-phone: \"\\f10b\";\n@fa-var-modx: \"\\f285\";\n@fa-var-money: \"\\f0d6\";\n@fa-var-moon-o: \"\\f186\";\n@fa-var-mortar-board: \"\\f19d\";\n@fa-var-motorcycle: \"\\f21c\";\n@fa-var-mouse-pointer: \"\\f245\";\n@fa-var-music: \"\\f001\";\n@fa-var-navicon: \"\\f0c9\";\n@fa-var-neuter: \"\\f22c\";\n@fa-var-newspaper-o: \"\\f1ea\";\n@fa-var-object-group: \"\\f247\";\n@fa-var-object-ungroup: \"\\f248\";\n@fa-var-odnoklassniki: \"\\f263\";\n@fa-var-odnoklassniki-square: \"\\f264\";\n@fa-var-opencart: \"\\f23d\";\n@fa-var-openid: \"\\f19b\";\n@fa-var-opera: \"\\f26a\";\n@fa-var-optin-monster: \"\\f23c\";\n@fa-var-outdent: \"\\f03b\";\n@fa-var-pagelines: \"\\f18c\";\n@fa-var-paint-brush: \"\\f1fc\";\n@fa-var-paper-plane: \"\\f1d8\";\n@fa-var-paper-plane-o: \"\\f1d9\";\n@fa-var-paperclip: \"\\f0c6\";\n@fa-var-paragraph: \"\\f1dd\";\n@fa-var-paste: \"\\f0ea\";\n@fa-var-pause: \"\\f04c\";\n@fa-var-pause-circle: \"\\f28b\";\n@fa-var-pause-circle-o: \"\\f28c\";\n@fa-var-paw: \"\\f1b0\";\n@fa-var-paypal: \"\\f1ed\";\n@fa-var-pencil: \"\\f040\";\n@fa-var-pencil-square: \"\\f14b\";\n@fa-var-pencil-square-o: \"\\f044\";\n@fa-var-percent: \"\\f295\";\n@fa-var-phone: \"\\f095\";\n@fa-var-phone-square: \"\\f098\";\n@fa-var-photo: \"\\f03e\";\n@fa-var-picture-o: \"\\f03e\";\n@fa-var-pie-chart: \"\\f200\";\n@fa-var-pied-piper: \"\\f2ae\";\n@fa-var-pied-piper-alt: \"\\f1a8\";\n@fa-var-pied-piper-pp: \"\\f1a7\";\n@fa-var-pinterest: \"\\f0d2\";\n@fa-var-pinterest-p: \"\\f231\";\n@fa-var-pinterest-square: \"\\f0d3\";\n@fa-var-plane: \"\\f072\";\n@fa-var-play: \"\\f04b\";\n@fa-var-play-circle: \"\\f144\";\n@fa-var-play-circle-o: \"\\f01d\";\n@fa-var-plug: \"\\f1e6\";\n@fa-var-plus: \"\\f067\";\n@fa-var-plus-circle: \"\\f055\";\n@fa-var-plus-square: \"\\f0fe\";\n@fa-var-plus-square-o: \"\\f196\";\n@fa-var-power-off: \"\\f011\";\n@fa-var-print: \"\\f02f\";\n@fa-var-product-hunt: \"\\f288\";\n@fa-var-puzzle-piece: \"\\f12e\";\n@fa-var-qq: \"\\f1d6\";\n@fa-var-qrcode: \"\\f029\";\n@fa-var-question: \"\\f128\";\n@fa-var-question-circle: \"\\f059\";\n@fa-var-question-circle-o: \"\\f29c\";\n@fa-var-quote-left: \"\\f10d\";\n@fa-var-quote-right: \"\\f10e\";\n@fa-var-ra: \"\\f1d0\";\n@fa-var-random: \"\\f074\";\n@fa-var-rebel: \"\\f1d0\";\n@fa-var-recycle: \"\\f1b8\";\n@fa-var-reddit: \"\\f1a1\";\n@fa-var-reddit-alien: \"\\f281\";\n@fa-var-reddit-square: \"\\f1a2\";\n@fa-var-refresh: \"\\f021\";\n@fa-var-registered: \"\\f25d\";\n@fa-var-remove: \"\\f00d\";\n@fa-var-renren: \"\\f18b\";\n@fa-var-reorder: \"\\f0c9\";\n@fa-var-repeat: \"\\f01e\";\n@fa-var-reply: \"\\f112\";\n@fa-var-reply-all: \"\\f122\";\n@fa-var-resistance: \"\\f1d0\";\n@fa-var-retweet: \"\\f079\";\n@fa-var-rmb: \"\\f157\";\n@fa-var-road: \"\\f018\";\n@fa-var-rocket: \"\\f135\";\n@fa-var-rotate-left: \"\\f0e2\";\n@fa-var-rotate-right: \"\\f01e\";\n@fa-var-rouble: \"\\f158\";\n@fa-var-rss: \"\\f09e\";\n@fa-var-rss-square: \"\\f143\";\n@fa-var-rub: \"\\f158\";\n@fa-var-ruble: \"\\f158\";\n@fa-var-rupee: \"\\f156\";\n@fa-var-safari: \"\\f267\";\n@fa-var-save: \"\\f0c7\";\n@fa-var-scissors: \"\\f0c4\";\n@fa-var-scribd: \"\\f28a\";\n@fa-var-search: \"\\f002\";\n@fa-var-search-minus: \"\\f010\";\n@fa-var-search-plus: \"\\f00e\";\n@fa-var-sellsy: \"\\f213\";\n@fa-var-send: \"\\f1d8\";\n@fa-var-send-o: \"\\f1d9\";\n@fa-var-server: \"\\f233\";\n@fa-var-share: \"\\f064\";\n@fa-var-share-alt: \"\\f1e0\";\n@fa-var-share-alt-square: \"\\f1e1\";\n@fa-var-share-square: \"\\f14d\";\n@fa-var-share-square-o: \"\\f045\";\n@fa-var-shekel: \"\\f20b\";\n@fa-var-sheqel: \"\\f20b\";\n@fa-var-shield: \"\\f132\";\n@fa-var-ship: \"\\f21a\";\n@fa-var-shirtsinbulk: \"\\f214\";\n@fa-var-shopping-bag: \"\\f290\";\n@fa-var-shopping-basket: \"\\f291\";\n@fa-var-shopping-cart: \"\\f07a\";\n@fa-var-sign-in: \"\\f090\";\n@fa-var-sign-language: \"\\f2a7\";\n@fa-var-sign-out: \"\\f08b\";\n@fa-var-signal: \"\\f012\";\n@fa-var-signing: \"\\f2a7\";\n@fa-var-simplybuilt: \"\\f215\";\n@fa-var-sitemap: \"\\f0e8\";\n@fa-var-skyatlas: \"\\f216\";\n@fa-var-skype: \"\\f17e\";\n@fa-var-slack: \"\\f198\";\n@fa-var-sliders: \"\\f1de\";\n@fa-var-slideshare: \"\\f1e7\";\n@fa-var-smile-o: \"\\f118\";\n@fa-var-snapchat: \"\\f2ab\";\n@fa-var-snapchat-ghost: \"\\f2ac\";\n@fa-var-snapchat-square: \"\\f2ad\";\n@fa-var-soccer-ball-o: \"\\f1e3\";\n@fa-var-sort: \"\\f0dc\";\n@fa-var-sort-alpha-asc: \"\\f15d\";\n@fa-var-sort-alpha-desc: \"\\f15e\";\n@fa-var-sort-amount-asc: \"\\f160\";\n@fa-var-sort-amount-desc: \"\\f161\";\n@fa-var-sort-asc: \"\\f0de\";\n@fa-var-sort-desc: \"\\f0dd\";\n@fa-var-sort-down: \"\\f0dd\";\n@fa-var-sort-numeric-asc: \"\\f162\";\n@fa-var-sort-numeric-desc: \"\\f163\";\n@fa-var-sort-up: \"\\f0de\";\n@fa-var-soundcloud: \"\\f1be\";\n@fa-var-space-shuttle: \"\\f197\";\n@fa-var-spinner: \"\\f110\";\n@fa-var-spoon: \"\\f1b1\";\n@fa-var-spotify: \"\\f1bc\";\n@fa-var-square: \"\\f0c8\";\n@fa-var-square-o: \"\\f096\";\n@fa-var-stack-exchange: \"\\f18d\";\n@fa-var-stack-overflow: \"\\f16c\";\n@fa-var-star: \"\\f005\";\n@fa-var-star-half: \"\\f089\";\n@fa-var-star-half-empty: \"\\f123\";\n@fa-var-star-half-full: \"\\f123\";\n@fa-var-star-half-o: \"\\f123\";\n@fa-var-star-o: \"\\f006\";\n@fa-var-steam: \"\\f1b6\";\n@fa-var-steam-square: \"\\f1b7\";\n@fa-var-step-backward: \"\\f048\";\n@fa-var-step-forward: \"\\f051\";\n@fa-var-stethoscope: \"\\f0f1\";\n@fa-var-sticky-note: \"\\f249\";\n@fa-var-sticky-note-o: \"\\f24a\";\n@fa-var-stop: \"\\f04d\";\n@fa-var-stop-circle: \"\\f28d\";\n@fa-var-stop-circle-o: \"\\f28e\";\n@fa-var-street-view: \"\\f21d\";\n@fa-var-strikethrough: \"\\f0cc\";\n@fa-var-stumbleupon: \"\\f1a4\";\n@fa-var-stumbleupon-circle: \"\\f1a3\";\n@fa-var-subscript: \"\\f12c\";\n@fa-var-subway: \"\\f239\";\n@fa-var-suitcase: \"\\f0f2\";\n@fa-var-sun-o: \"\\f185\";\n@fa-var-superscript: \"\\f12b\";\n@fa-var-support: \"\\f1cd\";\n@fa-var-table: \"\\f0ce\";\n@fa-var-tablet: \"\\f10a\";\n@fa-var-tachometer: \"\\f0e4\";\n@fa-var-tag: \"\\f02b\";\n@fa-var-tags: \"\\f02c\";\n@fa-var-tasks: \"\\f0ae\";\n@fa-var-taxi: \"\\f1ba\";\n@fa-var-television: \"\\f26c\";\n@fa-var-tencent-weibo: \"\\f1d5\";\n@fa-var-terminal: \"\\f120\";\n@fa-var-text-height: \"\\f034\";\n@fa-var-text-width: \"\\f035\";\n@fa-var-th: \"\\f00a\";\n@fa-var-th-large: \"\\f009\";\n@fa-var-th-list: \"\\f00b\";\n@fa-var-themeisle: \"\\f2b2\";\n@fa-var-thumb-tack: \"\\f08d\";\n@fa-var-thumbs-down: \"\\f165\";\n@fa-var-thumbs-o-down: \"\\f088\";\n@fa-var-thumbs-o-up: \"\\f087\";\n@fa-var-thumbs-up: \"\\f164\";\n@fa-var-ticket: \"\\f145\";\n@fa-var-times: \"\\f00d\";\n@fa-var-times-circle: \"\\f057\";\n@fa-var-times-circle-o: \"\\f05c\";\n@fa-var-tint: \"\\f043\";\n@fa-var-toggle-down: \"\\f150\";\n@fa-var-toggle-left: \"\\f191\";\n@fa-var-toggle-off: \"\\f204\";\n@fa-var-toggle-on: \"\\f205\";\n@fa-var-toggle-right: \"\\f152\";\n@fa-var-toggle-up: \"\\f151\";\n@fa-var-trademark: \"\\f25c\";\n@fa-var-train: \"\\f238\";\n@fa-var-transgender: \"\\f224\";\n@fa-var-transgender-alt: \"\\f225\";\n@fa-var-trash: \"\\f1f8\";\n@fa-var-trash-o: \"\\f014\";\n@fa-var-tree: \"\\f1bb\";\n@fa-var-trello: \"\\f181\";\n@fa-var-tripadvisor: \"\\f262\";\n@fa-var-trophy: \"\\f091\";\n@fa-var-truck: \"\\f0d1\";\n@fa-var-try: \"\\f195\";\n@fa-var-tty: \"\\f1e4\";\n@fa-var-tumblr: \"\\f173\";\n@fa-var-tumblr-square: \"\\f174\";\n@fa-var-turkish-lira: \"\\f195\";\n@fa-var-tv: \"\\f26c\";\n@fa-var-twitch: \"\\f1e8\";\n@fa-var-twitter: \"\\f099\";\n@fa-var-twitter-square: \"\\f081\";\n@fa-var-umbrella: \"\\f0e9\";\n@fa-var-underline: \"\\f0cd\";\n@fa-var-undo: \"\\f0e2\";\n@fa-var-universal-access: \"\\f29a\";\n@fa-var-university: \"\\f19c\";\n@fa-var-unlink: \"\\f127\";\n@fa-var-unlock: \"\\f09c\";\n@fa-var-unlock-alt: \"\\f13e\";\n@fa-var-unsorted: \"\\f0dc\";\n@fa-var-upload: \"\\f093\";\n@fa-var-usb: \"\\f287\";\n@fa-var-usd: \"\\f155\";\n@fa-var-user: \"\\f007\";\n@fa-var-user-md: \"\\f0f0\";\n@fa-var-user-plus: \"\\f234\";\n@fa-var-user-secret: \"\\f21b\";\n@fa-var-user-times: \"\\f235\";\n@fa-var-users: \"\\f0c0\";\n@fa-var-venus: \"\\f221\";\n@fa-var-venus-double: \"\\f226\";\n@fa-var-venus-mars: \"\\f228\";\n@fa-var-viacoin: \"\\f237\";\n@fa-var-viadeo: \"\\f2a9\";\n@fa-var-viadeo-square: \"\\f2aa\";\n@fa-var-video-camera: \"\\f03d\";\n@fa-var-vimeo: \"\\f27d\";\n@fa-var-vimeo-square: \"\\f194\";\n@fa-var-vine: \"\\f1ca\";\n@fa-var-vk: \"\\f189\";\n@fa-var-volume-control-phone: \"\\f2a0\";\n@fa-var-volume-down: \"\\f027\";\n@fa-var-volume-off: \"\\f026\";\n@fa-var-volume-up: \"\\f028\";\n@fa-var-warning: \"\\f071\";\n@fa-var-wechat: \"\\f1d7\";\n@fa-var-weibo: \"\\f18a\";\n@fa-var-weixin: \"\\f1d7\";\n@fa-var-whatsapp: \"\\f232\";\n@fa-var-wheelchair: \"\\f193\";\n@fa-var-wheelchair-alt: \"\\f29b\";\n@fa-var-wifi: \"\\f1eb\";\n@fa-var-wikipedia-w: \"\\f266\";\n@fa-var-windows: \"\\f17a\";\n@fa-var-won: \"\\f159\";\n@fa-var-wordpress: \"\\f19a\";\n@fa-var-wpbeginner: \"\\f297\";\n@fa-var-wpforms: \"\\f298\";\n@fa-var-wrench: \"\\f0ad\";\n@fa-var-xing: \"\\f168\";\n@fa-var-xing-square: \"\\f169\";\n@fa-var-y-combinator: \"\\f23b\";\n@fa-var-y-combinator-square: \"\\f1d4\";\n@fa-var-yahoo: \"\\f19e\";\n@fa-var-yc: \"\\f23b\";\n@fa-var-yc-square: \"\\f1d4\";\n@fa-var-yelp: \"\\f1e9\";\n@fa-var-yen: \"\\f157\";\n@fa-var-yoast: \"\\f2b1\";\n@fa-var-youtube: \"\\f167\";\n@fa-var-youtube-play: \"\\f16a\";\n@fa-var-youtube-square: \"\\f166\";\n\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/scss/_animated.scss",
    "content": "// Spinning Icons\n// --------------------------\n\n.#{$fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n          animation: fa-spin 2s infinite linear;\n}\n\n.#{$fa-css-prefix}-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n          animation: fa-spin 1s infinite steps(8);\n}\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/scss/_bordered-pulled.scss",
    "content": "// Bordered & Pulled\n// -------------------------\n\n.#{$fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: solid .08em $fa-border-color;\n  border-radius: .1em;\n}\n\n.#{$fa-css-prefix}-pull-left { float: left; }\n.#{$fa-css-prefix}-pull-right { float: right; }\n\n.#{$fa-css-prefix} {\n  &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }\n  &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }\n}\n\n/* Deprecated as of 4.4.0 */\n.pull-right { float: right; }\n.pull-left { float: left; }\n\n.#{$fa-css-prefix} {\n  &.pull-left { margin-right: .3em; }\n  &.pull-right { margin-left: .3em; }\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/scss/_core.scss",
    "content": "// Base Class Definition\n// -------------------------\n\n.#{$fa-css-prefix} {\n  display: inline-block;\n  font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/scss/_fixed-width.scss",
    "content": "// Fixed Width Icons\n// -------------------------\n.#{$fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/scss/_icons.scss",
    "content": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n\n.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }\n.#{$fa-css-prefix}-music:before { content: $fa-var-music; }\n.#{$fa-css-prefix}-search:before { content: $fa-var-search; }\n.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }\n.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }\n.#{$fa-css-prefix}-star:before { content: $fa-var-star; }\n.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }\n.#{$fa-css-prefix}-user:before { content: $fa-var-user; }\n.#{$fa-css-prefix}-film:before { content: $fa-var-film; }\n.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }\n.#{$fa-css-prefix}-th:before { content: $fa-var-th; }\n.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }\n.#{$fa-css-prefix}-check:before { content: $fa-var-check; }\n.#{$fa-css-prefix}-remove:before,\n.#{$fa-css-prefix}-close:before,\n.#{$fa-css-prefix}-times:before { content: $fa-var-times; }\n.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }\n.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }\n.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }\n.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }\n.#{$fa-css-prefix}-gear:before,\n.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }\n.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }\n.#{$fa-css-prefix}-home:before { content: $fa-var-home; }\n.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }\n.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }\n.#{$fa-css-prefix}-road:before { content: $fa-var-road; }\n.#{$fa-css-prefix}-download:before { content: $fa-var-download; }\n.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }\n.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }\n.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }\n.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }\n.#{$fa-css-prefix}-rotate-right:before,\n.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }\n.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }\n.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }\n.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }\n.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }\n.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }\n.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }\n.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }\n.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }\n.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }\n.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }\n.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }\n.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }\n.#{$fa-css-prefix}-book:before { content: $fa-var-book; }\n.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }\n.#{$fa-css-prefix}-print:before { content: $fa-var-print; }\n.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }\n.#{$fa-css-prefix}-font:before { content: $fa-var-font; }\n.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }\n.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }\n.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }\n.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }\n.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }\n.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }\n.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }\n.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }\n.#{$fa-css-prefix}-list:before { content: $fa-var-list; }\n.#{$fa-css-prefix}-dedent:before,\n.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }\n.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }\n.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }\n.#{$fa-css-prefix}-photo:before,\n.#{$fa-css-prefix}-image:before,\n.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }\n.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }\n.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }\n.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }\n.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }\n.#{$fa-css-prefix}-edit:before,\n.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }\n.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }\n.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }\n.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }\n.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }\n.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }\n.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }\n.#{$fa-css-prefix}-play:before { content: $fa-var-play; }\n.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }\n.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }\n.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }\n.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }\n.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }\n.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }\n.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }\n.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }\n.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }\n.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }\n.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }\n.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }\n.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }\n.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }\n.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }\n.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }\n.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }\n.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }\n.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }\n.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }\n.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }\n.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }\n.#{$fa-css-prefix}-mail-forward:before,\n.#{$fa-css-prefix}-share:before { content: $fa-var-share; }\n.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }\n.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }\n.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }\n.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }\n.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }\n.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }\n.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }\n.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }\n.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }\n.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }\n.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }\n.#{$fa-css-prefix}-warning:before,\n.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }\n.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }\n.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }\n.#{$fa-css-prefix}-random:before { content: $fa-var-random; }\n.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }\n.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }\n.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }\n.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }\n.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }\n.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }\n.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }\n.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }\n.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }\n.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }\n.#{$fa-css-prefix}-bar-chart-o:before,\n.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }\n.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }\n.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }\n.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }\n.#{$fa-css-prefix}-key:before { content: $fa-var-key; }\n.#{$fa-css-prefix}-gears:before,\n.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }\n.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }\n.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }\n.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }\n.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }\n.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }\n.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }\n.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }\n.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }\n.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }\n.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }\n.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }\n.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }\n.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }\n.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }\n.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }\n.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }\n.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }\n.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }\n.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }\n.#{$fa-css-prefix}-facebook-f:before,\n.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }\n.#{$fa-css-prefix}-github:before { content: $fa-var-github; }\n.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }\n.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }\n.#{$fa-css-prefix}-feed:before,\n.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }\n.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }\n.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }\n.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }\n.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }\n.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }\n.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }\n.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }\n.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }\n.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }\n.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }\n.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }\n.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }\n.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }\n.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }\n.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }\n.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }\n.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }\n.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }\n.#{$fa-css-prefix}-group:before,\n.#{$fa-css-prefix}-users:before { content: $fa-var-users; }\n.#{$fa-css-prefix}-chain:before,\n.#{$fa-css-prefix}-link:before { content: $fa-var-link; }\n.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }\n.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }\n.#{$fa-css-prefix}-cut:before,\n.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }\n.#{$fa-css-prefix}-copy:before,\n.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }\n.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }\n.#{$fa-css-prefix}-save:before,\n.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }\n.#{$fa-css-prefix}-square:before { content: $fa-var-square; }\n.#{$fa-css-prefix}-navicon:before,\n.#{$fa-css-prefix}-reorder:before,\n.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }\n.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }\n.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }\n.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }\n.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }\n.#{$fa-css-prefix}-table:before { content: $fa-var-table; }\n.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }\n.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }\n.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }\n.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }\n.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }\n.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }\n.#{$fa-css-prefix}-money:before { content: $fa-var-money; }\n.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }\n.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }\n.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }\n.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }\n.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }\n.#{$fa-css-prefix}-unsorted:before,\n.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }\n.#{$fa-css-prefix}-sort-down:before,\n.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }\n.#{$fa-css-prefix}-sort-up:before,\n.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }\n.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }\n.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }\n.#{$fa-css-prefix}-rotate-left:before,\n.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }\n.#{$fa-css-prefix}-legal:before,\n.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }\n.#{$fa-css-prefix}-dashboard:before,\n.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }\n.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }\n.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }\n.#{$fa-css-prefix}-flash:before,\n.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }\n.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }\n.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }\n.#{$fa-css-prefix}-paste:before,\n.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }\n.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }\n.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }\n.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }\n.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }\n.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }\n.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }\n.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }\n.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }\n.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }\n.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }\n.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }\n.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }\n.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }\n.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }\n.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }\n.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }\n.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }\n.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }\n.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }\n.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }\n.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }\n.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }\n.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }\n.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }\n.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }\n.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }\n.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }\n.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }\n.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }\n.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }\n.#{$fa-css-prefix}-mobile-phone:before,\n.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }\n.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }\n.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }\n.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }\n.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }\n.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }\n.#{$fa-css-prefix}-mail-reply:before,\n.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }\n.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }\n.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }\n.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }\n.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }\n.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }\n.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }\n.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }\n.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }\n.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }\n.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }\n.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }\n.#{$fa-css-prefix}-code:before { content: $fa-var-code; }\n.#{$fa-css-prefix}-mail-reply-all:before,\n.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }\n.#{$fa-css-prefix}-star-half-empty:before,\n.#{$fa-css-prefix}-star-half-full:before,\n.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }\n.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }\n.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }\n.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }\n.#{$fa-css-prefix}-unlink:before,\n.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }\n.#{$fa-css-prefix}-question:before { content: $fa-var-question; }\n.#{$fa-css-prefix}-info:before { content: $fa-var-info; }\n.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }\n.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }\n.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }\n.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }\n.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }\n.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }\n.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }\n.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }\n.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }\n.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }\n.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }\n.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }\n.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }\n.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }\n.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }\n.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }\n.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }\n.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }\n.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }\n.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }\n.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }\n.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }\n.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }\n.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }\n.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }\n.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }\n.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }\n.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }\n.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }\n.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }\n.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }\n.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }\n.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }\n.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }\n.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }\n.#{$fa-css-prefix}-toggle-down:before,\n.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }\n.#{$fa-css-prefix}-toggle-up:before,\n.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }\n.#{$fa-css-prefix}-toggle-right:before,\n.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }\n.#{$fa-css-prefix}-euro:before,\n.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }\n.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }\n.#{$fa-css-prefix}-dollar:before,\n.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }\n.#{$fa-css-prefix}-rupee:before,\n.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }\n.#{$fa-css-prefix}-cny:before,\n.#{$fa-css-prefix}-rmb:before,\n.#{$fa-css-prefix}-yen:before,\n.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }\n.#{$fa-css-prefix}-ruble:before,\n.#{$fa-css-prefix}-rouble:before,\n.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }\n.#{$fa-css-prefix}-won:before,\n.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }\n.#{$fa-css-prefix}-bitcoin:before,\n.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }\n.#{$fa-css-prefix}-file:before { content: $fa-var-file; }\n.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }\n.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }\n.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }\n.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }\n.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }\n.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }\n.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }\n.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }\n.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }\n.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }\n.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }\n.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }\n.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }\n.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }\n.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }\n.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }\n.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }\n.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }\n.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }\n.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }\n.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }\n.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }\n.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }\n.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }\n.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }\n.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }\n.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }\n.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }\n.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }\n.#{$fa-css-prefix}-android:before { content: $fa-var-android; }\n.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }\n.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }\n.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }\n.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }\n.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }\n.#{$fa-css-prefix}-female:before { content: $fa-var-female; }\n.#{$fa-css-prefix}-male:before { content: $fa-var-male; }\n.#{$fa-css-prefix}-gittip:before,\n.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; }\n.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }\n.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }\n.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }\n.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }\n.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }\n.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }\n.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }\n.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }\n.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }\n.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }\n.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }\n.#{$fa-css-prefix}-toggle-left:before,\n.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }\n.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }\n.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }\n.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }\n.#{$fa-css-prefix}-turkish-lira:before,\n.#{$fa-css-prefix}-try:before { content: $fa-var-try; }\n.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }\n.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }\n.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }\n.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }\n.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }\n.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }\n.#{$fa-css-prefix}-institution:before,\n.#{$fa-css-prefix}-bank:before,\n.#{$fa-css-prefix}-university:before { content: $fa-var-university; }\n.#{$fa-css-prefix}-mortar-board:before,\n.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }\n.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }\n.#{$fa-css-prefix}-google:before { content: $fa-var-google; }\n.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }\n.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }\n.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }\n.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }\n.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }\n.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }\n.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; }\n.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }\n.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }\n.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }\n.#{$fa-css-prefix}-language:before { content: $fa-var-language; }\n.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }\n.#{$fa-css-prefix}-building:before { content: $fa-var-building; }\n.#{$fa-css-prefix}-child:before { content: $fa-var-child; }\n.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }\n.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }\n.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }\n.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }\n.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }\n.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }\n.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }\n.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }\n.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }\n.#{$fa-css-prefix}-automobile:before,\n.#{$fa-css-prefix}-car:before { content: $fa-var-car; }\n.#{$fa-css-prefix}-cab:before,\n.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }\n.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }\n.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }\n.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }\n.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }\n.#{$fa-css-prefix}-database:before { content: $fa-var-database; }\n.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }\n.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }\n.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }\n.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }\n.#{$fa-css-prefix}-file-photo-o:before,\n.#{$fa-css-prefix}-file-picture-o:before,\n.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }\n.#{$fa-css-prefix}-file-zip-o:before,\n.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }\n.#{$fa-css-prefix}-file-sound-o:before,\n.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }\n.#{$fa-css-prefix}-file-movie-o:before,\n.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }\n.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }\n.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }\n.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }\n.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }\n.#{$fa-css-prefix}-life-bouy:before,\n.#{$fa-css-prefix}-life-buoy:before,\n.#{$fa-css-prefix}-life-saver:before,\n.#{$fa-css-prefix}-support:before,\n.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }\n.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }\n.#{$fa-css-prefix}-ra:before,\n.#{$fa-css-prefix}-resistance:before,\n.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }\n.#{$fa-css-prefix}-ge:before,\n.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }\n.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }\n.#{$fa-css-prefix}-git:before { content: $fa-var-git; }\n.#{$fa-css-prefix}-y-combinator-square:before,\n.#{$fa-css-prefix}-yc-square:before,\n.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }\n.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }\n.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }\n.#{$fa-css-prefix}-wechat:before,\n.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }\n.#{$fa-css-prefix}-send:before,\n.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }\n.#{$fa-css-prefix}-send-o:before,\n.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }\n.#{$fa-css-prefix}-history:before { content: $fa-var-history; }\n.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }\n.#{$fa-css-prefix}-header:before { content: $fa-var-header; }\n.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }\n.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }\n.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }\n.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }\n.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }\n.#{$fa-css-prefix}-soccer-ball-o:before,\n.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }\n.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }\n.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }\n.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }\n.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }\n.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }\n.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }\n.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }\n.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }\n.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }\n.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }\n.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }\n.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }\n.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }\n.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }\n.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }\n.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }\n.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }\n.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }\n.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }\n.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }\n.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }\n.#{$fa-css-prefix}-at:before { content: $fa-var-at; }\n.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }\n.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }\n.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }\n.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }\n.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }\n.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }\n.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }\n.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }\n.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }\n.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }\n.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }\n.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }\n.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }\n.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }\n.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }\n.#{$fa-css-prefix}-shekel:before,\n.#{$fa-css-prefix}-sheqel:before,\n.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }\n.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }\n.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; }\n.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; }\n.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; }\n.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; }\n.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; }\n.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; }\n.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; }\n.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; }\n.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; }\n.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; }\n.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; }\n.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; }\n.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; }\n.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; }\n.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; }\n.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; }\n.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; }\n.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }\n.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }\n.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }\n.#{$fa-css-prefix}-intersex:before,\n.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }\n.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }\n.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }\n.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; }\n.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; }\n.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; }\n.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }\n.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }\n.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }\n.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; }\n.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }\n.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }\n.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }\n.#{$fa-css-prefix}-server:before { content: $fa-var-server; }\n.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; }\n.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; }\n.#{$fa-css-prefix}-hotel:before,\n.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; }\n.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; }\n.#{$fa-css-prefix}-train:before { content: $fa-var-train; }\n.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }\n.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }\n.#{$fa-css-prefix}-yc:before,\n.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; }\n.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; }\n.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; }\n.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; }\n.#{$fa-css-prefix}-battery-4:before,\n.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; }\n.#{$fa-css-prefix}-battery-3:before,\n.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; }\n.#{$fa-css-prefix}-battery-2:before,\n.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; }\n.#{$fa-css-prefix}-battery-1:before,\n.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; }\n.#{$fa-css-prefix}-battery-0:before,\n.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; }\n.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; }\n.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; }\n.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; }\n.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; }\n.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; }\n.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; }\n.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; }\n.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; }\n.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; }\n.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; }\n.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; }\n.#{$fa-css-prefix}-hourglass-1:before,\n.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; }\n.#{$fa-css-prefix}-hourglass-2:before,\n.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; }\n.#{$fa-css-prefix}-hourglass-3:before,\n.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; }\n.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; }\n.#{$fa-css-prefix}-hand-grab-o:before,\n.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; }\n.#{$fa-css-prefix}-hand-stop-o:before,\n.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; }\n.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; }\n.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; }\n.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; }\n.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; }\n.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; }\n.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; }\n.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; }\n.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; }\n.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; }\n.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; }\n.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; }\n.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; }\n.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; }\n.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; }\n.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; }\n.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; }\n.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; }\n.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; }\n.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; }\n.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; }\n.#{$fa-css-prefix}-tv:before,\n.#{$fa-css-prefix}-television:before { content: $fa-var-television; }\n.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; }\n.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; }\n.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; }\n.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; }\n.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; }\n.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; }\n.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; }\n.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; }\n.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; }\n.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; }\n.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; }\n.#{$fa-css-prefix}-map:before { content: $fa-var-map; }\n.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; }\n.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; }\n.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; }\n.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; }\n.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; }\n.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; }\n.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; }\n.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; }\n.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; }\n.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; }\n.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; }\n.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; }\n.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; }\n.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; }\n.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; }\n.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; }\n.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; }\n.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; }\n.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; }\n.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; }\n.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; }\n.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; }\n.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; }\n.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; }\n.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; }\n.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; }\n.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; }\n.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; }\n.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; }\n.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; }\n.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; }\n.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; }\n.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; }\n.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; }\n.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; }\n.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; }\n.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; }\n.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; }\n.#{$fa-css-prefix}-asl-interpreting:before,\n.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; }\n.#{$fa-css-prefix}-deafness:before,\n.#{$fa-css-prefix}-hard-of-hearing:before,\n.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; }\n.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; }\n.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; }\n.#{$fa-css-prefix}-signing:before,\n.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; }\n.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; }\n.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; }\n.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; }\n.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; }\n.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; }\n.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; }\n.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }\n.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; }\n.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; }\n.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; }\n.#{$fa-css-prefix}-google-plus-circle:before,\n.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; }\n.#{$fa-css-prefix}-fa:before,\n.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; }\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/scss/_larger.scss",
    "content": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.#{$fa-css-prefix}-lg {\n  font-size: (4em / 3);\n  line-height: (3em / 4);\n  vertical-align: -15%;\n}\n.#{$fa-css-prefix}-2x { font-size: 2em; }\n.#{$fa-css-prefix}-3x { font-size: 3em; }\n.#{$fa-css-prefix}-4x { font-size: 4em; }\n.#{$fa-css-prefix}-5x { font-size: 5em; }\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/scss/_list.scss",
    "content": "// List Icons\n// -------------------------\n\n.#{$fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: $fa-li-width;\n  list-style-type: none;\n  > li { position: relative; }\n}\n.#{$fa-css-prefix}-li {\n  position: absolute;\n  left: -$fa-li-width;\n  width: $fa-li-width;\n  top: (2em / 14);\n  text-align: center;\n  &.#{$fa-css-prefix}-lg {\n    left: -$fa-li-width + (4em / 14);\n  }\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/scss/_mixins.scss",
    "content": "// Mixins\n// --------------------------\n\n@mixin fa-icon() {\n  display: inline-block;\n  font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n}\n\n@mixin fa-icon-rotate($degrees, $rotation) {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})\";\n  -webkit-transform: rotate($degrees);\n      -ms-transform: rotate($degrees);\n          transform: rotate($degrees);\n}\n\n@mixin fa-icon-flip($horiz, $vert, $rotation) {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)\";\n  -webkit-transform: scale($horiz, $vert);\n      -ms-transform: scale($horiz, $vert);\n          transform: scale($horiz, $vert);\n}\n\n\n// Only display content to screen readers. A la Bootstrap 4.\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n@mixin 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\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n@mixin sr-only-focusable {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/scss/_path.scss",
    "content": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');\n  src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),\n    url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),\n    url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),\n    url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),\n    url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');\n//  src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/scss/_rotated-flipped.scss",
    "content": "// Rotated & Flipped Icons\n// -------------------------\n\n.#{$fa-css-prefix}-rotate-90  { @include fa-icon-rotate(90deg, 1);  }\n.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }\n.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }\n\n.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }\n.#{$fa-css-prefix}-flip-vertical   { @include fa-icon-flip(1, -1, 2); }\n\n// Hook for IE8-9\n// -------------------------\n\n:root .#{$fa-css-prefix}-rotate-90,\n:root .#{$fa-css-prefix}-rotate-180,\n:root .#{$fa-css-prefix}-rotate-270,\n:root .#{$fa-css-prefix}-flip-horizontal,\n:root .#{$fa-css-prefix}-flip-vertical {\n  filter: none;\n}\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/scss/_screen-reader.scss",
    "content": "// Screen Readers\n// -------------------------\n\n.sr-only { @include sr-only(); }\n.sr-only-focusable { @include sr-only-focusable(); }\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/scss/_stacked.scss",
    "content": "// Stacked Icons\n// -------------------------\n\n.#{$fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.#{$fa-css-prefix}-stack-1x { line-height: inherit; }\n.#{$fa-css-prefix}-stack-2x { font-size: 2em; }\n.#{$fa-css-prefix}-inverse { color: $fa-inverse; }\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/scss/_variables.scss",
    "content": "// Variables\n// --------------------------\n\n$fa-font-path:        \"../fonts\" !default;\n$fa-font-size-base:   14px !default;\n$fa-line-height-base: 1 !default;\n//$fa-font-path:        \"//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts\" !default; // for referencing Bootstrap CDN font files directly\n$fa-css-prefix:       fa !default;\n$fa-version:          \"4.6.3\" !default;\n$fa-border-color:     #eee !default;\n$fa-inverse:          #fff !default;\n$fa-li-width:         (30em / 14) !default;\n\n$fa-var-500px: \"\\f26e\";\n$fa-var-adjust: \"\\f042\";\n$fa-var-adn: \"\\f170\";\n$fa-var-align-center: \"\\f037\";\n$fa-var-align-justify: \"\\f039\";\n$fa-var-align-left: \"\\f036\";\n$fa-var-align-right: \"\\f038\";\n$fa-var-amazon: \"\\f270\";\n$fa-var-ambulance: \"\\f0f9\";\n$fa-var-american-sign-language-interpreting: \"\\f2a3\";\n$fa-var-anchor: \"\\f13d\";\n$fa-var-android: \"\\f17b\";\n$fa-var-angellist: \"\\f209\";\n$fa-var-angle-double-down: \"\\f103\";\n$fa-var-angle-double-left: \"\\f100\";\n$fa-var-angle-double-right: \"\\f101\";\n$fa-var-angle-double-up: \"\\f102\";\n$fa-var-angle-down: \"\\f107\";\n$fa-var-angle-left: \"\\f104\";\n$fa-var-angle-right: \"\\f105\";\n$fa-var-angle-up: \"\\f106\";\n$fa-var-apple: \"\\f179\";\n$fa-var-archive: \"\\f187\";\n$fa-var-area-chart: \"\\f1fe\";\n$fa-var-arrow-circle-down: \"\\f0ab\";\n$fa-var-arrow-circle-left: \"\\f0a8\";\n$fa-var-arrow-circle-o-down: \"\\f01a\";\n$fa-var-arrow-circle-o-left: \"\\f190\";\n$fa-var-arrow-circle-o-right: \"\\f18e\";\n$fa-var-arrow-circle-o-up: \"\\f01b\";\n$fa-var-arrow-circle-right: \"\\f0a9\";\n$fa-var-arrow-circle-up: \"\\f0aa\";\n$fa-var-arrow-down: \"\\f063\";\n$fa-var-arrow-left: \"\\f060\";\n$fa-var-arrow-right: \"\\f061\";\n$fa-var-arrow-up: \"\\f062\";\n$fa-var-arrows: \"\\f047\";\n$fa-var-arrows-alt: \"\\f0b2\";\n$fa-var-arrows-h: \"\\f07e\";\n$fa-var-arrows-v: \"\\f07d\";\n$fa-var-asl-interpreting: \"\\f2a3\";\n$fa-var-assistive-listening-systems: \"\\f2a2\";\n$fa-var-asterisk: \"\\f069\";\n$fa-var-at: \"\\f1fa\";\n$fa-var-audio-description: \"\\f29e\";\n$fa-var-automobile: \"\\f1b9\";\n$fa-var-backward: \"\\f04a\";\n$fa-var-balance-scale: \"\\f24e\";\n$fa-var-ban: \"\\f05e\";\n$fa-var-bank: \"\\f19c\";\n$fa-var-bar-chart: \"\\f080\";\n$fa-var-bar-chart-o: \"\\f080\";\n$fa-var-barcode: \"\\f02a\";\n$fa-var-bars: \"\\f0c9\";\n$fa-var-battery-0: \"\\f244\";\n$fa-var-battery-1: \"\\f243\";\n$fa-var-battery-2: \"\\f242\";\n$fa-var-battery-3: \"\\f241\";\n$fa-var-battery-4: \"\\f240\";\n$fa-var-battery-empty: \"\\f244\";\n$fa-var-battery-full: \"\\f240\";\n$fa-var-battery-half: \"\\f242\";\n$fa-var-battery-quarter: \"\\f243\";\n$fa-var-battery-three-quarters: \"\\f241\";\n$fa-var-bed: \"\\f236\";\n$fa-var-beer: \"\\f0fc\";\n$fa-var-behance: \"\\f1b4\";\n$fa-var-behance-square: \"\\f1b5\";\n$fa-var-bell: \"\\f0f3\";\n$fa-var-bell-o: \"\\f0a2\";\n$fa-var-bell-slash: \"\\f1f6\";\n$fa-var-bell-slash-o: \"\\f1f7\";\n$fa-var-bicycle: \"\\f206\";\n$fa-var-binoculars: \"\\f1e5\";\n$fa-var-birthday-cake: \"\\f1fd\";\n$fa-var-bitbucket: \"\\f171\";\n$fa-var-bitbucket-square: \"\\f172\";\n$fa-var-bitcoin: \"\\f15a\";\n$fa-var-black-tie: \"\\f27e\";\n$fa-var-blind: \"\\f29d\";\n$fa-var-bluetooth: \"\\f293\";\n$fa-var-bluetooth-b: \"\\f294\";\n$fa-var-bold: \"\\f032\";\n$fa-var-bolt: \"\\f0e7\";\n$fa-var-bomb: \"\\f1e2\";\n$fa-var-book: \"\\f02d\";\n$fa-var-bookmark: \"\\f02e\";\n$fa-var-bookmark-o: \"\\f097\";\n$fa-var-braille: \"\\f2a1\";\n$fa-var-briefcase: \"\\f0b1\";\n$fa-var-btc: \"\\f15a\";\n$fa-var-bug: \"\\f188\";\n$fa-var-building: \"\\f1ad\";\n$fa-var-building-o: \"\\f0f7\";\n$fa-var-bullhorn: \"\\f0a1\";\n$fa-var-bullseye: \"\\f140\";\n$fa-var-bus: \"\\f207\";\n$fa-var-buysellads: \"\\f20d\";\n$fa-var-cab: \"\\f1ba\";\n$fa-var-calculator: \"\\f1ec\";\n$fa-var-calendar: \"\\f073\";\n$fa-var-calendar-check-o: \"\\f274\";\n$fa-var-calendar-minus-o: \"\\f272\";\n$fa-var-calendar-o: \"\\f133\";\n$fa-var-calendar-plus-o: \"\\f271\";\n$fa-var-calendar-times-o: \"\\f273\";\n$fa-var-camera: \"\\f030\";\n$fa-var-camera-retro: \"\\f083\";\n$fa-var-car: \"\\f1b9\";\n$fa-var-caret-down: \"\\f0d7\";\n$fa-var-caret-left: \"\\f0d9\";\n$fa-var-caret-right: \"\\f0da\";\n$fa-var-caret-square-o-down: \"\\f150\";\n$fa-var-caret-square-o-left: \"\\f191\";\n$fa-var-caret-square-o-right: \"\\f152\";\n$fa-var-caret-square-o-up: \"\\f151\";\n$fa-var-caret-up: \"\\f0d8\";\n$fa-var-cart-arrow-down: \"\\f218\";\n$fa-var-cart-plus: \"\\f217\";\n$fa-var-cc: \"\\f20a\";\n$fa-var-cc-amex: \"\\f1f3\";\n$fa-var-cc-diners-club: \"\\f24c\";\n$fa-var-cc-discover: \"\\f1f2\";\n$fa-var-cc-jcb: \"\\f24b\";\n$fa-var-cc-mastercard: \"\\f1f1\";\n$fa-var-cc-paypal: \"\\f1f4\";\n$fa-var-cc-stripe: \"\\f1f5\";\n$fa-var-cc-visa: \"\\f1f0\";\n$fa-var-certificate: \"\\f0a3\";\n$fa-var-chain: \"\\f0c1\";\n$fa-var-chain-broken: \"\\f127\";\n$fa-var-check: \"\\f00c\";\n$fa-var-check-circle: \"\\f058\";\n$fa-var-check-circle-o: \"\\f05d\";\n$fa-var-check-square: \"\\f14a\";\n$fa-var-check-square-o: \"\\f046\";\n$fa-var-chevron-circle-down: \"\\f13a\";\n$fa-var-chevron-circle-left: \"\\f137\";\n$fa-var-chevron-circle-right: \"\\f138\";\n$fa-var-chevron-circle-up: \"\\f139\";\n$fa-var-chevron-down: \"\\f078\";\n$fa-var-chevron-left: \"\\f053\";\n$fa-var-chevron-right: \"\\f054\";\n$fa-var-chevron-up: \"\\f077\";\n$fa-var-child: \"\\f1ae\";\n$fa-var-chrome: \"\\f268\";\n$fa-var-circle: \"\\f111\";\n$fa-var-circle-o: \"\\f10c\";\n$fa-var-circle-o-notch: \"\\f1ce\";\n$fa-var-circle-thin: \"\\f1db\";\n$fa-var-clipboard: \"\\f0ea\";\n$fa-var-clock-o: \"\\f017\";\n$fa-var-clone: \"\\f24d\";\n$fa-var-close: \"\\f00d\";\n$fa-var-cloud: \"\\f0c2\";\n$fa-var-cloud-download: \"\\f0ed\";\n$fa-var-cloud-upload: \"\\f0ee\";\n$fa-var-cny: \"\\f157\";\n$fa-var-code: \"\\f121\";\n$fa-var-code-fork: \"\\f126\";\n$fa-var-codepen: \"\\f1cb\";\n$fa-var-codiepie: \"\\f284\";\n$fa-var-coffee: \"\\f0f4\";\n$fa-var-cog: \"\\f013\";\n$fa-var-cogs: \"\\f085\";\n$fa-var-columns: \"\\f0db\";\n$fa-var-comment: \"\\f075\";\n$fa-var-comment-o: \"\\f0e5\";\n$fa-var-commenting: \"\\f27a\";\n$fa-var-commenting-o: \"\\f27b\";\n$fa-var-comments: \"\\f086\";\n$fa-var-comments-o: \"\\f0e6\";\n$fa-var-compass: \"\\f14e\";\n$fa-var-compress: \"\\f066\";\n$fa-var-connectdevelop: \"\\f20e\";\n$fa-var-contao: \"\\f26d\";\n$fa-var-copy: \"\\f0c5\";\n$fa-var-copyright: \"\\f1f9\";\n$fa-var-creative-commons: \"\\f25e\";\n$fa-var-credit-card: \"\\f09d\";\n$fa-var-credit-card-alt: \"\\f283\";\n$fa-var-crop: \"\\f125\";\n$fa-var-crosshairs: \"\\f05b\";\n$fa-var-css3: \"\\f13c\";\n$fa-var-cube: \"\\f1b2\";\n$fa-var-cubes: \"\\f1b3\";\n$fa-var-cut: \"\\f0c4\";\n$fa-var-cutlery: \"\\f0f5\";\n$fa-var-dashboard: \"\\f0e4\";\n$fa-var-dashcube: \"\\f210\";\n$fa-var-database: \"\\f1c0\";\n$fa-var-deaf: \"\\f2a4\";\n$fa-var-deafness: \"\\f2a4\";\n$fa-var-dedent: \"\\f03b\";\n$fa-var-delicious: \"\\f1a5\";\n$fa-var-desktop: \"\\f108\";\n$fa-var-deviantart: \"\\f1bd\";\n$fa-var-diamond: \"\\f219\";\n$fa-var-digg: \"\\f1a6\";\n$fa-var-dollar: \"\\f155\";\n$fa-var-dot-circle-o: \"\\f192\";\n$fa-var-download: \"\\f019\";\n$fa-var-dribbble: \"\\f17d\";\n$fa-var-dropbox: \"\\f16b\";\n$fa-var-drupal: \"\\f1a9\";\n$fa-var-edge: \"\\f282\";\n$fa-var-edit: \"\\f044\";\n$fa-var-eject: \"\\f052\";\n$fa-var-ellipsis-h: \"\\f141\";\n$fa-var-ellipsis-v: \"\\f142\";\n$fa-var-empire: \"\\f1d1\";\n$fa-var-envelope: \"\\f0e0\";\n$fa-var-envelope-o: \"\\f003\";\n$fa-var-envelope-square: \"\\f199\";\n$fa-var-envira: \"\\f299\";\n$fa-var-eraser: \"\\f12d\";\n$fa-var-eur: \"\\f153\";\n$fa-var-euro: \"\\f153\";\n$fa-var-exchange: \"\\f0ec\";\n$fa-var-exclamation: \"\\f12a\";\n$fa-var-exclamation-circle: \"\\f06a\";\n$fa-var-exclamation-triangle: \"\\f071\";\n$fa-var-expand: \"\\f065\";\n$fa-var-expeditedssl: \"\\f23e\";\n$fa-var-external-link: \"\\f08e\";\n$fa-var-external-link-square: \"\\f14c\";\n$fa-var-eye: \"\\f06e\";\n$fa-var-eye-slash: \"\\f070\";\n$fa-var-eyedropper: \"\\f1fb\";\n$fa-var-fa: \"\\f2b4\";\n$fa-var-facebook: \"\\f09a\";\n$fa-var-facebook-f: \"\\f09a\";\n$fa-var-facebook-official: \"\\f230\";\n$fa-var-facebook-square: \"\\f082\";\n$fa-var-fast-backward: \"\\f049\";\n$fa-var-fast-forward: \"\\f050\";\n$fa-var-fax: \"\\f1ac\";\n$fa-var-feed: \"\\f09e\";\n$fa-var-female: \"\\f182\";\n$fa-var-fighter-jet: \"\\f0fb\";\n$fa-var-file: \"\\f15b\";\n$fa-var-file-archive-o: \"\\f1c6\";\n$fa-var-file-audio-o: \"\\f1c7\";\n$fa-var-file-code-o: \"\\f1c9\";\n$fa-var-file-excel-o: \"\\f1c3\";\n$fa-var-file-image-o: \"\\f1c5\";\n$fa-var-file-movie-o: \"\\f1c8\";\n$fa-var-file-o: \"\\f016\";\n$fa-var-file-pdf-o: \"\\f1c1\";\n$fa-var-file-photo-o: \"\\f1c5\";\n$fa-var-file-picture-o: \"\\f1c5\";\n$fa-var-file-powerpoint-o: \"\\f1c4\";\n$fa-var-file-sound-o: \"\\f1c7\";\n$fa-var-file-text: \"\\f15c\";\n$fa-var-file-text-o: \"\\f0f6\";\n$fa-var-file-video-o: \"\\f1c8\";\n$fa-var-file-word-o: \"\\f1c2\";\n$fa-var-file-zip-o: \"\\f1c6\";\n$fa-var-files-o: \"\\f0c5\";\n$fa-var-film: \"\\f008\";\n$fa-var-filter: \"\\f0b0\";\n$fa-var-fire: \"\\f06d\";\n$fa-var-fire-extinguisher: \"\\f134\";\n$fa-var-firefox: \"\\f269\";\n$fa-var-first-order: \"\\f2b0\";\n$fa-var-flag: \"\\f024\";\n$fa-var-flag-checkered: \"\\f11e\";\n$fa-var-flag-o: \"\\f11d\";\n$fa-var-flash: \"\\f0e7\";\n$fa-var-flask: \"\\f0c3\";\n$fa-var-flickr: \"\\f16e\";\n$fa-var-floppy-o: \"\\f0c7\";\n$fa-var-folder: \"\\f07b\";\n$fa-var-folder-o: \"\\f114\";\n$fa-var-folder-open: \"\\f07c\";\n$fa-var-folder-open-o: \"\\f115\";\n$fa-var-font: \"\\f031\";\n$fa-var-font-awesome: \"\\f2b4\";\n$fa-var-fonticons: \"\\f280\";\n$fa-var-fort-awesome: \"\\f286\";\n$fa-var-forumbee: \"\\f211\";\n$fa-var-forward: \"\\f04e\";\n$fa-var-foursquare: \"\\f180\";\n$fa-var-frown-o: \"\\f119\";\n$fa-var-futbol-o: \"\\f1e3\";\n$fa-var-gamepad: \"\\f11b\";\n$fa-var-gavel: \"\\f0e3\";\n$fa-var-gbp: \"\\f154\";\n$fa-var-ge: \"\\f1d1\";\n$fa-var-gear: \"\\f013\";\n$fa-var-gears: \"\\f085\";\n$fa-var-genderless: \"\\f22d\";\n$fa-var-get-pocket: \"\\f265\";\n$fa-var-gg: \"\\f260\";\n$fa-var-gg-circle: \"\\f261\";\n$fa-var-gift: \"\\f06b\";\n$fa-var-git: \"\\f1d3\";\n$fa-var-git-square: \"\\f1d2\";\n$fa-var-github: \"\\f09b\";\n$fa-var-github-alt: \"\\f113\";\n$fa-var-github-square: \"\\f092\";\n$fa-var-gitlab: \"\\f296\";\n$fa-var-gittip: \"\\f184\";\n$fa-var-glass: \"\\f000\";\n$fa-var-glide: \"\\f2a5\";\n$fa-var-glide-g: \"\\f2a6\";\n$fa-var-globe: \"\\f0ac\";\n$fa-var-google: \"\\f1a0\";\n$fa-var-google-plus: \"\\f0d5\";\n$fa-var-google-plus-circle: \"\\f2b3\";\n$fa-var-google-plus-official: \"\\f2b3\";\n$fa-var-google-plus-square: \"\\f0d4\";\n$fa-var-google-wallet: \"\\f1ee\";\n$fa-var-graduation-cap: \"\\f19d\";\n$fa-var-gratipay: \"\\f184\";\n$fa-var-group: \"\\f0c0\";\n$fa-var-h-square: \"\\f0fd\";\n$fa-var-hacker-news: \"\\f1d4\";\n$fa-var-hand-grab-o: \"\\f255\";\n$fa-var-hand-lizard-o: \"\\f258\";\n$fa-var-hand-o-down: \"\\f0a7\";\n$fa-var-hand-o-left: \"\\f0a5\";\n$fa-var-hand-o-right: \"\\f0a4\";\n$fa-var-hand-o-up: \"\\f0a6\";\n$fa-var-hand-paper-o: \"\\f256\";\n$fa-var-hand-peace-o: \"\\f25b\";\n$fa-var-hand-pointer-o: \"\\f25a\";\n$fa-var-hand-rock-o: \"\\f255\";\n$fa-var-hand-scissors-o: \"\\f257\";\n$fa-var-hand-spock-o: \"\\f259\";\n$fa-var-hand-stop-o: \"\\f256\";\n$fa-var-hard-of-hearing: \"\\f2a4\";\n$fa-var-hashtag: \"\\f292\";\n$fa-var-hdd-o: \"\\f0a0\";\n$fa-var-header: \"\\f1dc\";\n$fa-var-headphones: \"\\f025\";\n$fa-var-heart: \"\\f004\";\n$fa-var-heart-o: \"\\f08a\";\n$fa-var-heartbeat: \"\\f21e\";\n$fa-var-history: \"\\f1da\";\n$fa-var-home: \"\\f015\";\n$fa-var-hospital-o: \"\\f0f8\";\n$fa-var-hotel: \"\\f236\";\n$fa-var-hourglass: \"\\f254\";\n$fa-var-hourglass-1: \"\\f251\";\n$fa-var-hourglass-2: \"\\f252\";\n$fa-var-hourglass-3: \"\\f253\";\n$fa-var-hourglass-end: \"\\f253\";\n$fa-var-hourglass-half: \"\\f252\";\n$fa-var-hourglass-o: \"\\f250\";\n$fa-var-hourglass-start: \"\\f251\";\n$fa-var-houzz: \"\\f27c\";\n$fa-var-html5: \"\\f13b\";\n$fa-var-i-cursor: \"\\f246\";\n$fa-var-ils: \"\\f20b\";\n$fa-var-image: \"\\f03e\";\n$fa-var-inbox: \"\\f01c\";\n$fa-var-indent: \"\\f03c\";\n$fa-var-industry: \"\\f275\";\n$fa-var-info: \"\\f129\";\n$fa-var-info-circle: \"\\f05a\";\n$fa-var-inr: \"\\f156\";\n$fa-var-instagram: \"\\f16d\";\n$fa-var-institution: \"\\f19c\";\n$fa-var-internet-explorer: \"\\f26b\";\n$fa-var-intersex: \"\\f224\";\n$fa-var-ioxhost: \"\\f208\";\n$fa-var-italic: \"\\f033\";\n$fa-var-joomla: \"\\f1aa\";\n$fa-var-jpy: \"\\f157\";\n$fa-var-jsfiddle: \"\\f1cc\";\n$fa-var-key: \"\\f084\";\n$fa-var-keyboard-o: \"\\f11c\";\n$fa-var-krw: \"\\f159\";\n$fa-var-language: \"\\f1ab\";\n$fa-var-laptop: \"\\f109\";\n$fa-var-lastfm: \"\\f202\";\n$fa-var-lastfm-square: \"\\f203\";\n$fa-var-leaf: \"\\f06c\";\n$fa-var-leanpub: \"\\f212\";\n$fa-var-legal: \"\\f0e3\";\n$fa-var-lemon-o: \"\\f094\";\n$fa-var-level-down: \"\\f149\";\n$fa-var-level-up: \"\\f148\";\n$fa-var-life-bouy: \"\\f1cd\";\n$fa-var-life-buoy: \"\\f1cd\";\n$fa-var-life-ring: \"\\f1cd\";\n$fa-var-life-saver: \"\\f1cd\";\n$fa-var-lightbulb-o: \"\\f0eb\";\n$fa-var-line-chart: \"\\f201\";\n$fa-var-link: \"\\f0c1\";\n$fa-var-linkedin: \"\\f0e1\";\n$fa-var-linkedin-square: \"\\f08c\";\n$fa-var-linux: \"\\f17c\";\n$fa-var-list: \"\\f03a\";\n$fa-var-list-alt: \"\\f022\";\n$fa-var-list-ol: \"\\f0cb\";\n$fa-var-list-ul: \"\\f0ca\";\n$fa-var-location-arrow: \"\\f124\";\n$fa-var-lock: \"\\f023\";\n$fa-var-long-arrow-down: \"\\f175\";\n$fa-var-long-arrow-left: \"\\f177\";\n$fa-var-long-arrow-right: \"\\f178\";\n$fa-var-long-arrow-up: \"\\f176\";\n$fa-var-low-vision: \"\\f2a8\";\n$fa-var-magic: \"\\f0d0\";\n$fa-var-magnet: \"\\f076\";\n$fa-var-mail-forward: \"\\f064\";\n$fa-var-mail-reply: \"\\f112\";\n$fa-var-mail-reply-all: \"\\f122\";\n$fa-var-male: \"\\f183\";\n$fa-var-map: \"\\f279\";\n$fa-var-map-marker: \"\\f041\";\n$fa-var-map-o: \"\\f278\";\n$fa-var-map-pin: \"\\f276\";\n$fa-var-map-signs: \"\\f277\";\n$fa-var-mars: \"\\f222\";\n$fa-var-mars-double: \"\\f227\";\n$fa-var-mars-stroke: \"\\f229\";\n$fa-var-mars-stroke-h: \"\\f22b\";\n$fa-var-mars-stroke-v: \"\\f22a\";\n$fa-var-maxcdn: \"\\f136\";\n$fa-var-meanpath: \"\\f20c\";\n$fa-var-medium: \"\\f23a\";\n$fa-var-medkit: \"\\f0fa\";\n$fa-var-meh-o: \"\\f11a\";\n$fa-var-mercury: \"\\f223\";\n$fa-var-microphone: \"\\f130\";\n$fa-var-microphone-slash: \"\\f131\";\n$fa-var-minus: \"\\f068\";\n$fa-var-minus-circle: \"\\f056\";\n$fa-var-minus-square: \"\\f146\";\n$fa-var-minus-square-o: \"\\f147\";\n$fa-var-mixcloud: \"\\f289\";\n$fa-var-mobile: \"\\f10b\";\n$fa-var-mobile-phone: \"\\f10b\";\n$fa-var-modx: \"\\f285\";\n$fa-var-money: \"\\f0d6\";\n$fa-var-moon-o: \"\\f186\";\n$fa-var-mortar-board: \"\\f19d\";\n$fa-var-motorcycle: \"\\f21c\";\n$fa-var-mouse-pointer: \"\\f245\";\n$fa-var-music: \"\\f001\";\n$fa-var-navicon: \"\\f0c9\";\n$fa-var-neuter: \"\\f22c\";\n$fa-var-newspaper-o: \"\\f1ea\";\n$fa-var-object-group: \"\\f247\";\n$fa-var-object-ungroup: \"\\f248\";\n$fa-var-odnoklassniki: \"\\f263\";\n$fa-var-odnoklassniki-square: \"\\f264\";\n$fa-var-opencart: \"\\f23d\";\n$fa-var-openid: \"\\f19b\";\n$fa-var-opera: \"\\f26a\";\n$fa-var-optin-monster: \"\\f23c\";\n$fa-var-outdent: \"\\f03b\";\n$fa-var-pagelines: \"\\f18c\";\n$fa-var-paint-brush: \"\\f1fc\";\n$fa-var-paper-plane: \"\\f1d8\";\n$fa-var-paper-plane-o: \"\\f1d9\";\n$fa-var-paperclip: \"\\f0c6\";\n$fa-var-paragraph: \"\\f1dd\";\n$fa-var-paste: \"\\f0ea\";\n$fa-var-pause: \"\\f04c\";\n$fa-var-pause-circle: \"\\f28b\";\n$fa-var-pause-circle-o: \"\\f28c\";\n$fa-var-paw: \"\\f1b0\";\n$fa-var-paypal: \"\\f1ed\";\n$fa-var-pencil: \"\\f040\";\n$fa-var-pencil-square: \"\\f14b\";\n$fa-var-pencil-square-o: \"\\f044\";\n$fa-var-percent: \"\\f295\";\n$fa-var-phone: \"\\f095\";\n$fa-var-phone-square: \"\\f098\";\n$fa-var-photo: \"\\f03e\";\n$fa-var-picture-o: \"\\f03e\";\n$fa-var-pie-chart: \"\\f200\";\n$fa-var-pied-piper: \"\\f2ae\";\n$fa-var-pied-piper-alt: \"\\f1a8\";\n$fa-var-pied-piper-pp: \"\\f1a7\";\n$fa-var-pinterest: \"\\f0d2\";\n$fa-var-pinterest-p: \"\\f231\";\n$fa-var-pinterest-square: \"\\f0d3\";\n$fa-var-plane: \"\\f072\";\n$fa-var-play: \"\\f04b\";\n$fa-var-play-circle: \"\\f144\";\n$fa-var-play-circle-o: \"\\f01d\";\n$fa-var-plug: \"\\f1e6\";\n$fa-var-plus: \"\\f067\";\n$fa-var-plus-circle: \"\\f055\";\n$fa-var-plus-square: \"\\f0fe\";\n$fa-var-plus-square-o: \"\\f196\";\n$fa-var-power-off: \"\\f011\";\n$fa-var-print: \"\\f02f\";\n$fa-var-product-hunt: \"\\f288\";\n$fa-var-puzzle-piece: \"\\f12e\";\n$fa-var-qq: \"\\f1d6\";\n$fa-var-qrcode: \"\\f029\";\n$fa-var-question: \"\\f128\";\n$fa-var-question-circle: \"\\f059\";\n$fa-var-question-circle-o: \"\\f29c\";\n$fa-var-quote-left: \"\\f10d\";\n$fa-var-quote-right: \"\\f10e\";\n$fa-var-ra: \"\\f1d0\";\n$fa-var-random: \"\\f074\";\n$fa-var-rebel: \"\\f1d0\";\n$fa-var-recycle: \"\\f1b8\";\n$fa-var-reddit: \"\\f1a1\";\n$fa-var-reddit-alien: \"\\f281\";\n$fa-var-reddit-square: \"\\f1a2\";\n$fa-var-refresh: \"\\f021\";\n$fa-var-registered: \"\\f25d\";\n$fa-var-remove: \"\\f00d\";\n$fa-var-renren: \"\\f18b\";\n$fa-var-reorder: \"\\f0c9\";\n$fa-var-repeat: \"\\f01e\";\n$fa-var-reply: \"\\f112\";\n$fa-var-reply-all: \"\\f122\";\n$fa-var-resistance: \"\\f1d0\";\n$fa-var-retweet: \"\\f079\";\n$fa-var-rmb: \"\\f157\";\n$fa-var-road: \"\\f018\";\n$fa-var-rocket: \"\\f135\";\n$fa-var-rotate-left: \"\\f0e2\";\n$fa-var-rotate-right: \"\\f01e\";\n$fa-var-rouble: \"\\f158\";\n$fa-var-rss: \"\\f09e\";\n$fa-var-rss-square: \"\\f143\";\n$fa-var-rub: \"\\f158\";\n$fa-var-ruble: \"\\f158\";\n$fa-var-rupee: \"\\f156\";\n$fa-var-safari: \"\\f267\";\n$fa-var-save: \"\\f0c7\";\n$fa-var-scissors: \"\\f0c4\";\n$fa-var-scribd: \"\\f28a\";\n$fa-var-search: \"\\f002\";\n$fa-var-search-minus: \"\\f010\";\n$fa-var-search-plus: \"\\f00e\";\n$fa-var-sellsy: \"\\f213\";\n$fa-var-send: \"\\f1d8\";\n$fa-var-send-o: \"\\f1d9\";\n$fa-var-server: \"\\f233\";\n$fa-var-share: \"\\f064\";\n$fa-var-share-alt: \"\\f1e0\";\n$fa-var-share-alt-square: \"\\f1e1\";\n$fa-var-share-square: \"\\f14d\";\n$fa-var-share-square-o: \"\\f045\";\n$fa-var-shekel: \"\\f20b\";\n$fa-var-sheqel: \"\\f20b\";\n$fa-var-shield: \"\\f132\";\n$fa-var-ship: \"\\f21a\";\n$fa-var-shirtsinbulk: \"\\f214\";\n$fa-var-shopping-bag: \"\\f290\";\n$fa-var-shopping-basket: \"\\f291\";\n$fa-var-shopping-cart: \"\\f07a\";\n$fa-var-sign-in: \"\\f090\";\n$fa-var-sign-language: \"\\f2a7\";\n$fa-var-sign-out: \"\\f08b\";\n$fa-var-signal: \"\\f012\";\n$fa-var-signing: \"\\f2a7\";\n$fa-var-simplybuilt: \"\\f215\";\n$fa-var-sitemap: \"\\f0e8\";\n$fa-var-skyatlas: \"\\f216\";\n$fa-var-skype: \"\\f17e\";\n$fa-var-slack: \"\\f198\";\n$fa-var-sliders: \"\\f1de\";\n$fa-var-slideshare: \"\\f1e7\";\n$fa-var-smile-o: \"\\f118\";\n$fa-var-snapchat: \"\\f2ab\";\n$fa-var-snapchat-ghost: \"\\f2ac\";\n$fa-var-snapchat-square: \"\\f2ad\";\n$fa-var-soccer-ball-o: \"\\f1e3\";\n$fa-var-sort: \"\\f0dc\";\n$fa-var-sort-alpha-asc: \"\\f15d\";\n$fa-var-sort-alpha-desc: \"\\f15e\";\n$fa-var-sort-amount-asc: \"\\f160\";\n$fa-var-sort-amount-desc: \"\\f161\";\n$fa-var-sort-asc: \"\\f0de\";\n$fa-var-sort-desc: \"\\f0dd\";\n$fa-var-sort-down: \"\\f0dd\";\n$fa-var-sort-numeric-asc: \"\\f162\";\n$fa-var-sort-numeric-desc: \"\\f163\";\n$fa-var-sort-up: \"\\f0de\";\n$fa-var-soundcloud: \"\\f1be\";\n$fa-var-space-shuttle: \"\\f197\";\n$fa-var-spinner: \"\\f110\";\n$fa-var-spoon: \"\\f1b1\";\n$fa-var-spotify: \"\\f1bc\";\n$fa-var-square: \"\\f0c8\";\n$fa-var-square-o: \"\\f096\";\n$fa-var-stack-exchange: \"\\f18d\";\n$fa-var-stack-overflow: \"\\f16c\";\n$fa-var-star: \"\\f005\";\n$fa-var-star-half: \"\\f089\";\n$fa-var-star-half-empty: \"\\f123\";\n$fa-var-star-half-full: \"\\f123\";\n$fa-var-star-half-o: \"\\f123\";\n$fa-var-star-o: \"\\f006\";\n$fa-var-steam: \"\\f1b6\";\n$fa-var-steam-square: \"\\f1b7\";\n$fa-var-step-backward: \"\\f048\";\n$fa-var-step-forward: \"\\f051\";\n$fa-var-stethoscope: \"\\f0f1\";\n$fa-var-sticky-note: \"\\f249\";\n$fa-var-sticky-note-o: \"\\f24a\";\n$fa-var-stop: \"\\f04d\";\n$fa-var-stop-circle: \"\\f28d\";\n$fa-var-stop-circle-o: \"\\f28e\";\n$fa-var-street-view: \"\\f21d\";\n$fa-var-strikethrough: \"\\f0cc\";\n$fa-var-stumbleupon: \"\\f1a4\";\n$fa-var-stumbleupon-circle: \"\\f1a3\";\n$fa-var-subscript: \"\\f12c\";\n$fa-var-subway: \"\\f239\";\n$fa-var-suitcase: \"\\f0f2\";\n$fa-var-sun-o: \"\\f185\";\n$fa-var-superscript: \"\\f12b\";\n$fa-var-support: \"\\f1cd\";\n$fa-var-table: \"\\f0ce\";\n$fa-var-tablet: \"\\f10a\";\n$fa-var-tachometer: \"\\f0e4\";\n$fa-var-tag: \"\\f02b\";\n$fa-var-tags: \"\\f02c\";\n$fa-var-tasks: \"\\f0ae\";\n$fa-var-taxi: \"\\f1ba\";\n$fa-var-television: \"\\f26c\";\n$fa-var-tencent-weibo: \"\\f1d5\";\n$fa-var-terminal: \"\\f120\";\n$fa-var-text-height: \"\\f034\";\n$fa-var-text-width: \"\\f035\";\n$fa-var-th: \"\\f00a\";\n$fa-var-th-large: \"\\f009\";\n$fa-var-th-list: \"\\f00b\";\n$fa-var-themeisle: \"\\f2b2\";\n$fa-var-thumb-tack: \"\\f08d\";\n$fa-var-thumbs-down: \"\\f165\";\n$fa-var-thumbs-o-down: \"\\f088\";\n$fa-var-thumbs-o-up: \"\\f087\";\n$fa-var-thumbs-up: \"\\f164\";\n$fa-var-ticket: \"\\f145\";\n$fa-var-times: \"\\f00d\";\n$fa-var-times-circle: \"\\f057\";\n$fa-var-times-circle-o: \"\\f05c\";\n$fa-var-tint: \"\\f043\";\n$fa-var-toggle-down: \"\\f150\";\n$fa-var-toggle-left: \"\\f191\";\n$fa-var-toggle-off: \"\\f204\";\n$fa-var-toggle-on: \"\\f205\";\n$fa-var-toggle-right: \"\\f152\";\n$fa-var-toggle-up: \"\\f151\";\n$fa-var-trademark: \"\\f25c\";\n$fa-var-train: \"\\f238\";\n$fa-var-transgender: \"\\f224\";\n$fa-var-transgender-alt: \"\\f225\";\n$fa-var-trash: \"\\f1f8\";\n$fa-var-trash-o: \"\\f014\";\n$fa-var-tree: \"\\f1bb\";\n$fa-var-trello: \"\\f181\";\n$fa-var-tripadvisor: \"\\f262\";\n$fa-var-trophy: \"\\f091\";\n$fa-var-truck: \"\\f0d1\";\n$fa-var-try: \"\\f195\";\n$fa-var-tty: \"\\f1e4\";\n$fa-var-tumblr: \"\\f173\";\n$fa-var-tumblr-square: \"\\f174\";\n$fa-var-turkish-lira: \"\\f195\";\n$fa-var-tv: \"\\f26c\";\n$fa-var-twitch: \"\\f1e8\";\n$fa-var-twitter: \"\\f099\";\n$fa-var-twitter-square: \"\\f081\";\n$fa-var-umbrella: \"\\f0e9\";\n$fa-var-underline: \"\\f0cd\";\n$fa-var-undo: \"\\f0e2\";\n$fa-var-universal-access: \"\\f29a\";\n$fa-var-university: \"\\f19c\";\n$fa-var-unlink: \"\\f127\";\n$fa-var-unlock: \"\\f09c\";\n$fa-var-unlock-alt: \"\\f13e\";\n$fa-var-unsorted: \"\\f0dc\";\n$fa-var-upload: \"\\f093\";\n$fa-var-usb: \"\\f287\";\n$fa-var-usd: \"\\f155\";\n$fa-var-user: \"\\f007\";\n$fa-var-user-md: \"\\f0f0\";\n$fa-var-user-plus: \"\\f234\";\n$fa-var-user-secret: \"\\f21b\";\n$fa-var-user-times: \"\\f235\";\n$fa-var-users: \"\\f0c0\";\n$fa-var-venus: \"\\f221\";\n$fa-var-venus-double: \"\\f226\";\n$fa-var-venus-mars: \"\\f228\";\n$fa-var-viacoin: \"\\f237\";\n$fa-var-viadeo: \"\\f2a9\";\n$fa-var-viadeo-square: \"\\f2aa\";\n$fa-var-video-camera: \"\\f03d\";\n$fa-var-vimeo: \"\\f27d\";\n$fa-var-vimeo-square: \"\\f194\";\n$fa-var-vine: \"\\f1ca\";\n$fa-var-vk: \"\\f189\";\n$fa-var-volume-control-phone: \"\\f2a0\";\n$fa-var-volume-down: \"\\f027\";\n$fa-var-volume-off: \"\\f026\";\n$fa-var-volume-up: \"\\f028\";\n$fa-var-warning: \"\\f071\";\n$fa-var-wechat: \"\\f1d7\";\n$fa-var-weibo: \"\\f18a\";\n$fa-var-weixin: \"\\f1d7\";\n$fa-var-whatsapp: \"\\f232\";\n$fa-var-wheelchair: \"\\f193\";\n$fa-var-wheelchair-alt: \"\\f29b\";\n$fa-var-wifi: \"\\f1eb\";\n$fa-var-wikipedia-w: \"\\f266\";\n$fa-var-windows: \"\\f17a\";\n$fa-var-won: \"\\f159\";\n$fa-var-wordpress: \"\\f19a\";\n$fa-var-wpbeginner: \"\\f297\";\n$fa-var-wpforms: \"\\f298\";\n$fa-var-wrench: \"\\f0ad\";\n$fa-var-xing: \"\\f168\";\n$fa-var-xing-square: \"\\f169\";\n$fa-var-y-combinator: \"\\f23b\";\n$fa-var-y-combinator-square: \"\\f1d4\";\n$fa-var-yahoo: \"\\f19e\";\n$fa-var-yc: \"\\f23b\";\n$fa-var-yc-square: \"\\f1d4\";\n$fa-var-yelp: \"\\f1e9\";\n$fa-var-yen: \"\\f157\";\n$fa-var-yoast: \"\\f2b1\";\n$fa-var-youtube: \"\\f167\";\n$fa-var-youtube-play: \"\\f16a\";\n$fa-var-youtube-square: \"\\f166\";\n\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/font-awesome/scss/font-awesome.scss",
    "content": "/*!\n *  Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables\";\n@import \"mixins\";\n@import \"path\";\n@import \"core\";\n@import \"larger\";\n@import \"fixed-width\";\n@import \"list\";\n@import \"bordered-pulled\";\n@import \"animated\";\n@import \"rotated-flipped\";\n@import \"stacked\";\n@import \"icons\";\n@import \"screen-reader\";\n"
  },
  {
    "path": "example/bootstrap/v3/vendor/jquery/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v1.12.4\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-05-20T17:17Z\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Support: Firefox 18+\n// Can't be in strict mode, several libs including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n//\"use strict\";\nvar deletedIds = [];\n\nvar document = window.document;\n\nvar slice = deletedIds.slice;\n\nvar concat = deletedIds.concat;\n\nvar push = deletedIds.push;\n\nvar indexOf = deletedIds.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar support = {};\n\n\n\nvar\n\tversion = \"1.12.4\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1, IE<9\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: deletedIds.sort,\n\tsplice: deletedIds.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar src, copyIsArray, copy, name, options, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = jQuery.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type( obj ) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type( obj ) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\t/* jshint eqeqeq: false */\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\n\t\tvar realStringObj = obj && obj.toString();\n\t\treturn !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type( obj ) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call( obj, \"constructor\" ) &&\n\t\t\t\t!hasOwn.call( obj.constructor.prototype, \"isPrototypeOf\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Handle iteration over inherited properties before own properties.\n\t\tif ( !support.ownFirst ) {\n\t\t\tfor ( key in obj ) {\n\t\t\t\treturn hasOwn.call( obj, key );\n\t\t\t}\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || hasOwn.call( obj, key );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && jQuery.trim( data ) ) {\n\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data ); // jscs:ignore requireDotNotation\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android<4.1, IE<9\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( indexOf ) {\n\t\t\t\treturn indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\twhile ( j < len ) {\n\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)\n\t\tif ( len !== len ) {\n\t\t\twhile ( second[ j ] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar args, proxy, tmp;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: function() {\n\t\treturn +( new Date() );\n\t},\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\n// JSHint would error on this code due to the Symbol not being defined in ES5.\n// Defining this global in .jshintrc would create a danger of using the global\n// unguarded in another place, it seems safer to just disable JSHint for these\n// three lines.\n/* jshint ignore: start */\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ];\n}\n/* jshint ignore: end */\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: iOS 8.2 (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.2.1\n * http://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2015-10-17\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// http://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, nidselect, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rescape, \"\\\\$&\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\tnidselect = ridentifier.test( nid ) ? \"#\" + nid : \"[id='\" + nid + \"']\";\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = nidselect + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, parent,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( (parent = document.defaultView) && parent.top !== parent ) {\n\t\t// Support: IE 11\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( document.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\treturn m ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( div ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !div.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibing-combinator selector` fails\n\t\t\tif ( !div.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( (oldCache = uniqueCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([\\w-]+)\\s*\\/?>(?:<\\/\\1>|)$/ );\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) > -1 ) !== not;\n\t} );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tret = [],\n\t\t\tself = this,\n\t\t\tlen = self.length;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// init accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt( 0 ) === \"<\" &&\n\t\t\t\tselector.charAt( selector.length - 1 ) === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[ 2 ] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn typeof root.ready !== \"undefined\" ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && ( pos ?\n\t\t\t\t\tpos.index( cur ) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[ 0 ], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tret = jQuery.uniqueSort( ret );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tret = ret.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnotwhite = ( /\\S+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( jQuery.isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && jQuery.type( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = true;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ) ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis === promise ? newDefer.promise() : this,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add( function() {\n\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 ||\n\t\t\t\t( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred.\n\t\t\t// If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) )\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n} );\n\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\tjQuery( document ).off( \"ready\" );\n\t\t}\n\t}\n} );\n\n/**\n * Clean-up method for dom ready events\n */\nfunction detach() {\n\tif ( document.addEventListener ) {\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\t\twindow.removeEventListener( \"load\", completed );\n\n\t} else {\n\t\tdocument.detachEvent( \"onreadystatechange\", completed );\n\t\twindow.detachEvent( \"onload\", completed );\n\t}\n}\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\n\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n\tif ( document.addEventListener ||\n\t\twindow.event.type === \"load\" ||\n\t\tdocument.readyState === \"complete\" ) {\n\n\t\tdetach();\n\t\tjQuery.ready();\n\t}\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called\n\t\t// after the browser event has already occurred.\n\t\t// Support: IE6-10\n\t\t// Older IE sometimes signals \"interactive\" too soon\n\t\tif ( document.readyState === \"complete\" ||\n\t\t\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\twindow.setTimeout( jQuery.ready );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed );\n\n\t\t// If IE event model is used\n\t\t} else {\n\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", completed );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch ( e ) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t( function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll( \"left\" );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn window.setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// detach all dom ready events\n\t\t\t\t\t\tdetach();\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t} )();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Kick off the DOM ready check even if the user does not\njQuery.ready.promise();\n\n\n\n\n// Support: IE<9\n// Iteration over object's inherited properties before its own\nvar i;\nfor ( i in jQuery( support ) ) {\n\tbreak;\n}\nsupport.ownFirst = i === \"0\";\n\n// Note: most support tests are defined in their respective modules.\n// false until the test is run\nsupport.inlineBlockNeedsLayout = false;\n\n// Execute ASAP in case we need to set body.style.zoom\njQuery( function() {\n\n\t// Minified: var a,b,c,d\n\tvar val, div, body, container;\n\n\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\n\tif ( !body || !body.style ) {\n\n\t\t// Return for frameset docs that don't have a body\n\t\treturn;\n\t}\n\n\t// Setup\n\tdiv = document.createElement( \"div\" );\n\tcontainer = document.createElement( \"div\" );\n\tcontainer.style.cssText = \"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\";\n\tbody.appendChild( container ).appendChild( div );\n\n\tif ( typeof div.style.zoom !== \"undefined\" ) {\n\n\t\t// Support: IE<8\n\t\t// Check if natively block-level elements act like inline-block\n\t\t// elements when setting their display to 'inline' and giving\n\t\t// them layout\n\t\tdiv.style.cssText = \"display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1\";\n\n\t\tsupport.inlineBlockNeedsLayout = val = div.offsetWidth === 3;\n\t\tif ( val ) {\n\n\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\t\t\t// Support: IE<8\n\t\t\tbody.style.zoom = 1;\n\t\t}\n\t}\n\n\tbody.removeChild( container );\n} );\n\n\n( function() {\n\tvar div = document.createElement( \"div\" );\n\n\t// Support: IE<9\n\tsupport.deleteExpando = true;\n\ttry {\n\t\tdelete div.test;\n\t} catch ( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\t// Null elements to avoid leaks in IE.\n\tdiv = null;\n} )();\nvar acceptData = function( elem ) {\n\tvar noData = jQuery.noData[ ( elem.nodeName + \" \" ).toLowerCase() ],\n\t\tnodeType = +elem.nodeType || 1;\n\n\t// Do not set data on non-element DOM nodes because it will not be cleared (#8335).\n\treturn nodeType !== 1 && nodeType !== 9 ?\n\t\tfalse :\n\n\t\t// Nodes accept data unless otherwise specified; rejection can be conditional\n\t\t!noData || noData !== true && elem.getAttribute( \"classid\" ) === noData;\n};\n\n\n\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction dataAttr( elem, key, data ) {\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[ name ] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ) {\n\tif ( !acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar ret, thisCache,\n\t\tinternalKey = jQuery.expando,\n\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t// can't GC object references properly across the DOM-JS boundary\n\t\tisNode = elem.nodeType,\n\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t// attached directly to the object so GC can occur automatically\n\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t// Avoid doing any more work than we need to when trying to get data on an\n\t// object that has no data at all\n\tif ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) &&\n\t\tdata === undefined && typeof name === \"string\" ) {\n\t\treturn;\n\t}\n\n\tif ( !id ) {\n\n\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t// ends up in the global cache\n\t\tif ( isNode ) {\n\t\t\tid = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;\n\t\t} else {\n\t\t\tid = internalKey;\n\t\t}\n\t}\n\n\tif ( !cache[ id ] ) {\n\n\t\t// Avoid exposing jQuery metadata on plain JS objects when the object\n\t\t// is serialized using JSON.stringify\n\t\tcache[ id ] = isNode ? {} : { toJSON: jQuery.noop };\n\t}\n\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t// shallow copied over onto the existing cache\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\tif ( pvt ) {\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t} else {\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t}\n\t}\n\n\tthisCache = cache[ id ];\n\n\t// jQuery data() is stored in a separate object inside the object's internal data\n\t// cache in order to avoid key collisions between internal data and user-defined\n\t// data.\n\tif ( !pvt ) {\n\t\tif ( !thisCache.data ) {\n\t\t\tthisCache.data = {};\n\t\t}\n\n\t\tthisCache = thisCache.data;\n\t}\n\n\tif ( data !== undefined ) {\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t}\n\n\t// Check for both converted-to-camel and non-converted data property names\n\t// If a data property was specified\n\tif ( typeof name === \"string\" ) {\n\n\t\t// First Try to find as-is property data\n\t\tret = thisCache[ name ];\n\n\t\t// Test for null|undefined property data\n\t\tif ( ret == null ) {\n\n\t\t\t// Try to find the camelCased property\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t}\n\t} else {\n\t\tret = thisCache;\n\t}\n\n\treturn ret;\n}\n\nfunction internalRemoveData( elem, name, pvt ) {\n\tif ( !acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, i,\n\t\tisNode = elem.nodeType,\n\n\t\t// See jQuery.data for more information\n\t\tcache = isNode ? jQuery.cache : elem,\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t// If there is already no cache entry for this object, there is no\n\t// purpose in continuing\n\tif ( !cache[ id ] ) {\n\t\treturn;\n\t}\n\n\tif ( name ) {\n\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\tif ( thisCache ) {\n\n\t\t\t// Support array or space separated string names for data keys\n\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split( \" \" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete thisCache[ name[ i ] ];\n\t\t\t}\n\n\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t// and let the cache object itself get destroyed\n\t\t\tif ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// See jQuery.data for more information\n\tif ( !pvt ) {\n\t\tdelete cache[ id ].data;\n\n\t\t// Don't destroy the parent cache unless the internal data object\n\t\t// had been the only thing left in it\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Destroy the cache\n\tif ( isNode ) {\n\t\tjQuery.cleanData( [ elem ], true );\n\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t/* jshint eqeqeq: false */\n\t} else if ( support.deleteExpando || cache != cache.window ) {\n\t\t/* jshint eqeqeq: true */\n\t\tdelete cache[ id ];\n\n\t// When all else fails, undefined\n\t} else {\n\t\tcache[ id ] = undefined;\n\t}\n}\n\njQuery.extend( {\n\tcache: {},\n\n\t// The following elements (space-suffixed to avoid Object.prototype collisions)\n\t// throw uncatchable exceptions if you attempt to set expando properties\n\tnoData: {\n\t\t\"applet \": true,\n\t\t\"embed \": true,\n\n\t\t// ...but Flash objects (which have this classid) *can* handle expandos\n\t\t\"object \": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name );\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, true );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, true );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Special expections of .data basically thwart jQuery.access,\n\t\t// so implement the relevant behavior ourselves\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn arguments.length > 1 ?\n\n\t\t\t// Sets one value\n\t\t\tthis.each( function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t} ) :\n\n\t\t\t// Gets one value\n\t\t\t// Try to fetch any internally stored data first\n\t\t\telem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object,\n\t// or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\t\t\t\tjQuery._removeData( elem, key );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\n\n\n( function() {\n\tvar shrinkWrapBlocksVal;\n\n\tsupport.shrinkWrapBlocks = function() {\n\t\tif ( shrinkWrapBlocksVal != null ) {\n\t\t\treturn shrinkWrapBlocksVal;\n\t\t}\n\n\t\t// Will be changed later if needed.\n\t\tshrinkWrapBlocksVal = false;\n\n\t\t// Minified: var b,c,d\n\t\tvar div, body, container;\n\n\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\n\t\tif ( !body || !body.style ) {\n\n\t\t\t// Test fired too early or in an unsupported environment, exit.\n\t\t\treturn;\n\t\t}\n\n\t\t// Setup\n\t\tdiv = document.createElement( \"div\" );\n\t\tcontainer = document.createElement( \"div\" );\n\t\tcontainer.style.cssText = \"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\";\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\t// Support: IE6\n\t\t// Check if elements with layout shrink-wrap their children\n\t\tif ( typeof div.style.zoom !== \"undefined\" ) {\n\n\t\t\t// Reset CSS: box-sizing; display; margin; border\n\t\t\tdiv.style.cssText =\n\n\t\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n\t\t\t\t\"box-sizing:content-box;display:block;margin:0;border:0;\" +\n\t\t\t\t\"padding:1px;width:1px;zoom:1\";\n\t\t\tdiv.appendChild( document.createElement( \"div\" ) ).style.width = \"5px\";\n\t\t\tshrinkWrapBlocksVal = div.offsetWidth !== 3;\n\t\t}\n\n\t\tbody.removeChild( container );\n\n\t\treturn shrinkWrapBlocksVal;\n\t};\n\n} )();\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHidden = function( elem, el ) {\n\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" ||\n\t\t\t!jQuery.contains( elem.ownerDocument, elem );\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted,\n\t\tscale = 1,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() { return tween.cur(); } :\n\t\t\tfunction() { return jQuery.css( elem, prop, \"\" ); },\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\tdo {\n\n\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\tscale = scale || \".5\";\n\n\t\t\t// Adjust and apply\n\t\t\tinitialInUnit = initialInUnit / scale;\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t// Break the loop if scale is unchanged or perfect, or if we've just had enough.\n\t\t} while (\n\t\t\tscale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations\n\t\t);\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlength = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ],\n\t\t\t\t\tkey,\n\t\t\t\t\traw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlength ? fn( elems[ 0 ], key ) : emptyGet;\n};\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([\\w:-]+)/ );\n\nvar rscriptType = ( /^$|\\/(?:java|ecma)script/i );\n\nvar rleadingWhitespace = ( /^\\s+/ );\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|\" +\n\t\t\"details|dialog|figcaption|figure|footer|header|hgroup|main|\" +\n\t\t\"mark|meter|nav|output|picture|progress|section|summary|template|time|video\";\n\n\n\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\t\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\n\n( function() {\n\tvar div = document.createElement( \"div\" ),\n\t\tfragment = document.createDocumentFragment(),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Setup\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// IE strips leading whitespace when .innerHTML is used\n\tsupport.leadingWhitespace = div.firstChild.nodeType === 3;\n\n\t// Make sure that tbody elements aren't automatically inserted\n\t// IE will insert them into empty tables\n\tsupport.tbody = !div.getElementsByTagName( \"tbody\" ).length;\n\n\t// Make sure that link elements get serialized correctly by innerHTML\n\t// This requires a wrapper element in IE\n\tsupport.htmlSerialize = !!div.getElementsByTagName( \"link\" ).length;\n\n\t// Makes sure cloning an html5 element does not cause problems\n\t// Where outerHTML is undefined, this still works\n\tsupport.html5Clone =\n\t\tdocument.createElement( \"nav\" ).cloneNode( true ).outerHTML !== \"<:nav></:nav>\";\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tinput.type = \"checkbox\";\n\tinput.checked = true;\n\tfragment.appendChild( input );\n\tsupport.appendChecked = input.checked;\n\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\t// Support: IE6-IE11+\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tfragment.appendChild( div );\n\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput = document.createElement( \"input\" );\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3\n\t// old WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<9\n\t// Cloned elements keep attachEvent handlers, we use addEventListener on IE9+\n\tsupport.noCloneEvent = !!div.addEventListener;\n\n\t// Support: IE<9\n\t// Since attributes and properties are the same in IE,\n\t// cleanData must set properties to undefined rather than use removeAttribute\n\tdiv[ jQuery.expando ] = 1;\n\tsupport.attributes = !div.getAttribute( jQuery.expando );\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\tarea: [ 1, \"<map>\", \"</map>\" ],\n\n\t// Support: IE8\n\tparam: [ 1, \"<object>\", \"</object>\" ],\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t// unless wrapped in a div with non-breaking characters in front of it.\n\t_default: support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\" ]\n};\n\n// Support: IE8-IE9\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\tvar elems, elem,\n\t\ti = 0,\n\t\tfound = typeof context.getElementsByTagName !== \"undefined\" ?\n\t\t\tcontext.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== \"undefined\" ?\n\t\t\t\tcontext.querySelectorAll( tag || \"*\" ) :\n\t\t\t\tundefined;\n\n\tif ( !found ) {\n\t\tfor ( found = [], elems = context.childNodes || context;\n\t\t\t( elem = elems[ i ] ) != null;\n\t\t\ti++\n\t\t) {\n\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\t\t\t\tfound.push( elem );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], found ) :\n\t\tfound;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar elem,\n\t\ti = 0;\n\tfor ( ; ( elem = elems[ i ] ) != null; i++ ) {\n\t\tjQuery._data(\n\t\t\telem,\n\t\t\t\"globalEval\",\n\t\t\t!refElements || jQuery._data( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/,\n\trtbody = /<tbody/i;\n\nfunction fixDefaultChecked( elem ) {\n\tif ( rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar j, elem, contains,\n\t\ttmp, tag, tbody, wrap,\n\t\tl = elems.length,\n\n\t\t// Ensure a safe fragment\n\t\tsafe = createSafeFragment( context ),\n\n\t\tnodes = [],\n\t\ti = 0;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || safe.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Manually add leading whitespace removed by IE\n\t\t\t\tif ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[ 0 ] ) );\n\t\t\t\t}\n\n\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\tif ( !support.tbody ) {\n\n\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\ttmp.firstChild :\n\n\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\twrap[ 1 ] === \"<table>\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\ttmp :\n\t\t\t\t\t\t\t0;\n\n\t\t\t\t\tj = elem && elem.childNodes.length;\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\tif ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), \"tbody\" ) &&\n\t\t\t\t\t\t\t!tbody.childNodes.length ) {\n\n\t\t\t\t\t\t\telem.removeChild( tbody );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\t\t\t\ttmp.textContent = \"\";\n\n\t\t\t\t// Fix #12392 for oldIE\n\t\t\t\twhile ( tmp.firstChild ) {\n\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\t\t\t\t}\n\n\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\ttmp = safe.lastChild;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fix #11356: Clear elements from fragment\n\tif ( tmp ) {\n\t\tsafe.removeChild( tmp );\n\t}\n\n\t// Reset defaultChecked for any radios and checkboxes\n\t// about to be appended to the DOM in IE 6/7 (#8060)\n\tif ( !support.appendChecked ) {\n\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\t}\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\ttmp = null;\n\n\treturn safe;\n}\n\n\n( function() {\n\tvar i, eventName,\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events)\n\tfor ( i in { submit: true, change: true, focusin: true } ) {\n\t\teventName = \"on\" + i;\n\n\t\tif ( !( support[ i ] = eventName in window ) ) {\n\n\t\t\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\t\t\tdiv.setAttribute( eventName, \"t\" );\n\t\t\tsupport[ i ] = div.attributes[ eventName ].expando === false;\n\t\t}\n\t}\n\n\t// Null elements to avoid leaks in IE.\n\tdiv = null;\n} )();\n\n\nvar rformElems = /^(?:input|select|textarea)$/i,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE9\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\t\tvar tmp, events, t, handleObjIn,\n\t\t\tspecial, eventHandle, handleObj,\n\t\t\thandlers, type, namespaces, origType,\n\t\t\telemData = jQuery._data( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" &&\n\t\t\t\t\t( !e || jQuery.event.triggered !== e.type ) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak\n\t\t\t// with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\t\tvar j, handleObj, tmp,\n\t\t\torigCount, t, events,\n\t\t\tspecial, handlers, type,\n\t\t\tnamespaces, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\tvar handle, ontype, cur,\n\t\t\tbubbleType, special, tmp, i,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tjQuery._data( cur, \"handle\" );\n\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif (\n\t\t\t\t( !special._default ||\n\t\t\t\t special._default.apply( eventPath.pop(), data ) === false\n\t\t\t\t) && acceptData( elem )\n\t\t\t) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\ttry {\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t}\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, j, ret, matched, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, matches, sel, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Support (at least): Chrome, IE9\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t//\n\t\t// Support: Firefox<=42+\n\t\t// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)\n\t\tif ( delegateCount && cur.nodeType &&\n\t\t\t( event.type !== \"click\" || isNaN( event.button ) || event.button < 1 ) ) {\n\n\t\t\t/* jshint eqeqeq: false */\n\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\t\t\t\t/* jshint eqeqeq: true */\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== \"click\" ) ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matches } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Fix target property (#1925)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Support: Safari 6-8+\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: ( \"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase \" +\n\t\t\"metaKey relatedTarget shiftKey target timeStamp view which\" ).split( \" \" ),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split( \" \" ),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: ( \"button buttons clientX clientY fromElement offsetX offsetY \" +\n\t\t\t\"pageX pageY screenX screenY toElement\" ).split( \" \" ),\n\t\tfilter: function( event, original ) {\n\t\t\tvar body, eventDoc, doc,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX +\n\t\t\t\t\t( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -\n\t\t\t\t\t( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY +\n\t\t\t\t\t( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) -\n\t\t\t\t\t( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ?\n\t\t\t\t\toriginal.toElement :\n\t\t\t\t\tfromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\t\t\t\t\t\t// let .trigger() run the handlers\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\n\t\t\t\t// Previously, `originalEvent: {}` was set here, so stopPropagation call\n\t\t\t\t// would not be triggered on donor event, since in our own\n\t\t\t\t// jQuery.event.stopPropagation function we had a check for existence of\n\t\t\t\t// originalEvent.stopPropagation method, so, consequently it would be a noop.\n\t\t\t\t//\n\t\t\t\t// Guard for simulated events was moved to jQuery.event.stopPropagation function\n\t\t\t\t// since `originalEvent` should point to the original event for the\n\t\t\t\t// constancy with other events and for more focused logic\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\n\t\t// This \"if\" is needed for plain objects\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t// detachEvent needed property on element, by name of that event,\n\t\t\t// to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === \"undefined\" ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: IE < 9, Android < 4.0\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If preventDefault exists, run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// Support: IE\n\t\t// Otherwise set the returnValue property of the original event to false\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( !e || this.isSimulated ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If stopPropagation exists, run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Set the cancelBubble property of the original event to true\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopImmediatePropagation ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://code.google.com/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\n// IE submit delegation\nif ( !support.submit ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ?\n\n\t\t\t\t\t\t// Support: IE <=8\n\t\t\t\t\t\t// We use jQuery.prop instead of elem.form\n\t\t\t\t\t\t// to allow fixing the IE8 delegated submit issue (gh-2332)\n\t\t\t\t\t\t// by 3rd party polyfills/workarounds.\n\t\t\t\t\t\tjQuery.prop( elem, \"form\" ) :\n\t\t\t\t\t\tundefined;\n\n\t\t\t\tif ( form && !jQuery._data( form, \"submit\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submitBubble = true;\n\t\t\t\t\t} );\n\t\t\t\t\tjQuery._data( form, \"submit\", true );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submitBubble ) {\n\t\t\t\tdelete event._submitBubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !support.change ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._justChanged = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._justChanged && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._justChanged = false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"change\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t\tjQuery._data( elem, \"change\", true );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger ||\n\t\t\t\t( elem.type !== \"radio\" && elem.type !== \"checkbox\" ) ) {\n\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn !rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Support: Firefox\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome, Safari\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = jQuery._data( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tjQuery._data( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = jQuery._data( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tjQuery._removeData( doc, fix );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery._data( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\nvar rinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trnoshimcache = new RegExp( \"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\" ),\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:-]+)[^>]*)\\/>/gi,\n\n\t// Support: IE 10-11, Edge 10240+\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement( \"div\" ) );\n\n// Support: IE<8\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName( \"tbody\" )[ 0 ] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement( \"tbody\" ) ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( jQuery.find.attr( elem, \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction fixCloneNodeIssues( src, dest ) {\n\tvar nodeName, e, data;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\tif ( !support.noCloneEvent && dest[ jQuery.expando ] ) {\n\t\tdata = jQuery._data( dest );\n\n\t\tfor ( e in data.events ) {\n\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\t\t}\n\n\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\t\tdest.removeAttribute( jQuery.expando );\n\t}\n\n\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdisableScript( dest ).text = src.text;\n\t\trestoreScript( dest );\n\n\t// IE6-10 improperly clones children of object elements using classid.\n\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t} else if ( nodeName === \"object\" ) {\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar first, node, hasScripts,\n\t\tscripts, doc, fragment,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tisFunction = jQuery.isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( isFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( isFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android<4.1, PhantomJS<2\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tjQuery.globalEval(\n\t\t\t\t\t\t\t\t( node.text || node.textContent || node.innerHTML || \"\" )\n\t\t\t\t\t\t\t\t\t.replace( rcleanScript, \"\" )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\tfragment = first = null;\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\telems = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = elems[ i ] ) != null; i++ ) {\n\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1></$2>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar destElements, node, clone, i, srcElements,\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\tif ( support.html5Clone || jQuery.isXMLDoc( elem ) ||\n\t\t\t!rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( ( !support.noCloneEvent || !support.noCloneChecked ) &&\n\t\t\t\t( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\t// Fix all IE cloning issues\n\t\t\tfor ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) {\n\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[ i ] ) {\n\t\t\t\t\tfixCloneNodeIssues( node, destElements[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) {\n\t\t\t\t\tcloneCopyEvent( node, destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\tdestElements = srcElements = node = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems, /* internal */ forceAcceptData ) {\n\t\tvar elem, type, id, data,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tattributes = support.attributes,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\tif ( forceAcceptData || acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes\n\t\t\t\t\t\t// IE creates expando attributes along with the property\n\t\t\t\t\t\t// IE does not have a removeAttribute function on Document nodes\n\t\t\t\t\t\tif ( !attributes && typeof elem.removeAttribute !== \"undefined\" ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t\t\t\t// https://code.google.com/p/chromium/issues/detail?id=378607\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdeletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\n\t// Keep domManip exposed until 3.0 (gh-2225)\n\tdomManip: domManip,\n\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append(\n\t\t\t\t\t( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value )\n\t\t\t\t);\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\n\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\t\t\t// Support: IE<9\n\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\telem.options.length = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[ i ] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\n\n\nvar iframe,\n\telemdisplay = {\n\n\t\t// Support: Firefox\n\t\t// We have to pre-define these values for FF (#10227)\n\t\tHTML: \"block\",\n\t\tBODY: \"block\"\n\t};\n\n/**\n * Retrieve the actual display of a element\n * @param {String} name nodeName of the element\n * @param {Object} doc Document object\n */\n\n// Called only from within defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\n\t\tdisplay = jQuery.css( elem[ 0 ], \"display\" );\n\n\t// We don't have any data stored on the element,\n\t// so use \"detach\" method as fast way to get rid of the element\n\telem.detach();\n\n\treturn display;\n}\n\n/**\n * Try to determine the default display value of an element\n * @param {String} nodeName\n */\nfunction defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe || jQuery( \"<iframe frameborder='0' width='0' height='0'/>\" ) )\n\t\t\t\t.appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;\n\n\t\t\t// Support: IE\n\t\t\tdoc.write();\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\nvar rmargin = ( /^margin/ );\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar documentElement = document.documentElement;\n\n\n\n( function() {\n\tvar pixelPositionVal, pixelMarginRightVal, boxSizingReliableVal,\n\t\treliableHiddenOffsetsVal, reliableMarginRightVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\tdiv.style.cssText = \"float:left;opacity:.5\";\n\n\t// Support: IE<9\n\t// Make sure that element opacity exists (as opposed to filter)\n\tsupport.opacity = div.style.opacity === \"0.5\";\n\n\t// Verify style float existence\n\t// (IE uses styleFloat instead of cssFloat)\n\tsupport.cssFloat = !!div.style.cssFloat;\n\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tcontainer = document.createElement( \"div\" );\n\tcontainer.style.cssText = \"border:0;width:8px;height:0;top:0;left:-9999px;\" +\n\t\t\"padding:0;margin-top:1px;position:absolute\";\n\tdiv.innerHTML = \"\";\n\tcontainer.appendChild( div );\n\n\t// Support: Firefox<29, Android 2.3\n\t// Vendor-prefix box-sizing\n\tsupport.boxSizing = div.style.boxSizing === \"\" || div.style.MozBoxSizing === \"\" ||\n\t\tdiv.style.WebkitBoxSizing === \"\";\n\n\tjQuery.extend( support, {\n\t\treliableHiddenOffsets: function() {\n\t\t\tif ( pixelPositionVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn reliableHiddenOffsetsVal;\n\t\t},\n\n\t\tboxSizingReliable: function() {\n\n\t\t\t// We're checking for pixelPositionVal here instead of boxSizingReliableVal\n\t\t\t// since that compresses better and they're computed together anyway.\n\t\t\tif ( pixelPositionVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\n\t\tpixelMarginRight: function() {\n\n\t\t\t// Support: Android 4.0-4.3\n\t\t\tif ( pixelPositionVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn pixelMarginRightVal;\n\t\t},\n\n\t\tpixelPosition: function() {\n\t\t\tif ( pixelPositionVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn pixelPositionVal;\n\t\t},\n\n\t\treliableMarginRight: function() {\n\n\t\t\t// Support: Android 2.3\n\t\t\tif ( pixelPositionVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn reliableMarginRightVal;\n\t\t},\n\n\t\treliableMarginLeft: function() {\n\n\t\t\t// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37\n\t\t\tif ( pixelPositionVal == null ) {\n\t\t\t\tcomputeStyleTests();\n\t\t\t}\n\t\t\treturn reliableMarginLeftVal;\n\t\t}\n\t} );\n\n\tfunction computeStyleTests() {\n\t\tvar contents, divStyle,\n\t\t\tdocumentElement = document.documentElement;\n\n\t\t// Setup\n\t\tdocumentElement.appendChild( container );\n\n\t\tdiv.style.cssText =\n\n\t\t\t// Support: Android 2.3\n\t\t\t// Vendor-prefix box-sizing\n\t\t\t\"-webkit-box-sizing:border-box;box-sizing:border-box;\" +\n\t\t\t\"position:relative;display:block;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"top:1%;width:50%\";\n\n\t\t// Support: IE<9\n\t\t// Assume reasonable values in the absence of getComputedStyle\n\t\tpixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false;\n\t\tpixelMarginRightVal = reliableMarginRightVal = true;\n\n\t\t// Check for getComputedStyle so that this code is not run in IE<9.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tdivStyle = window.getComputedStyle( div );\n\t\t\tpixelPositionVal = ( divStyle || {} ).top !== \"1%\";\n\t\t\treliableMarginLeftVal = ( divStyle || {} ).marginLeft === \"2px\";\n\t\t\tboxSizingReliableVal = ( divStyle || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Support: Android 4.0 - 4.3 only\n\t\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\t\tdiv.style.marginRight = \"50%\";\n\t\t\tpixelMarginRightVal = ( divStyle || { marginRight: \"4px\" } ).marginRight === \"4px\";\n\n\t\t\t// Support: Android 2.3 only\n\t\t\t// Div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container (#3333)\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tcontents = div.appendChild( document.createElement( \"div\" ) );\n\n\t\t\t// Reset CSS: box-sizing; display; margin; border; padding\n\t\t\tcontents.style.cssText = div.style.cssText =\n\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n\t\t\t\t\"box-sizing:content-box;display:block;margin:0;border:0;padding:0\";\n\t\t\tcontents.style.marginRight = contents.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\treliableMarginRightVal =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( contents ) || {} ).marginRight );\n\n\t\t\tdiv.removeChild( contents );\n\t\t}\n\n\t\t// Support: IE6-8\n\t\t// First check that getClientRects works as expected\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\tdiv.style.display = \"none\";\n\t\treliableHiddenOffsetsVal = div.getClientRects().length === 0;\n\t\tif ( reliableHiddenOffsetsVal ) {\n\t\t\tdiv.style.display = \"\";\n\t\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\t\tdiv.childNodes[ 0 ].style.borderCollapse = \"separate\";\n\t\t\tcontents = div.getElementsByTagName( \"td\" );\n\t\t\tcontents[ 0 ].style.cssText = \"margin:0;border:0;padding:0;display:none\";\n\t\t\treliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;\n\t\t\tif ( reliableHiddenOffsetsVal ) {\n\t\t\t\tcontents[ 0 ].style.display = \"\";\n\t\t\t\tcontents[ 1 ].style.display = \"none\";\n\t\t\t\treliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;\n\t\t\t}\n\t\t}\n\n\t\t// Teardown\n\t\tdocumentElement.removeChild( container );\n\t}\n\n} )();\n\n\nvar getStyles, curCSS,\n\trposition = /^(top|right|bottom|left)$/;\n\nif ( window.getComputedStyle ) {\n\tgetStyles = function( elem ) {\n\n\t\t// Support: IE<=11+, Firefox<=30+ (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\n\tcurCSS = function( elem, name, computed ) {\n\t\tvar width, minWidth, maxWidth, ret,\n\t\t\tstyle = elem.style;\n\n\t\tcomputed = computed || getStyles( elem );\n\n\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;\n\n\t\t// Support: Opera 12.1x only\n\t\t// Fall back to style even without computed\n\t\t// computed is undefined for elems on document fragments\n\t\tif ( ( ret === \"\" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\tif ( computed ) {\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\"\n\t\t\t// instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values,\n\t\t\t// but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec:\n\t\t\t// http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t\t// Remember the original values\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\t// Put in the new values to get a computed value out\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\t// Revert the changed values\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\t// Support: IE\n\t\t// IE returns zIndex value as an integer.\n\t\treturn ret === undefined ?\n\t\t\tret :\n\t\t\tret + \"\";\n\t};\n} else if ( documentElement.currentStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn elem.currentStyle;\n\t};\n\n\tcurCSS = function( elem, name, computed ) {\n\t\tvar left, rs, rsLeft, ret,\n\t\t\tstyle = elem.style;\n\n\t\tcomputed = computed || getStyles( elem );\n\t\tret = computed ? computed[ name ] : undefined;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are\n\t\t// proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it\n\t\t// might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trs = elem.runtimeStyle;\n\t\t\trsLeft = rs && rs.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\t// Support: IE\n\t\t// IE returns zIndex value as an integer.\n\t\treturn ret === undefined ?\n\t\t\tret :\n\t\t\tret + \"\" || \"auto\";\n\t};\n}\n\n\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar\n\n\t\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity\\s*=\\s*([^)]*)/i,\n\n\t// swappable if display is none or starts with table except\n\t// \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values:\n\t// https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trnumsplit = new RegExp( \"^(\" + pnum + \")(.*)$\", \"i\" ),\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style;\n\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt( 0 ).toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] =\n\t\t\t\t\tjQuery._data( elem, \"olddisplay\", defaultDisplay( elem.nodeName ) );\n\t\t\t}\n\t\t} else {\n\t\t\thidden = isHidden( elem );\n\n\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\t\t\t\tjQuery._data(\n\t\t\t\t\telem,\n\t\t\t\t\t\"olddisplay\",\n\t\t\t\t\thidden ? display : jQuery.css( elem, \"display\" )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = support.boxSizing &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test( val ) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox &&\n\t\t\t( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\n\t\t// normalize float css property\n\t\t\"float\": support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] ||\n\t\t\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set. See: #7116\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\tif ( type === \"number\" ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// Fixes #8908, it can be done more correctly by specifying setters in cssHooks,\n\t\t\t// but it would mean to define eight\n\t\t\t// (for every problematic property) identical functions\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\t// Support: IE\n\t\t\t\t// Swallow errors from 'invalid' CSS values (#5509)\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar num, val, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] ||\n\t\t\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\t\t\t\t\telem.offsetWidth === 0 ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tsupport.boxSizing &&\n\t\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n} );\n\nif ( !support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( ( computed && elem.currentStyle ?\n\t\t\t\telem.currentStyle.filter :\n\t\t\t\telem.style.filter ) || \"\" ) ?\n\t\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist -\n\t\t\t// attempt to remove filter attribute #6652\n\t\t\t// if value === \"\", then remove inline opacity #12685\n\t\t\tif ( ( value >= 1 || value === \"\" ) &&\n\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there is no filter style applied in a css rule\n\t\t\t\t// or unset inline opacity, we are done\n\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t}\n\t}\n);\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn (\n\t\t\t\tparseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\n\t\t\t\t// Support: IE<=11+\n\t\t\t\t// Running getBoundingClientRect on a disconnected node in IE throws an error\n\t\t\t\t// Support: IE8 only\n\t\t\t\t// getClientRects() errors on disconnected elems\n\t\t\t\t( jQuery.contains( elem.ownerDocument, elem ) ?\n\t\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t0\n\t\t\t\t)\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 &&\n\t\t\t\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9\n// Panic based approach to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// we're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = jQuery._data( elem, \"fxshow\" );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t// Test default display if display is currently \"none\"\n\t\tcheckDisplay = display === \"none\" ?\n\t\t\tjQuery._data( elem, \"olddisplay\" ) || defaultDisplay( elem.nodeName ) : display;\n\n\t\tif ( checkDisplay === \"inline\" && jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !support.shrinkWrapBlocks() ) {\n\t\t\tanim.always( function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t} );\n\t\t}\n\t}\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// If there is dataShow left over from a stopped hide or show\n\t\t\t\t// and we are going to proceed with show, we should pretend to be hidden\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t// Any non-fx value stops us from restoring the original display value\n\t\t} else {\n\t\t\tdisplay = undefined;\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = jQuery._data( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done( function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t} );\n\t\t}\n\t\tanim.done( function() {\n\t\t\tvar prop;\n\t\t\tjQuery._removeData( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t} );\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t// If this is a noop like .hide().hide(), restore an overwritten display value\n\t} else if ( ( display === \"none\" ? defaultDisplay( elem.nodeName ) : display ) === \"inline\" ) {\n\t\tstyle.display = display;\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( jQuery.isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tjQuery.proxy( result.stop, result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnotwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ?\n\t\t\tjQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = jQuery._data( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tif ( timer() ) {\n\t\tjQuery.fx.start();\n\t} else {\n\t\tjQuery.timers.pop();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\twindow.clearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar a,\n\t\tinput = document.createElement( \"input\" ),\n\t\tdiv = document.createElement( \"div\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\t// Setup\n\tdiv = document.createElement( \"div\" );\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\n\n\t// Support: Windows Web Apps (WWA)\n\t// `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"checkbox\" );\n\tdiv.appendChild( input );\n\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\n\n\t// First batch of tests.\n\ta.style.cssText = \"top:1px\";\n\n\t// Test setAttribute on camelCase class.\n\t// If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\tsupport.getSetAttribute = div.className !== \"t\";\n\n\t// Get the style information from getAttribute\n\t// (IE uses .cssText instead)\n\tsupport.style = /top/.test( a.getAttribute( \"style\" ) );\n\n\t// Make sure that URLs aren't manipulated\n\t// (IE normalizes it by default)\n\tsupport.hrefNormalized = a.getAttribute( \"href\" ) === \"/a\";\n\n\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n\tsupport.checkOn = !!input.value;\n\n\t// Make sure that a selected-by-default option has a working selected property.\n\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\tsupport.optSelected = opt.selected;\n\n\t// Tests for enctype support on a form (#6743)\n\tsupport.enctype = !!document.createElement( \"form\" ).enctype;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE8 only\n\t// Check if we can trust getAttribute(\"value\")\n\tinput = document.createElement( \"input\" );\n\tinput.setAttribute( \"value\", \"\" );\n\tsupport.input = input.getAttribute( \"value\" ) === \"\";\n\n\t// Check if an input maintains its value after becoming a radio\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar rreturn = /\\r/g,\n\trspaces = /[\\x20\\t\\r\\n\\f]+/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif (\n\t\t\t\t\thooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace( rreturn, \"\" ) :\n\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE10-11+\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tjQuery.trim( jQuery.text( elem ) ).replace( rspaces, \" \" );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( support.optDisabled ?\n\t\t\t\t\t\t\t\t!option.disabled :\n\t\t\t\t\t\t\t\toption.getAttribute( \"disabled\" ) === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\tif ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) {\n\n\t\t\t\t\t\t// Support: IE6\n\t\t\t\t\t\t// When new option element is added to select box we need to\n\t\t\t\t\t\t// force reflow of newly added node in order to workaround delay\n\t\t\t\t\t\t// of initialization properties\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\toption.selected = optionSet = true;\n\n\t\t\t\t\t\t} catch ( _ ) {\n\n\t\t\t\t\t\t\t// Will be executed only in IE6\n\t\t\t\t\t\t\toption.scrollHeight;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\toption.selected = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\n\t\t\t\treturn options;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\nvar nodeHook, boolHook,\n\tattrHandle = jQuery.expr.attrHandle,\n\truseDefault = /^(?:checked|selected)$/i,\n\tgetSetAttribute = support.getSetAttribute,\n\tgetSetInput = support.input;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tjQuery.nodeName( elem, \"input\" ) ) {\n\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE8-9\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\tif ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\n\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate)\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\n\t\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\n\t\t\t// IE<8 needs the *property* name\n\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\n\t\t} else {\n\n\t\t\t// Support: IE<9\n\t\t\t// Use defaultChecked and defaultSelected for oldIE\n\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tif ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\t\tvar ret, handle;\n\t\t\tif ( !isXML ) {\n\n\t\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\t\thandle = attrHandle[ name ];\n\t\t\t\tattrHandle[ name ] = ret;\n\t\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t\t\tattrHandle[ name ] = handle;\n\t\t\t}\n\t\t\treturn ret;\n\t\t};\n\t} else {\n\t\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\t\tif ( !isXML ) {\n\t\t\t\treturn elem[ jQuery.camelCase( \"default-\" + name ) ] ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t\t}\n\t\t};\n\t}\n} );\n\n// fix oldIE attroperties\nif ( !getSetInput || !getSetAttribute ) {\n\tjQuery.attrHooks.value = {\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.defaultValue = value;\n\t\t\t} else {\n\n\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\n\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = {\n\t\tset: function( elem, value, name ) {\n\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\telem.setAttributeNode(\n\t\t\t\t\t( ret = elem.ownerDocument.createAttribute( name ) )\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tret.value = value += \"\";\n\n\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\n\t\t\tif ( name === \"value\" || value === elem.getAttribute( name ) ) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t};\n\n\t// Some attributes are constructed with empty-string values when not defined\n\tattrHandle.id = attrHandle.name = attrHandle.coords =\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar ret;\n\t\t\tif ( !isXML ) {\n\t\t\t\treturn ( ret = elem.getAttributeNode( name ) ) && ret.value !== \"\" ?\n\t\t\t\t\tret.value :\n\t\t\t\t\tnull;\n\t\t\t}\n\t\t};\n\n\t// Fixing value retrieval on a button requires this module\n\tjQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( ret && ret.specified ) {\n\t\t\t\treturn ret.value;\n\t\t\t}\n\t\t},\n\t\tset: nodeHook.set\n\t};\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tset: function( elem, value, name ) {\n\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each( [ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\n\nif ( !support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\n\t\t\t// .cssText, that would destroy case sensitivity in URL's, like in \"background\"\n\t\t\treturn elem.style.cssText || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = value + \"\" );\n\t\t}\n\t};\n}\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button|object)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each( function() {\n\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch ( e ) {}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\treturn tabindex ?\n\t\t\t\t\tparseInt( tabindex, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\t\trclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t\t0 :\n\t\t\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Some attributes require a special call on IE\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !support.hrefNormalized ) {\n\n\t// href/src property should get the full normalized URL (#10299/#12915)\n\tjQuery.each( [ \"href\", \"src\" ], function( i, name ) {\n\t\tjQuery.propHooks[ name ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.getAttribute( name, 4 );\n\t\t\t}\n\t\t};\n\t} );\n}\n\n// Support: Safari, IE9+\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n// IE6/7 call enctype encoding\nif ( !support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n\n\n\nvar rclass = /[\\t\\r\\n\\f]/g;\n\nfunction getClass( elem ) {\n\treturn jQuery.attr( elem, \"class\" ) || \"\";\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnotwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 &&\n\t\t\t\t\t( \" \" + curValue + \" \" ).replace( rclass, \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tjQuery.attr( elem, \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tif ( typeof value === \"string\" && value ) {\n\t\t\tclasses = value.match( rnotwhite ) || [];\n\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 &&\n\t\t\t\t\t( \" \" + curValue + \" \" ).replace( rclass, \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tjQuery.attr( elem, \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( type === \"string\" ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = value.match( rnotwhite ) || [];\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tjQuery.attr( this, \"class\",\n\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\"\" :\n\t\t\t\t\tjQuery._data( this, \"__className__\" ) || \"\"\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + getClass( elem ) + \" \" ).replace( rclass, \" \" )\n\t\t\t\t\t.indexOf( className ) > -1\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\njQuery.each( ( \"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\nvar location = window.location;\n\nvar nonce = jQuery.now();\n\nvar rquery = ( /\\?/ );\n\n\n\nvar rvalidtokens = /(,)|(\\[|{)|(}|])|\"(?:[^\"\\\\\\r\\n]|\\\\[\"\\\\\\/bfnrt]|\\\\u[\\da-fA-F]{4})*\"\\s*:?|true|false|null|-?(?!0\\d)\\d+(?:\\.\\d+|)(?:[eE][+-]?\\d+|)/g;\n\njQuery.parseJSON = function( data ) {\n\n\t// Attempt to parse using the native JSON parser first\n\tif ( window.JSON && window.JSON.parse ) {\n\n\t\t// Support: Android 2.3\n\t\t// Workaround failure to string-cast null input\n\t\treturn window.JSON.parse( data + \"\" );\n\t}\n\n\tvar requireNonComma,\n\t\tdepth = null,\n\t\tstr = jQuery.trim( data + \"\" );\n\n\t// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains\n\t// after removing valid tokens\n\treturn str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {\n\n\t\t// Force termination if we see a misplaced comma\n\t\tif ( requireNonComma && comma ) {\n\t\t\tdepth = 0;\n\t\t}\n\n\t\t// Perform no more replacements after returning to outermost depth\n\t\tif ( depth === 0 ) {\n\t\t\treturn token;\n\t\t}\n\n\t\t// Commas must not follow \"[\", \"{\", or \",\"\n\t\trequireNonComma = open || comma;\n\n\t\t// Determine new depth\n\t\t// array/object open (\"[\" or \"{\"): depth += true - false (increment)\n\t\t// array/object close (\"]\" or \"}\"): depth += false - true (decrement)\n\t\t// other cases (\",\" or primitive): depth += true - true (numeric cast)\n\t\tdepth += !close - !open;\n\n\t\t// Remove this token\n\t\treturn \"\";\n\t} ) ) ?\n\t\t( Function( \"return \" + str ) )() :\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n};\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, tmp;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tif ( window.DOMParser ) { // Standard\n\t\t\ttmp = new window.DOMParser();\n\t\t\txml = tmp.parseFromString( data, \"text/xml\" );\n\t\t} else { // IE\n\t\t\txml = new window.ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\txml.async = \"false\";\n\t\t\txml.loadXML( data );\n\t\t}\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\n\t// IE leaves an \\r character at EOL\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Document location\n\tajaxLocation = location.href,\n\n\t// Segment location into parts\n\tajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType.charAt( 0 ) === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar deep, key,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\tvar firstDataType, ct, finalDataType, type,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) { // jscs:ignore requireDotNotation\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar\n\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers as string\n\t\t\tresponseHeadersString,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\ttransport,\n\n\t\t\t// Response headers\n\t\t\tresponseHeaders,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" )\n\t\t\t.replace( rhash, \"\" )\n\t\t\t.replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( rnotwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapAll( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( this[ 0 ] ) {\n\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each( function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t} ).end();\n\t}\n} );\n\n\nfunction getDisplay( elem ) {\n\treturn elem.style && elem.style.display || jQuery.css( elem, \"display\" );\n}\n\nfunction filterHidden( elem ) {\n\n\t// Disconnected elements are considered hidden\n\tif ( !jQuery.contains( elem.ownerDocument || document, elem ) ) {\n\t\treturn true;\n\t}\n\twhile ( elem && elem.nodeType === 1 ) {\n\t\tif ( getDisplay( elem ) === \"none\" || elem.type === \"hidden\" ) {\n\t\t\treturn true;\n\t\t}\n\t\telem = elem.parentNode;\n\t}\n\treturn false;\n}\n\njQuery.expr.filters.hidden = function( elem ) {\n\n\t// Support: Opera <= 12.12\n\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\treturn support.reliableHiddenOffsets() ?\n\t\t( elem.offsetWidth <= 0 && elem.offsetHeight <= 0 &&\n\t\t\t!elem.getClientRects().length ) :\n\t\t\tfilterHidden( elem );\n};\n\njQuery.expr.filters.visible = function( elem ) {\n\treturn !jQuery.expr.filters.hidden( elem );\n};\n\n\n\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ) {\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t} ) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?\n\n\t// Support: IE6-IE8\n\tfunction() {\n\n\t\t// XHR cannot access local files, always use ActiveX for that case\n\t\tif ( this.isLocal ) {\n\t\t\treturn createActiveXHR();\n\t\t}\n\n\t\t// Support: IE 9-11\n\t\t// IE seems to error on cross-domain PATCH requests when ActiveX XHR\n\t\t// is used. In IE 9+ always use the native XHR.\n\t\t// Note: this condition won't catch Edge as it doesn't define\n\t\t// document.documentMode but it also doesn't support ActiveX so it won't\n\t\t// reach this code.\n\t\tif ( document.documentMode > 8 ) {\n\t\t\treturn createStandardXHR();\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// oldIE XHR does not support non-RFC2616 methods (#13240)\n\t\t// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx\n\t\t// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9\n\t\t// Although this check for six methods instead of eight\n\t\t// since IE also does not support \"trace\" and \"connect\"\n\t\treturn /^(get|post|head|put|delete|options)$/i.test( this.type ) &&\n\t\t\tcreateStandardXHR() || createActiveXHR();\n\t} :\n\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\nvar xhrId = 0,\n\txhrCallbacks = {},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\n// Support: IE<10\n// Open requests must be manually aborted on unload (#5280)\n// See https://support.microsoft.com/kb/2856746 for more info\nif ( window.attachEvent ) {\n\twindow.attachEvent( \"onunload\", function() {\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( undefined, true );\n\t\t}\n\t} );\n}\n\n// Determine support properties\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nxhrSupported = support.ajax = !!xhrSupported;\n\n// Create transport if the browser can provide an xhr\nif ( xhrSupported ) {\n\n\tjQuery.ajaxTransport( function( options ) {\n\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !options.crossDomain || support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\t\t\t\t\tvar i,\n\t\t\t\t\t\txhr = options.xhr(),\n\t\t\t\t\t\tid = ++xhrId;\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\txhr.open(\n\t\t\t\t\t\toptions.type,\n\t\t\t\t\t\toptions.url,\n\t\t\t\t\t\toptions.async,\n\t\t\t\t\t\toptions.username,\n\t\t\t\t\t\toptions.password\n\t\t\t\t\t);\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set headers\n\t\t\t\t\tfor ( i in headers ) {\n\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// IE's ActiveXObject throws a 'Type Mismatch' exception when setting\n\t\t\t\t\t\t// request header to a null-value.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// To keep consistent with other XHR implementations, cast the value\n\t\t\t\t\t\t// to string and ignore `undefined`.\n\t\t\t\t\t\tif ( headers[ i ] !== undefined ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] + \"\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( options.hasContent && options.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\t\t\t\t\t\tvar status, statusText, responses;\n\n\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t// Clean up\n\t\t\t\t\t\t\tdelete xhrCallbacks[ id ];\n\t\t\t\t\t\t\tcallback = undefined;\n\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\n\t\t\t\t\t\t\t// Abort manually if needed\n\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\tstatus = xhr.status;\n\n\t\t\t\t\t\t\t\t// Support: IE<10\n\t\t\t\t\t\t\t\t// Accessing binary-data responseText throws an exception\n\t\t\t\t\t\t\t\t// (#11426)\n\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\n\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\tif ( !status && options.isLocal && !options.crossDomain ) {\n\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\n\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, xhr.getAllResponseHeaders() );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// `xhr.send` may raise an exception, but it will be\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\tif ( !options.async ) {\n\n\t\t\t\t\t\t// If we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\twindow.setTimeout( callback );\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Register the callback, but delay it in case `xhr.send` throws\n\t\t\t\t\t\t// Add to the list of active xhr callbacks\n\t\t\t\t\t\txhr.onreadystatechange = xhrCallbacks[ id ] = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback( undefined, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t} );\n}\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t} catch ( e ) {}\n}\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || jQuery( \"head\" )[ 0 ] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement( \"script\" );\n\n\t\t\t\tscript.async = true;\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( script.parentNode ) {\n\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = null;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( undefined, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// data: string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\tcontext = context || document;\n\n\tvar parsed = rsingleTag.exec( data ),\n\t\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n// Keep a copy of the old load method\nvar _load = jQuery.fn.load;\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = jQuery.trim( url.slice( off, url.length ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.expr.filters.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\n\n/**\n * Gets a window from an element\n */\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\tjQuery.inArray( \"auto\", [ curCSSTop, curCSSLeft ] ) > -1;\n\n\t\t// need to be able to calculate position if either top or left\n\t\t// is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\toffset: function( options ) {\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar docElem, win,\n\t\t\tbox = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ],\n\t\t\tdoc = elem && elem.ownerDocument;\n\n\t\tif ( !doc ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocElem = doc.documentElement;\n\n\t\t// Make sure it's not a disconnected DOM node\n\t\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box;\n\t\t}\n\n\t\t// If we don't have gBCR, just use 0,0 rather than error\n\t\t// BlackBerry 5, iOS 3 (original iPhone)\n\t\tif ( typeof elem.getBoundingClientRect !== \"undefined\" ) {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t}\n\t\twin = getWindow( doc );\n\t\treturn {\n\t\t\ttop: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),\n\t\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n\t\t};\n\t},\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\tparentOffset = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ];\n\n\t\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0},\n\t\t// because it is its only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\t\t} else {\n\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top  += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? ( prop in win ) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n} );\n\n// Support: Safari<7-8+, Chrome<37-44+\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// getComputedStyle returns percent when specified for top/left/bottom/right\n// rather than make the css module depend on the offset module, we just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\tfunction( defaultExtra, funcName ) {\n\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only,\n\t\t\t\t\t// but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t} );\n} );\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t}\n} );\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in\n// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\nreturn jQuery;\n}));\n"
  },
  {
    "path": "example/callbacks/onbeforechange.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Callbacks: onbeforechange</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\"> <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\" data-step=\"5\" data-intro=\"Get it, use it.\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-step=\"1\" data-intro=\"This is a tooltip!\">Usage of onbeforechange</h1>\n        <p class=\"lead\" data-step=\"4\" data-intro=\"Another step.\">In this example you learn how to use <code>onbeforechange</code> callback to prevent displaying a step.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:startIntro();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\" data-step=\"2\" data-intro=\"Ok, wasn't that fun?\" data-position='right' data-scrollto='tooltip'>\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n\n        <div class=\"span6\" data-step=\"3\" data-intro=\"More features, more fun.\"  data-position='left'>\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n        </div>\n      </div>\n\n      <hr>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n\n    <script type=\"text/javascript\">\n      function startIntro(){\n        var intro = introJs.tour();\n        intro.onbeforechange(function () {\n          if (this.currentStep() === 2) {\n            alert('You cannot continue! :P')\n            return false;\n          }\n        });\n        intro.start();\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/custom-class/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Custom CSS Class</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n    <style>\n      .forLastStep {\n        font-weight: bold;\n      }\n      .customDefault {\n        color: gray;\n      }\n      .customDefault .introjs-skipbutton {\n        border-radius: 0;\n        color: red;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\" data-step=\"5\" data-tooltipclass='forLastStep' data-intro=\"Get it, use it.\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-step=\"1\" data-intro=\"This is a tooltip!\">Custom Class</h1>\n        <p class=\"lead\" data-step=\"4\" data-intro=\"Another step.\">Add custom CSS class to tooltip boxes using <code>data-tooltipClass</code> attribute and <code>tooltipClass</code> option.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:introJs.tour().setOption('tooltipClass', 'customDefault').start();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\" data-step=\"2\" data-intro=\"Ok, wasn't that fun?\" data-position='right'>\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n\n        <div class=\"span6\" data-step=\"3\" data-intro=\"More features, more fun.\"  data-position='left'>\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n        </div>\n      </div>\n\n      <hr>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/disable-interaction/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Disable Interaction</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\" data-step=\"5\" data-intro=\"Again, you can't click on the links.\" data-disable-interaction=\"1\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-step=\"1\" data-intro=\"Interaction is disabled in this step\" data-disable-interaction=\"1\">Disable Interaction</h1>\n        <p class=\"lead\" data-step=\"4\" data-intro=\"Another step.\">This page demonstrates the usage of <code>data-disable-interaction</code> attribute.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:introJs.tour().start();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\" data-step=\"2\" data-intro=\"Ok, wasn't that fun?\" data-position='right' data-scrollto='tooltip'>\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n\n        <div class=\"span6\" data-step=\"3\" data-intro=\"More features, more fun.\"  data-position='left'>\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n        </div>\n      </div>\n\n      <hr>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/disable-interaction/programmatic.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Programmatic Disable Interaction</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul id=\"step5\" class=\"nav nav-pills pull-right\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 id=\"step1\">Programmatic Disable Interaction</h1>\n        <p id=\"step4\" class=\"lead\">This page demonstrates the usage of <code>disableInteraction</code> option.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"startIntro();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div id=\"step2\" class=\"span6\">\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n        </div>\n\n        <div id=\"step3\" class=\"span6\">\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n        </div>\n      </div>\n\n      <hr>\n\n    </div>\n    <script type=\"text/javascript\" src=\"../../intro.js\"></script>\n    <script\ntype=\"text/javascript\">\n      function startIntro() {\n        var intro = introJs.tour();\n\n        intro.setOptions({\n          steps: [\n            {\n              intro: \"Hello world!\"\n            },\n            {\n              element: document.querySelector('#step1'),\n              intro: \"This is a tooltip. (interaction disabled)\",\n              disableInteraction: true\n            },\n            {\n              element: document.querySelectorAll('#step2')[0],\n              intro: \"Ok, wasn't that fun?\",\n              position: 'right'\n            },\n            {\n              element: '#step3',\n              intro: 'More features, more fun.',\n              position: 'left'\n            },\n            {\n              element: '#step4',\n              intro: \"Another step.\",\n              position: 'bottom'\n            },\n            {\n              element: '#step5',\n              intro: 'Get it, use it. (interaction disabled)',\n              disableInteraction: true\n            }\n          ]\n        });\n\n        intro.start();\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/dynamic-start/index.html",
    "content": "<!DOCTYPE html>\r\n<html lang=\"en\">\r\n  <head>\r\n    <!-- Intro.js by Afshin Mehrabani (@afshinmeh) in usabli.ca group -->\r\n    <meta charset=\"utf-8\">\r\n    <title>Pricing Elasticity Analysis: How does a price change impact my bottom line?</title>\r\n    <!--meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"-->\r\n    <meta name=\"description\" content='This Starter Kit will guide you through how you can use the A/B testing tools within Alteryx to answer \"How does a price change impact my bottom line?\" and similar questions.'>\r\n    <meta name=\"author\" content=\"Content Engineering - Stephen Wagner\">\r\n\r\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\r\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\r\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\r\n    <link href=\"./resources/step.css\" rel=\"stylesheet\">\r\n\r\n  </head>\r\n\r\n  <body style=\"text-align: center;padding-top: 50px;\">\r\n    <div id=\"overview\" style=\"display:block;margin-right: auto;margin-left: auto;\">\r\n      </br>\r\n      <img src=\"img/AB_Controls_Title.png\" style=\"height:auto;width:100%;\">\r\n      <p>An important step in running an A/B test is to match control and treatment units properly.<br>Matching units properly will allow you to control for differences between units and compare \"apples to apples\" as best as possible.<br>This guided workflow will demonstrate how to match control and treatment stores to use when analyzing which facial price performed the best.</p>\r\n      <button type=\"submit\" onclick=\"startIntro();\">Start Guided Workflow</button></br>\r\n      <p style=\"margin-top:5px;font-size:12px;\">Use keyboard arrow keys to progress through walkthrough.&nbsp;&nbsp;Press Esc to end walkthrough.</p>\r\n      <p style=\"margin-top:8px;font-size:10px;\"><i>For best viewing experience, please move the Results view underneath the Configuration view</i></p>\r\n    </div>\r\n\r\n    <div id=\"walkthrough\" style=\"display:none;\">\r\n      <div id=\"header\" class=\"section group\">\r\n        <img src=\"img/AB_Controls_Title.png\" style=\"height:48px;width:1020px;\">\r\n      </div>\r\n\r\n      <div id=\"workflow\" class=\"section group\" style=\"text-align:center;display:block;\">\r\n        <div id=\"col1\" class=\"col span_1_of_9\">\r\n          <div id=\"tool1\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool1.png\" onclick=\"step('7');\">\r\n          </div>\r\n          <div id=\"tool10\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool10.png\" onclick=\"step('13');\">\r\n          </div>\r\n          <div class=\"section group\">\r\n          </div>\r\n        </div>\r\n        <div id=\"col2\" class=\"col span_1_of_9\">\r\n          <div id=\"tool2\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool2.png\" onclick=\"step('9');\">\r\n          </div>\r\n          <div class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/line.png\">\r\n          </div>\r\n          <div class=\"section group\">\r\n          </div>\r\n        </div>\r\n        <div id=\"col3\" class=\"col span_1_of_9\">\r\n          <div id=\"tool3\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool3.png\" onclick=\"step('15');\">\r\n          </div>\r\n          <div class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/line2.png\">\r\n          </div>\r\n          <div class=\"section group\">\r\n            <img src=\"img/tools/line4.png\">\r\n          </div>\r\n        </div>\r\n        <div id=\"col4\" class=\"col span_1_of_9\">\r\n          <div id=\"tool4\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool4.png\" onclick=\"step('18');\">\r\n          </div>\r\n          <div id=\"tool11\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool11.png\" onclick=\"step('20');\">\r\n          </div>\r\n          <div id=\"tool14\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool14.png\" onclick=\"step('22');\">\r\n          </div>\r\n        </div>\r\n        <div id=\"col5\" class=\"col span_1_of_9\">\r\n          <div id=\"tool5\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool5.png\" onclick=\"step('24');\">\r\n          </div>\r\n          <div id=\"tool12\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool12.png\" onclick=\"step('24');\">\r\n          </div>\r\n          <div id=\"tool15\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool15.png\" onclick=\"step('24');\">\r\n          </div>\r\n        </div>\r\n        <div id=\"col6\" class=\"col span_1_of_9\">\r\n          <div id=\"tool6\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool6.png\" onclick=\"step('26');\">\r\n          </div>\r\n          <div id=\"tool13\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool13.png\" onclick=\"step('26');\">\r\n          </div>\r\n          <div id=\"tool16\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool16.png\" onclick=\"step('26');\">\r\n          </div>\r\n        </div>\r\n        <div id=\"col7\" class=\"col span_1_of_9\">\r\n          <div id=\"tool7\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool7.png\" onclick=\"step('30');\">\r\n          </div>\r\n          <div class=\"section group\">\r\n            <img src=\"img/tools/line3.png\">\r\n          </div>\r\n          <div class=\"section group\">\r\n            <img src=\"img/tools/line5.png\">\r\n          </div>\r\n        </div>\r\n        <div id=\"col8\" class=\"col span_1_of_9\">\r\n          <div id=\"tool8\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool8.png\" onclick=\"step('32');\">\r\n          </div>\r\n          <div class=\"section group\">\r\n          </div>\r\n          <div class=\"section group\">\r\n          </div>\r\n        </div>\r\n        <div id=\"col9\" class=\"col span_1_of_9\">\r\n          <div id=\"tool9\" class=\"section group\">\r\n            <img class=\"tool\" src=\"img/tools/tool9.png\" onclick=\"step('34');\">\r\n          </div>\r\n          <div class=\"section group\">\r\n          </div>\r\n          <div class=\"section group\">\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <div id=\"footer\" style=\"background-color:rgb(214,214,214);float:center;text-align:center;vertical-align:center;font-size:13px;\">\r\n        <p><i>Navigation Tips:&nbsp;&nbsp;Use keyboard arrow keys to progress through walkthrough.&nbsp;&nbsp;&nbsp;Press Esc to end walkthrough.&nbsp;&nbsp;&nbsp;Click on a tool to begin walkthrough at that step.</i></p>\r\n      </div>\r\n    </div>\r\n\r\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\r\n    <script type=\"text/javascript\" src=\"./resources/step.js\"></script>\r\n  </body>\r\n</html>\r\n"
  },
  {
    "path": "example/dynamic-start/resources/step.css",
    "content": "@import url(\"http://fonts.googleapis.com/css?family=Lato:400,700\");\n\n\nbody {\n  padding-top: 0px;\n  font-family: 'Lato', sans-serif;*/\n  padding-bottom: 0px;\n  width: auto;\n  height: auto;;\n  vertical-align: center;\n}\n\n#overview, #helpTip {\n  width: 1200px;\n  height: 300px;\n  vertical-align: center;\n  float: center;\n  text-align: center;\n}\n/*\n/*  SECTIONS  */\n.section {\n  clear: both;\n  padding: 0px;\n  margin: 0px;\n}\n\n/*  COLUMN SETUP  */\n.col {\n  display: block;\n  float: center;\n  margin: 0% 0 0% 0%;\n}\n.col:first-child { margin-left: 5px; }\n\n/*  GROUPING  */\n.group:before,\n.group:after { content:\"\"; display:table; }\n.group:after { clear:both;}\n.group { zoom:1; /* For IE 6/7 */ }\n\n\n/*  GRID OF SIXTEEN  */\n.span_1_of_9 {  width: 140px; }\n\n@media (min-width: 1200px) {\n  [class*=\"span\"] {\n    float: left;\n    min-height: 1px;\n    margin-left: 0px;\n  }\n}\n\nbutton, input, textarea, summary, a {\n    outline: none;\n}\n\nbutton {\n    display: inline-block;\n    margin: 0 0 0 5px;\n    padding: 6px 10px 7px 10px;\n    border-width: 1px;\n    border-style: solid;\n    font-family: 'Lato', Arial, sans-serif;\n    font-size: 1em;\n    cursor: pointer;\n    border-color: #bbb;\n    background-color: #eee;\n    color: #333;\n}\n\nbutton.secondary {\n    padding: 2px 10px 4px 10px;\n    line-height: 19px;\n}\n\nbutton:hover,\nbutton:focus {\n    background-color: #d2d2d2;\n    border-color: #999;\n}\n\nbutton.submit,\nbutton[type=\"submit\"] {\n    border-color: #1691C6;\n    background-color: #1691C6;\n    color: #fff;\n}\n\nbutton.submit:hover,\nbutton[type=\"submit\"]:hover,\nbutton.submit:focus,\nbutton[type=\"submit\"]:focus {\n    background-color: #1380AF;\n    border-color: #0059B2;\n}\n\nbutton.disabled,\nbutton:disabled,\nbutton:disabled:hover,\nbutton.disabled:hover,\nbutton:disabled:focus,\nbutton.disabled:focus {\n    border-color: #ccc;\n    color: #bbb;\n    background-color: transparent;\n    cursor: default;\n}\n\n.introjs-progress {\n  border-radius: 1px;\n  height: 5px;\n}\n\n.introjs-progressbar {\n  background-color: rgb(0,144,200);\n}\n\n.introjs-tooltip {\n  vertical-align: top;\n  min-width: 400px;\n  max-width: 900px;\n  max-height: 300px;\n}\n\n.tool {\n  cursor: pointer;\n}"
  },
  {
    "path": "example/dynamic-start/resources/step.js",
    "content": "var steps = [\r\n              {\r\n                 intro: \"Now that the data has been prepared and organized, we will use the <b>AB Trend</b> and <b>AB Controls</b> tools to determine our control-treatment store pairs.\",\r\n              },\r\n              {\r\n                 intro: \"It is important to think about differences between stores that would assist in properly matching control-treatment stores.  Variables that were deemed important for the day spa facial test are:<ul><li>Store sales trend &ndash; matching stores based on foot traffic</li><li>Seasonality of sales &ndash; matching stores with similar seasonal traffic patterns</li><li>Geographic region &ndash; to control for regional customer preferences</li></ul><br>The AB Trends tool automatically calculates the first two bullets &ndash; trend and seasonality.  Filter tools will be used to group stores by region.\",\r\n              },\r\n              {\r\n                 intro: 'Two datasets will used as sources:<ul><li>Weekly Store Traffic</li><li>Store List</li></ul>',\r\n              },\r\n              {\r\n                 intro: '<p style=\"font-size:13px;\">Weekly Store Traffic sample:<br><img src=\"img/data/Weekly_Store_Traffic.png\"></p>',\r\n              },\r\n              {\r\n                 intro: '<p style=\"font-size:13px;\">Store List sample:<br><img src=\"img/data/Store_List.png\"></p>',\r\n              },\r\n              {\r\n                 intro: 'One dataset will be created:<ul><li>Control-Treatment Pairs for A/B Analysis tool</li></ul>',\r\n              },\r\n              {\r\n                 intro: '<p style=\"font-size:13px;\">Control-Treatment Pairs sample:<br><img src=\"img/data/Control_Treatment_Pairs.png\"></p>',\r\n              },\r\n              {\r\n                 element: '#tool1',\r\n                 intro: 'Input tool will be used to bring in the Weekly Store Traffic data that was created in the data preparation workflow.',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool1',\r\n                 intro: 'Enter <code>.\\\\Supporting_Macros\\\\Data\\\\Weekly_Store_Traffic.yxdb</code> within the <b>Connect a File or Database</b> dialog<br><img src=\"img/configs/config1.png\"><br>Leave <b>Options</b> section as defaults',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool2',\r\n                 intro: \"Numeric measures are needed in order to match treatment stores to control candidates.  Two of the best measures to use are trend and seasonality.  In this case, the AB Trend tool will use weekly store traffic data &ndash; which we created in the data preparation workflow &ndash; to calculate these measures.\",\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool2',\r\n                 intro: '<img src=\"img/configs/config2.png\"><p style=\"font-size:12px;text-align:right;\"><i>Continued . . .</i></p>',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool2',\r\n                 intro: '<img src=\"img/configs/config2.1.png\">',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool2',\r\n                 intro: 'Run the workflow to generate metadata through the AB Trend tool.',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool10',\r\n                 intro: 'Input tool will be used to bring in the Store List data that was created in the data preparation workflow.',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool10',\r\n                 intro: 'Enter <code>.\\\\Supporting_Macros\\\\Data\\\\Store_List.yxdb</code> within the <b>Connect a File or Database</b> dialog<br><img src=\"img/configs/config10.png\"><br>Leave <b>Options</b> section as defaults',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool3',\r\n                 intro: \"The Store List data is added to the Weekly Store Traffic data stream using the Join tool.  Connect the AB Trend <code>Output</code> to the <code>Left Input</code> and Store List to the <code>Right Input</code>.\",\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool3',\r\n                 intro: 'Select <code>Join by Specific Fields</code> and select <code>Store</code> for both the <code>Left</code> and <code>Right</code>.<br><img src=\"img/configs/config3.png\"></br></br>Also, uncheck <code>Store</code> from the <code>Right Input</code>.</br><img src=\"img/configs/config3.1.png\">',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                intro: \"We want to match control and treatment stores separately for each region.  The next set of tools will be used to split the data stream into three regional streams &mdash; Midwest, East, and West.\"\r\n              },\r\n              {\r\n                 element: '#tool4',\r\n                 intro: \"Filter tool is used to remove all stores that are not in the Midwest Region.\",\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool4',\r\n                 intro: 'Using a <code>Basic Filter</code>, configure to show:<br><code>Region = Midwest</code>',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool11',\r\n                 intro: \"Filter tool is used to remove all stores that are not in the East Region.\",\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool11',\r\n                 intro: 'Using a <code>Basic Filter</code>, configure to show:<br><code>Region = East</code>',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool14',\r\n                 intro: \"Filter tool is used to remove the stores that are not in the West Region.\",\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool14',\r\n                 intro: 'Using a <code>Basic Filter</code>, configure to show:<br><code>Region = West</code>',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#col5',\r\n                 intro: \"Filter tool is used to subset data stream to only treatment stores &mdash; which will be connected to the Treatment (T) input of the AB Controls tool.\",\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#col5',\r\n                 intro: 'Configure all three filter tools to use a <code>Basic Filter</code> with<br><code>Test_Group = CC</code>',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#col6',\r\n                 intro: \"The AB Controls tool will use the Trend and Seasonality, calculated with the AB Trend tool, to match each treatment store to two control stores.  All three AB Controls tools will be configured the same.\",\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#col6',\r\n                 intro: '<img src=\"img/configs/config6.png\"><p style=\"font-size:12px;text-align:right;\"><i>Continued . . .</i></p>',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#col6',\r\n                 intro: '<img src=\"img/configs/config6.1.png\"><p style=\"font-size:12px;text-align:right;\"><i>Continued . . .</i></p>',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#col6',\r\n                 intro: '<img src=\"img/configs/config6.2.png\">',\r\n                 position: 'right'\r\n              },\r\n              {\r\n                 element: '#tool7',\r\n                 intro: 'The Union tool combines the data streams from all three Regions back into a single data stream.  Connect the <code>C Output</code> from each AB Controls tool to the Union <code>Input</code>.',\r\n                 position: 'left'\r\n              },\r\n              {\r\n                 element: '#tool7',\r\n                 intro: '<i>No configuration required</i>',\r\n                 position: 'left'\r\n              },\r\n              {\r\n                 element: '#tool8',\r\n                 intro: \"After determining the control-treatment pairs, the store attribute information is joined onto our data stream using the Join tool.  Connect the <code>Left Input</code> to the Union <code>Output</code> and the <code>Right Input</code> to the Store List Input Data tool.\",\r\n                 position: 'left'\r\n              },\r\n              {\r\n                 element: '#tool8',\r\n                 intro: 'Select <code>Join by Specific Fields</code> and select <code>Treatments</code> for <code>Left</code> and <code>Store</code> for the <code>Right</code>.<br><img src=\"img/configs/config8.png\" style=\"height:auto;width:65%;\"></br></br>Also, uncheck <code>Store</code> from the <code>Right Input</code>.</br><img src=\"img/configs/config8.1.png\" style=\"height:auto;width:65%;\">',\r\n                 position: 'left'\r\n              },\r\n              {\r\n                 element: '#tool9',\r\n                 intro: 'The Control-Treatment Pairs dataset is ready to be output using an Output Data tool.<br><br>This data will be used an an input for the A/B Analysis tool.',\r\n                 position: 'left'\r\n              },\r\n              {\r\n                 element: '#tool9',\r\n                 intro: 'Enter <code>.\\\\Supporting_Macros\\\\Data\\\\Control-Treatment_Pairs.yxdb</code> within the <b>Write to File or Database</b> dialog<br><img src=\"img/configs/config9.png\"><br>Leave <b>Options</b> section as defaults',\r\n                 position: 'left'\r\n              },\r\n              {\r\n                intro: 'Run the workflow to complete the AB Controls step.<br><br>After running the workflow, open the next guided workflow &mdash; <a href=\"../../4. Analyzing your test results.yxmd\">4. Analyzing your test results</a>.'\r\n              }\r\n            ];\r\n\r\nfunction startIntro(){\r\n\r\n        document.getElementById(\"overview\").setAttribute(\"style\", \"display: none\");\r\n        document.getElementById(\"walkthrough\").setAttribute(\"style\", \"display: inline-block\");\r\n\r\n        var intro = introJs();\r\n          intro.setOptions({\r\n            steps: steps,\r\n            showBullets: false,\r\n            showButtons: false,\r\n            showProgress: true,\r\n            exitOnOverlayClick: false,\r\n            showStepNumbers: false,\r\n            keyboardNavigation: true\r\n          });\r\n\r\n          intro.start();\r\n      }\r\n\r\n\r\n// Add  onclick=\"step('');\" to div with tool\r\nfunction step(num){\r\n  var intro = introJs();\r\n    intro.setOptions({\r\n      steps: steps,\r\n      showBullets: false,\r\n      showButtons: false,\r\n      showProgress: true,\r\n      exitOnOverlayClick: false,\r\n      showStepNumbers: false,\r\n      keyboardNavigation: true\r\n\r\n    });\r\n  intro.goToStep(num).start();\r\n}\r\n"
  },
  {
    "path": "example/groups/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Groups</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\" data-step=\"5\" data-intro=\"Get it, use it.\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1>Groups</h1>\n        <p class=\"lead\">An example of grouping, with <code>data-intro-group</code> attributes.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:introJs.tour().start('odd');\">Show me odds</a>\n        <a class=\"btn btn-large btn-info\" href=\"javascript:void(0);\" onclick=\"javascript:introJs.tour().start('even');\">Show me evens</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\">\n          <div data-step=\"1\" data-intro-group=\"odd\" data-intro=\"Here we go\">\n            <h4>Section One</h4>\n            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n          <div data-step=\"1\" data-intro-group=\"even\" data-intro=\"Here we go\">\n            <h4>Section Two</h4>\n            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n          <div data-step=\"2\" data-intro-group=\"odd\" data-intro=\"Through the list\">\n            <h4>Section Three</h4>\n            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n        </div>\n\n        <div class=\"span6\">\n          <div data-step=\"2\" data-intro-group=\"even\" data-intro=\"Through the list\">\n            <h4>Section Four</h4>\n            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n          <div data-step=\"3\" data-intro-group=\"odd\" data-intro=\"On and on...\">\n            <h4>Section Five</h4>\n            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n          <div data-step=\"3\" data-intro-group=\"even\" data-intro=\"On and on...\">\n            <h4>Section Six</h4>\n            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n        </div>\n      </div>\n\n      <hr>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/hello-world/exit-confirm.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Basic usage</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\" data-step=\"5\" data-intro=\"Get it, use it.\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-step=\"1\" data-intro=\"This is a tooltip!\">Confirm before exit</h1>\n        <p class=\"lead\" data-step=\"4\" data-intro=\"Another step.\">Shows a confirmation box before existing the tour using <code>onbeforeexit</code> callback.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:startTour();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\" data-step=\"2\" data-intro=\"Ok, wasn't that fun?\" data-position='right' data-scrollTo='tooltip'>\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n\n        <div class=\"span6\" data-step=\"3\" data-intro=\"More features, more fun.\"  data-position='left'>\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n        </div>\n      </div>\n\n      <hr>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n\n    <script type=\"text/javascript\">\n      function startTour() {\n        introJs.tour().start().onbeforeexit(function () {\n          return confirm(\"Are you sure?\");\n        });\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/hello-world/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Basic usage</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\" data-step=\"5\" data-intro=\"Get it, use it.\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-step=\"1\" data-intro=\"This is a tooltip!\" data-title=\"A short title\">Basic Usage</h1>\n        <p class=\"lead\" data-step=\"4\" data-intro=\"Another step.\" data-title=\"foo\">This is the basic usage of IntroJs, with <code>data-step</code> and <code>data-intro</code> attributes.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:introJs.tour().start();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\" data-step=\"2\" data-title=\"A very long title containing a lot of unnecessary text so that the title spans over multiple lines\" data-intro=\"Ok, wasn't that fun?\" data-position='right' data-scrollTo='tooltip'>\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n\n        <div class=\"span6\" data-step=\"3\" data-intro=\"More features, more fun.\"  data-position='left'>\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n        </div>\n      </div>\n\n      <hr>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/hello-world/positions.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Different element positions</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n\n    <style>\n.container-narrow div.masthead{\n    position: fixed;\n    width: 700px;\n    top: 0;\n    background-color: #fff;\n    border: 1px solid #E4E4E4;\n    z-index: 1;\n    padding: 10px;\n    border-radius: 2px;\n    border-top: 0;\n}\n\n    </style>\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\" data-intro=\"fixed position\">\n        <ul class=\"nav nav-pills pull-right\" data-step=\"5\" data-intro=\"Get it, use it.\" style=\"margin-bottom: 0;\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\" style=\"margin: 0;\">Intro.js</h3>\n      </div>\n\n      <div class=\"jumbotron\">\n        <h1 data-step=\"1\" data-intro=\"This is a tooltip!\" style=\"position: relative;\">Different element positions</h1>\n        <p class=\"lead\" data-step=\"4\" data-intro=\"Another step.\">In this example you see that Intro.js works with all types of <code>position</code>.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:introJs.tour().start();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\" data-step=\"2\" data-intro=\"Ok, wasn't that fun?\" data-position='right' style=\"position: relative;\">\n          <h4>Position fixed</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n\n        <div class=\"span6\" data-step=\"3\" data-intro=\"More features, more fun.\"  data-position='left'>\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n        </div>\n      </div>\n\n      <hr>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/hello-world/withProgress.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>With Progress-bar</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\" data-step=\"5\" data-intro=\"Get it, use it.\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-step=\"1\" data-intro=\"This is a tooltip!\">Progress-bar</h1>\n        <p class=\"lead\" data-step=\"4\" data-intro=\"Another step.\">This is the basic usage of IntroJs, with <code>data-step</code> and <code>data-intro</code> attributes.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:introJs.tour().setOption('showProgress', true).start();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\" data-step=\"2\" data-intro=\"Ok, wasn't that fun?\" data-position='right'>\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n\n        <div class=\"span6\" data-step=\"3\" data-intro=\"More features, more fun.\"  data-position='left'>\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n        </div>\n      </div>\n\n      <hr>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/hello-world/withScroll.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Basic usage</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n\n    <style>\n      .marketing {\n        height: 300px;\n        height: 40vh;\n        margin-top: 500px;\n        margin-top: 40vh;\n        overflow: auto;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-step=\"3\" data-intro=\"This is a tooltip!\">Works with a Scrollable Element</h1>\n        <p class=\"lead\">This is the basic usage of IntroJs, with <code>data-step</code> and <code>data-intro</code> attributes.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:introJs.tour().start();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n          <h4 data-step=\"2\" data-intro=\"Another step.\">Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <div>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          <h5>testing</h5>\n          </div>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4 data-step=\"1\" data-intro=\"A scrolling step.\">Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Seven</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Eight</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Nine</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci\n          faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Ten</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Eleven</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Twelve</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n      </div>\n\n      <hr>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/hello-world/withoutBullets.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Without Bullets</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\" data-step=\"5\" data-intro=\"Get it, use it.\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-step=\"1\" data-intro=\"This is a tooltip!\">Without Bullets</h1>\n        <p class=\"lead\" data-step=\"4\" data-intro=\"Another step.\">This is the basic usage of IntroJs, with <code>data-step</code> and <code>data-intro</code> attributes.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:introJs.tour().setOption('showBullets', false).start();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\" data-step=\"2\" data-intro=\"Ok, wasn't that fun?\" data-position='right'>\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n\n        <div class=\"span6\" data-step=\"3\" data-intro=\"More features, more fun.\"  data-position='left'>\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n        </div>\n      </div>\n\n      <hr>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/hello-world/withoutButtons.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Without Buttons</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\" data-step=\"5\" data-intro=\"Get it, use it.\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-step=\"1\" data-intro=\"This is a tooltip!\">Without Buttons</h1>\n        <p class=\"lead\" data-step=\"4\" data-intro=\"Another step.\">This is the basic usage of IntroJs, with <code>data-step</code> and <code>data-intro</code> attributes.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:introJs.tour().setOption('showButtons', false).start();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\" data-step=\"2\" data-intro=\"Ok, wasn't that fun?\" data-position='right'>\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n\n        <div class=\"span6\" data-step=\"3\" data-intro=\"More features, more fun.\"  data-position='left'>\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n        </div>\n      </div>\n\n      <hr>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/hint/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Hints</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n\n    <style>\n    .btn-group-justified {\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 nowrap;\n      flex-flow: row nowrap;\n    }\n    .btn-group-justified > * {\n      -webkit-box-flex: 1;\n      -ms-flex: 1 1 auto;\n      flex: 1 1 auto;\n    }\n    </style>\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\" data-hint=\"Get it, use it.\" data-position=\"bottom-left-aligned\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a data-hint=\"Tweet at me\" data-position=\"right\" href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">\n          <span data-hint=\"Nice to meet you\" data-position=\"bottom\">Intro.js</span>\n        </h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-hint=\"This is a tooltip!\" data-hint-position=\"top-middle\" data-position=\"top-right-aligned\">Hints</h1>\n        <p class=\"lead\">Add hints using <code>data-hint</code> attribute.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:introJs.hint().addHints();\">Add hints</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\">\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n\n        <div class=\"span6\">\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n        </div>\n      </div>\n\n      <hr>\n\n      <div class=\"btn-group btn-group-justified\" role=\"group\" aria-label=\"...\">\n          <button\n            type=\"button\"\n            role=\"button\"\n            data-hint=\"Left align\"\n            data-hint-position=\"top-middle\"\n            data-position=\"bottom\"\n            class=\"btn btn-default\">Left</button>\n          <button\n            type=\"button\"\n            role=\"button\"\n            data-hint=\"Middle align\"\n            data-hint-position=\"top-middle\"\n            data-position=\"bottom\"\n            class=\"btn btn-default\">Middle</button>\n          <button\n            type=\"button\"\n            role=\"button\"\n            data-hint=\"Right align\"\n            data-hint-position=\"top-middle\"\n            data-position=\"bottom\"\n            class=\"btn btn-default\">Right</button>\n        </div>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/hint/withElement.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Hints - With Element</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\" data-hint=\"Get it, use it.\" data-position=\"right\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-hint=\"This is a tooltip!\" data-hint-position=\"top-middle\" data-position=\"bottom-right-aligned\">Hints With Element</h1>\n        <p class=\"lead\">Add hints using <code>data-hint</code> attribute on a parent element.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:introJs.hint('.marketing').addHints();\">Add hints</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\">\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4 data-hint=\"The second section!\">Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n\n        <div class=\"span6\">\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4 data-hint=\"The last section!\">Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n        </div>\n      </div>\n\n      <hr>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/html-tooltip/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>HTML in tooltip</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul id=\"step5\" class=\"nav nav-pills pull-right\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 id=\"step1\">HTML in tooltip</h1>\n        <p id=\"step4\" class=\"lead\">We're going to use HTML codes in tooltips via Programmatic API</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"startIntro();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div id=\"step2\" class=\"span6\">\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n        </div>\n\n        <div id=\"step3\" class=\"span6\">\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n        </div>\n      </div>\n\n      <hr>\n\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n    <script type=\"text/javascript\">\n      function startIntro(){\n        var intro = introJs.tour();\n          intro.setOptions({\n            hideNext: true,\n            language: 'de_DE',\n            steps: [\n              {\n                title: '<p>Welcome</p>',\n                element: '#step1',\n                intro: \"This is a <b>bold</b> tooltip.\",\n                position: 'right'\n              },\n              {\n                element: '#step2',\n                intro: \"Ok, <i>wasn't</i> that fun?\",\n                position: 'bottom-right-aligned'\n              },\n              {\n                element: '#step3',\n                intro: 'More features, more <span style=\"color: red;\">f</span><span style=\"color: green;\">u</span><span style=\"color: blue;\">n</span>.',\n                position: 'top-middle-aligned'\n              },\n              {\n                element: '#step4',\n                intro: \"<span style='font-family: Tahoma'>Another step with new font!</span>\",\n                position: 'bottom-middle-aligned'\n              },\n              {\n                element: '#step5',\n                intro: '<strong>Get</strong> it, <strong>use</strong> it.'\n              }\n            ]\n          });\n\n          intro.start();\n      }\n    </script>\n  </body>\n</html>\n\n"
  },
  {
    "path": "example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Examples, Table of Contents</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"assets/css/demo.css\" rel=\"stylesheet\">\n    <link href=\"assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n    <div class=\"container-narrow\">\n      <div class=\"masthead\">\n        <h3 class=\"muted\">Examples</h3>\n      </div>\n\n      <hr>\n      <ul>\n        <li><a href=\"hello-world/index.html\" title='Basic usage'>Basic usage</a></li>\n        <li><a href=\"hello-world/withoutBullets.html\" title='Basic usage with buttons'>Basic usage with buttons</a></li>\n        <li><a href=\"hello-world/withoutButtons.html\" title='Basic usage with bullets'>Basic usage with bullets</a></li>\n        <li><a href=\"hello-world/withProgress.html\" title='Basic usage with progress-bar'>Basic usage with progress-bar</a></li>\n        <li><a href=\"hello-world/withScroll.html\" title='Basic usage with a scrolling element'>Basic usage with a scrolling element</a></li>\n        <li><a href=\"programmatic/index.html\" title='Programmatic defining using JSON'>Programmatic defining using JSON</a></li>\n        <li><a href=\"multi-page/index.html\" title='Multi-Page introduction'>Multi-Page introduction</a></li>\n        <li><a href=\"auto-position/index.html\" title='Auto-positioning'>Auto-positioning</a></li>\n        <li><a href=\"disable-interaction/index.html\" title='Disable interaction'>Disable interaction with elements</a></li>\n        <li><a href=\"RTL/index.html\" title='RTL version'>RTL version</a></li>\n        <li><a href=\"html-tooltip/index.html\" title='HTML in tooltip'>HTML in tooltip</a></li>\n        <li><a href=\"custom-class/index.html\" title='Custom CSS Class'>Custom CSS Class</a></li>\n        <li><a href=\"withoutElement/index.html\" title='Introduction without focusing on elements'>Introduction without focusing on elements</a></li>\n        <li><a href=\"bootstrap/v3/index.html\" title='Using with Bootstrap v3.0'>Using with Bootstrap v3.0</a></li>\n        <li><a href=\"svg/d3.htm\" title='Using Introjs with SVG Element'>Using with SVG Elements (D3)</a></li>\n        <li><a href=\"hint/index.html\" title='Basic hints usage'>Basic hints usage</a></li>\n        <li><a href=\"hint/withElement.html\" title='Basic hints usage on an element'>Basic hints usage on an element</a></li>\n        <li><a href=\"programmatic/hint.html\" title='Programmatic defining hints using JSON'>Programmatic defining hints using JSON</a></li>\n      </ul>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "example/multi-page/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Multi-page introduction, Page 1</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n    <div class=\"container-narrow\">\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-step=\"1\" data-intro=\"This is a tooltip!\">Multi-Page</span></h1>\n        <p class=\"lead\">Multi-page introduction, you will see three steps of introduction in this page.</p>\n        <a id=\"startButton\" class=\"btn btn-large btn-success\" href=\"javascript:void(0);\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\" data-step=\"2\" data-intro=\"Ok, wasn't that fun?\" data-position='right'>\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n\n        <div class=\"span6\" data-step=\"3\" data-intro=\"More features, more fun.\"  data-position='left'>\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n        </div>\n      </div>\n\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n    <script type=\"text/javascript\">\n      document.getElementById('startButton').onclick = function() {\n        introJs.tour().setOption('doneLabel', 'Next page').oncomplete(function() {\n          window.location.href = 'multi-page/second.html?multipage=true';\n        }).start();\n      };\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/multi-page/second.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Multi-page introduction, Page 2</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\" data-intro=\"Get it, use it.\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1>Second Page</span></h1>\n        <p class=\"lead\" data-intro=\"Another step.\">Next page of introduction!</p>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\">\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n        </div>\n\n        <div class=\"span6\">\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n        </div>\n      </div>\n\n\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n    <script type=\"text/javascript\">\n      if (RegExp('multipage', 'gi').test(window.location.search)) {\n        introJs.tour().start();\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/programmatic/hint.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Hints</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\">\n          <li  id='step4'><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 id='step1'>Hints</h1>\n        <p class=\"lead\">Adding hints using JSON + callbacks</p>\n        <a id='step2' class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"javascript:addHints();\">Add hints</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div class=\"span6\">\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n          </div>\n\n        <div class=\"span6\">\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n        </div>\n      </div>\n\n      <hr>\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n    <script type=\"text/javascript\">\n      function addHints(){\n        intro = introJs.hint();\n          intro.setOptions({\n            hints: [\n              {\n                element: document.querySelector('#step1'),\n                hint: \"This is a tooltip.\",\n                hintPosition: 'top-middle'\n              },\n              {\n                element: '#step2',\n                hint: 'More features, more fun.',\n                position: 'left'\n              },\n              {\n                element: '#step4',\n                hint: \"<b>Another</b> step.\",\n                hintPosition: 'top-middle'\n              }\n            ]\n          });\n\n          intro.onhintsadded(function() {\n              console.log('all hints added');\n          });\n\n          intro.onhintclick(function(hintElement, item, stepId) {\n              console.log('hint clicked', hintElement, item, stepId);\n          });\n\n          intro.onhintclose(function (stepId) {\n              console.log('hint closed', stepId);\n          });\n\n          intro.addHints();\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/programmatic/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Defining with JSON configuration</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul id=\"step5\" class=\"nav nav-pills pull-right\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 id=\"step1\">Programmatic</h1>\n        <p id=\"step4\" class=\"lead\">In this example we are going to define steps with JSON configuration.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"startIntro();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div id=\"step2\" class=\"span6\">\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n        </div>\n\n        <div id=\"step3\" class=\"span6\">\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n        </div>\n      </div>\n\n      <hr>\n\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n    <script type=\"text/javascript\">\n      function startIntro(){\n        var intro = introJs.tour();\n          intro.setOptions({\n            steps: [\n              {\n                intro: \"Hello world!\"\n              },\n              {\n                element: document.querySelector('#step1'),\n                intro: \"This is a tooltip.\"\n              },\n              {\n                element: document.querySelectorAll('#step2')[0],\n                intro: \"Ok, wasn't that fun?\",\n                position: 'right'\n              },\n              {\n                element: '#step3',\n                intro: 'More features, more fun.',\n                position: 'left'\n              },\n              {\n                element: '#step4',\n                intro: \"Another step.\",\n                position: 'bottom'\n              },\n              {\n                element: '#step5',\n                intro: 'Get it, use it.'\n              }\n            ]\n          });\n\n          intro.start();\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/svg/d3.htm",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Multi-page introduction, Page 1</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n    <div class=\"container-narrow\">\n      <div class=\"masthead\">\n        <ul class=\"nav nav-pills pull-right\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 data-intro=\"This is a tooltip!\">SVG</h1>\n        <p class=\"lead\">Using Introjs for SVG Element</p>\n        <a id=\"startButton\" class=\"btn btn-large btn-success\" href=\"javascript:void(0);\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <svg width=\"960\" height=\"500\">\n          <circle data-intro=\"hello\" cx=\"429\" cy=\"260\" r=\"32\" style=\"fill: rgb(31, 119, 180); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle>\n          <circle data-intro=\"second step intro\" cx=\"171\" cy=\"112\" r=\"32\" style=\"fill: rgb(174, 199, 232); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle>\n          <circle cx=\"414\" cy=\"51\" r=\"32\" style=\"fill: rgb(255, 127, 14); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"177\" cy=\"464\" r=\"32\" style=\"fill: rgb(255, 187, 120); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"680\" cy=\"378\" r=\"32\" style=\"fill: rgb(44, 160, 44); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"477\" cy=\"68\" r=\"32\" style=\"fill: rgb(152, 223, 138); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"867\" cy=\"395\" r=\"32\" style=\"fill: rgb(214, 39, 40); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"572\" cy=\"327\" r=\"32\" style=\"fill: rgb(255, 152, 150); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"87\" cy=\"427\" r=\"32\" style=\"fill: rgb(148, 103, 189); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"41\" cy=\"273\" r=\"32\" style=\"fill: rgb(197, 176, 213); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"382\" cy=\"443\" r=\"32\" style=\"fill: rgb(140, 86, 75); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"135\" cy=\"57\" r=\"32\" style=\"fill: rgb(196, 156, 148); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"821\" cy=\"144\" r=\"32\" style=\"fill: rgb(227, 119, 194); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"539\" cy=\"272\" r=\"32\" style=\"fill: rgb(247, 182, 210); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"886\" cy=\"93\" r=\"32\" style=\"fill: rgb(127, 127, 127); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"74\" cy=\"181\" r=\"32\" style=\"fill: rgb(199, 199, 199); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"526\" cy=\"299\" r=\"32\" style=\"fill: rgb(188, 189, 34); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"434\" cy=\"57\" r=\"32\" style=\"fill: rgb(219, 219, 141); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"722\" cy=\"394\" r=\"32\" style=\"fill: rgb(23, 190, 207); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle><circle cx=\"809\" cy=\"139\" r=\"32\" style=\"fill: rgb(158, 218, 229); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\"></circle>\n      </svg>\n\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n    <script type=\"text/javascript\">\n      document.getElementById('startButton').onclick = function() {\n        introJs.tour().start();\n      };\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/withoutElement/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Intro without focusing on elements</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Intro.js - Better introductions for websites and features with a step-by-step guide for your projects.\">\n    <meta name=\"author\" content=\"Afshin Mehrabani (@afshinmeh) in usabli.ca group\">\n\n    <!-- styles -->\n    <link href=\"../assets/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <link href=\"../assets/css/demo.css\" rel=\"stylesheet\">\n\n    <!-- Add IntroJs styles -->\n    <link href=\"../../dist/introjs.css\" rel=\"stylesheet\">\n\n    <link href=\"../assets/css/bootstrap-responsive.min.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div class=\"container-narrow\">\n\n      <div class=\"masthead\">\n        <ul id=\"step5\" class=\"nav nav-pills pull-right\">\n          <li><a href=\"https://github.com/usablica/intro.js/tags\"><i class='icon-black icon-download-alt'></i> Download</a></li>\n          <li><a href=\"https://github.com/usablica/intro.js\">Github</a></li>\n          <li><a href=\"https://twitter.com/usablica\">@usablica</a></li>\n        </ul>\n        <h3 class=\"muted\">Intro.js</h3>\n      </div>\n\n      <hr>\n\n      <div class=\"jumbotron\">\n        <h1 id=\"step1\">Without Element</h1>\n        <p id=\"step4\" class=\"lead\">This example shows the introductions without focusing on elements.</p>\n        <a class=\"btn btn-large btn-success\" href=\"javascript:void(0);\" onclick=\"startIntro();\">Show me how</a>\n      </div>\n\n      <hr>\n\n      <div class=\"row-fluid marketing\">\n        <div id=\"step2\" class=\"span6\">\n          <h4>Section One</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Two</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Three</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n        </div>\n\n        <div id=\"step3\" class=\"span6\">\n          <h4>Section Four</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n\n          <h4>Section Five</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n\n          <h4>Section Six</h4>\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis augue a neque cursus ac blandit orci faucibus. Phasellus nec metus purus.</p>\n        </div>\n      </div>\n\n      <hr>\n\n    </div>\n    <script type=\"text/javascript\" src=\"../../dist/intro.js\"></script>\n    <script type=\"text/javascript\">\n      function startIntro(){\n        var intro = introJs.tour();\n          intro.setOptions({\n            steps: [\n              {\n                intro: \"Hello world!\"\n              },\n              {\n                intro: \"You <b>don't need</b> to define element to focus, this is a floating tooltip.\"\n              },\n              {\n                element: document.querySelector('#step1'),\n                intro: \"This is a tooltip.\"\n              },\n              {\n                element: document.querySelectorAll('#step2')[0],\n                intro: \"Ok, wasn't that fun?\",\n                position: 'right'\n              },\n              {\n                element: '#step3',\n                intro: 'More features, more fun.',\n                position: 'left'\n              },\n              {\n                element: '#step4',\n                intro: \"Another step.\",\n                position: 'bottom'\n              },\n              {\n                element: '#step5',\n                intro: 'Get it, use it.'\n              }\n            ]\n          });\n\n          intro.start();\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "jest.config.js",
    "content": "module.exports = {\n  testEnvironment: 'jsdom',\n  clearMocks: true,\n  setupFilesAfterEnv: [\"jest-extended/all\"],\n  roots: [\"<rootDir>/tests/jest\", \"<rootDir>/src\"],\n  transform: {\n    '^.+\\\\.tsx?$': ['ts-jest', {\n      ...require('./tsconfig.test.json')\n    }],\n  },\n  moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],\n  setupFiles: ['<rootDir>/tests/jest/setup.ts'],\n  moduleNameMapper: {\n    '\\\\.(css|less|scss|sass)$': 'identity-obj-proxy',\n  },\n  testRegex: '(/__tests__/.*|(\\\\.|/)(test))\\\\.(ts|js)x?$',\n  coverageDirectory: 'coverage',\n  collectCoverageFrom: [\n    'src/**/*.{ts,tsx,js,jsx}',\n    '!src/**/*.cy.ts',\n    '!src/**/*.d.ts',\n    '!src/**/*.test.ts',\n  ],\n};\n"
  },
  {
    "path": "license.md",
    "content": "## License\n\nWe added commercial license to be able to provide better support, features and versions. If you are using Intro.js for a commercial project, you would need to get a commercial license at [introjs.com](http://introjs.com/#commercial). \n\nHowever, if you are using Intro.js version older than v2.0.0, you don't need to obtain a commercial license.\n\n### Commercial license\n\nIf you want to use Intro.js for a commercial application, theme or plugin the commercial license is the appropriate license. With this option, your source code is kept proprietary. Purchase a commercial license at [introjs.com](http://introjs.com/#commercial)\n\n### Open-source license\n\nCopyright (C) 2012-2022 Afshin Mehrabani (afshin.meh@gmail.com)\n\n### GNU AFFERO GENERAL PUBLIC LICENSE\n\nVersion 3, 19 November 2007\n\nCopyright (C) 2007 Free Software Foundation, Inc.\n<https://fsf.org/>\n\nEveryone is permitted to copy and distribute verbatim copies of this\nlicense document, but changing it is not allowed.\n\n### Preamble\n\nThe GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\nThe licenses for most software and other practical works are designed\nto take away your freedom to share and change the works. By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains\nfree software for all its users.\n\nWhen we speak of free software, we are referring to freedom, not\nprice. Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\nDevelopers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\nA secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate. Many developers of free software are heartened and\nencouraged by the resulting cooperation. However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\nThe GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community. It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server. Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\nAn older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals. This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing\nunder this license.\n\nThe precise terms and conditions for copying, distribution and\nmodification follow.\n\n### TERMS AND CONDITIONS\n\n#### 0. Definitions.\n\n\"This License\" refers to version 3 of the GNU Affero General Public\nLicense.\n\n\"Copyright\" also means copyright-like laws that apply to other kinds\nof works, such as semiconductor masks.\n\n\"The Program\" refers to any copyrightable work licensed under this\nLicense. Each licensee is addressed as \"you\". \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\nTo \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of\nan exact copy. The resulting work is called a \"modified version\" of\nthe earlier work or a work \"based on\" the earlier work.\n\nA \"covered work\" means either the unmodified Program or a work based\non the Program.\n\nTo \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy. Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\nTo \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies. Mere interaction with a user\nthrough a computer network, with no transfer of a copy, is not\nconveying.\n\nAn interactive user interface displays \"Appropriate Legal Notices\" to\nthe extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License. If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n#### 1. Source Code.\n\nThe \"source code\" for a work means the preferred form of the work for\nmaking modifications to it. \"Object code\" means any non-source form of\na work.\n\nA \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\nThe \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form. A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\nThe \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities. However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work. For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\nThe Corresponding Source need not include anything that users can\nregenerate automatically from other parts of the Corresponding Source.\n\nThe Corresponding Source for a work in source code form is that same\nwork.\n\n#### 2. Basic Permissions.\n\nAll rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met. This License explicitly affirms your unlimited\npermission to run the unmodified Program. The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work. This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\nYou may make, run and propagate covered works that you do not convey,\nwithout conditions so long as your license otherwise remains in force.\nYou may convey covered works to others for the sole purpose of having\nthem make modifications exclusively for you, or provide you with\nfacilities for running those works, provided that you comply with the\nterms of this License in conveying all material for which you do not\ncontrol copyright. Those thus making or running the covered works for\nyou must do so exclusively on your behalf, under your direction and\ncontrol, on terms that prohibit them from making any copies of your\ncopyrighted material outside their relationship with you.\n\nConveying under any other circumstances is permitted solely under the\nconditions stated below. Sublicensing is not allowed; section 10 makes\nit unnecessary.\n\n#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\nNo covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\nWhen you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such\ncircumvention is effected by exercising rights under this License with\nrespect to the covered work, and you disclaim any intention to limit\noperation or modification of the work as a means of enforcing, against\nthe work's users, your or third parties' legal rights to forbid\ncircumvention of technological measures.\n\n#### 4. Conveying Verbatim Copies.\n\nYou may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\nYou may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n#### 5. Conveying Modified Source Versions.\n\nYou may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these\nconditions:\n\n-   a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n-   b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under\n    section 7. This requirement modifies the requirement in section 4\n    to \"keep intact all notices\".\n-   c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy. This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged. This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n-   d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\nA compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit. Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n#### 6. Conveying Non-Source Forms.\n\nYou may convey a covered work in object code form under the terms of\nsections 4 and 5, provided that you also convey the machine-readable\nCorresponding Source under the terms of this License, in one of these\nways:\n\n-   a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n-   b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the Corresponding\n    Source from a network server at no charge.\n-   c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source. This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n-   d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge. You need not require recipients to copy the\n    Corresponding Source along with the object code. If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source. Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n-   e) Convey the object code using peer-to-peer transmission,\n    provided you inform other peers where the object code and\n    Corresponding Source of the work are being offered to the general\n    public at no charge under subsection 6d.\n\nA separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\nA \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal,\nfamily, or household purposes, or (2) anything designed or sold for\nincorporation into a dwelling. In determining whether a product is a\nconsumer product, doubtful cases shall be resolved in favor of\ncoverage. For a particular product received by a particular user,\n\"normally used\" refers to a typical or common use of that class of\nproduct, regardless of the status of the particular user or of the way\nin which the particular user actually uses, or expects or is expected\nto use, the product. A product is a consumer product regardless of\nwhether the product has substantial commercial, industrial or\nnon-consumer uses, unless such uses represent the only significant\nmode of use of the product.\n\n\"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to\ninstall and execute modified versions of a covered work in that User\nProduct from a modified version of its Corresponding Source. The\ninformation must suffice to ensure that the continued functioning of\nthe modified object code is in no case prevented or interfered with\nsolely because modification has been made.\n\nIf you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information. But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\nThe requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or\nupdates for a work that has been modified or installed by the\nrecipient, or for the User Product in which it has been modified or\ninstalled. Access to a network may be denied when the modification\nitself materially and adversely affects the operation of the network\nor violates the rules and protocols for communication across the\nnetwork.\n\nCorresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n#### 7. Additional Terms.\n\n\"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law. If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\nWhen you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit. (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.) You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\nNotwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders\nof that material) supplement the terms of this License with terms:\n\n-   a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n-   b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n-   c) Prohibiting misrepresentation of the origin of that material,\n    or requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n-   d) Limiting the use for publicity purposes of names of licensors\n    or authors of the material; or\n-   e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n-   f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions\n    of it) with contractual assumptions of liability to the recipient,\n    for any liability that these contractual assumptions directly\n    impose on those licensors and authors.\n\nAll other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10. If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term. If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\nIf you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\nAdditional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions; the\nabove requirements apply either way.\n\n#### 8. Termination.\n\nYou may not propagate or modify a covered work except as expressly\nprovided under this License. Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\nHowever, if you cease all violation of this License, then your license\nfrom a particular copyright holder is reinstated (a) provisionally,\nunless and until the copyright holder explicitly and finally\nterminates your license, and (b) permanently, if the copyright holder\nfails to notify you of the violation by some reasonable means prior to\n60 days after the cessation.\n\nMoreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\nTermination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License. If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n#### 9. Acceptance Not Required for Having Copies.\n\nYou are not required to accept this License in order to receive or run\na copy of the Program. Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance. However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work. These actions infringe copyright if you do\nnot accept this License. Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n#### 10. Automatic Licensing of Downstream Recipients.\n\nEach time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License. You are not responsible\nfor enforcing compliance by third parties with this License.\n\nAn \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations. If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\nYou may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License. For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n#### 11. Patents.\n\nA \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based. The\nwork thus licensed is called the contributor's \"contributor version\".\n\nA contributor's \"essential patent claims\" are all patent claims owned\nor controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version. For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\nEach contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\nIn the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement). To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\nIf you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients. \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\nIf, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\nA patent license is \"discriminatory\" if it does not include within the\nscope of its coverage, prohibits the exercise of, or is conditioned on\nthe non-exercise of one or more of the rights that are specifically\ngranted under this License. You may not convey a covered work if you\nare a party to an arrangement with a third party that is in the\nbusiness of distributing software, under which you make payment to the\nthird party based on the extent of your activity of conveying the\nwork, and under which the third party grants, to any of the parties\nwho would receive the covered work from you, a discriminatory patent\nlicense (a) in connection with copies of the covered work conveyed by\nyou (or copies made from those copies), or (b) primarily for and in\nconnection with specific products or compilations that contain the\ncovered work, unless you entered into that arrangement, or that patent\nlicense was granted, prior to 28 March 2007.\n\nNothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n#### 12. No Surrender of Others' Freedom.\n\nIf conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License. If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under\nthis License and any other pertinent obligations, then as a\nconsequence you may not convey it at all. For example, if you agree to\nterms that obligate you to collect a royalty for further conveying\nfrom those to whom you convey the Program, the only way you could\nsatisfy both those terms and this License would be to refrain entirely\nfrom conveying the Program.\n\n#### 13. Remote Network Interaction; Use with the GNU General Public License.\n\nNotwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your\nversion supports such interaction) an opportunity to receive the\nCorresponding Source of your version by providing access to the\nCorresponding Source from a network server at no charge, through some\nstandard or customary means of facilitating copying of software. This\nCorresponding Source shall include the Corresponding Source for any\nwork covered by version 3 of the GNU General Public License that is\nincorporated pursuant to the following paragraph.\n\nNotwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work. The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n#### 14. Revised Versions of this License.\n\nThe Free Software Foundation may publish revised and/or new versions\nof the GNU Affero General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number. If the Program\nspecifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation. If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever\npublished by the Free Software Foundation.\n\nIf the Program specifies that a proxy can decide which future versions\nof the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\nLater license versions may give you additional or different\npermissions. However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n#### 15. Disclaimer of Warranty.\n\nTHERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT\nWARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND\nPERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE\nDEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR\nCORRECTION.\n\n#### 16. Limitation of Liability.\n\nIN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR\nCONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES\nARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT\nNOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR\nLOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM\nTO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER\nPARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\n#### 17. Interpretation of Sections 15 and 16.\n\nIf the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\nEND OF TERMS AND CONDITIONS\n\n### How to Apply These Terms to Your New Programs\n\nIf you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these\nterms.\n\nTo do so, attach the following notices to the program. It is safest to\nattach them to the start of each source file to most effectively state\nthe exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n        Better introductions for websites and features with a step-by-step guide for your projects.\n        Copyright (C) 2012-2021 Afshin Mehrabani\n\n        This program is free software: you can redistribute it and/or modify\n        it under the terms of the GNU Affero General Public License as\n        published by the Free Software Foundation, either version 3 of the\n        License, or (at your option) any later version.\n\n        This program is distributed in the hope that it will be useful,\n        but WITHOUT ANY WARRANTY; without even the implied warranty of\n        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n        GNU Affero General Public License for more details.\n\n        You should have received a copy of the GNU Affero General Public License\n        along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper\nmail.\n\nIf your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source. For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code. There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for\nthe specific requirements.\n\nYou should also get your employer (if you work as a programmer) or\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary. For more information on this, and how to apply and follow\nthe GNU AGPL, see <https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"intro.js\",\n  \"version\": \"8.3.2\",\n  \"description\": \"User Onboarding and Product Walkthrough Library\",\n  \"keywords\": [\n    \"onboarding\",\n    \"tour\",\n    \"introjs\",\n    \"intro\",\n    \"guide\",\n    \"walkthrough\",\n    \"user-onboarding\"\n  ],\n  \"author\": \"Afshin Mehrabani <afshin.meh@gmail.com>\",\n  \"homepage\": \"https://introjs.com\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/usablica/intro.js\"\n  },\n  \"main\": \"intro.js\",\n  \"module\": \"intro.module.js\",\n  \"types\": \"src/index.d.ts\",\n  \"scripts\": {\n    \"prettier\": \"prettier --write '(src|tests)/**/*.(js|ts|json|html)' '!tests/cypress/setup/dist'\",\n    \"cypress:updatesnapshots\": \"start-server-and-test dev http://localhost:10001/dist/intro.js 'docker run -it -v $PWD:/e2e -w /e2e --entrypoint=cypress cypress/included:cypress-13.17.0-node-22.13.0-chrome-131.0.6778.264-1-ff-134.0-edge-131.0.2903.112-1 run --env visualRegressionType=base'\",\n    \"test\": \"run-p test:prettier test:jest test:cypress\",\n    \"test:prettier\": \"prettier --check '(src|tests)/**/*.(js|ts|json|html)' '!tests/cypress/setup/dist'\",\n    \"test:watch\": \"jest --watch\",\n    \"test:jest\": \"jest --coverage --silent --ci --coverage --coverageReporters=\\\"text\\\" --coverageReporters=\\\"text-summary\\\"\",\n    \"test:cypress:docker\": \"start-server-and-test dev http://localhost:10001/dist/intro.js 'docker run -it -v $PWD:/e2e -w /e2e --entrypoint=cypress cypress/included:cypress-13.17.0-node-22.13.0-chrome-131.0.6778.264-1-ff-134.0-edge-131.0.2903.112-1 run --env visualRegressionType=regression'\",\n    \"test:cypress\": \"start-server-and-test dev http://localhost:10001/dist/intro.js 'docker run -it -v $PWD:/e2e -w /e2e --entrypoint=cypress cypress/included:cypress-13.17.0-node-22.13.0-chrome-131.0.6778.264-1-ff-134.0-edge-131.0.2903.112-1 run --env visualRegressionType=regression || cypress run --env visualRegressionType=regression'\",\n    \"release\": \"./bin/release.sh || true\",\n    \"prebuild\": \"rimraf ./dist\",\n    \"build\": \"rollup -c\",\n    \"build:watch\": \"rollup -c -w\",\n    \"dev\": \"npm run build:watch -- --configPlugin serve\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.12.3\",\n    \"@babel/preset-env\": \"^7.20.2\",\n    \"@babel/preset-typescript\": \"^7.21.0\",\n    \"@rollup/plugin-commonjs\": \"^24.0.1\",\n    \"@rollup/plugin-json\": \"^6.0.0\",\n    \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n    \"@rollup/plugin-typescript\": \"^11.1.2\",\n    \"@types/jest\": \"^29.4.2\",\n    \"@types/jest-axe\": \"^3.5.9\",\n    \"@types/node\": \"^20.4.9\",\n    \"autoprefixer\": \"^9.0.0\",\n    \"babel-jest\": \"^29.2.2\",\n    \"core-js\": \"^3.6.5\",\n    \"cypress\": \"^13.12.0\",\n    \"cypress-real-events\": \"^1.13.0\",\n    \"cypress-visual-regression\": \"^5.2.1\",\n    \"eslint\": \"^8.0.1\",\n    \"jest\": \"^29.7.0\",\n    \"jest-axe\": \"^10.0.0\",\n    \"jest-environment-jsdom\": \"^30.0.5\",\n    \"jest-extended\": \"^3.2.4\",\n    \"jsdom\": \"^21.1.1\",\n    \"lerna-changelog\": \"^2.1.0\",\n    \"minify\": \"^9.1.0\",\n    \"node-sass\": \"^8.0.0\",\n    \"npm-run-all\": \"^4.1.5\",\n    \"postcss\": \"^8.4.21\",\n    \"postcss-clean\": \"^1.2.0\",\n    \"postcss-normalize\": \"^8.0.1\",\n    \"prettier\": \"2.8.8\",\n    \"rimraf\": \"^3.0.2\",\n    \"rollup\": \"^2.48.0\",\n    \"rollup-plugin-babel\": \"^4.4.0\",\n    \"rollup-plugin-commonjs\": \"^10.1.0\",\n    \"rollup-plugin-eslint\": \"^7.0.0\",\n    \"rollup-plugin-filesize\": \"^10.0.0\",\n    \"rollup-plugin-multi-entry\": \"^2.1.0\",\n    \"rollup-plugin-node-resolve\": \"^5.2.0\",\n    \"rollup-plugin-postcss\": \"^4.0.0\",\n    \"rollup-plugin-progress\": \"^1.1.2\",\n    \"rollup-plugin-serve\": \"^1.1.1\",\n    \"rollup-plugin-terser\": \"^7.0.2\",\n    \"start-server-and-test\": \"^2.0.4\",\n    \"ts-jest\": \"^29.1.1\",\n    \"tslib\": \"^2.6.0\",\n    \"typescript\": \"^5.1.6\"\n  },\n  \"engine\": [\n    \"node >=0.1.90\"\n  ],\n  \"files\": [\n    \"*.js\",\n    \"*.css\",\n    \"*.map\",\n    \"**/*.d.ts\",\n    \"themes/*\",\n    \"minified/*\",\n    \"!tests/**/*\"\n  ],\n  \"license\": \"AGPL-3.0\",\n  \"changelog\": {\n    \"labels\": {\n      \"new feature\": \":rocket: New Feature\",\n      \"breaking\": \":boom: Breaking Change\",\n      \"bug\": \":bug: Bug Fix\",\n      \"polish\": \":nail_care: Polish\",\n      \"documentation\": \":memo: Documentation\",\n      \"internal\": \":house: Internal\",\n      \"performance\": \":running_woman: Performance\"\n    },\n    \"cacheDir\": \".changelog\"\n  }\n}\n"
  },
  {
    "path": "rollup.config.js",
    "content": "import babel from 'rollup-plugin-babel';\nimport filesize from 'rollup-plugin-filesize';\nimport progress from 'rollup-plugin-progress';\nimport commonjs from '@rollup/plugin-commonjs'\nimport json from '@rollup/plugin-json';\nimport resolve from '@rollup/plugin-node-resolve';\nimport pkg from './package.json';\nimport { terser } from 'rollup-plugin-terser';\nimport autoprefixer from 'autoprefixer';\nimport normalize from 'postcss-normalize';\nimport clean from 'postcss-clean';\nimport postcss from 'rollup-plugin-postcss';\nimport typescript from '@rollup/plugin-typescript';\n\nconst inputPath = './src'\nconst outputPath = './dist';\n\nconst banner = `/*!\n * Intro.js v${pkg.version}\n * https://introjs.com\n *\n * Copyright (C) 2012-${new Date().getFullYear()} Afshin Mehrabani (@afshinmeh).\n * https://introjs.com\n *\n * Date: ${new Date().toUTCString()}\n */\n`;\n\nconst extensions = ['.ts', '.js'];\n\nconst jsPlugins = [\n  commonjs(),\n  json(),\n  resolve({ extensions }),\n  progress(),\n  filesize({\n    showGzippedSize: true,\n  }),\n  babel({\n    exclude: 'node_modules/**',\n    include: [`${inputPath}/**/*`],\n    extensions\n  }),\n  terser()\n];\n\nconst postCSSPlugins = [\n  normalize,\n  autoprefixer,\n  clean\n];\n\nexport default [\n  {\n    input: `${inputPath}/styles/introjs-rtl.scss`,\n    output: [{\n      file: `${outputPath}/introjs-rtl.css`,\n      format: 'es'\n    }, {\n      file: `${outputPath}/minified/introjs-rtl.min.css`,\n      format: 'es'\n    }],\n    plugins: [\n      postcss({\n        extract: true,\n        sourceMap: true,\n        plugins: postCSSPlugins\n      })\n    ]\n  },\n  {\n    input: `${inputPath}/styles/introjs.scss`,\n    output: [{\n      file: `${outputPath}/introjs.css`,\n      format: 'es'\n    }, {\n      file: `${outputPath}/minified/introjs.min.css`,\n      format: 'es'\n    }],\n    plugins: [\n      postcss({\n        extract: true,\n        sourceMap: true,\n        plugins: postCSSPlugins\n      })\n    ]\n  },\n  {\n    input: `${inputPath}/index.ts`,\n    output: [{\n      file: `${outputPath}/${pkg.main}`,\n      format: 'umd',\n      banner,\n      name: 'introJs',\n      sourcemap: true,\n    }, {\n      file: `${outputPath}/minified/${pkg.main.replace(/\\.js$/, '.min.js')}`,\n      format: 'umd',\n      banner,\n      name: 'introJs',\n      sourcemap: true,\n    }],\n    plugins: jsPlugins\n  },\n  {\n    input: `${inputPath}/index.ts`,\n    output: {\n      file: `${outputPath}/${pkg.module}`,\n      banner,\n      format: 'es',\n      name: 'introJs',\n      sourcemap: true,\n    },\n    plugins: [\n      typescript({\n        emitDeclarationOnly: true,\n        declaration: true,\n      }),\n      ...jsPlugins,\n    ]\n  }\n];\n"
  },
  {
    "path": "src/i18n/ar_SA.ts",
    "content": "export default {\n  buttons: {\n    next: \"التالي\",\n    prev: \"السابق\",\n    skip: \"تخطي\",\n    done: \"إنهاء\",\n    gotIt: \"فهمت\",\n  },\n  messages: {\n    dontShowAgainLabel: \"لا تظهر مرة أخرى\",\n    stepNumbersOfLabel: \"من\",\n  },\n};\n"
  },
  {
    "path": "src/i18n/de_DE.ts",
    "content": "export default {\n  buttons: {\n    next: \"Weiter\",\n    prev: \"Zurück\",\n    skip: \"Überspringen\",\n    done: \"Fertig\",\n    gotIt: \"Verstanden\",\n  },\n  messages: {\n    dontShowAgainLabel: \"Nicht wieder anzeigen\",\n    stepNumbersOfLabel: \"von\",\n  },\n};\n"
  },
  {
    "path": "src/i18n/en_US.ts",
    "content": "export default {\n  buttons: {\n    next: \"Next\",\n    prev: \"Back\",\n    skip: \"Skip\",\n    done: \"Done\",\n    gotIt: \"Got it\",\n  },\n  messages: {\n    dontShowAgainLabel: \"Don't show this again\",\n    stepNumbersOfLabel: \"of\",\n  },\n};\n"
  },
  {
    "path": "src/i18n/es_ES.ts",
    "content": "export default {\n  buttons: {\n    next: \"Siguiente\",\n    prev: \"Atrás\",\n    skip: \"Saltar\",\n    done: \"Hecho\",\n    gotIt: \"Entendido\",\n  },\n  messages: {\n    dontShowAgainLabel: \"No mostrar esto de nuevo\",\n    stepNumbersOfLabel: \"de\",\n  },\n};\n"
  },
  {
    "path": "src/i18n/fa_IR.ts",
    "content": "export default {\n  buttons: {\n    next: \"بعدی\",\n    prev: \"قبلی\",\n    skip: \"رد کردن\",\n    done: \"پایان\",\n    gotIt: \"فهمیدم\",\n  },\n  messages: {\n    dontShowAgainLabel: \"دیگر این را نشان نده\",\n    stepNumbersOfLabel: \"از\",\n  },\n};\n"
  },
  {
    "path": "src/i18n/fr_FR.ts",
    "content": "export default {\n  buttons: {\n    next: \"Suivant\",\n    prev: \"Retour\",\n    skip: \"Passer\",\n    done: \"Terminé\",\n    gotIt: \"Compris\",\n  },\n  messages: {\n    dontShowAgainLabel: \"Ne plus afficher ceci\",\n    stepNumbersOfLabel: \"sur\",\n  },\n};\n"
  },
  {
    "path": "src/i18n/language.test.ts",
    "content": "import { Translator, getAvailableLanguages, LanguageCode } from \"./language\";\n\n// Store original navigator\nconst originalNavigator = global.navigator;\n\n// Mock navigator object\nconst createMockNavigator = (language?: string, userLanguage?: string) => {\n  const mockNavigator: any = {};\n\n  if (language !== undefined) mockNavigator.language = language;\n  if (userLanguage !== undefined) mockNavigator.userLanguage = userLanguage;\n\n  if (language === undefined && userLanguage === undefined) {\n    mockNavigator.language = \"en-US\";\n  }\n\n  Object.defineProperty(global, \"navigator\", {\n    value: mockNavigator,\n    writable: true,\n    configurable: true,\n  });\n\n  return mockNavigator;\n};\n\ndescribe(\"Translator\", () => {\n  beforeEach(() => createMockNavigator());\n  afterAll(() => {\n    Object.defineProperty(global, \"navigator\", {\n      value: originalNavigator,\n      writable: true,\n      configurable: true,\n    });\n  });\n\n  describe(\"Constructor\", () => {\n    it(\"should use provided language code\", () => {\n      const translator = new Translator(\"es_ES\");\n      expect(translator.translate(\"buttons.next\")).toBe(\"Siguiente\");\n    });\n\n    it(\"should detect browser language and match locale\", () => {\n      createMockNavigator(\"fr-FR\");\n      const translator = new Translator();\n      expect(translator.translate(\"buttons.next\")).toBe(\"Suivant\");\n    });\n\n    it(\"should fallback to en_US for unsupported languages\", () => {\n      createMockNavigator(\"zh-CN\");\n      const translator = new Translator();\n      expect(translator.translate(\"buttons.next\")).toBe(\"Next\");\n    });\n\n    it(\"should handle underscores and dashes in language codes\", () => {\n      createMockNavigator(\"es_ES\");\n      const translator1 = new Translator();\n      expect(translator1.translate(\"buttons.next\")).toBe(\"Siguiente\");\n\n      createMockNavigator(\"fr-FR\");\n      const translator2 = new Translator();\n      expect(translator2.translate(\"buttons.next\")).toBe(\"Suivant\");\n    });\n  });\n\n  describe(\"setLanguage\", () => {\n    it(\"should change active language correctly\", () => {\n      const translator = new Translator(\"en_US\");\n      translator.setLanguage(\"fr_FR\");\n      expect(translator.translate(\"buttons.done\")).toBe(\"Terminé\");\n\n      translator.setLanguage(\"fa_IR\");\n      expect(translator.translate(\"buttons.done\")).toBe(\"پایان\");\n    });\n\n    it(\"should work with all supported languages\", () => {\n      const translator = new Translator();\n      ([\"en_US\", \"es_ES\", \"fr_FR\", \"de_DE\", \"fa_IR\"] as LanguageCode[]).forEach(\n        (code) => {\n          translator.setLanguage(code);\n          expect(typeof translator.translate(\"buttons.next\")).toBe(\"string\");\n        }\n      );\n    });\n  });\n\n  describe(\"translate\", () => {\n    let translator: Translator;\n\n    beforeEach(() => (translator = new Translator(\"en_US\")));\n\n    it(\"should translate standard keys\", () => {\n      expect(translator.translate(\"buttons.next\")).toBe(\"Next\");\n      expect(translator.translate(\"buttons.prev\")).toBe(\"Back\");\n      expect(translator.translate(\"buttons.done\")).toBe(\"Done\");\n    });\n\n    it(\"should return key if not found\", () => {\n      expect(translator.translate(\"nonexistent.key\")).toBe(\"nonexistent.key\");\n    });\n  });\n\n  describe(\"getAvailableLanguages\", () => {\n    it(\"should return all language codes\", () => {\n      const codes = getAvailableLanguages();\n      expect(codes).toEqual(\n        expect.arrayContaining([\"en_US\", \"es_ES\", \"fr_FR\", \"de_DE\", \"fa_IR\"])\n      );\n    });\n  });\n\n  describe(\"Integration with Tour options\", () => {\n    class MockTour {\n      private _options: any = {};\n      setOptions(options: any) {\n        const processed = { ...options };\n        if (processed.language) {\n          const translator = new Translator(processed.language);\n          processed.nextLabel =\n            processed.nextLabel ?? translator.translate(\"buttons.next\");\n          processed.prevLabel =\n            processed.prevLabel ?? translator.translate(\"buttons.prev\");\n          processed.doneLabel =\n            processed.doneLabel ?? translator.translate(\"buttons.done\");\n        }\n        this._options = { ...this._options, ...processed };\n      }\n      getOption(key: string) {\n        return this._options[key];\n      }\n    }\n\n    it(\"should translate labels based on language code\", () => {\n      const tour = new MockTour();\n      tour.setOptions({ language: \"es_ES\" });\n      expect(tour.getOption(\"nextLabel\")).toBe(\"Siguiente\");\n      expect(tour.getOption(\"prevLabel\")).toBe(\"Atrás\");\n      expect(tour.getOption(\"doneLabel\")).toBe(\"Hecho\");\n    });\n\n    it(\"should not override custom labels\", () => {\n      const tour = new MockTour();\n      tour.setOptions({ language: \"fr_FR\", nextLabel: \"Custom Next\" });\n      expect(tour.getOption(\"nextLabel\")).toBe(\"Custom Next\");\n      expect(tour.getOption(\"doneLabel\")).toBe(\"Terminé\");\n    });\n\n    it(\"should handle multiple languages sequentially\", () => {\n      const tour = new MockTour();\n      tour.setOptions({ language: \"de_DE\" });\n      expect(tour.getOption(\"nextLabel\")).toBe(\"Weiter\");\n\n      tour.setOptions({ language: \"fa_IR\" });\n      expect(tour.getOption(\"nextLabel\")).toBe(\"بعدی\");\n    });\n  });\n});\n"
  },
  {
    "path": "src/i18n/language.ts",
    "content": "import enUS from \"./en_US\";\nimport faIR from \"./fa_IR\";\nimport deDE from \"./de_DE\";\nimport esES from \"./es_ES\";\nimport frFR from \"./fr_FR\";\nimport ar_SA from \"./ar_SA\";\n\nconst languages = {\n  en_US: enUS,\n  fa_IR: faIR,\n  de_DE: deDE,\n  es_ES: esES,\n  fr_FR: frFR,\n  ar_SA: ar_SA,\n} as const;\n\nexport type LanguageCode = keyof typeof languages;\nexport const DefaultLanguage = Object.keys(languages)[0] as LanguageCode;\ntype Messages = { [key: string]: string | Messages };\n\nexport function getAvailableLanguages(): LanguageCode[] {\n  return Object.keys(languages) as LanguageCode[];\n}\n\nexport class Translator {\n  private _languageCode: LanguageCode;\n\n  constructor(languageCode?: LanguageCode) {\n    if (languageCode && languages[languageCode]) {\n      this._languageCode = languageCode;\n    } else {\n      const rawLang = (\n        navigator.language ||\n        (navigator as any).userLanguage ||\n        DefaultLanguage\n      ).replace(\"-\", \"_\");\n\n      const normalizedLang = (Object.keys(languages) as LanguageCode[]).find(\n        (key) => key.toLowerCase() === rawLang.toLowerCase()\n      );\n\n      this._languageCode = normalizedLang ?? DefaultLanguage;\n    }\n  }\n\n  setLanguage(code: LanguageCode) {\n    if (languages[code]) {\n      this._languageCode = code;\n    }\n  }\n\n  getLanguage(): LanguageCode {\n    return this._languageCode;\n  }\n\n  private get messages() {\n    return languages[this._languageCode];\n  }\n\n  private getString(\n    message: string,\n    obj: Messages = this.messages\n  ): string | null {\n    const parts = message.split(\".\");\n    let current: Messages | string = obj;\n\n    for (const part of parts) {\n      if (typeof current !== \"object\" || !(part in current)) return null;\n      current = current[part];\n    }\n\n    return typeof current === \"string\" ? current : null;\n  }\n\n  translate(message: string): string {\n    return this.getString(message) ?? message;\n  }\n}\n"
  },
  {
    "path": "src/index.test.ts",
    "content": "import { Tour } from \"./packages/tour\";\nimport introJs from \"./index\";\nimport { Hint } from \"./packages/hint\";\n\ndescribe(\"index\", () => {\n  it(\"should create a new instance of Tour\", () => {\n    // Arrange\n    const stubElement = document.createElement(\"div\");\n    jest.spyOn(document, \"createElement\").mockReturnValue(stubElement);\n\n    // Act\n    const tourInstance = introJs.tour(stubElement);\n\n    // Assert\n    expect(tourInstance).toBeInstanceOf(Tour);\n  });\n\n  it(\"should create a new instance of Hint\", () => {\n    // Arrange\n    const stubElement = document.createElement(\"div\");\n    jest.spyOn(document, \"createElement\").mockReturnValue(stubElement);\n\n    // Act\n    const hintInstance = introJs.hint(stubElement);\n\n    // Assert\n    expect(hintInstance).toBeInstanceOf(Hint);\n  });\n});\n"
  },
  {
    "path": "src/index.ts",
    "content": "import { version } from \"../package.json\";\nimport { Hint } from \"./packages/hint\";\nimport { Tour } from \"./packages/tour\";\n\nclass LegacyIntroJs extends Tour {\n  /**\n   * @deprecated introJs().addHints() is deprecated, please use introJs.hint().addHints() instead\n   * @param args\n   */\n  addHints(..._: any[]) {\n    console.error(\n      \"introJs().addHints() is deprecated, please use introJs.hint.addHints() instead.\"\n    );\n  }\n\n  /**\n   * @deprecated introJs().addHint() is deprecated, please use introJs.hint.addHint() instead\n   * @param args\n   */\n  addHint(..._: any[]) {\n    console.error(\n      \"introJs().addHint() is deprecated, please use introJs.hint.addHint() instead.\"\n    );\n  }\n\n  /**\n   * @deprecated introJs().removeHints() is deprecated, please use introJs.hint.hideHints() instead\n   * @param args\n   */\n  removeHints(..._: any[]) {\n    console.error(\n      \"introJs().removeHints() is deprecated, please use introJs.hint.removeHints() instead.\"\n    );\n  }\n}\n\n/**\n * Intro.js module\n */\nconst introJs = (elementOrSelector?: string | HTMLElement) => {\n  console.warn(\n    \"introJs() is deprecated. Please use introJs.tour() or introJs.hint() instead.\"\n  );\n  return new LegacyIntroJs(elementOrSelector);\n};\n\n/**\n * Create a new Intro.js Tour instance\n * @param elementOrSelector Optional target element to start the Tour on\n */\nintroJs.tour = (elementOrSelector?: string | HTMLElement) =>\n  new Tour(elementOrSelector);\n\n/**\n * Create a new Intro.js Hint instance\n * @param elementOrSelector Optional target element to start the Hint on\n */\nintroJs.hint = (elementOrSelector?: string | HTMLElement) =>\n  new Hint(elementOrSelector);\n\n/**\n * Current Intro.js version\n */\nintroJs.version = version;\n\nexport default introJs;\n"
  },
  {
    "path": "src/option.test.ts",
    "content": "import { setOption, setOptions } from \"./option\";\nimport { Translator } from \"./i18n/language\";\n\nObject.defineProperty(global, \"navigator\", {\n  value: { language: \"en-US\" },\n  writable: true,\n});\n\ndescribe(\"option\", () => {\n  describe(\"setOption\", () => {\n    it(\"should set option\", () => {\n      const mockOption: any = { key1: \"value1\" };\n\n      // Act → capture return value\n      const result = setOption(mockOption, \"key1\", \"newValue1\");\n\n      //Assert\n      expect(result.key1).toBe(\"newValue1\");\n      expect(mockOption.key1).toBe(\"value1\");\n    });\n  });\n\n  describe(\"setOptions\", () => {\n    it(\"should set options\", () => {\n      const mockOption: any = { key1: \"value1\", key2: \"value2\" };\n\n      // Act → capture return value\n      const result = setOptions(mockOption, {\n        key2: \"newValue2\",\n        key1: \"newValue1\",\n      });\n\n      // Assert\n      expect(result.key1).toBe(\"newValue1\");\n      expect(result.key2).toBe(\"newValue2\");\n      expect(mockOption.key1).toBe(\"value1\");\n      expect(mockOption.key2).toBe(\"value2\");\n    });\n  });\n\n  describe(\"setOptions with language\", () => {\n    it(\"should set language when provided\", () => {\n      const mockOption: any = {};\n      // Act\n      const result = setOptions(mockOption, { language: \"fr_FR\" });\n      // Assert\n      expect(result.language).toEqual(\"fr_FR\");\n    });\n\n    it(\"should not override language when other options change\", () => {\n      const mockOption: any = {\n        language: \"en_US\",\n      };\n      // Act\n      const result = setOptions(mockOption, { htmlRender: true });\n      // Assert\n      expect(result.language).toEqual(\"en_US\");\n      expect(result.htmlRender).toBe(true);\n    });\n\n    it(\"should keep other options even if language changes\", () => {\n      const mockOption: any = {\n        language: \"en_US\",\n        htmlRender: true,\n        customProp: \"test\",\n      };\n      // Act\n      const updatedOption = setOption(mockOption, \"language\", \"fr_FR\");\n      // Assert\n      expect(updatedOption.language).toEqual(\"fr_FR\");\n      expect(updatedOption.htmlRender).toBe(true);\n      expect(updatedOption.customProp).toBe(\"test\");\n    });\n  });\n\n  describe(\"Label handling and emoji overrides\", () => {\n    it(\"should override label with emoji when language is already set\", () => {\n      const options: any = {\n        language: \"de_DE\",\n        nextLabel: \"Weiter\",\n        prevLabel: \"Zurück\",\n        doneLabel: \"Fertig\",\n      };\n\n      const updated = setOptions(options, { nextLabel: \"➡️\" });\n\n      expect(updated.nextLabel).toBe(\"➡️\"); // emoji kept\n      expect(updated.prevLabel).toBe(\"Zurück\"); // other labels stay German\n      expect(updated.doneLabel).toBe(\"Fertig\");\n    });\n\n    it(\"overWritten emoji label when changing language\", () => {\n      const options: any = {\n        language: \"de_DE\",\n        nextLabel: \"➡️\",\n        prevLabel: \"Zurück\",\n        doneLabel: \"Fertig\",\n      };\n\n      const updated = setOptions(options, { language: \"fr_FR\" });\n\n      expect(updated.nextLabel).toBe(\"Suivant\"); // emoji overWritten by French\n      const t = new Translator(\"fr_FR\");\n      expect(updated.prevLabel).toBe(t.translate(\"buttons.prev\")); // now French\n      expect(updated.doneLabel).toBe(t.translate(\"buttons.done\"));\n    });\n\n    it(\"should retranslate all labels if none are custom\", () => {\n      const options: any = { language: \"en_US\" };\n      const updated = setOptions(options, { language: \"de_DE\" });\n\n      const t = new Translator(\"de_DE\");\n      expect(updated.nextLabel).toBe(t.translate(\"buttons.next\"));\n      expect(updated.prevLabel).toBe(t.translate(\"buttons.prev\"));\n      expect(updated.doneLabel).toBe(t.translate(\"buttons.done\"));\n    });\n\n    it(\"should keep emoji doneLabel when language is not set\", () => {\n      const defaultOptions: any = {\n        nextLabel: \"Next\",\n        prevLabel: \"Back\",\n        doneLabel: \"Done\",\n      };\n\n      const withEmoji = setOptions(defaultOptions, { doneLabel: \"✅\" });\n\n      const afterStart = setOptions(withEmoji, { isActive: true });\n\n      expect(afterStart.doneLabel).toBe(\"✅\");\n\n      expect(afterStart.nextLabel).toBe(\"Next\");\n      expect(afterStart.prevLabel).toBe(\"Back\");\n    });\n  });\n});\n"
  },
  {
    "path": "src/option.ts",
    "content": "import { getDefaultTourOptions, TourOptions } from \"./packages/tour/option\";\nimport { getDefaultHintOptions, HintOptions } from \"./packages/hint/option\";\nimport { Translator, DefaultLanguage } from \"./i18n/language\";\n\nfunction isHintOptions(options: any): options is HintOptions {\n  return \"hints\" in options;\n}\n\nexport function applyLanguageDefaults<T extends TourOptions | HintOptions>(\n  options: T\n): T {\n  const language = options.language ?? DefaultLanguage;\n  const translator = new Translator();\n  translator.setLanguage(language);\n\n  if (isHintOptions(options)) {\n    const translatedOptions = getDefaultHintOptions(translator);\n\n    return {\n      ...options,\n      hintButtonLabel: translatedOptions.hintButtonLabel,\n    };\n  } else {\n    const translatedOptions = getDefaultTourOptions(translator);\n\n    return {\n      ...options,\n      doneLabel: translatedOptions.doneLabel,\n      nextLabel: translatedOptions.nextLabel,\n      prevLabel: translatedOptions.prevLabel,\n      skipLabel: translatedOptions.skipLabel,\n      dontShowAgainLabel: translatedOptions.dontShowAgainLabel,\n      stepNumbersOfLabel: translatedOptions.stepNumbersOfLabel,\n    };\n  }\n}\n\n/**\n * Update a single option.\n * Special handling for language: regenerates defaults in the new language.\n */\nexport function setOption<\n  T extends TourOptions | HintOptions,\n  K extends keyof T\n>(options: T, key: K, value: T[K]): T {\n  if (key === \"language\") {\n    return applyLanguageDefaults({ ...options, language: value } as T);\n  }\n\n  return { ...options, [key]: value };\n}\n\n/**\n * Update multiple options at once.\n */\nexport function setOptions<T extends TourOptions | HintOptions>(\n  options: T,\n  partialOptions: Partial<T>\n): T {\n  let updated = { ...options };\n  for (const [key, value] of Object.entries(partialOptions)) {\n    updated = setOption(updated, key as keyof T, value as T[keyof T]);\n  }\n  return updated;\n}\n"
  },
  {
    "path": "src/packages/dom/index.test.ts",
    "content": "import van, { State } from \".\";\n\nconst {\n  a,\n  b,\n  button,\n  div,\n  h2,\n  i,\n  input,\n  li,\n  option,\n  p,\n  pre,\n  select,\n  span,\n  sup,\n  table,\n  tbody,\n  td,\n  th,\n  thead,\n  tr,\n  ul,\n} = van.tags;\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\nconst waitMsForDerivations = 5;\n\nconst createHiddenDom = () => {\n  const dom = div({ class: \"hidden\" });\n  van.add(document.body, dom);\n  return dom;\n};\n\ndescribe(\"van\", () => {\n  describe(\"tag\", () => {\n    it(\"should create basic tag\", () => {\n      const dom = div(\n        p(\"👋Hello\"),\n        ul(li(\"🗺️World\"), li(a({ href: \"https://vanjs.org/\" }, \"🍦VanJS\")))\n      );\n\n      expect(dom.outerHTML).toBe(\n        '<div><p>👋Hello</p><ul><li>🗺️World</li><li><a href=\"https://vanjs.org/\">🍦VanJS</a></li></ul></div>'\n      );\n    });\n\n    it(\"should add onclick event\", () => {\n      const dom = div(\n        button({ onclick: () => van.add(dom, p(\"Button clicked!\")) })\n      );\n      dom.querySelector(\"button\")!.click();\n      expect(dom.outerHTML).toBe(\n        \"<div><button></button><p>Button clicked!</p></div>\"\n      );\n    });\n\n    it(\"should escape html tags\", () => {\n      expect(p(\"<input>\").outerHTML).toBe(\"<p>&lt;input&gt;</p>\");\n      expect(div(\"a && b\").outerHTML).toBe(\"<div>a &amp;&amp; b</div>\");\n      expect(div(\"<input a && b>\").outerHTML).toBe(\n        \"<div>&lt;input a &amp;&amp; b&gt;</div>\"\n      );\n    });\n\n    it(\"should create nested tags\", () => {\n      expect(ul([li(\"Item 1\"), li(\"Item 2\"), li(\"Item 3\")]).outerHTML).toBe(\n        \"<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li></ul>\"\n      );\n    });\n\n    it(\"should create deep nested tags\", () => {\n      expect(ul([[li(\"Item 1\"), [li(\"Item 2\")]], li(\"Item 3\")]).outerHTML).toBe(\n        \"<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li></ul>\"\n      );\n    });\n\n    it(\"should create tags with null props\", () => {\n      const dom = button({ onclick: null });\n      expect(dom.onclick === null);\n    });\n\n    it(\"should connect props to state\", async () => {\n      const href = van.state(\"http://example.com/\");\n      const dom = a({ href }, \"Test Link\");\n      van.add(createHiddenDom(), dom);\n      expect(dom.href).toBe(\"http://example.com/\");\n      href.val = \"https://vanjs.org/\";\n      await sleep(waitMsForDerivations);\n      expect(dom.href).toBe(\"https://vanjs.org/\");\n    });\n\n    it(\"should not change props when state is disconnected\", async () => {\n      const href = van.state(\"http://example.com/\");\n      const dom = a({ href }, \"Test Link\");\n      expect(dom.href).toBe(\"http://example.com/\");\n      href.val = \"https://vanjs.org/\";\n      await sleep(waitMsForDerivations);\n      // href won't change as dom is not connected to document\n      expect(dom.href).toBe(\"http://example.com/\");\n    });\n\n    it(\"should change connect onclick handler with state\", async () => {\n      const dom = div();\n      van.add(createHiddenDom(), dom);\n      // TODO: fix the any type here. It should ideally be an EventListener | null\n      const handler = van.state(<any>(\n        (() => van.add(dom, p(\"Button clicked!\")))\n      ));\n      van.add(dom, button({ onclick: handler }));\n      dom.querySelector(\"button\")!.click();\n      expect(dom.outerHTML).toBe(\n        \"<div><button></button><p>Button clicked!</p></div>\"\n      );\n\n      handler.val = () => van.add(dom, div(\"Button clicked!\"));\n      await sleep(waitMsForDerivations);\n      dom.querySelector(\"button\")!.click();\n      expect(dom.outerHTML).toBe(\n        \"<div><button></button><p>Button clicked!</p><div>Button clicked!</div></div>\"\n      );\n\n      handler.val = null;\n      await sleep(waitMsForDerivations);\n      dom.querySelector(\"button\")!.click();\n      expect(dom.outerHTML).toBe(\n        \"<div><button></button><p>Button clicked!</p><div>Button clicked!</div></div>\"\n      );\n    });\n\n    it(\"should not change onclick handler when state is disconnected\", async () => {\n      const dom = div();\n      const handler = van.state(() => van.add(dom, p(\"Button clicked!\")));\n      van.add(dom, button({ onclick: handler }));\n      dom.querySelector(\"button\")!.click();\n      expect(dom.outerHTML).toBe(\n        \"<div><button></button><p>Button clicked!</p></div>\"\n      );\n\n      handler.val = () => van.add(dom, div(\"Button clicked!\"));\n      await sleep(waitMsForDerivations);\n      dom.querySelector(\"button\")!.click();\n      // The onclick handler won't change as dom is not connected to document, as a result, the <p> element will be added\n      expect(dom.outerHTML).toBe(\n        \"<div><button></button><p>Button clicked!</p><p>Button clicked!</p></div>\"\n      );\n    });\n\n    it(\"should update props from a derived state\", async () => {\n      const host = van.state(\"example.com\");\n      const path = van.state(\"/hello\");\n      const dom = a(\n        { href: () => `https://${host.val}${path.val}` },\n        \"Test Link\"\n      );\n      van.add(createHiddenDom(), dom);\n      expect(dom.href).toBe(\"https://example.com/hello\");\n      host.val = \"vanjs.org\";\n      path.val = \"/start\";\n      await sleep(waitMsForDerivations);\n      expect(dom.href).toBe(\"https://vanjs.org/start\");\n    });\n\n    it(\"should not update props from a disconnected derived state\", async () => {\n      const host = van.state(\"example.com\");\n      const path = van.state(\"/hello\");\n      const dom = a(\n        { href: () => `https://${host.val}${path.val}` },\n        \"Test Link\"\n      );\n      expect(dom.href).toBe(\"https://example.com/hello\");\n      host.val = \"vanjs.org\";\n      path.val = \"/start\";\n      await sleep(waitMsForDerivations);\n      // href won't change as dom is not connected to document\n      expect(dom.href).toBe(\"https://example.com/hello\");\n    });\n\n    it(\"should update props when partial state\", async () => {\n      const host = van.state(\"example.com\");\n      const path = \"/hello\";\n      const dom = a({ href: () => `https://${host.val}${path}` }, \"Test Link\");\n      van.add(createHiddenDom(), dom);\n      expect(dom.href).toBe(\"https://example.com/hello\");\n      host.val = \"vanjs.org\";\n      await sleep(waitMsForDerivations);\n      expect(dom.href).toBe(\"https://vanjs.org/hello\");\n    });\n\n    it(\"should not update props when partial state is disconnected\", async () => {\n      const host = van.state(\"example.com\");\n      const path = \"/hello\";\n      const dom = a({ href: () => `https://${host.val}${path}` }, \"Test Link\");\n      expect(dom.href).toBe(\"https://example.com/hello\");\n      host.val = \"vanjs.org\";\n      await sleep(waitMsForDerivations);\n      // href won't change as dom is not connected to document\n      expect(dom.href).toBe(\"https://example.com/hello\");\n    });\n\n    it(\"should render correctly when connected state throws an error\", async () => {\n      const text = van.state(\"hello\");\n      const dom = div(\n        div(\n          {\n            class: () => {\n              if (text.val === \"fail\") throw new Error();\n              return text.val;\n            },\n            \"data-name\": text,\n          },\n          text\n        ),\n        div(\n          {\n            class: () => {\n              if (text.val === \"fail\") throw new Error();\n              return text.val;\n            },\n            \"data-name\": text,\n          },\n          text\n        )\n      );\n      van.add(createHiddenDom(), dom);\n      expect(dom.outerHTML).toBe(\n        '<div><div class=\"hello\" data-name=\"hello\">hello</div><div class=\"hello\" data-name=\"hello\">hello</div></div>'\n      );\n\n      text.val = \"fail\";\n      await sleep(waitMsForDerivations);\n      // The binding function for `class` property throws an error.\n      // We want to validate the `class` property won't be updated because of the error,\n      // but other properties and child nodes are updated as usual.\n      expect(dom.outerHTML).toBe(\n        '<div><div class=\"hello\" data-name=\"fail\">fail</div><div class=\"hello\" data-name=\"fail\">fail</div></div>'\n      );\n    });\n\n    it(\"should render correct when disconnected state throws an error\", async () => {\n      const text = van.state(\"hello\");\n      const dom = div(\n        div(\n          {\n            class: () => {\n              if (text.val === \"fail\") throw new Error();\n              return text.val;\n            },\n            \"data-name\": text,\n          },\n          text\n        ),\n        div(\n          {\n            class: () => {\n              if (text.val === \"fail\") throw new Error();\n              return text.val;\n            },\n            \"data-name\": text,\n          },\n          text\n        )\n      );\n      expect(dom.outerHTML).toBe(\n        '<div><div class=\"hello\" data-name=\"hello\">hello</div><div class=\"hello\" data-name=\"hello\">hello</div></div>'\n      );\n\n      text.val = \"fail\";\n      await sleep(waitMsForDerivations);\n      // `dom` won't change as it's not connected to document\n      expect(dom.outerHTML).toBe(\n        '<div><div class=\"hello\" data-name=\"hello\">hello</div><div class=\"hello\" data-name=\"hello\">hello</div></div>'\n      );\n    });\n\n    it(\"should change and trigger onclick handler when state is connected\", async () => {\n      const hiddenDom = createHiddenDom();\n      const elementName = van.state(\"p\");\n      van.add(\n        hiddenDom,\n        button({\n          onclick: van.derive(() => {\n            const name = elementName.val;\n            return name\n              ? () => van.add(hiddenDom, van.tags[name](\"Button clicked!\"))\n              : null;\n          }),\n        })\n      );\n      hiddenDom.querySelector(\"button\")!.click();\n      expect(hiddenDom.innerHTML).toBe(\n        \"<button></button><p>Button clicked!</p>\"\n      );\n\n      elementName.val = \"div\";\n      await sleep(waitMsForDerivations);\n      hiddenDom.querySelector(\"button\")!.click();\n      expect(hiddenDom.innerHTML).toBe(\n        \"<button></button><p>Button clicked!</p><div>Button clicked!</div>\"\n      );\n\n      elementName.val = \"\";\n      await sleep(waitMsForDerivations);\n      hiddenDom.querySelector(\"button\")!.click();\n      expect(hiddenDom.innerHTML).toBe(\n        \"<button></button><p>Button clicked!</p><div>Button clicked!</div>\"\n      );\n    });\n\n    it(\"should not change onclick handler when state is disconnected\", async () => {\n      const dom = div();\n      const elementName = van.state(\"p\");\n      van.add(\n        dom,\n        button({\n          onclick: van.derive(() => {\n            const name = elementName.val;\n            return name\n              ? () => van.add(dom, van.tags[name](\"Button clicked!\"))\n              : null;\n          }),\n        })\n      );\n      dom.querySelector(\"button\")!.click();\n      expect(dom.innerHTML).toBe(\"<button></button><p>Button clicked!</p>\");\n\n      elementName.val = \"div\";\n      await sleep(waitMsForDerivations);\n      // The onclick handler won't change as `dom` is not connected to document,\n      // as a result, the <p> element will be added.\n      dom.querySelector(\"button\")!.click();\n      expect(dom.innerHTML).toBe(\n        \"<button></button><p>Button clicked!</p><p>Button clicked!</p>\"\n      );\n    });\n\n    it(\"should update data attributes when state is connected\", async () => {\n      const lineNum = van.state(1);\n      const dom = div(\n        {\n          \"data-type\": \"line\",\n          \"data-id\": lineNum,\n          \"data-line\": () => `line=${lineNum.val}`,\n        },\n        \"This is a test line\"\n      );\n      van.add(createHiddenDom(), dom);\n      expect(dom.outerHTML).toBe(\n        '<div data-type=\"line\" data-id=\"1\" data-line=\"line=1\">This is a test line</div>'\n      );\n\n      lineNum.val = 3;\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\n        '<div data-type=\"line\" data-id=\"3\" data-line=\"line=3\">This is a test line</div>'\n      );\n    });\n\n    it(\"should not update data attributes when state is disconnected\", async () => {\n      const lineNum = van.state(1);\n      const dom = div(\n        {\n          \"data-type\": \"line\",\n          \"data-id\": lineNum,\n          \"data-line\": () => `line=${lineNum.val}`,\n        },\n        \"This is a test line\"\n      );\n      expect(dom.outerHTML).toBe(\n        '<div data-type=\"line\" data-id=\"1\" data-line=\"line=1\">This is a test line</div>'\n      );\n\n      lineNum.val = 3;\n      await sleep(waitMsForDerivations);\n      // Attributes won't change as dom is not connected to document\n      expect(dom.outerHTML).toBe(\n        '<div data-type=\"line\" data-id=\"1\" data-line=\"line=1\">This is a test line</div>'\n      );\n    });\n\n    it(\"should update readonly props when state is connected\", async () => {\n      const form = van.state(\"form1\");\n      const dom = button({ form }, \"Button\");\n      van.add(createHiddenDom(), dom);\n      expect(dom.outerHTML).toBe('<button form=\"form1\">Button</button>');\n\n      form.val = \"form2\";\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe('<button form=\"form2\">Button</button>');\n\n      expect(input({ list: \"datalist1\" }).outerHTML).toBe(\n        '<input list=\"datalist1\">'\n      );\n    });\n\n    it(\"should not update readonly props when state is disconnected\", async () => {\n      const form = van.state(\"form1\");\n      const dom = button({ form }, \"Button\");\n      expect(dom.outerHTML).toBe('<button form=\"form1\">Button</button>');\n\n      form.val = \"form2\";\n      await sleep(waitMsForDerivations);\n      // Attributes won't change as dom is not connected to document\n      expect(dom.outerHTML).toBe('<button form=\"form1\">Button</button>');\n\n      expect(input({ list: \"datalist1\" }).outerHTML).toBe(\n        '<input list=\"datalist1\">'\n      );\n    });\n\n    it(\"should add custom event handler\", () => {\n      const dom = div(\n        button({ oncustom: () => van.add(dom, p(\"Event triggered!\")) })\n      );\n      dom.querySelector(\"button\")!.dispatchEvent(new Event(\"custom\"));\n      expect(dom.innerHTML).toBe(\"<button></button><p>Event triggered!</p>\");\n    });\n\n    it(\"should add custom event handler with state\", async () => {\n      const hiddenDom = createHiddenDom();\n      const oncustom = van.state(() =>\n        van.add(hiddenDom, p(\"Handler 1 triggered!\"))\n      );\n      van.add(hiddenDom, button({ oncustom }));\n      hiddenDom.querySelector(\"button\")!.dispatchEvent(new Event(\"custom\"));\n      expect(hiddenDom.innerHTML).toBe(\n        \"<button></button><p>Handler 1 triggered!</p>\"\n      );\n\n      oncustom.val = () => van.add(hiddenDom, p(\"Handler 2 triggered!\"));\n      await sleep(waitMsForDerivations);\n      hiddenDom.querySelector(\"button\")!.dispatchEvent(new Event(\"custom\"));\n      expect(hiddenDom.innerHTML).toBe(\n        \"<button></button><p>Handler 1 triggered!</p><p>Handler 2 triggered!</p>\"\n      );\n    });\n\n    it(\"should add state derived custom event handler\", async () => {\n      const handlerType = van.state(1);\n      const hiddenDom = createHiddenDom();\n      van.add(\n        hiddenDom,\n        button({\n          oncustom: van.derive(() =>\n            handlerType.val === 1\n              ? () => van.add(hiddenDom, p(\"Handler 1 triggered!\"))\n              : () => van.add(hiddenDom, p(\"Handler 2 triggered!\"))\n          ),\n        })\n      );\n      hiddenDom.querySelector(\"button\")!.dispatchEvent(new Event(\"custom\"));\n      expect(hiddenDom.innerHTML).toBe(\n        \"<button></button><p>Handler 1 triggered!</p>\"\n      );\n\n      handlerType.val = 2;\n      await sleep(waitMsForDerivations);\n      hiddenDom.querySelector(\"button\")!.dispatchEvent(new Event(\"custom\"));\n      expect(hiddenDom.innerHTML).toBe(\n        \"<button></button><p>Handler 1 triggered!</p><p>Handler 2 triggered!</p>\"\n      );\n    });\n\n    it(\"should add child as connected state\", async () => {\n      const hiddenDom = createHiddenDom();\n      const line2 = van.state(<string | null>\"Line 2\");\n      const dom = div(pre(\"Line 1\"), pre(line2), pre(\"Line 3\"));\n      van.add(hiddenDom, dom);\n      expect(dom.outerHTML).toBe(\n        \"<div><pre>Line 1</pre><pre>Line 2</pre><pre>Line 3</pre></div>\"\n      );\n\n      line2.val = \"Line 2: Extra Stuff\";\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\n        \"<div><pre>Line 1</pre><pre>Line 2: Extra Stuff</pre><pre>Line 3</pre></div>\"\n      );\n\n      // null to remove text DOM\n      line2.val = null;\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\n        \"<div><pre>Line 1</pre><pre></pre><pre>Line 3</pre></div>\"\n      );\n\n      // Resetting the state won't bring the text DOM back\n      line2.val = \"Line 2\";\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\n        \"<div><pre>Line 1</pre><pre></pre><pre>Line 3</pre></div>\"\n      );\n    });\n\n    it(\"should not update child when state is disconnected\", async () => {\n      const line2 = van.state(<string | null>\"Line 2\");\n      const dom = div(pre(\"Line 1\"), pre(line2), pre(\"Line 3\"));\n      expect(dom.outerHTML).toBe(\n        \"<div><pre>Line 1</pre><pre>Line 2</pre><pre>Line 3</pre></div>\"\n      );\n\n      line2.val = \"Line 2: Extra Stuff\";\n      await sleep(waitMsForDerivations);\n      // Content won't change as dom is not connected to document\n      expect(dom.outerHTML).toBe(\n        \"<div><pre>Line 1</pre><pre>Line 2</pre><pre>Line 3</pre></div>\"\n      );\n\n      line2.val = null;\n      await sleep(waitMsForDerivations);\n      // Content won't change as dom is not connected to document\n      expect(dom.outerHTML).toBe(\n        \"<div><pre>Line 1</pre><pre>Line 2</pre><pre>Line 3</pre></div>\"\n      );\n    });\n\n    it(\"should not delete dom when child is a state\", async () => {\n      const text = van.state(\"Text\");\n      const dom = p(text);\n      van.add(createHiddenDom(), dom);\n      expect(dom.outerHTML).toBe(\"<p>Text</p>\");\n      text.val = \"\";\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\"<p></p>\");\n      text.val = \"Text\";\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\"<p>Text</p>\");\n    });\n\n    it(\"should create svg elements\", () => {\n      const { circle, path, svg } = van.tags(\"http://www.w3.org/2000/svg\");\n      const dom = svg(\n        { width: \"16px\", viewBox: \"0 0 50 50\" },\n        circle({\n          cx: \"25\",\n          cy: \"25\",\n          r: \"20\",\n          stroke: \"black\",\n          \"stroke-width\": \"2\",\n          fill: \"yellow\",\n        }),\n        circle({\n          cx: \"16\",\n          cy: \"20\",\n          r: \"2\",\n          stroke: \"black\",\n          \"stroke-width\": \"2\",\n          fill: \"black\",\n        }),\n        circle({\n          cx: \"34\",\n          cy: \"20\",\n          r: \"2\",\n          stroke: \"black\",\n          \"stroke-width\": \"2\",\n          fill: \"black\",\n        }),\n        path({\n          d: \"M 15 30 Q 25 40, 35 30\",\n          stroke: \"black\",\n          \"stroke-width\": \"2\",\n          fill: \"transparent\",\n        })\n      );\n      expect(dom.outerHTML).toBe(\n        '<svg width=\"16px\" viewBox=\"0 0 50 50\"><circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"black\" stroke-width=\"2\" fill=\"yellow\"></circle><circle cx=\"16\" cy=\"20\" r=\"2\" stroke=\"black\" stroke-width=\"2\" fill=\"black\"></circle><circle cx=\"34\" cy=\"20\" r=\"2\" stroke=\"black\" stroke-width=\"2\" fill=\"black\"></circle><path d=\"M 15 30 Q 25 40, 35 30\" stroke=\"black\" stroke-width=\"2\" fill=\"transparent\"></path></svg>'\n      );\n    });\n\n    it(\"should create math elements\", () => {\n      const { math, mi, mn, mo, mrow, msup } = van.tags(\n        \"http://www.w3.org/1998/Math/MathML\"\n      );\n      const dom = math(\n        msup(mi(\"e\"), mrow(mi(\"i\"), mi(\"π\"))),\n        mo(\"+\"),\n        mn(\"1\"),\n        mo(\"=\"),\n        mn(\"0\")\n      );\n      expect(dom.outerHTML).toBe(\n        \"<math><msup><mi>e</mi><mrow><mi>i</mi><mi>π</mi></mrow></msup><mo>+</mo><mn>1</mn><mo>=</mo><mn>0</mn></math>\"\n      );\n    });\n  });\n\n  describe(\"add\", () => {\n    it(\"should add elements to the document\", () => {\n      const dom = ul();\n      expect(van.add(dom, li(\"Item 1\"), li(\"Item 2\"))).toBe(dom);\n      expect(dom.outerHTML).toBe(\"<ul><li>Item 1</li><li>Item 2</li></ul>\");\n      expect(van.add(dom, li(\"Item 3\"), li(\"Item 4\"), li(\"Item 5\"))).toBe(dom);\n      expect(dom.outerHTML).toBe(\n        \"<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li><li>Item 4</li><li>Item 5</li></ul>\"\n      );\n      // No-op if no children specified\n      expect(van.add(dom)).toBe(dom);\n      expect(dom.outerHTML).toBe(\n        \"<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li><li>Item 4</li><li>Item 5</li></ul>\"\n      );\n    });\n\n    it(\"should add nested elements\", () => {\n      const dom = ul();\n      expect(van.add(dom, [li(\"Item 1\"), li(\"Item 2\")])).toBe(dom);\n      expect(dom.outerHTML).toBe(\"<ul><li>Item 1</li><li>Item 2</li></ul>\");\n    });\n\n    it(\"should add deeply nested elements\", () => {\n      const dom = ul();\n      van.add(dom, [li(\"Item 1\"), li(\"Item 2\")]);\n      // Deeply nested\n      expect(van.add(dom, [[li(\"Item 3\"), [li(\"Item 4\")]], li(\"Item 5\")])).toBe(\n        dom\n      );\n      expect(dom.outerHTML).toBe(\n        \"<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li><li>Item 4</li><li>Item 5</li></ul>\"\n      );\n    });\n\n    it(\"should ignore empty array\", () => {\n      const dom = ul();\n      van.add(dom, [li(\"Item 1\"), li(\"Item 2\")]);\n      // No-op if no children specified\n      expect(van.add(dom, [[[]]])).toBe(dom);\n      expect(dom.outerHTML).toBe(\"<ul><li>Item 1</li><li>Item 2</li></ul>\");\n    });\n\n    it(\"should ignore null or undefined children\", () => {\n      const dom = ul();\n      expect(\n        van.add(dom, li(\"Item 1\"), li(\"Item 2\"), undefined, li(\"Item 3\"), null)\n      ).toBe(dom);\n      expect(dom.outerHTML).toBe(\n        \"<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li></ul>\"\n      );\n      expect(\n        van.add(dom, [\n          li(\"Item 4\"),\n          li(\"Item 5\"),\n          undefined,\n          li(\"Item 6\"),\n          null,\n        ])\n      ).toBe(dom);\n      expect(dom.outerHTML).toBe(\n        \"<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li><li>Item 4</li><li>Item 5</li><li>Item 6</li></ul>\"\n      );\n    });\n\n    it(\"should ignore nested null or undefined children\", () => {\n      const dom = ul();\n      van.add(dom, li(\"Item 1\"), li(\"Item 2\"), undefined, li(\"Item 3\"), null);\n      van.add(dom, [li(\"Item 4\"), li(\"Item 5\"), undefined, li(\"Item 6\"), null]);\n      expect(\n        van.add(dom, [\n          [undefined, li(\"Item 7\"), null, [li(\"Item 8\")]],\n          null,\n          li(\"Item 9\"),\n          undefined,\n        ])\n      ).toBe(dom);\n      expect(dom.outerHTML).toBe(\n        \"<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li><li>Item 4</li><li>Item 5</li><li>Item 6</li><li>Item 7</li><li>Item 8</li><li>Item 9</li></ul>\"\n      );\n    });\n\n    it(\"should add children as connected state\", async () => {\n      const hiddenDom = createHiddenDom();\n      const line2 = van.state(<string | null>\"Line 2\");\n      expect(van.add(hiddenDom, pre(\"Line 1\"), pre(line2), pre(\"Line 3\"))).toBe(\n        hiddenDom\n      );\n      expect(hiddenDom.outerHTML).toBe(\n        '<div class=\"hidden\"><pre>Line 1</pre><pre>Line 2</pre><pre>Line 3</pre></div>'\n      );\n\n      line2.val = \"Line 2: Extra Stuff\";\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.outerHTML).toBe(\n        '<div class=\"hidden\"><pre>Line 1</pre><pre>Line 2: Extra Stuff</pre><pre>Line 3</pre></div>'\n      );\n\n      // null to remove text DOM\n      line2.val = null;\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.outerHTML).toBe(\n        '<div class=\"hidden\"><pre>Line 1</pre><pre></pre><pre>Line 3</pre></div>'\n      );\n\n      // Resetting the state won't bring the text DOM back\n      line2.val = \"Line 2\";\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.outerHTML).toBe(\n        '<div class=\"hidden\"><pre>Line 1</pre><pre></pre><pre>Line 3</pre></div>'\n      );\n    });\n\n    it(\"should not change children when state is disconnected\", async () => {\n      const line2 = van.state(<string | null>\"Line 2\");\n      const dom = div();\n      expect(van.add(dom, pre(\"Line 1\"), pre(line2), pre(\"Line 3\"))).toBe(dom);\n      expect(dom.outerHTML).toBe(\n        \"<div><pre>Line 1</pre><pre>Line 2</pre><pre>Line 3</pre></div>\"\n      );\n\n      line2.val = \"Line 2: Extra Stuff\";\n      await sleep(waitMsForDerivations);\n      // Content won't change as dom is not connected to document\n      expect(dom.outerHTML).toBe(\n        \"<div><pre>Line 1</pre><pre>Line 2</pre><pre>Line 3</pre></div>\"\n      );\n\n      line2.val = null;\n      await sleep(waitMsForDerivations);\n      // Content won't change as dom is not connected to document\n      expect(dom.outerHTML).toBe(\n        \"<div><pre>Line 1</pre><pre>Line 2</pre><pre>Line 3</pre></div>\"\n      );\n    });\n  });\n\n  describe(\"state\", () => {\n    it(\"should return the correct oldVal and val\", async () => {\n      const hiddenDom = createHiddenDom();\n      const s = van.state(\"State Version 1\");\n      expect(s.val).toBe(\"State Version 1\");\n      expect(s.oldVal).toBe(\"State Version 1\");\n\n      // If the state object doesn't have any bindings, we directly update the `oldVal`\n      s.val = \"State Version 2\";\n      expect(s.val).toBe(\"State Version 2\");\n      expect(s.oldVal).toBe(\"State Version 2\");\n\n      van.add(hiddenDom, s);\n      // If the state object has some bindings, `oldVal` refers to its old value until DOM update completes\n      s.val = \"State Version 3\";\n      expect(s.val).toBe(\"State Version 3\");\n      expect(s.oldVal).toBe(\"State Version 2\");\n      await sleep(waitMsForDerivations);\n      expect(s.val).toBe(\"State Version 3\");\n      expect(s.oldVal).toBe(\"State Version 3\");\n    });\n\n    it(\"should not trigger derived states when rawVal is set\", async () => {\n      const hiddenDom = createHiddenDom();\n      const history: number[] = [];\n      const a = van.state(3),\n        b = van.state(5);\n      const s = van.derive(() => a.rawVal! + b.val!);\n      van.derive(() => history.push(a.rawVal! + b.val!));\n\n      van.add(\n        hiddenDom,\n        input({ type: \"text\", value: () => a.rawVal! + b.val! }),\n        p(() => a.rawVal! + b.val!)\n      );\n\n      await sleep(waitMsForDerivations);\n      expect(s.val).toBe(8);\n      expect(history).toStrictEqual([8]);\n      expect(hiddenDom.querySelector(\"input\")!.value).toBe(\"8\");\n      expect(hiddenDom.querySelector(\"p\")!.innerHTML).toBe(\"8\");\n\n      // Changing the `val` of `a` won't trigger the derived states, side effects, state-derived\n      // properties and state-derived child nodes, as the value of `a` is accessed via `a.rawVal`.\n      ++a.val!;\n      await sleep(waitMsForDerivations);\n      expect(s.val).toBe(8);\n      expect(history).toStrictEqual([8]);\n      expect(hiddenDom.querySelector(\"input\")!.value).toBe(\"8\");\n      expect(hiddenDom.querySelector(\"p\")!.innerHTML).toBe(\"8\");\n\n      // Changing the `val` of `b` will trigger the derived states, side effects, state-derived\n      // properties and state-derived child nodes, as the value of `b` is accessed via `b.rawVal`.\n      ++b.val!;\n      await sleep(waitMsForDerivations);\n      expect(s.val).toBe(10);\n      expect(history).toStrictEqual([8, 10]);\n      expect(hiddenDom.querySelector(\"input\")!.value).toBe(\"10\");\n      expect(hiddenDom.querySelector(\"p\")!.innerHTML).toBe(\"10\");\n    });\n  });\n\n  describe(\"derive\", () => {\n    it(\"should trigger callback when val changes\", async () => {\n      const history: string[] = [];\n      const s = van.state(\"This\");\n      van.derive(() => history.push(s.val!));\n      expect(history).toStrictEqual([\"This\"]);\n\n      s.val = \"is\";\n      await sleep(waitMsForDerivations);\n      expect(history).toStrictEqual([\"This\", \"is\"]);\n\n      s.val = \"a\";\n      await sleep(waitMsForDerivations);\n      expect(history).toStrictEqual([\"This\", \"is\", \"a\"]);\n\n      s.val = \"test\";\n      await sleep(waitMsForDerivations);\n      expect(history).toStrictEqual([\"This\", \"is\", \"a\", \"test\"]);\n\n      s.val = \"test\";\n      await sleep(waitMsForDerivations);\n      expect(history).toStrictEqual([\"This\", \"is\", \"a\", \"test\"]);\n\n      s.val = \"test2\";\n      // \"Test2\" won't be added into `history` as `s` will be set to \"test3\" immediately\n      s.val = \"test3\";\n      await sleep(waitMsForDerivations);\n      expect(history).toStrictEqual([\"This\", \"is\", \"a\", \"test\", \"test3\"]);\n    });\n\n    it(\"should trigger derived state callback when val changes\", async () => {\n      const numItems = van.state(0);\n      const items = van.derive(() =>\n        [...Array(numItems.val).keys()].map((i) => `Item ${i + 1}`)\n      );\n      const selectedIndex = van.derive(() => (items.val, 0));\n      const selectedItem = van.derive(() => items.val![selectedIndex.val!]);\n\n      numItems.val = 3;\n      await sleep(waitMsForDerivations);\n      expect(numItems.val).toBe(3);\n      expect(items.val!.join(\",\")).toBe(\"Item 1,Item 2,Item 3\");\n      expect(selectedIndex.val).toBe(0);\n      expect(selectedItem.val).toBe(\"Item 1\");\n\n      selectedIndex.val = 2;\n      await sleep(waitMsForDerivations);\n      expect(selectedIndex.val).toBe(2);\n      expect(selectedItem.val).toBe(\"Item 3\");\n\n      numItems.val = 5;\n      await sleep(waitMsForDerivations);\n      expect(numItems.val).toBe(5);\n      expect(items.val!.join(\",\")).toBe(\"Item 1,Item 2,Item 3,Item 4,Item 5\");\n      expect(selectedIndex.val).toBe(0);\n      expect(selectedItem.val).toBe(\"Item 1\");\n\n      selectedIndex.val = 3;\n      await sleep(waitMsForDerivations);\n      expect(selectedIndex.val).toBe(3);\n      expect(selectedItem.val).toBe(\"Item 4\");\n    });\n\n    it(\"should trigger compute conditional derived state\", async () => {\n      const cond = van.state(true);\n      const a = van.state(1),\n        b = van.state(2),\n        c = van.state(3),\n        d = van.state(4);\n      let numEffectTriggered = 0;\n      const sum = van.derive(\n        () => (\n          ++numEffectTriggered, cond.val ? a.val! + b.val! : c.val! + d.val!\n        )\n      );\n\n      expect(sum.val).toBe(3);\n      expect(numEffectTriggered).toBe(1);\n\n      a.val = 11;\n      await sleep(waitMsForDerivations);\n      expect(sum.val).toBe(13);\n      expect(numEffectTriggered).toBe(2);\n\n      b.val = 12;\n      await sleep(waitMsForDerivations);\n      expect(sum.val).toBe(23);\n      expect(numEffectTriggered).toBe(3);\n\n      // Changing c or d won't triggered the effect as they're not its current dependencies\n      c.val = 13;\n      await sleep(waitMsForDerivations);\n      expect(sum.val).toBe(23);\n      expect(numEffectTriggered).toBe(3);\n\n      d.val = 14;\n      await sleep(waitMsForDerivations);\n      expect(sum.val).toBe(23);\n      expect(numEffectTriggered).toBe(3);\n\n      cond.val = false;\n      await sleep(waitMsForDerivations);\n      expect(sum.val).toBe(27);\n      expect(numEffectTriggered).toBe(4);\n\n      c.val = 23;\n      await sleep(waitMsForDerivations);\n      expect(sum.val).toBe(37);\n      expect(numEffectTriggered).toBe(5);\n\n      d.val = 24;\n      await sleep(waitMsForDerivations);\n      expect(sum.val).toBe(47);\n      expect(numEffectTriggered).toBe(6);\n\n      // Changing a or b won't triggered the effect as they're not its current dependencies\n      a.val = 21;\n      await sleep(waitMsForDerivations);\n      expect(sum.val).toBe(47);\n      expect(numEffectTriggered).toBe(6);\n\n      b.val = 22;\n      await sleep(waitMsForDerivations);\n      expect(sum.val).toBe(47);\n      expect(numEffectTriggered).toBe(6);\n    });\n\n    it(\"should not change state when derive throws error\", async () => {\n      const s0 = van.state(1);\n      const s1 = van.derive(() => s0.val! * 2);\n      const s2 = van.derive(() => {\n        if (s0.val! > 1) throw new Error();\n        return s0.val;\n      });\n      const s3 = van.derive(() => s0.val! * s0.val!);\n\n      expect(s1.val).toBe(2);\n      expect(s2.val).toBe(1);\n      expect(s3.val).toBe(1);\n\n      s0.val = 3;\n      await sleep(waitMsForDerivations);\n      // The derivation function for `s2` throws an error.\n      // We want to validate the `val` of `s2` remains the same because of the error,\n      // but other derived states are updated as usual.\n      expect(s1.val).toBe(6);\n      expect(s2.val).toBe(1);\n      expect(s3.val).toBe(9);\n    });\n\n    it(\"should update dom when derived state changes\", async () => {\n      const hiddenDom = createHiddenDom();\n      const CheckboxCounter = () => {\n        const checked = van.state(false),\n          numChecked = van.state(0);\n        van.derive(() => {\n          if (checked.val) ++numChecked.val!;\n        });\n\n        return div(\n          input({\n            type: \"checkbox\",\n            checked,\n            onclick: (e) =>\n              (checked.val = ((e as Event).target as HTMLInputElement).checked),\n          }),\n          \" Checked \",\n          numChecked,\n          \" times. \",\n          button({ onclick: () => (numChecked.val = 0) }, \"Reset\")\n        );\n      };\n\n      van.add(hiddenDom, CheckboxCounter());\n\n      expect(hiddenDom.innerHTML).toBe(\n        '<div><input type=\"checkbox\"> Checked 0 times. <button>Reset</button></div>'\n      );\n\n      hiddenDom.querySelector(\"input\")!.click();\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<div><input type=\"checkbox\"> Checked 1 times. <button>Reset</button></div>'\n      );\n\n      hiddenDom.querySelector(\"input\")!.click();\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<div><input type=\"checkbox\"> Checked 1 times. <button>Reset</button></div>'\n      );\n\n      hiddenDom.querySelector(\"input\")!.click();\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<div><input type=\"checkbox\"> Checked 2 times. <button>Reset</button></div>'\n      );\n\n      hiddenDom.querySelector(\"button\")!.click();\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<div><input type=\"checkbox\"> Checked 0 times. <button>Reset</button></div>'\n      );\n    });\n\n    it(\"should batch derived state updates\", async () => {\n      const a = van.state(3),\n        b = van.state(5);\n      let numDerivations = 0;\n      const s = van.derive(() => {\n        ++numDerivations;\n        return a.val! + b.val!;\n      });\n\n      expect(s.val).toBe(8);\n      expect(numDerivations).toBe(1);\n\n      // Both `a` and `b` will change. `s` will only be re-derived once\n      ++a.val!, ++b.val!;\n      await sleep(waitMsForDerivations);\n      expect(s.val).toBe(10);\n      expect(numDerivations).toBe(2);\n\n      // `a` will change, and then change back. No derivation will happen\n      ++a.val!, --a.val!;\n      await sleep(waitMsForDerivations);\n      expect(s.val).toBe(10);\n      expect(numDerivations).toBe(2);\n    });\n\n    it(\"should batch multilayer derived state updates\", async () => {\n      const hiddenDom = createHiddenDom();\n      const a = van.state(1),\n        b = van.derive(() => a.val! * a.val!);\n      const c = van.derive(() => b.val! * b.val!),\n        d = van.derive(() => c.val! * c.val!);\n\n      let numSDerived = 0,\n        numSSquaredDerived = 0;\n      const s = van.derive(() => {\n        ++numSDerived;\n        return a.val! + b.val! + c.val! + d.val!;\n      });\n\n      van.add(\n        hiddenDom,\n        \"a = \",\n        a,\n        \" b = \",\n        b,\n        \" c = \",\n        c,\n        \" d = \",\n        d,\n        \" s = \",\n        s,\n        \" s^2 = \",\n        () => {\n          ++numSSquaredDerived;\n          return s.val! * s.val!;\n        }\n      );\n\n      expect(hiddenDom.innerHTML).toBe(\n        \"a = 1 b = 1 c = 1 d = 1 s = 4 s^2 = 16\"\n      );\n      expect(numSDerived).toBe(1);\n      expect(numSSquaredDerived).toBe(1);\n\n      ++a.val!;\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        \"a = 2 b = 4 c = 16 d = 256 s = 278 s^2 = 77284\"\n      );\n      // `s` is derived 4 times, triggered by `a`, `b`, `c`, `d`, respectively.\n      expect(numSDerived).toBe(5);\n      // `s^2` (the `s` derived Text node), is only derived once per one DOM update cycle.\n      expect(numSSquaredDerived).toBe(2);\n    });\n\n    it(\"should stop updating when there is a cycle in the derivation\", async () => {\n      const a = van.state(1);\n      const b = van.derive(() => a.val! + 1);\n      van.derive(() => (a.val = b.val! + 1));\n\n      // `a` and `b` are circular dependency. But derivations will stop after limited number of\n      // iterations.\n      ++a.val!;\n      await sleep(waitMsForDerivations);\n      expect(a.val).toBe(104);\n      expect(b.val).toBe(103);\n    });\n\n    it(\"should dynamically update dom based on derived state\", async () => {\n      const hiddenDom = createHiddenDom();\n      const verticalPlacement = van.state(false);\n      const button1Text = van.state(\"Button 1\"),\n        button2Text = van.state(\"Button 2\"),\n        button3Text = van.state(\"Button 3\");\n\n      const domFunc = () =>\n        verticalPlacement.val\n          ? div(\n              div(button(button1Text)),\n              div(button(button2Text)),\n              div(button(button3Text))\n            )\n          : div(button(button1Text), button(button2Text), button(button3Text));\n      expect(van.add(hiddenDom, domFunc)).toBe(hiddenDom);\n\n      const dom = <Element>hiddenDom.firstChild;\n      expect(dom.outerHTML).toBe(\n        \"<div><button>Button 1</button><button>Button 2</button><button>Button 3</button></div>\"\n      );\n      button2Text.val = \"Button 2: Extra\";\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\n        \"<div><button>Button 1</button><button>Button 2: Extra</button><button>Button 3</button></div>\"\n      );\n\n      verticalPlacement.val = true;\n      await sleep(waitMsForDerivations);\n\n      // dom is disconnected from the document thus it won't be updated\n      expect(dom.outerHTML).toBe(\n        \"<div><button>Button 1</button><button>Button 2: Extra</button><button>Button 3</button></div>\"\n      );\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        \"<div><div><button>Button 1</button></div><div><button>Button 2: Extra</button></div><div><button>Button 3</button></div></div>\"\n      );\n      button2Text.val = \"Button 2: Extra Extra\";\n      await sleep(waitMsForDerivations);\n      // Since dom is disconnected from document, its inner button won't be reactive to state changes\n      expect(dom.outerHTML).toBe(\n        \"<div><button>Button 1</button><button>Button 2: Extra</button><button>Button 3</button></div>\"\n      );\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        \"<div><div><button>Button 1</button></div><div><button>Button 2: Extra Extra</button></div><div><button>Button 3</button></div></div>\"\n      );\n    });\n\n    it(\"should update dom based on conditional derived state\", async () => {\n      const hiddenDom = createHiddenDom();\n      const cond = van.state(true);\n      const button1 = van.state(\"Button 1\"),\n        button2 = van.state(\"Button 2\");\n      const button3 = van.state(\"Button 3\"),\n        button4 = van.state(\"Button 4\");\n      let numFuncCalled = 0;\n      const domFunc = () => (\n        ++numFuncCalled,\n        cond.val\n          ? div(button(button1.val), button(button2.val))\n          : div(button(button3.val), button(button4.val))\n      );\n      expect(van.add(hiddenDom, domFunc)).toBe(hiddenDom);\n\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        \"<div><button>Button 1</button><button>Button 2</button></div>\"\n      );\n      expect(numFuncCalled).toBe(1);\n\n      button1.val = \"Button 1-1\";\n      await sleep(waitMsForDerivations);\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        \"<div><button>Button 1-1</button><button>Button 2</button></div>\"\n      );\n      expect(numFuncCalled).toBe(2);\n\n      button2.val = \"Button 2-1\";\n      await sleep(waitMsForDerivations);\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        \"<div><button>Button 1-1</button><button>Button 2-1</button></div>\"\n      );\n      expect(numFuncCalled).toBe(3);\n\n      // Changing button3 or button4 won't triggered the effect as they're not its current dependencies\n      button3.val = \"Button 3-1\";\n      await sleep(waitMsForDerivations);\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        \"<div><button>Button 1-1</button><button>Button 2-1</button></div>\"\n      );\n      expect(numFuncCalled).toBe(3);\n\n      button4.val = \"Button 4-1\";\n      await sleep(waitMsForDerivations);\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        \"<div><button>Button 1-1</button><button>Button 2-1</button></div>\"\n      );\n      expect(numFuncCalled).toBe(3);\n\n      cond.val = false;\n      await sleep(waitMsForDerivations);\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        \"<div><button>Button 3-1</button><button>Button 4-1</button></div>\"\n      );\n      expect(numFuncCalled).toBe(4);\n\n      button3.val = \"Button 3-2\";\n      await sleep(waitMsForDerivations);\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        \"<div><button>Button 3-2</button><button>Button 4-1</button></div>\"\n      );\n      expect(numFuncCalled).toBe(5);\n\n      button4.val = \"Button 4-2\";\n      await sleep(waitMsForDerivations);\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        \"<div><button>Button 3-2</button><button>Button 4-2</button></div>\"\n      );\n      expect(numFuncCalled).toBe(6);\n\n      // Changing button1 or button2 won't triggered the effect as they're not its current dependencies\n      button1.val = \"Button 1-2\";\n      await sleep(waitMsForDerivations);\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        \"<div><button>Button 3-2</button><button>Button 4-2</button></div>\"\n      );\n      expect(numFuncCalled).toBe(6);\n\n      button1.val = \"Button 2-2\";\n      await sleep(waitMsForDerivations);\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        \"<div><button>Button 3-2</button><button>Button 4-2</button></div>\"\n      );\n      expect(numFuncCalled).toBe(6);\n    });\n\n    it(\"should rearrange dom when state changes\", async () => {\n      const hiddenDom = createHiddenDom();\n      const numItems = van.state(0);\n      const items = van.derive(() =>\n        [...Array(numItems.val).keys()].map((i) => `Item ${i + 1}`)\n      );\n      const selectedIndex = van.derive(() => (items.val, 0));\n\n      const domFunc = (dom?: Element) => {\n        // If items aren't changed, we don't need to regenerate the entire dom\n        if (dom && items.val === items.oldVal) {\n          const itemDoms = dom.childNodes;\n          (<Element>itemDoms[selectedIndex.oldVal!]).classList.remove(\n            \"selected\"\n          );\n          (<Element>itemDoms[selectedIndex.val!]).classList.add(\"selected\");\n          return dom;\n        }\n\n        return ul(\n          items.val!.map((item: string, i: number) =>\n            li({ class: i === selectedIndex.val ? \"selected\" : \"\" }, item)\n          )\n        );\n      };\n      van.add(hiddenDom, domFunc);\n\n      numItems.val = 3;\n      await sleep(waitMsForDerivations);\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        '<ul><li class=\"selected\">Item 1</li><li class=\"\">Item 2</li><li class=\"\">Item 3</li></ul>'\n      );\n      const rootDom1stIteration = <Element>hiddenDom.firstChild;\n\n      selectedIndex.val = 1;\n      await sleep(waitMsForDerivations);\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        '<ul><li class=\"\">Item 1</li><li class=\"selected\">Item 2</li><li class=\"\">Item 3</li></ul>'\n      );\n      // Items aren't changed, thus we don't need to regenerate the dom\n      expect(hiddenDom.firstChild!).toBe(rootDom1stIteration);\n\n      numItems.val = 5;\n      await sleep(waitMsForDerivations);\n      // Items are changed, thus the dom for the list is regenerated\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        '<ul><li class=\"selected\">Item 1</li><li class=\"\">Item 2</li><li class=\"\">Item 3</li><li class=\"\">Item 4</li><li class=\"\">Item 5</li></ul>'\n      );\n      expect(hiddenDom.firstChild !== rootDom1stIteration);\n      // rootDom1stIteration is disconnected from the document and remain unchanged\n      expect(rootDom1stIteration.outerHTML).toBe(\n        '<ul><li class=\"\">Item 1</li><li class=\"selected\">Item 2</li><li class=\"\">Item 3</li></ul>'\n      );\n      const rootDom2ndIteration = hiddenDom.firstChild!;\n\n      selectedIndex.val = 2;\n      await sleep(waitMsForDerivations);\n      expect((<Element>hiddenDom.firstChild).outerHTML).toBe(\n        '<ul><li class=\"\">Item 1</li><li class=\"\">Item 2</li><li class=\"selected\">Item 3</li><li class=\"\">Item 4</li><li class=\"\">Item 5</li></ul>'\n      );\n      // Items aren't changed, thus we don't need to regenerate the dom\n      expect(hiddenDom.firstChild!).toBe(rootDom2ndIteration);\n      // rootDom1stIteration won't be updated as it has already been disconnected from the document\n      expect(rootDom1stIteration.outerHTML).toBe(\n        '<ul><li class=\"\">Item 1</li><li class=\"selected\">Item 2</li><li class=\"\">Item 3</li></ul>'\n      );\n    });\n\n    it(\"should remove dom when it returns null\", async () => {\n      const hiddenDom = createHiddenDom();\n      const line1 = van.state(\"Line 1\"),\n        line2 = van.state(\"Line 2\"),\n        line3 = van.state(<string | null>\"Line 3\"),\n        line4 = van.state(\"\"),\n        line5 = van.state(null);\n\n      const dom = div(\n        () => (line1.val === \"\" ? null : p(line1.val)),\n        () => (line2.val === \"\" ? null : p(line2.val)),\n        p(line3),\n        // line4 won't appear in the DOM tree as its initial value is null\n        () => (line4.val === \"\" ? null : p(line4.val)),\n        // line5 won't appear in the DOM tree as its initial value is null\n        p(line5)\n      );\n      van.add(hiddenDom, dom);\n\n      expect(dom.outerHTML).toBe(\n        \"<div><p>Line 1</p><p>Line 2</p><p>Line 3</p><p></p></div>\"\n      );\n      // Delete Line 2\n      line2.val = \"\";\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\n        \"<div><p>Line 1</p><p>Line 3</p><p></p></div>\"\n      );\n\n      // Deleted dom won't be brought back, even the underlying state is changed back\n      line2.val = \"Line 2\";\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\n        \"<div><p>Line 1</p><p>Line 3</p><p></p></div>\"\n      );\n\n      // Delete Line 3\n      line3.val = null;\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\"<div><p>Line 1</p><p></p><p></p></div>\");\n\n      // Deleted dom won't be brought back, even the underlying state is changed back\n      line3.val = \"Line 3\";\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\"<div><p>Line 1</p><p></p><p></p></div>\");\n    });\n\n    it(\"should remove dom when it returns undefined\", async () => {\n      const hiddenDom = createHiddenDom();\n      const line1 = van.state(\"Line 1\"),\n        line2 = van.state(\"Line 2\"),\n        line3 = van.state(<string | undefined>\"Line 3\"),\n        line4 = van.state(\"\"),\n        line5 = van.state(undefined);\n\n      const dom = div(\n        () => (line1.val === \"\" ? null : p(line1.val)),\n        () => (line2.val === \"\" ? null : p(line2.val)),\n        p(line3),\n        // line4 won't appear in the DOM tree as its initial value is null\n        () => (line4.val === \"\" ? null : p(line4.val)),\n        // line5 won't appear in the DOM tree as its initial value is null\n        p(line5)\n      );\n      van.add(hiddenDom, dom);\n\n      expect(dom.outerHTML).toBe(\n        \"<div><p>Line 1</p><p>Line 2</p><p>Line 3</p><p></p></div>\"\n      );\n      // Delete Line 2\n      line2.val = \"\";\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\n        \"<div><p>Line 1</p><p>Line 3</p><p></p></div>\"\n      );\n\n      // Deleted dom won't be brought back, even the underlying state is changed back\n      line2.val = \"Line 2\";\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\n        \"<div><p>Line 1</p><p>Line 3</p><p></p></div>\"\n      );\n\n      // Delete Line 3\n      line3.val = undefined;\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\"<div><p>Line 1</p><p></p><p></p></div>\");\n\n      // Deleted dom won't be brought back, even the underlying state is changed back\n      line3.val = \"Line 3\";\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\"<div><p>Line 1</p><p></p><p></p></div>\");\n    });\n\n    it(\"should not remove dom when it returns 0\", async () => {\n      const hiddenDom = createHiddenDom();\n      const state1 = van.state(0),\n        state2 = van.state(1);\n      const dom = div(\n        state1,\n        () => 1 - state1.val!,\n        state2,\n        () => 1 - state2.val!\n      );\n      van.add(hiddenDom, dom);\n\n      expect(dom.outerHTML).toBe(\"<div>0110</div>\");\n\n      (state1.val = 1), (state2.val = 0);\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\"<div>1001</div>\");\n    });\n\n    it(\"should update dom when primitive state changes\", async () => {\n      const hiddenDom = createHiddenDom();\n      const a = van.state(1),\n        b = van.state(2),\n        deleted = van.state(false);\n      const dom = div(() => (deleted.val ? null : a.val! + b.val!));\n      expect(dom.outerHTML).toBe(\"<div>3</div>\");\n      van.add(hiddenDom, dom);\n\n      a.val = 6;\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\"<div>8</div>\");\n\n      b.val = 5;\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\"<div>11</div>\");\n\n      deleted.val = true;\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\"<div></div>\");\n\n      // Deleted dom won't be brought back, even the underlying state is changed back\n      deleted.val = false;\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\"<div></div>\");\n    });\n\n    it(\"should not update when state is not connected\", async () => {\n      const hiddenDom = createHiddenDom();\n      const part1 = \"👋Hello \",\n        part2 = van.state(\"🗺️World\");\n\n      expect(\n        van.add(\n          hiddenDom,\n          () => `${part1}${part2.val}, from: ${part1}${part2.oldVal}`\n        )\n      ).toBe(hiddenDom);\n\n      const dom = <Element>hiddenDom.firstChild;\n      expect(dom.textContent!).toBe(\"👋Hello 🗺️World, from: 👋Hello 🗺️World\");\n      expect(hiddenDom.innerHTML).toBe(\n        \"👋Hello 🗺️World, from: 👋Hello 🗺️World\"\n      );\n\n      part2.val = \"🍦VanJS\";\n      await sleep(waitMsForDerivations);\n\n      // dom is disconnected from the document thus it won't be updated\n      expect(dom.textContent!).toBe(\"👋Hello 🗺️World, from: 👋Hello 🗺️World\");\n      expect(hiddenDom.innerHTML).toBe(\n        \"👋Hello 🍦VanJS, from: 👋Hello 🗺️World\"\n      );\n    });\n\n    it(\"should not update dom when oldVal is referenced\", async () => {\n      const hiddenDom = createHiddenDom();\n      const text = van.state(\"Old Text\");\n\n      expect(\n        van.add(hiddenDom, () => `From: \"${text.oldVal}\" to: \"${text.val}\"`)\n      ).toBe(hiddenDom);\n\n      const dom = <Element>hiddenDom.firstChild;\n      expect(dom.textContent!).toBe('From: \"Old Text\" to: \"Old Text\"');\n      expect(hiddenDom.innerHTML).toBe('From: \"Old Text\" to: \"Old Text\"');\n\n      text.val = \"New Text\";\n      await sleep(waitMsForDerivations);\n\n      // dom is disconnected from the document thus it won't be updated\n      expect(dom.textContent).toBe('From: \"Old Text\" to: \"Old Text\"');\n      expect(hiddenDom.innerHTML).toBe('From: \"Old Text\" to: \"New Text\"');\n    });\n\n    it(\"should not update when state derived children throws error\", async () => {\n      const hiddenDom = createHiddenDom();\n      const num = van.state(0);\n\n      expect(\n        van.add(\n          hiddenDom,\n          num,\n          () => {\n            if (num.val! > 0) throw new Error();\n            return span(\"ok\");\n          },\n          num\n        )\n      ).toBe(hiddenDom);\n\n      expect(hiddenDom.innerHTML).toBe(\"0<span>ok</span>0\");\n\n      num.val = 1;\n      await sleep(waitMsForDerivations);\n      // The binding function 2nd child of hiddenDom throws an error.\n      // We want to validate the 2nd child won't be updated because of the error,\n      // but other DOM nodes are updated as usual\n      expect(hiddenDom.innerHTML).toBe(\"1<span>ok</span>1\");\n    });\n  });\n\n  describe(\"hydrate\", () => {\n    it(\"should hydrate the given dom with the provided state\", async () => {\n      const hiddenDom = createHiddenDom();\n      const Counter = (init: number) => {\n        const counter = van.state(init);\n        return button(\n          { \"data-counter\": counter, onclick: () => ++counter.val! },\n          () => `Count: ${counter.val}`\n        );\n      };\n      // Static DOM before hydration\n      hiddenDom.innerHTML = Counter(5).outerHTML;\n\n      // Before hydration, the counter is not reactive\n      hiddenDom.querySelector(\"button\")!.click();\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<button data-counter=\"5\">Count: 5</button>'\n      );\n\n      van.hydrate(hiddenDom.querySelector(\"button\")!, (dom: HTMLElement) =>\n        Counter(Number(dom.getAttribute(\"data-counter\")))\n      );\n\n      // After hydration, the counter is reactive\n      hiddenDom.querySelector(\"button\")!.click();\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<button data-counter=\"6\">Count: 6</button>'\n      );\n    });\n\n    it(\"should remove dom when it returns null\", async () => {\n      const hiddenDom = createHiddenDom();\n      // Remove the DOM node upon hydration\n      van.add(hiddenDom, div());\n      van.hydrate(hiddenDom.querySelector(\"div\")!, () => null);\n      expect(hiddenDom.innerHTML).toBe(\"\");\n\n      // Remove the DOM node after the state update\n      van.add(hiddenDom, div());\n      const s = van.state(1);\n      van.hydrate(<HTMLElement>hiddenDom.querySelector(\"div\"), () =>\n        s.val === 1 ? pre() : null\n      );\n      expect(hiddenDom.innerHTML).toBe(\"<pre></pre>\");\n      s.val = 2;\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\"\");\n    });\n\n    it(\"should remove dom when it returns undefined\", async () => {\n      const hiddenDom = createHiddenDom();\n      // Remove the DOM node upon hydration\n      van.add(hiddenDom, div());\n      van.hydrate(hiddenDom.querySelector(\"div\")!, () => undefined);\n      expect(hiddenDom.innerHTML).toBe(\"\");\n\n      // Remove the DOM node after the state update\n      van.add(hiddenDom, div());\n      const s = van.state(1);\n      van.hydrate(<HTMLElement>hiddenDom.querySelector(\"div\"), () =>\n        s.val === 1 ? pre() : undefined\n      );\n      expect(hiddenDom.innerHTML).toBe(\"<pre></pre>\");\n      s.val = 2;\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\"\");\n    });\n\n    it(\"should not remove dom when it returns 0\", async () => {\n      const hiddenDom = createHiddenDom();\n      van.add(hiddenDom, div(), div());\n\n      const s = van.state(0);\n      const [dom1, dom2] = hiddenDom.querySelectorAll(\"div\");\n\n      van.hydrate(dom1, <any>(() => s.val));\n      van.hydrate(dom2, <any>(() => 1 - s.val!));\n      expect(hiddenDom.innerHTML).toBe(\"01\");\n\n      s.val = 1;\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\"10\");\n    });\n  });\n\n  describe(\"gc\", () => {\n    it(\"should bind basic state and derived state\", async () => {\n      const hiddenDom = createHiddenDom();\n      const counter = van.state(0);\n      const bindingsPropKey = Object.entries(counter).find(([_, v]) =>\n        Array.isArray(v)\n      )![0];\n\n      van.add(hiddenDom, () => span(`Counter: ${counter.val}`));\n\n      for (let i = 0; i < 100; ++i) ++counter.val!;\n      await sleep(waitMsForDerivations);\n\n      expect(hiddenDom.innerHTML).toBe(\"<span>Counter: 100</span>\");\n      expect(Object(counter)[bindingsPropKey]).toHaveLength(2);\n    });\n\n    it(\"should clean up nested bindings\", async () => {\n      const hiddenDom = createHiddenDom();\n      const renderPre = van.state(false),\n        text = van.state(\"Text\");\n      const bindingsPropKey = Object.entries(renderPre).find(([_, v]) =>\n        Array.isArray(v)\n      )![0];\n      const dom = div(() =>\n        (renderPre.val ? pre : div)(() => `--${text.val}--`)\n      );\n      van.add(hiddenDom, dom);\n\n      for (let i = 0; i < 20; ++i) {\n        renderPre.val = !renderPre.val;\n        await sleep(waitMsForDerivations);\n      }\n\n      // Wait until GC kicks in\n      await sleep(1000);\n\n      expect(Object(renderPre)[bindingsPropKey]).toHaveLength(1);\n      expect(Object(text)[bindingsPropKey]).toHaveLength(1);\n    });\n\n    it(\"should clean up conditional bindings\", async () => {\n      const hiddenDom = createHiddenDom();\n      const cond = van.state(true);\n      const a = van.state(0),\n        b = van.state(0),\n        c = van.state(0),\n        d = van.state(0);\n      const bindingsPropKey = Object.entries(cond).find(([_, v]) =>\n        Array.isArray(v)\n      )![0];\n      const dom = div(() => (cond.val ? a.val! + b.val! : c.val! + d.val!));\n      van.add(hiddenDom, dom);\n\n      const allStates: State<number | boolean>[] = [cond, a, b, c, d];\n      for (let i = 0; i < 100; ++i) {\n        const randomState =\n          allStates[Math.floor(Math.random() * allStates.length)];\n        if (randomState === cond) randomState.val = !randomState.val;\n        else ++(<State<number>>randomState).val!;\n        await sleep(waitMsForDerivations);\n      }\n\n      allStates.every((s) => {\n        expect(Object(s)[bindingsPropKey].length).toBeGreaterThanOrEqual(1);\n        expect(Object(s)[bindingsPropKey].length).toBeLessThanOrEqual(15);\n      });\n\n      // Wait until GC kicks in\n      await sleep(1000);\n      allStates.every((s) =>\n        expect(Object(s)[bindingsPropKey]).toHaveLength(1)\n      );\n    });\n\n    it(\"should correctly call derived state function\", async () => {\n      const history: any[] = [];\n      const a = van.state(0);\n      const listenersPropKey = Object.entries(a).filter(([_, v]) =>\n        Array.isArray(v)\n      )[1][0];\n\n      van.derive(() => history.push(a.val));\n\n      for (let i = 0; i < 100; ++i) {\n        ++a.val!;\n        await sleep(waitMsForDerivations);\n      }\n\n      expect(history.length).toBe(101);\n      expect(Object(a)[listenersPropKey]).toHaveLength(2);\n    });\n\n    it(\"should clean up derived state function\", async () => {\n      const hiddenDom = createHiddenDom();\n      const renderPre = van.state(false),\n        prefix = van.state(\"Prefix\");\n      const bindingsPropKey = Object.entries(renderPre).find(([_, v]) =>\n        Array.isArray(v)\n      )![0];\n      const listenersPropKey = Object.entries(renderPre).filter(([_, v]) =>\n        Array.isArray(v)\n      )[1][0];\n      const dom = div(() => {\n        const text = van.derive(() => `${prefix.val} - Suffix`);\n        return (renderPre.val ? pre : div)(() => `--${text.val}--`);\n      });\n      van.add(hiddenDom, dom);\n\n      for (let i = 0; i < 20; ++i) {\n        renderPre.val = !renderPre.val;\n        await sleep(waitMsForDerivations);\n      }\n\n      // Wait until GC kicks in\n      await sleep(1000);\n\n      expect(Object(renderPre)[bindingsPropKey]).toHaveLength(1);\n      expect(Object(prefix)[listenersPropKey]).toHaveLength(1);\n    });\n\n    it(\"should clean up derived state in props\", async () => {\n      const hiddenDom = createHiddenDom();\n      const renderPre = van.state(false),\n        class1 = van.state(true);\n      const bindingsPropKey = Object.entries(renderPre).find(([_, v]) =>\n        Array.isArray(v)\n      )![0];\n      const listenersPropKey = Object.entries(renderPre).filter(([_, v]) =>\n        Array.isArray(v)\n      )[1][0];\n      const dom = div(() =>\n        (renderPre.val ? pre : div)(\n          { class: () => (class1.val ? \"class1\" : \"class2\") },\n          \"Text\"\n        )\n      );\n      van.add(hiddenDom, dom);\n\n      for (let i = 0; i < 20; ++i) {\n        renderPre.val = !renderPre.val;\n        await sleep(waitMsForDerivations);\n      }\n\n      // Wait until GC kicks in\n      await sleep(1000);\n\n      expect(Object(renderPre)[bindingsPropKey]).toHaveLength(1);\n      expect(Object(class1)[listenersPropKey]).toHaveLength(1);\n    });\n\n    it(\"should clean up derived state as event handler\", async () => {\n      const hiddenDom = createHiddenDom();\n      const renderPre = van.state(false),\n        handlerType = van.state(1);\n      const bindingsPropKey = Object.entries(renderPre).find(([_, v]) =>\n        Array.isArray(v)\n      )![0];\n      const listenersPropKey = Object.entries(renderPre).filter(([_, v]) =>\n        Array.isArray(v)\n      )[1][0];\n      const dom = div(() =>\n        (renderPre.val ? pre : div)(\n          button({\n            oncustom: van.derive(() =>\n              handlerType.val === 1\n                ? () => van.add(hiddenDom, p(\"Handler 1 triggered!\"))\n                : () => van.add(hiddenDom, p(\"Handler 2 triggered!\"))\n            ),\n          })\n        )\n      );\n      van.add(hiddenDom, dom);\n\n      for (let i = 0; i < 20; ++i) {\n        renderPre.val = !renderPre.val;\n        await sleep(waitMsForDerivations);\n      }\n\n      // Wait until GC kicks in\n      await sleep(1000);\n\n      expect(Object(renderPre)[bindingsPropKey]).toHaveLength(1);\n      expect(Object(handlerType)[listenersPropKey]).toHaveLength(1);\n    });\n\n    it(\"should clean up conditionally derived states\", async () => {\n      const cond = van.state(true);\n      const a = van.state(0),\n        b = van.state(0),\n        c = van.state(0),\n        d = van.state(0);\n      const listenersPropKey = Object.entries(a).filter(([_, v]) =>\n        Array.isArray(v)\n      )[1][0];\n      van.derive(() => (cond.val ? a.val! + b.val! : c.val! + d.val!));\n\n      const allStates: State<number | boolean>[] = [cond, a, b, c, d];\n      for (let i = 0; i < 100; ++i) {\n        const randomState =\n          allStates[Math.floor(Math.random() * allStates.length)];\n        if (randomState === cond) randomState.val = !randomState.val;\n        else ++(<State<number>>randomState).val!;\n      }\n\n      allStates.every((s) => {\n        expect(Object(s)[listenersPropKey].length).toBeGreaterThanOrEqual(1);\n        expect(Object(s)[listenersPropKey].length).toBeLessThanOrEqual(10);\n      });\n\n      // Wait until GC kicks in\n      await sleep(1000);\n      allStates.every((s) => {\n        expect(Object(s)[listenersPropKey].length).toBeGreaterThanOrEqual(1);\n        expect(Object(s)[listenersPropKey].length).toBeLessThanOrEqual(4);\n      });\n    });\n  });\n\n  describe(\"e2e\", () => {\n    it(\"should render Counter and update dom accordingly\", async () => {\n      const hiddenDom = createHiddenDom();\n      const Counter = () => {\n        const counter = van.state(0);\n        return div(\n          div(\"❤️: \", counter),\n          button({ onclick: () => ++counter.val! }, \"👍\"),\n          button({ onclick: () => --counter.val! }, \"👎\")\n        );\n      };\n\n      van.add(hiddenDom, Counter());\n\n      expect(\n        (<Element>hiddenDom.firstChild).querySelector(\"div\")!.innerHTML\n      ).toBe(\"❤️: 0\");\n\n      const [incrementBtn, decrementBtn] =\n        hiddenDom.getElementsByTagName(\"button\");\n\n      incrementBtn.click();\n      await sleep(waitMsForDerivations);\n      expect(\n        (<Element>hiddenDom.firstChild).querySelector(\"div\")!.innerHTML\n      ).toBe(\"❤️: 1\");\n\n      incrementBtn.click();\n      await sleep(waitMsForDerivations);\n      expect(\n        (<Element>hiddenDom.firstChild).querySelector(\"div\")!.innerHTML\n      ).toBe(\"❤️: 2\");\n\n      decrementBtn.click();\n      await sleep(waitMsForDerivations);\n      expect(\n        (<Element>hiddenDom.firstChild).querySelector(\"div\")!.innerHTML\n      ).toBe(\"❤️: 1\");\n    });\n\n    it(\"should render ul li\", () => {\n      const List = ({ items }: { items: string[] }) =>\n        ul(items.map((it: any) => li(it)));\n      expect(List({ items: [\"Item 1\", \"Item 2\", \"Item 3\"] }).outerHTML).toBe(\n        \"<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li></ul>\"\n      );\n    });\n\n    it(\"should render table\", () => {\n      const Table = ({\n        head,\n        data,\n      }: {\n        head?: readonly string[];\n        data: readonly (string | number)[][];\n      }) =>\n        table(\n          head ? thead(tr(head.map((h) => th(h)))) : [],\n          tbody(data.map((row) => tr(row.map((col) => td(col)))))\n        );\n\n      expect(\n        Table({\n          head: [\"ID\", \"Name\", \"Country\"],\n          data: [\n            [1, \"John Doe\", \"US\"],\n            [2, \"Jane Smith\", \"CA\"],\n            [3, \"Bob Johnson\", \"AU\"],\n          ],\n        }).outerHTML\n      ).toBe(\n        \"<table><thead><tr><th>ID</th><th>Name</th><th>Country</th></tr></thead><tbody><tr><td>1</td><td>John Doe</td><td>US</td></tr><tr><td>2</td><td>Jane Smith</td><td>CA</td></tr><tr><td>3</td><td>Bob Johnson</td><td>AU</td></tr></tbody></table>\"\n      );\n\n      expect(\n        Table({\n          data: [\n            [1, \"John Doe\", \"US\"],\n            [2, \"Jane Smith\", \"CA\"],\n          ],\n        }).outerHTML\n      ).toBe(\n        \"<table><tbody><tr><td>1</td><td>John Doe</td><td>US</td></tr><tr><td>2</td><td>Jane Smith</td><td>CA</td></tr></tbody></table>\"\n      );\n    });\n\n    it(\"should render and update dom after changing state\", async () => {\n      const hiddenDom = createHiddenDom();\n      // Create a new state object with init value 1\n      const counter = van.state(1);\n\n      // Log whenever the value of the state is updated\n      van.derive(() => console.log(`Counter: ${counter.val}`));\n\n      // Derived state\n      const counterSquared = van.derive(() => counter.val! * counter.val!);\n\n      // Used as a child node\n      const dom1 = div(counter);\n\n      // Used as a property\n      const dom2 = input({ type: \"number\", value: counter, disabled: true });\n\n      // Used in a state-derived property\n      const dom3 = div({ style: () => `font-size: ${counter.val}em;` }, \"Text\");\n\n      // Used in a state-derived child\n      const dom4 = div(counter, sup(2), () => ` = ${counterSquared.val}`);\n\n      // Button to increment the value of the state\n      const incrementBtn = button(\n        { onclick: () => ++counter.val! },\n        \"Increment\"\n      );\n      const resetBtn = button({ onclick: () => (counter.val = 1) }, \"Reset\");\n\n      van.add(hiddenDom, incrementBtn, resetBtn, dom1, dom2, dom3, dom4);\n\n      expect(hiddenDom.innerHTML).toBe(\n        '<button>Increment</button><button>Reset</button><div>1</div><input type=\"number\" disabled=\"\"><div style=\"font-size: 1em;\">Text</div><div>1<sup>2</sup> = 1</div>'\n      );\n      expect(dom2.value).toBe(\"1\");\n\n      incrementBtn.click();\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<button>Increment</button><button>Reset</button><div>2</div><input type=\"number\" disabled=\"\"><div style=\"font-size: 2em;\">Text</div><div>2<sup>2</sup> = 4</div>'\n      );\n      expect(dom2.value).toBe(\"2\");\n\n      incrementBtn.click();\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<button>Increment</button><button>Reset</button><div>3</div><input type=\"number\" disabled=\"\"><div style=\"font-size: 3em;\">Text</div><div>3<sup>2</sup> = 9</div>'\n      );\n      expect(dom2.value).toBe(\"3\");\n\n      resetBtn.click();\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<button>Increment</button><button>Reset</button><div>1</div><input type=\"number\" disabled=\"\"><div style=\"font-size: 1em;\">Text</div><div>1<sup>2</sup> = 1</div>'\n      );\n      expect(dom2.value).toBe(\"1\");\n    });\n\n    it(\"should update dom based on derived state\", async () => {\n      const hiddenDom = createHiddenDom();\n      const DerivedState = () => {\n        const text = van.state(\"VanJS\");\n        const length = van.derive(() => text.val!.length);\n        return span(\n          \"The length of \",\n          input({\n            type: \"text\",\n            value: text,\n            oninput: (e: any) => (text.val = e.target.value),\n          }),\n          \" is \",\n          length,\n          \".\"\n        );\n      };\n\n      van.add(hiddenDom, DerivedState());\n      const dom = <Element>hiddenDom.firstChild;\n      expect(dom.outerHTML).toBe(\n        '<span>The length of <input type=\"text\"> is 5.</span>'\n      );\n\n      const inputDom = dom.querySelector(\"input\")!;\n      inputDom.value = \"Mini-Van\";\n      inputDom.dispatchEvent(new Event(\"input\"));\n\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\n        '<span>The length of <input type=\"text\"> is 8.</span>'\n      );\n    });\n\n    it(\"should update props based on state\", async () => {\n      const hiddenDom = createHiddenDom();\n      const ConnectedProps = () => {\n        const text = van.state(\"\");\n        return span(\n          input({\n            type: \"text\",\n            value: text,\n            oninput: (e: any) => (text.val = e.target.value),\n          }),\n          input({\n            type: \"text\",\n            value: text,\n            oninput: (e: any) => (text.val = e.target.value),\n          })\n        );\n      };\n      van.add(hiddenDom, ConnectedProps());\n\n      const [input1, input2] = hiddenDom.querySelectorAll(\"input\");\n      input1.value += \"123\";\n      input1.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n      expect(input1.value).toBe(\"123\");\n      expect(input2.value).toBe(\"123\");\n\n      input2.value += \"abc\";\n      input2.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n      expect(input1.value).toBe(\"123abc\");\n      expect(input2.value).toBe(\"123abc\");\n    });\n\n    it(\"should update css based on state\", async () => {\n      const hiddenDom = createHiddenDom();\n      const FontPreview = () => {\n        const size = van.state(16),\n          color = van.state(\"black\");\n        return span(\n          \"Size: \",\n          input({\n            type: \"range\",\n            min: 10,\n            max: 36,\n            value: size,\n            oninput: (e: any) =>\n              (size.val = Number((<HTMLInputElement>e.target).value)),\n          }),\n          \" Color: \",\n          select(\n            {\n              oninput: (e: any) =>\n                (color.val = (<HTMLInputElement>e.target).value),\n              value: color,\n            },\n            [\"black\", \"blue\", \"green\", \"red\", \"brown\"].map((c) =>\n              option({ value: c }, c)\n            )\n          ),\n          span(\n            {\n              class: \"preview\",\n              style: () => `font-size: ${size.val}px; color: ${color.val};`,\n            },\n            \" Hello 🍦VanJS\"\n          )\n        );\n      };\n      van.add(hiddenDom, FontPreview());\n      expect((<any>hiddenDom.querySelector(\"span.preview\")).style.cssText).toBe(\n        \"font-size: 16px; color: black;\"\n      );\n\n      hiddenDom.querySelector(\"input\")!.value = \"20\";\n      hiddenDom.querySelector(\"input\")!.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n      expect((<any>hiddenDom.querySelector(\"span.preview\")).style.cssText).toBe(\n        \"font-size: 20px; color: black;\"\n      );\n\n      hiddenDom.querySelector(\"select\")!.value = \"blue\";\n      hiddenDom.querySelector(\"select\")!.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n      expect((<any>hiddenDom.querySelector(\"span.preview\")).style.cssText).toBe(\n        \"font-size: 20px; color: blue;\"\n      );\n    });\n\n    it(\"should bind event listener based on derived state\", async () => {\n      const hiddenDom = createHiddenDom();\n      const Counter = () => {\n        const counter = van.state(0);\n        const action = van.state(\"👍\");\n        return span(\n          \"❤️ \",\n          counter,\n          \" \",\n          select(\n            {\n              oninput: (e: any) => (action.val = e.target.value),\n              value: action,\n            },\n            option({ value: \"👍\" }, \"👍\"),\n            option({ value: \"👎\" }, \"👎\")\n          ),\n          \" \",\n          button(\n            {\n              onclick: van.derive(() =>\n                action.val === \"👍\"\n                  ? () => ++counter.val!\n                  : () => --counter.val!\n              ),\n            },\n            \"Run\"\n          )\n        );\n      };\n\n      van.add(hiddenDom, Counter());\n      const dom = <Element>hiddenDom.firstChild;\n      expect(dom.outerHTML).toBe(\n        '<span>❤️ 0 <select><option value=\"👍\">👍</option><option value=\"👎\">👎</option></select> <button>Run</button></span>'\n      );\n\n      dom.querySelector(\"button\")!.click();\n      dom.querySelector(\"button\")!.click();\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\n        '<span>❤️ 2 <select><option value=\"👍\">👍</option><option value=\"👎\">👎</option></select> <button>Run</button></span>'\n      );\n\n      dom.querySelector(\"select\")!.value = \"👎\";\n      dom.querySelector(\"select\")!.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n      dom.querySelector(\"button\")!.click();\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\n        '<span>❤️ 1 <select><option value=\"👍\">👍</option><option value=\"👎\">👎</option></select> <button>Run</button></span>'\n      );\n    });\n\n    it(\"should render nested ul li\", async () => {\n      const hiddenDom = createHiddenDom();\n      const SortedList = () => {\n        const items = van.state(\"a,b,c\"),\n          sortedBy = van.state(\"Ascending\");\n        return span(\n          \"Comma-separated list: \",\n          input({\n            oninput: (e: any) =>\n              (items.val = (<HTMLInputElement>e.target).value),\n            type: \"text\",\n            value: items,\n          }),\n          \" \",\n          select(\n            {\n              oninput: (e: any) =>\n                (sortedBy.val = (<HTMLInputElement>e.target).value),\n              value: sortedBy,\n            },\n            option({ value: \"Ascending\" }, \"Ascending\"),\n            option({ value: \"Descending\" }, \"Descending\")\n          ),\n          // A State-derived child node\n          () =>\n            sortedBy.val === \"Ascending\"\n              ? ul(\n                  items\n                    .val!.split(\",\")\n                    .sort()\n                    .map((i) => li(i))\n                )\n              : ul(\n                  items\n                    .val!.split(\",\")\n                    .sort()\n                    .reverse()\n                    .map((i) => li(i))\n                )\n        );\n      };\n      van.add(hiddenDom, SortedList());\n\n      hiddenDom.querySelector(\"input\")!.value = \"a,b,c,d\";\n      hiddenDom.querySelector(\"input\")!.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.querySelector(\"ul\")!.outerHTML).toBe(\n        \"<ul><li>a</li><li>b</li><li>c</li><li>d</li></ul>\"\n      );\n\n      hiddenDom.querySelector(\"select\")!.value = \"Descending\";\n      hiddenDom.querySelector(\"select\")!.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.querySelector(\"ul\")!.outerHTML).toBe(\n        \"<ul><li>d</li><li>c</li><li>b</li><li>a</li></ul>\"\n      );\n    });\n\n    it(\"should render editable ul li\", async () => {\n      const hiddenDom = createHiddenDom();\n      const ListItem = ({ text }: { text: string }) => {\n        const deleted = van.state(false);\n        return () =>\n          deleted.val\n            ? null\n            : li(text, a({ onclick: () => (deleted.val = true) }, \"❌\"));\n      };\n\n      const EditableList = () => {\n        const listDom = ul();\n        const textDom = input({ type: \"text\" });\n        return div(\n          textDom,\n          \" \",\n          button(\n            {\n              onclick: () =>\n                van.add(listDom, ListItem({ text: textDom.value })),\n            },\n            \"➕\"\n          ),\n          listDom\n        );\n      };\n      van.add(hiddenDom, EditableList());\n\n      hiddenDom.querySelector(\"input\")!.value = \"abc\";\n      hiddenDom.querySelector(\"button\")!.click();\n      hiddenDom.querySelector(\"input\")!.value = \"123\";\n      hiddenDom.querySelector(\"button\")!.click();\n      hiddenDom.querySelector(\"input\")!.value = \"def\";\n      hiddenDom.querySelector(\"button\")!.click();\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.querySelector(\"ul\")!.outerHTML).toBe(\n        \"<ul><li>abc<a>❌</a></li><li>123<a>❌</a></li><li>def<a>❌</a></li></ul>\"\n      );\n\n      {\n        [...hiddenDom.querySelectorAll(\"li\")]\n          .find((e) => e.innerHTML.startsWith(\"123\"))!\n          .querySelector(\"a\")!\n          .click();\n        await sleep(waitMsForDerivations);\n        expect(hiddenDom.querySelector(\"ul\")!.outerHTML).toBe(\n          \"<ul><li>abc<a>❌</a></li><li>def<a>❌</a></li></ul>\"\n        );\n      }\n      {\n        [...hiddenDom.querySelectorAll(\"li\")]\n          .find((e) => e.innerHTML.startsWith(\"abc\"))!\n          .querySelector(\"a\")!\n          .click();\n        await sleep(waitMsForDerivations);\n        expect(hiddenDom.querySelector(\"ul\")!.outerHTML).toBe(\n          \"<ul><li>def<a>❌</a></li></ul>\"\n        );\n      }\n      {\n        [...hiddenDom.querySelectorAll(\"li\")]\n          .find((e) => e.innerHTML.startsWith(\"def\"))!\n          .querySelector(\"a\")!\n          .click();\n        await sleep(waitMsForDerivations);\n        expect(hiddenDom.querySelector(\"ul\")!.outerHTML).toBe(\"<ul></ul>\");\n      }\n    });\n\n    it(\"should update dom based on polymorphic state\", async () => {\n      const stateProto = Object.getPrototypeOf(van.state());\n      const hiddenDom = createHiddenDom();\n      let numYellowButtonClicked = 0;\n\n      const val = <T>(v: T | State<T> | (() => T)) => {\n        const protoOfV = Object.getPrototypeOf(v ?? 0);\n        if (protoOfV === stateProto) return (<State<T>>v).val;\n        if (protoOfV === Function.prototype) return (<() => T>v)();\n        return <T>v;\n      };\n\n      const Button = ({\n        color,\n        text,\n        onclick,\n      }: {\n        color: State<string> | string | (() => string);\n        text: State<string> | string;\n        onclick: State<() => void> | (() => void);\n      }) =>\n        button(\n          { style: () => `background-color: ${val(color)};`, onclick },\n          text\n        );\n\n      const App = () => {\n        const colorState = van.state(\"green\");\n        const textState = van.state(\"Turn Red\");\n\n        const turnRed = () => {\n          colorState.val = \"red\";\n          textState.val = \"Turn Green\";\n          onclickState.val = turnGreen;\n        };\n        const turnGreen = () => {\n          colorState.val = \"green\";\n          textState.val = \"Turn Red\";\n          onclickState.val = turnRed;\n        };\n        const onclickState = van.state(turnRed);\n\n        const lightness = van.state(255);\n\n        return span(\n          Button({\n            color: \"yellow\",\n            text: \"Click Me\",\n            onclick: () => ++numYellowButtonClicked,\n          }),\n          \" \",\n          Button({ color: colorState, text: textState, onclick: onclickState }),\n          \" \",\n          Button({\n            color: () =>\n              `rgb(${lightness.val}, ${lightness.val}, ${lightness.val})`,\n            text: \"Get Darker\",\n            onclick: () => (lightness.val = Math.max(lightness.val! - 10, 0)),\n          })\n        );\n      };\n\n      van.add(hiddenDom, App());\n\n      expect(hiddenDom.innerHTML).toBe(\n        '<span><button style=\"background-color: yellow;\">Click Me</button> <button style=\"background-color: green;\">Turn Red</button> <button style=\"background-color: rgb(255, 255, 255);\">Get Darker</button></span>'\n      );\n      const [button1, button2, button3] = hiddenDom.querySelectorAll(\"button\");\n\n      button1.click();\n      expect(numYellowButtonClicked).toBe(1);\n      button1.click();\n      expect(numYellowButtonClicked).toBe(2);\n\n      button2.click();\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<span><button style=\"background-color: yellow;\">Click Me</button> <button style=\"background-color: red;\">Turn Green</button> <button style=\"background-color: rgb(255, 255, 255);\">Get Darker</button></span>'\n      );\n      button2.click();\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<span><button style=\"background-color: yellow;\">Click Me</button> <button style=\"background-color: green;\">Turn Red</button> <button style=\"background-color: rgb(255, 255, 255);\">Get Darker</button></span>'\n      );\n\n      button3.click();\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<span><button style=\"background-color: yellow;\">Click Me</button> <button style=\"background-color: green;\">Turn Red</button> <button style=\"background-color: rgb(245, 245, 245);\">Get Darker</button></span>'\n      );\n      button3.click();\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<span><button style=\"background-color: yellow;\">Click Me</button> <button style=\"background-color: green;\">Turn Red</button> <button style=\"background-color: rgb(235, 235, 235);\">Get Darker</button></span>'\n      );\n    });\n\n    it(\"should update dom based on state\", async () => {\n      const hiddenDom = createHiddenDom();\n      const TurnBold = () => {\n        const vanJS = van.state(<any>\"VanJS\");\n        return span(\n          button({ onclick: () => (vanJS.val = b(\"VanJS\")) }, \"Turn Bold\"),\n          \" Welcome to \",\n          vanJS,\n          \". \",\n          vanJS,\n          \" is awesome!\"\n        );\n      };\n\n      van.add(hiddenDom, TurnBold());\n      const dom = <Element>hiddenDom.firstChild;\n      expect(dom.outerHTML).toBe(\n        \"<span><button>Turn Bold</button> Welcome to VanJS. VanJS is awesome!</span>\"\n      );\n\n      dom.querySelector(\"button\")!.click();\n      await sleep(waitMsForDerivations);\n      expect(dom.outerHTML).toBe(\n        \"<span><button>Turn Bold</button> Welcome to . <b>VanJS</b> is awesome!</span>\"\n      );\n    });\n\n    it(\"should batch updates\", async () => {\n      const hiddenDom = createHiddenDom();\n      const name = van.state(\"\");\n\n      const Name1 = () => {\n        const numRendered = van.state(0);\n        return div(() => {\n          ++numRendered.val!;\n          return name.val!.trim().length === 0\n            ? p(\"Please enter your name\")\n            : p(\"Hello \", b(name));\n        }, p(i(\"The <p> element has been rendered \", numRendered, \" time(s).\")));\n      };\n\n      const Name2 = () => {\n        const numRendered = van.state(0);\n        const isNameEmpty = van.derive(() => name.val!.trim().length === 0);\n        return div(() => {\n          ++numRendered.val!;\n          return isNameEmpty.val\n            ? p(\"Please enter your name\")\n            : p(\"Hello \", b(name));\n        }, p(i(\"The <p> element has been rendered \", numRendered, \" time(s).\")));\n      };\n\n      van.add(\n        hiddenDom,\n        p(\n          \"Your name is: \",\n          input({\n            type: \"text\",\n            value: name,\n            oninput: (e: any) => (name.val = e.target.value),\n          })\n        ),\n        Name1(),\n        Name2()\n      );\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<p>Your name is: <input type=\"text\"></p><div><p>Please enter your name</p><p><i>The &lt;p&gt; element has been rendered 1 time(s).</i></p></div><div><p>Please enter your name</p><p><i>The &lt;p&gt; element has been rendered 1 time(s).</i></p></div>'\n      );\n\n      hiddenDom.querySelector(\"input\")!.value = \"T\";\n      hiddenDom.querySelector(\"input\")!.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n      hiddenDom.querySelector(\"input\")!.value = \"Ta\";\n      hiddenDom.querySelector(\"input\")!.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n      hiddenDom.querySelector(\"input\")!.value = \"Tao\";\n      hiddenDom.querySelector(\"input\")!.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<p>Your name is: <input type=\"text\"></p><div><p>Hello <b>Tao</b></p><p><i>The &lt;p&gt; element has been rendered 4 time(s).</i></p></div><div><p>Hello <b>Tao</b></p><p><i>The &lt;p&gt; element has been rendered 2 time(s).</i></p></div>'\n      );\n\n      hiddenDom.querySelector(\"input\")!.value = \"\";\n      hiddenDom.querySelector(\"input\")!.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations * 2);\n      expect(hiddenDom.innerHTML).toBe(\n        '<p>Your name is: <input type=\"text\"></p><div><p>Please enter your name</p><p><i>The &lt;p&gt; element has been rendered 5 time(s).</i></p></div><div><p>Please enter your name</p><p><i>The &lt;p&gt; element has been rendered 3 time(s).</i></p></div>'\n      );\n\n      hiddenDom.querySelector(\"input\")!.value = \"X\";\n      hiddenDom.querySelector(\"input\")!.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n      hiddenDom.querySelector(\"input\")!.value = \"Xi\";\n      hiddenDom.querySelector(\"input\")!.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n      hiddenDom.querySelector(\"input\")!.value = \"Xin\";\n      hiddenDom.querySelector(\"input\")!.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n\n      await sleep(waitMsForDerivations);\n      expect(hiddenDom.innerHTML).toBe(\n        '<p>Your name is: <input type=\"text\"></p><div><p>Hello <b>Xin</b></p><p><i>The &lt;p&gt; element has been rendered 8 time(s).</i></p></div><div><p>Hello <b>Xin</b></p><p><i>The &lt;p&gt; element has been rendered 4 time(s).</i></p></div>'\n      );\n    });\n\n    it(\"should hydrate the given element\", async () => {\n      const stateProto = Object.getPrototypeOf(van.state());\n\n      const val = <T>(v: T | State<T>) =>\n        Object.getPrototypeOf(v ?? 0) === stateProto ? (<State<T>>v).val : <T>v;\n\n      const hiddenDom = createHiddenDom();\n      const counterInit = 5;\n\n      const Counter = ({\n        id,\n        init = 0,\n        buttonStyle = \"👍👎\",\n      }: {\n        id?: string;\n        init?: number;\n        buttonStyle?: string | State<string>;\n      }) => {\n        const { button, div } = van.tags;\n\n        const [up, down] = [...Object(val(buttonStyle))];\n        const counter = van.state(init);\n        return div(\n          { ...(id ? { id } : {}), \"data-counter\": counter },\n          \"❤️ \",\n          counter,\n          \" \",\n          button({ onclick: () => ++counter.val! }, up),\n          button({ onclick: () => --counter.val! }, down)\n        );\n      };\n      const selectDom = select(\n        { value: \"👆👇\" },\n        option(\"👆👇\"),\n        option(\"👍👎\"),\n        option(\"🔼🔽\"),\n        option(\"⏫⏬\"),\n        option(\"📈📉\")\n      );\n      const buttonStyle = van.state(selectDom.value);\n      selectDom.oninput = (e) =>\n        (buttonStyle.val = (<HTMLSelectElement>e!.target).value);\n      // Static DOM before hydration\n      hiddenDom.innerHTML = div(\n        h2(\"Basic Counter\"),\n        Counter({ init: counterInit }),\n        h2(\"Styled Counter\"),\n        p(\"Select the button style: \", selectDom),\n        Counter({ init: counterInit, buttonStyle })\n      ).innerHTML;\n\n      const clickBtns = async (\n        dom: HTMLElement,\n        numUp: number,\n        numDown: number\n      ) => {\n        const [upBtn, downBtn] = [...dom.querySelectorAll(\"button\")];\n        for (let i = 0; i < numUp; ++i) {\n          upBtn.click();\n          await sleep(waitMsForDerivations);\n        }\n        for (let i = 0; i < numDown; ++i) {\n          downBtn.click();\n          await sleep(waitMsForDerivations);\n        }\n      };\n\n      const counterHTML = (counter: number, buttonStyle: string) => {\n        const [up, down] = [...buttonStyle];\n        return div(\n          { \"data-counter\": counter },\n          \"❤️ \",\n          counter,\n          \" \",\n          button(up),\n          button(down)\n        ).innerHTML;\n      };\n\n      // Before hydration, counters are not reactive\n      let [basicCounter, styledCounter] = hiddenDom.querySelectorAll(\"div\");\n      await clickBtns(basicCounter, 3, 1);\n      await clickBtns(styledCounter, 2, 5);\n      [basicCounter, styledCounter] = hiddenDom.querySelectorAll(\"div\");\n      expect(basicCounter.innerHTML).toBe(counterHTML(5, \"👍👎\"));\n      expect(styledCounter.innerHTML).toBe(counterHTML(5, \"👆👇\"));\n\n      // Selecting a new button style won't change the actual buttons\n      selectDom.value = \"🔼🔽\";\n      selectDom.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n      [basicCounter, styledCounter] = hiddenDom.querySelectorAll(\"div\");\n      expect(styledCounter.innerHTML).toBe(counterHTML(5, \"👆👇\"));\n      selectDom.value = \"👆👇\";\n      selectDom.dispatchEvent(new Event(\"input\"));\n\n      van.hydrate(basicCounter, (dom) =>\n        Counter({\n          id: \"basic-counter\",\n          init: Number(dom.getAttribute(\"data-counter\")),\n        })\n      );\n      van.hydrate(styledCounter, (dom) =>\n        Counter({\n          id: \"styled-counter\",\n          init: Number(dom.getAttribute(\"data-counter\")),\n          buttonStyle: buttonStyle,\n        })\n      );\n\n      // After hydration, counters are reactive\n      [basicCounter, styledCounter] = hiddenDom.querySelectorAll(\"div\");\n      await clickBtns(basicCounter, 3, 1);\n      await clickBtns(styledCounter, 2, 5);\n      [basicCounter, styledCounter] = hiddenDom.querySelectorAll(\"div\");\n      expect(basicCounter.innerHTML).toBe(counterHTML(7, \"👍👎\"));\n      expect(styledCounter.innerHTML).toBe(counterHTML(2, \"👆👇\"));\n\n      // Selecting a new button style will change the actual buttons\n      const prevStyledCounter = styledCounter;\n      selectDom.value = \"🔼🔽\";\n      selectDom.dispatchEvent(new Event(\"input\"));\n      await sleep(waitMsForDerivations);\n      [basicCounter, styledCounter] = hiddenDom.querySelectorAll(\"div\");\n      expect(styledCounter.innerHTML).toBe(counterHTML(2, \"🔼🔽\"));\n      expect(styledCounter !== prevStyledCounter);\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/dom/index.ts",
    "content": "/**\n * A TypeScript and modified version of the VanJS project.\n * Credits: https://github.com/vanjs-org/van & https://github.com/ge3224/van-ts\n */\n\n/**\n * A type representing primitive JavaScript types.\n */\nexport type Primitive = string | number | boolean | bigint;\n\n/**\n * A type representing a property value which can be a primitive, a function,\n * or null.\n */\nexport type PropValue = Primitive | (<T>(e: T) => void) | null;\n\n/**\n * A type representing valid child DOM values.\n */\nexport type ValidChildDomValue = Primitive | Node | null | undefined;\n\n/**\n * A type representing functions that generate DOM values.\n */\nexport type BindingFunc =\n  | ((dom?: Node) => ValidChildDomValue)\n  | ((dom?: Element) => Element);\n\n/**\n * A type representing various possible child DOM values.\n */\nexport type ChildDom =\n  | ValidChildDomValue\n  | StateView<Primitive | null | undefined>\n  | BindingFunc\n  | readonly ChildDom[];\n\ntype ConnectedDom = { isConnected: number };\n\ntype Binding = {\n  f: BindingFunc;\n  _dom: HTMLElement | null | undefined;\n};\n\ntype Listener<T> = {\n  f: BindingFunc;\n  s: State<T>;\n  _dom?: HTMLElement | null | undefined;\n};\n\ntype Connectable<T> = Listener<T> | Binding;\n\n/**\n * Interface representing a state object with various properties and bindings.\n */\nexport interface State<T> {\n  val: T | undefined;\n  readonly oldVal: T | undefined;\n  rawVal: T | undefined;\n  _oldVal: T | undefined;\n  _bindings: Array<Binding>;\n  _listeners: Array<Listener<T>>;\n}\n\n/**\n * A type representing a read-only view of a `State` object.\n */\nexport type StateView<T> = Readonly<State<T>>;\n\n/**\n * A type representing a value that can be either a `State` object or a direct\n * value of type `T`.\n */\nexport type Val<T> = State<T> | T;\n\n/**\n * A type representing a property value, a state view of a property value, or a\n * function returning a property value.\n */\nexport type PropValueOrDerived =\n  | PropValue\n  | StateView<PropValue>\n  | (() => PropValue);\n\n/**\n * A type representing partial props with known keys for a specific\n * element type.\n */\nexport type Props = Record<string, PropValueOrDerived> & {\n  class?: PropValueOrDerived;\n};\n\nexport type PropsWithKnownKeys<ElementType> = Partial<{\n  [K in keyof ElementType]: PropValueOrDerived;\n}>;\n\n/**\n * Represents a function type that constructs a tagged result using provided\n * properties and children.\n */\nexport type TagFunc<Result> = (\n  first?: (Props & PropsWithKnownKeys<Result>) | ChildDom,\n  ...rest: readonly ChildDom[]\n) => Result;\n\n/**\n * Interface representing dependencies with sets for getters and setters.\n */\ninterface Dependencies<T> {\n  _getters: Set<State<T>>;\n  _setters: Set<State<T>>;\n}\n\n/**\n * A function type for searching property descriptors in a prototype chain.\n */\ntype PropertyDescriptorSearchFn<T> = (\n  proto: T\n) => ReturnType<typeof Object.getOwnPropertyDescriptor> | undefined;\n\n/**\n * A function type for setting event listeners.\n */\ntype EventSetterFn = (\n  v: EventListenerOrEventListenerObject,\n  oldV?: EventListenerOrEventListenerObject\n) => void;\n\n/**\n * A function type for setting property values.\n */\ntype PropSetterFn = (value: any) => void;\n\n/**\n * Represents a function type for creating a namespace-specific collection of\n * tag functions.\n *\n * @param {string} namespaceURI\n * - The URI of the namespace for which the tag functions are being created.\n *\n * @returns {Readonly<Record<string, TagFunc<Element>>>}\n * - A readonly record of string keys to TagFunc<Element> functions,\n *   representing the collection of tag functions within the specified\n *   namespace.\n */\nexport type NamespaceFunction = (\n  namespaceURI: string\n) => Readonly<Record<string, TagFunc<Element>>>;\n\n/**\n * Represents a type for a collection of tag functions.\n *\n * This type includes:\n * - A readonly record of string keys to TagFunc<Element> functions, enabling\n *   the creation of generic HTML elements.\n * - Specific tag functions for each HTML element type as defined in\n *   HTMLElementTagNameMap, with the return type corresponding to the specific\n *   type of the HTML element (e.g., HTMLDivElement for 'div',\n *   HTMLAnchorElement for 'a').\n *\n * Usage of this type allows for type-safe creation of HTML elements with\n * specific properties and child elements.\n */\nexport type Tags = Readonly<Record<string, TagFunc<Element>>> & {\n  [K in keyof HTMLElementTagNameMap]: TagFunc<HTMLElementTagNameMap[K]>;\n};\n\n/**\n * While VanJS prefers using `let` instead of `const` to help reduce bundle\n * size, this project employs the `const` keyword. Bundle sizes are managed\n * during TypeScript compilation and bundling, incorporating minification and\n * tree shaking.\n *\n * The following are global variables used by VanJS to alias some builtin\n * symbols and reduce the bundle size.\n */\n\n/**\n * Set containing changed states.\n */\nlet changedStates: Set<State<any>> | undefined;\n\n/**\n * Set containing derived states.\n */\nlet derivedStates: Set<State<any>>;\n\n/**\n * Current dependencies object, containing getters and setters.\n */\nlet curDeps: Dependencies<any>;\n\n/**\n * Array containing current new derivations.\n */\nlet curNewDerives: Array<any>;\n\n/**\n * Set containing objects marked for garbage collection.\n */\nlet forGarbageCollection: Set<any> | undefined;\n\n/**\n * Alias for the built-in primitive value `undefined`. This variable is used to\n * reduce bundle size. Since it is never initialized, its value equals\n * `undefined`. During minification, variable names are shortened.\n */\nlet _undefined: undefined;\n\n/**\n * Alias for the keyword `Object`. This is used to reduce bundle size during\n * minification.\n */\nconst _object = Object;\n\n/**\n * Alias for the keyword `document`. This is used to reduce bundle size during\n * minification.\n */\nconst _document = document;\n\n/**\n * A constant function returning the prototype of an object.\n */\nconst protoOf = _object.getPrototypeOf;\n\n/**\n * Constant representing a DOM object that is always considered connected.\n */\nconst alwaysConnectedDom: ConnectedDom = { isConnected: 1 };\n\n/**\n * Constant representing the garbage collection cycle duration in milliseconds.\n */\nconst gcCycleInMs = 1000;\n\n/**\n * Cache object for property setters.\n */\nconst propSetterCache: { [key: string]: (<T>(v: T) => void) | 0 } = {};\n\n/**\n * Prototype of the `alwaysConnectedDom` object.\n */\nconst objProto = protoOf(alwaysConnectedDom);\n\n/**\n * Prototype of the `Function` object.\n */\nconst funcProto = Function.prototype;\n\n/**\n * Adds a state object to a set and schedules an associated function to be\n * executed after a specified delay if the set is initially undefined.\n */\nconst addAndScheduleOnFirst = <T>(\n  set: Set<State<T>> | undefined,\n  state: State<T>,\n  fn: () => void,\n  waitMs?: number\n): Set<State<T>> => {\n  if (set === undefined) {\n    setTimeout(fn, waitMs);\n    set = new Set<State<T>>();\n  }\n  set.add(state);\n  return set;\n};\n\n/**\n * Executes a function with a given argument and tracks dependencies during\n * its execution.\n */\nconst runAndCaptureDependencies = <T>(\n  fn: Function,\n  deps: Dependencies<T>,\n  arg: T\n): T => {\n  let prevDeps = curDeps;\n  curDeps = deps;\n\n  try {\n    return fn(arg);\n  } catch (e) {\n    console.error(e);\n    return arg;\n  } finally {\n    curDeps = prevDeps;\n  }\n};\n\n/**\n * Filters an array of Connectable objects, returning only those whose `_dom`\n * property is connected to the current document.\n */\nconst keepConnected = <T extends Connectable<T>>(l: T[]): T[] => {\n  return l.filter((b) => b._dom?.isConnected);\n};\n\n/**\n * Adds a state object to a collection that will be processed for\n * garbage collection.\n */\nconst addForGarbageCollection = <T>(discard: State<T>): void => {\n  forGarbageCollection = addAndScheduleOnFirst(\n    forGarbageCollection,\n    discard,\n    () => {\n      if (forGarbageCollection) {\n        for (let s of forGarbageCollection) {\n          s._bindings = keepConnected(s._bindings);\n          s._listeners = keepConnected(s._listeners);\n        }\n        forGarbageCollection = _undefined; // Resets `forGarbageCollection` after processing\n      }\n    },\n    gcCycleInMs\n  );\n};\n\n/**\n * Prototype for state objects, providing getter and setter for `val` and\n * `oldVal`.\n */\nconst stateProto = {\n  get val() {\n    const state = this as State<unknown>;\n    curDeps?._getters?.add(state);\n    return state.rawVal;\n  },\n\n  get oldVal() {\n    const state = this as State<unknown>;\n    curDeps?._getters?.add(state);\n    return state._oldVal;\n  },\n\n  set val(v) {\n    const state = this as State<unknown>;\n    curDeps?._setters?.add(state);\n    if (v !== state.rawVal) {\n      state.rawVal = v;\n      state._bindings.length + state._listeners.length\n        ? (derivedStates?.add(state),\n          (changedStates = addAndScheduleOnFirst(\n            changedStates,\n            state,\n            updateDoms\n          )))\n        : (state._oldVal = v);\n    }\n  },\n};\n\n/**\n * Generates a property descriptor with preset characteristics for properties\n * of a state object.\n */\nconst statePropertyDescriptor = <T>(value: T): PropertyDescriptor => {\n  return {\n    writable: true,\n    configurable: true,\n    enumerable: true,\n    value: value,\n  };\n};\n\n/**\n * Creates a state object with optional initial value. The properties of the\n * created object are configured to be enumerable, writable, and configurable.\n *\n * @template\n * @param {T} [initVal] - Optional initial value for the state.\n * @returns {State<T>} A state object.\n */\nconst state = <T>(initVal?: T): State<T> => {\n  // In contrast to the VanJS implementation (above), where reducing the bundle\n  // size is a key priority, we use the `Object.create` method instead of the\n  // `Object.prototype.__proto__` accessor since the latter is no longer\n  // recommended.\n  //\n  // [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto)\n  return _object.create(stateProto, {\n    rawVal: statePropertyDescriptor(initVal),\n    _oldVal: statePropertyDescriptor(initVal),\n    _bindings: statePropertyDescriptor([]),\n    _listeners: statePropertyDescriptor([]),\n  });\n};\n\n/**\n * Binds a function to a DOM element, capturing its dependencies and updating\n * the DOM as needed.\n *\n * @template T\n * @param {Function} f - The function to bind.\n * @param {T | undefined} [dom] - Optional DOM element or undefined.\n * @returns {T} The resulting DOM element or text node.*\n */\nconst bind = <T>(f: Function, dom?: T | undefined): T => {\n  let deps: Dependencies<any> = { _getters: new Set(), _setters: new Set() };\n  let binding: { [key: string]: any } = { f };\n  let prevNewDerives = curNewDerives;\n\n  curNewDerives = [];\n  let newDom = runAndCaptureDependencies(f, deps, dom);\n\n  newDom = ((newDom ?? _document) as Node).nodeType\n    ? newDom\n    : new Text(newDom as string | undefined);\n\n  for (let d of deps._getters)\n    deps._setters.has(d) ||\n      (addForGarbageCollection(d as any), (d as any)._bindings.push(binding));\n  for (let l of curNewDerives) l._dom = newDom;\n  curNewDerives = prevNewDerives;\n  return (binding._dom = newDom);\n};\n\n/**\n * Derives a State<T> based on a function and optional paremeters.\n *\n * @template T - The type of value returned by the derivation function.\n * @param {() => T} f - The derivation that computes the value.\n * @param {State<T>} [s] - Optional initial State<T> object to store the derived value.\n * @param {ChildDom} [dom] - Optional DOM element or ChildDom to associate with the derivation.\n * @returns {State<T>} The State<T> object containing the derived value and associated dependencies.\n */\nconst derive = <T>(f: () => T, s?: State<T>, dom?: ChildDom): State<T> => {\n  s = s ?? state();\n  let deps: Dependencies<T> = { _getters: new Set(), _setters: new Set() };\n  let listener: { [key: string]: any } = { f, s };\n  listener._dom = dom ?? curNewDerives?.push(listener) ?? alwaysConnectedDom;\n  s.val = runAndCaptureDependencies(f, deps, s.rawVal);\n  for (let d of deps._getters)\n    deps._setters.has(d) ||\n      (addForGarbageCollection(d), d._listeners.push(listener as Listener<T>));\n  return s;\n};\n\n/**\n * Appends child elements to a DOM element and returns said DOM element.\n *\n * @param {Element} dom - The DOM element to which children will be added.\n * @param {readonly ChildDom[]} children - An array of child elements or arrays of child elements to add.\n * @returns {Element} The modified DOM element after adding all children.\n */\nconst add = (dom: Element, ...children: readonly ChildDom[]): Element => {\n  for (let c of (children as any).flat(Infinity)) {\n    const protoOfC = protoOf(c ?? 0);\n    const child =\n      protoOfC === stateProto\n        ? bind(() => c.val)\n        : protoOfC === funcProto\n        ? bind(c)\n        : c;\n    child != _undefined && dom.append(child);\n  }\n  return dom;\n};\n\n/**\n * Creates a new DOM element with specified namespace, tag name, properties,\n * and children.\n */\nconst tag = (ns: string | null, name: string, ...args: any): Element => {\n  const [props, ...children] =\n    protoOf(args[0] ?? 0) === objProto ? args : [{}, ...args];\n\n  const dom: Element | HTMLElement = ns\n    ? _document.createElementNS(ns, name)\n    : _document.createElement(name);\n\n  for (let [k, v] of _object.entries(props)) {\n    const getDesc: PropertyDescriptorSearchFn<any> = (proto: any) =>\n      proto\n        ? _object.getOwnPropertyDescriptor(proto, k as PropertyKey) ??\n          getDesc(protoOf(proto))\n        : _undefined;\n\n    const cacheKey = `${name},${k}`;\n\n    const propSetter =\n      propSetterCache[cacheKey] ??\n      (propSetterCache[cacheKey] = getDesc(protoOf(dom))?.set ?? 0);\n\n    const setter: PropSetterFn | EventSetterFn = k.startsWith(\"on\")\n      ? (\n          v: EventListenerOrEventListenerObject,\n          oldV?: EventListenerOrEventListenerObject\n        ) => {\n          const event = k.slice(2);\n          if (oldV) dom.removeEventListener(event, oldV);\n          dom.addEventListener(event, v);\n        }\n      : propSetter\n      ? propSetter.bind(dom)\n      : dom.setAttribute.bind(dom, k);\n\n    let protoOfV = protoOf(v ?? 0);\n\n    k.startsWith(\"on\") ||\n      (protoOfV === funcProto &&\n        ((v = derive(v as BindingFunc)), (protoOfV = stateProto)));\n\n    protoOfV === stateProto\n      ? bind(() => (setter((v as any).val, (v as any)._oldVal), dom))\n      : setter(v as EventListenerOrEventListenerObject);\n  }\n\n  return add(dom, ...children);\n};\n\n/**\n * Creates a proxy handler object for intercepting the 'get' property access\n * operation. The handler wraps the access in a function call that binds the\n * accessed property name along with an optional namespace.\n */\nconst proxyHandler = (namespace?: string): ProxyHandler<object> => {\n  return {\n    get: (_: never, name: string) =>\n      tag.bind(_undefined, namespace ?? null, name),\n  };\n};\n\n/**\n * Creates a Proxy-based Tags object with optional namespace functionality.\n *\n * @function\n * @param {string} [namespace] - Optional namespace for organizing tags.\n * @returns {Tags & NamespaceFunction} A Proxy object representing tags and namespaces.\n */\nconst tags = new Proxy(\n  (namespace?: string) =>\n    new Proxy(tag, proxyHandler(namespace)) as NamespaceFunction,\n  proxyHandler()\n) as Tags & NamespaceFunction;\n\n/**\n * Updates a DOM element with a new DOM element, replacing the old one or\n * removing it if newDom is null or undefined.\n *\n * @template T\n * @param {T} dom - The current DOM element to update.\n * @param {T} newDom - The new DOM element to replace with.\n * @returns {void}\n */\nconst update = <T>(dom: T, newDom: T): void => {\n  newDom\n    ? newDom !== dom &&\n      (dom as HTMLElement).replaceWith(newDom as string | Node)\n    : (dom as HTMLElement).remove();\n};\n\n/**\n * Updates DOM elements based on changed and derived states.\n */\nconst updateDoms = () => {\n  let iter = 0,\n    derivedStatesArray = changedStates\n      ? [...changedStates].filter((s) => s.rawVal !== s._oldVal)\n      : [];\n  do {\n    derivedStates = new Set();\n    for (let l of new Set(\n      derivedStatesArray.flatMap(\n        (s) => (s._listeners = keepConnected(s._listeners))\n      )\n    ))\n      derive(l.f, l.s, l._dom), (l._dom = _undefined);\n  } while (++iter < 100 && (derivedStatesArray = [...derivedStates]).length);\n  let changedStatesArray = changedStates\n    ? [...changedStates].filter((s) => s.rawVal !== s._oldVal)\n    : [];\n  changedStates = _undefined;\n  for (let b of new Set(\n    changedStatesArray.flatMap(\n      (s) => (s._bindings = keepConnected(s._bindings))\n    )\n  ))\n    b._dom && update(b._dom, bind(b.f, b._dom)), (b._dom = _undefined);\n\n  for (let s of changedStatesArray) s._oldVal = s.rawVal;\n};\n\n/**\n * Hydrates a DOM element with a function that updates its content.\n *\n * @template T\n * @param {T} dom - The DOM node to hydrate.\n * @param {(dom: T) => T | null | undefined} updateFn - The function to update the DOM node.\n * @returns {T | void} The updated DOM node or void if update fails.\n */\nconst hydrate = <T extends Node>(\n  dom: T,\n  updateFn: (dom: T) => T | null | undefined\n): T | void => {\n  return update(dom, bind(updateFn, dom));\n};\n\nexport default { add, tags, state, derive, hydrate };\n"
  },
  {
    "path": "src/packages/hint/className.ts",
    "content": "export const hintsClassName = \"introjs-hints\";\nexport const hintClassName = \"introjs-hint\";\nexport const arrowClassName = \"introjs-arrow\";\nexport const tooltipClassName = \"introjs-tooltip\";\nexport const hideHintClassName = \"introjs-hidehint\";\nexport const tooltipReferenceLayerClassName = \"introjs-tooltipReferenceLayer\";\nexport const tooltipTextClassName = \"introjs-tooltiptext\";\nexport const hintReferenceClassName = \"introjs-hintReference\";\nexport const hintNoAnimationClassName = \"introjs-hint-no-anim\";\nexport const fixedHintClassName = \"introjs-fixedhint\";\nexport const hintDotClassName = \"introjs-hint-dot\";\nexport const hintPulseClassName = \"introjs-hint-pulse\";\n"
  },
  {
    "path": "src/packages/hint/components/HintIcon.ts",
    "content": "import isFixed from \"../../../util/isFixed\";\nimport dom, { State } from \"../../dom\";\nimport {\n  fixedHintClassName,\n  hideHintClassName,\n  hintClassName,\n  hintDotClassName,\n  hintNoAnimationClassName,\n  hintPulseClassName,\n} from \"../className\";\nimport { HintItem, HintPosition } from \"../hintItem\";\nimport { dataStepAttribute } from \"../dataAttributes\";\nimport { alignHintPosition } from \"../position\";\n\nconst { a, div } = dom.tags;\n\nexport type HintProps = {\n  index: number;\n  hintItem: HintItem;\n  refreshesSignal: State<number>;\n  onClick: (e: any) => void;\n};\n\nconst className = (hintItem: HintItem) => {\n  const classNames = [hintClassName];\n\n  if (!hintItem.hintAnimation) {\n    classNames.push(hintNoAnimationClassName);\n  }\n\n  if (isFixed(hintItem.element as HTMLElement)) {\n    classNames.push(fixedHintClassName);\n  }\n\n  if (!hintItem.isActive?.val) {\n    classNames.push(hideHintClassName);\n  }\n\n  return classNames.join(\" \");\n};\n\nconst HintDot = () => div({ className: hintDotClassName });\nconst HintPulse = () => div({ className: hintPulseClassName });\n\nexport const HintIcon = ({\n  index,\n  hintItem,\n  onClick,\n  refreshesSignal,\n}: HintProps) => {\n  const hintElement = a(\n    {\n      [dataStepAttribute]: index.toString(),\n      className: () => className(hintItem),\n      role: \"button\",\n      tabindex: 0,\n      \"aria-label\": hintItem?.hint,\n      onclick: onClick,\n    },\n    HintDot(),\n    HintPulse()\n  );\n\n  dom.derive(() => {\n    if (refreshesSignal.val === undefined) return;\n\n    alignHintPosition(\n      hintItem.hintPosition as HintPosition,\n      hintElement,\n      hintItem.element as HTMLElement\n    );\n  });\n\n  return hintElement;\n};\n"
  },
  {
    "path": "src/packages/hint/components/HintTooltip.test.ts",
    "content": "import { HintTooltip } from \"./HintTooltip\";\nimport { HintItem } from \"../hintItem\";\nimport dom from \"../../dom\";\n\ndescribe(\"HintTooltip\", () => {\n  test(\"should apply custom className to tooltip content container\", () => {\n    // Arrange\n    const element = document.createElement(\"div\");\n    document.body.appendChild(element);\n\n    const hintItem: HintItem = {\n      element,\n      hint: \"Test hint\",\n      position: \"bottom\",\n      hintTooltipElement: element,\n      hintPosition: \"bottom-middle\",\n    };\n\n    const closeButtonHandler = jest.fn();\n\n    const stubClassName = \"custom-tooltip\";\n\n    // Act\n    const tooltip = HintTooltip({\n      hintItem,\n      closeButtonEnabled: false,\n      closeButtonOnClick: closeButtonHandler,\n      closeButtonLabel: \"Close\",\n      closeButtonClassName: \"custom-close-btn\",\n      className: stubClassName,\n      autoPosition: false,\n      positionPrecedence: [\"top\", \"bottom\"],\n      refreshes: dom.state(0),\n      showStepNumbers: true,\n      text: \"Test hint\",\n    });\n\n    document.body.appendChild(tooltip);\n\n    // Assert\n    const contentContainer = tooltip.querySelector(\".introjs-tooltiptext\");\n    expect(contentContainer).not.toBeNull();\n    expect(contentContainer?.classList.contains(stubClassName)).toBe(true);\n    expect(contentContainer?.className).toBe(\n      `introjs-tooltiptext ${stubClassName}`\n    );\n  });\n});\n"
  },
  {
    "path": "src/packages/hint/components/HintTooltip.ts",
    "content": "import { Tooltip, TooltipProps } from \"../../tooltip/tooltip\";\nimport dom from \"../../dom\";\nimport { tooltipTextClassName } from \"../className\";\nimport { HintItem } from \"../hintItem\";\nimport { TooltipContent } from \"../../tooltip/tooltipContent\";\n\nconst { a, div } = dom.tags;\n\nexport type HintTooltipProps = Omit<\n  TooltipProps,\n  \"hintMode\" | \"element\" | \"position\"\n> & {\n  hintItem: HintItem;\n  closeButtonEnabled: boolean;\n  closeButtonOnClick: (hintItem: HintItem) => void;\n  closeButtonLabel: string;\n  closeButtonClassName: string;\n  className?: string;\n  renderAsHtml?: boolean;\n};\n\nexport const HintTooltip = ({\n  hintItem,\n  closeButtonEnabled,\n  closeButtonOnClick,\n  closeButtonLabel,\n  closeButtonClassName,\n  className,\n  renderAsHtml,\n  ...props\n}: HintTooltipProps) => {\n  const text = hintItem.hint;\n\n  return Tooltip(\n    {\n      ...props,\n      element: hintItem.hintTooltipElement as HTMLElement,\n      position: hintItem.position,\n      hintMode: true,\n      onClick: (e: Event) => {\n        //IE9 & Other Browsers\n        if (e.stopPropagation) {\n          e.stopPropagation();\n        }\n        //IE8 and Lower\n        else {\n          e.cancelBubble = true;\n        }\n      },\n    },\n    [\n      div(\n        { className: `${tooltipTextClassName} ${className || \"\"}` },\n        TooltipContent({\n          text: text || \"\",\n          tooltipRenderAsHtml: renderAsHtml,\n          container: div({ className: tooltipTextClassName }),\n        }),\n        closeButtonEnabled\n          ? a(\n              {\n                className: closeButtonClassName,\n                role: \"button\",\n                onclick: () => closeButtonOnClick(hintItem),\n              },\n              closeButtonLabel\n            )\n          : null\n      ),\n    ]\n  );\n};\n"
  },
  {
    "path": "src/packages/hint/components/HintsRoot.ts",
    "content": "import dom from \"../../dom\";\nimport { hintsClassName } from \"../className\";\nimport { hideHint } from \"../hide\";\nimport { Hint } from \"../hint\";\nimport { HintItem } from \"../hintItem\";\nimport { HintIcon } from \"./HintIcon\";\nimport { ReferenceLayer } from \"./ReferenceLayer\";\n\nconst { div } = dom.tags;\n\nexport type HintsRootProps = {\n  hint: Hint;\n};\n\n/**\n * Returns an event handler unique to the hint iteration\n */\nconst getHintClick = (hint: Hint, i: number) => (e: Event) => {\n  const evt = e ? e : window.event;\n\n  if (evt && evt.stopPropagation) {\n    evt.stopPropagation();\n  }\n\n  if (evt && evt.cancelBubble !== null) {\n    evt.cancelBubble = true;\n  }\n\n  hint.showHintDialog(i);\n};\n\nexport const HintsRoot = ({ hint }: HintsRootProps) => {\n  const hintElements = [];\n\n  for (const [i, hintItem] of hint.getHints().entries()) {\n    const hintTooltipElement = HintIcon({\n      index: i,\n      hintItem,\n      onClick: getHintClick(hint, i),\n      refreshesSignal: hint.getRefreshesSignal(),\n    });\n\n    // store the hint tooltip element in the hint item\n    // because we need to position the reference layer relative to the HintIcon\n    hintItem.hintTooltipElement = hintTooltipElement;\n\n    hintElements.push(hintTooltipElement);\n  }\n\n  const root = div(\n    {\n      className: hintsClassName,\n    },\n    ...hintElements\n  );\n\n  dom.derive(() => {\n    const activeHintSignal = hint.getActiveHintSignal();\n    if (activeHintSignal.val === undefined) return;\n\n    const stepId = activeHintSignal.val;\n    const hints = hint.getHints();\n    const hintItem = hints[stepId];\n\n    if (!hintItem) return;\n\n    const referenceLayer = ReferenceLayer({\n      activeHintSignal,\n      hintItem,\n\n      helperElementPadding: hint.getOption(\"helperElementPadding\"),\n      targetElement: hint.getTargetElement(),\n\n      refreshes: hint.getRefreshesSignal(),\n\n      // hints don't have step numbers\n      showStepNumbers: false,\n\n      renderAsHtml: hint.getOption(\"tooltipRenderAsHtml\"),\n\n      autoPosition: hint.getOption(\"autoPosition\"),\n      positionPrecedence: hint.getOption(\"positionPrecedence\"),\n\n      closeButtonEnabled: hint.getOption(\"hintShowButton\"),\n      closeButtonLabel: hint.getOption(\"hintButtonLabel\"),\n      closeButtonClassName: hint.getOption(\"buttonClass\"),\n      closeButtonOnClick: (hintItem: HintItem) => hideHint(hint, hintItem),\n      className: hint.getOption(\"tooltipClass\"),\n      text: hintItem.hint,\n    });\n\n    dom.add(root, referenceLayer);\n  });\n\n  return root;\n};\n"
  },
  {
    "path": "src/packages/hint/components/ReferenceLayer.ts",
    "content": "import { setPositionRelativeTo } from \"../../../util/positionRelativeTo\";\nimport dom, { State } from \"../../dom\";\nimport {\n  hintReferenceClassName,\n  tooltipReferenceLayerClassName,\n} from \"../className\";\nimport { dataStepAttribute } from \"../dataAttributes\";\nimport { HintTooltip, HintTooltipProps } from \"./HintTooltip\";\n\nconst { div } = dom.tags;\n\nexport type ReferenceLayerProps = HintTooltipProps & {\n  activeHintSignal: State<number | undefined>;\n  targetElement: HTMLElement;\n  helperElementPadding: number;\n};\n\nexport const ReferenceLayer = ({\n  activeHintSignal,\n  targetElement,\n  helperElementPadding,\n  ...props\n}: ReferenceLayerProps) => {\n  const initialActiveHintSignal = activeHintSignal.val;\n\n  return () => {\n    // remove the reference layer if the active hint signal is set to undefined\n    // e.g. when the user clicks outside the hint\n    if (activeHintSignal.val == undefined) return null;\n\n    // remove the reference layer if the active hint signal changes\n    // and the initial active hint signal is not same as the current active hint signal (e.g. when the user clicks on another hint)\n    if (initialActiveHintSignal !== activeHintSignal.val) return null;\n\n    const referenceLayer = div(\n      {\n        [dataStepAttribute]: activeHintSignal.val,\n        className: `${tooltipReferenceLayerClassName} ${hintReferenceClassName}`,\n      },\n      HintTooltip(props)\n    );\n\n    setTimeout(() => {\n      setPositionRelativeTo(\n        targetElement,\n        referenceLayer,\n        props.hintItem.hintTooltipElement as HTMLElement,\n        helperElementPadding\n      );\n    }, 1);\n\n    return referenceLayer;\n  };\n};\n"
  },
  {
    "path": "src/packages/hint/dataAttributes.ts",
    "content": "export const dataHintAttribute = \"data-hint\";\nexport const dataStepAttribute = \"data-step\";\nexport const dataHintPositionAttribute = \"data-hint-position\";\nexport const dataTooltipClassAttribute = \"data-tooltip-class\";\nexport const dataHintAnimationAttribute = \"data-hint-animation\";\n"
  },
  {
    "path": "src/packages/hint/hide.ts",
    "content": "import { Hint } from \"./hint\";\nimport { HintItem } from \"./hintItem\";\n\n/**\n * Hide a hint\n *\n * @api private\n */\nexport async function hideHint(hint: Hint, hintItem: HintItem) {\n  const isActiveSignal = hintItem.isActive;\n\n  if (isActiveSignal) {\n    isActiveSignal.val = false;\n  }\n\n  hint.hideHintDialog();\n\n  // call the callback function (if any)\n  hint.callback(\"hintClose\")?.call(hint, hintItem);\n}\n\n/**\n * Hide all hints\n *\n * @api private\n */\nexport async function hideHints(hint: Hint) {\n  for (const hintItem of hint.getHints()) {\n    await hideHint(hint, hintItem);\n  }\n}\n"
  },
  {
    "path": "src/packages/hint/hideHints.cy.ts",
    "content": "context(\"HideHints\", () => {\n  it(\"should hide all hints after calling hideHints()\", () => {\n    cy.visit(\"./cypress/setup/index.html\").then(async (window) => {\n      const instance = window.introJs.hint();\n\n      instance.showHints();\n\n      cy.get(\".introjs-hint\").should(\"have.length\", 4);\n\n      await instance.hideHints();\n\n      cy.get(\".introjs-hint\").should(\"have.length\", 4);\n      cy.get(\".introjs-hint\").each((x) =>\n        cy.wrap(x).should(\"have.class\", \"introjs-hidehint\")\n      );\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/hint/hint.test.ts",
    "content": "import { axe, toHaveNoViolations } from \"jest-axe\";\n\nexpect.extend(toHaveNoViolations);\n\nfunction getMockHint(container: HTMLElement) {\n  let options: any = {};\n  let hintsAddedCb: Function | null = null;\n  let hintClickCb: Function | null = null;\n  let hintCloseCb: Function | null = null;\n\n  return {\n    setOptions(opts: any) {\n      options = opts;\n      return this;\n    },\n    addHints() {\n      if (!options.hints) return;\n      options.hints.forEach((h: any, idx: number) => {\n        const el =\n          typeof h.element === \"string\"\n            ? container.querySelector(h.element)\n            : h.element;\n        if (!el) return;\n\n        // create mock hint element\n        const hintEl = document.createElement(\"button\");\n        hintEl.setAttribute(\"data-hint-id\", idx.toString());\n        hintEl.setAttribute(\"aria-label\", h.hint || \"Hint\");\n        hintEl.textContent = \"?\";\n        el.insertAdjacentElement(\"afterend\", hintEl);\n\n        hintEl.addEventListener(\"click\", () => {\n          if (hintClickCb) hintClickCb(hintEl, h, idx);\n        });\n      });\n      if (hintsAddedCb) hintsAddedCb();\n    },\n    onhintsadded(cb: Function) {\n      hintsAddedCb = cb;\n    },\n    onhintclick(cb: Function) {\n      hintClickCb = cb;\n    },\n    onhintclose(cb: Function) {\n      hintCloseCb = cb;\n    },\n    closeHint(stepId: number) {\n      const el = container.querySelector(`[data-hint-id=\"${stepId}\"]`);\n      if (el) {\n        el.remove();\n        if (hintCloseCb) hintCloseCb(stepId);\n      }\n    },\n    getHints() {\n      return options.hints || [];\n    },\n  };\n}\n\ntest(\"should have no accessibility violations for all hints\", async () => {\n  const container = document.createElement(\"main\");\n  container.setAttribute(\"role\", \"main\");\n  document.body.appendChild(container);\n\n  // Mock target elements\n  const btn = document.createElement(\"button\");\n  btn.id = \"btn\";\n  btn.textContent = \"Click me\";\n  container.appendChild(btn);\n\n  const img = document.createElement(\"img\");\n  img.id = \"img\";\n  img.src = \"https://via.placeholder.com/100\";\n  img.alt = \"Sample image\";\n  container.appendChild(img);\n\n  // Create mock hint\n  const mockHint = getMockHint(container);\n  mockHint.setOptions({\n    hints: [\n      { element: \"#btn\", hint: \"This is a button\" },\n      { element: \"#img\", hint: \"This is an image\" },\n    ],\n  });\n\n  mockHint.onhintsadded(() => console.log(\"Hints added\"));\n  type HintOption = { element: string | HTMLElement; hint?: string };\n\n  mockHint.onhintclick((item: HintOption, idx: number) =>\n    console.log(\"Hint clicked\", idx, item)\n  );\n  mockHint.onhintclose((idx: number) => console.log(\"Hint closed\", idx));\n\n  // Add hints\n  mockHint.addHints();\n\n  // Run accessibility test\n  const results = await axe(container);\n  expect(results).toHaveNoViolations();\n});\n"
  },
  {
    "path": "src/packages/hint/hint.ts",
    "content": "import { Package } from \"../package\";\nimport { getDefaultHintOptions, HintOptions } from \"./option\";\nimport { fetchHintItems, HintItem } from \"./hintItem\";\nimport { setOption, setOptions } from \"../../option\";\nimport isFunction from \"../../util/isFunction\";\nimport debounce from \"../../util/debounce\";\nimport DOMEvent from \"../../util/DOMEvent\";\nimport { getContainerElement } from \"../../util/containerElement\";\nimport { hideHint, hideHints } from \"./hide\";\nimport { showHint, showHints } from \"./show\";\nimport dom from \"../dom\";\nimport { HintsRoot } from \"./components/HintsRoot\";\n\ntype hintsAddedCallback = (this: Hint) => void | Promise<void>;\ntype hintClickCallback = (this: Hint, item: HintItem) => void | Promise<void>;\ntype hintCloseCallback = (this: Hint, item: HintItem) => void | Promise<void>;\n\nexport class Hint implements Package<HintOptions> {\n  private _root: HTMLElement | undefined;\n  private _hints: HintItem[] = [];\n  private readonly _targetElement: HTMLElement;\n  private _options: HintOptions;\n  private _activeHintSignal = dom.state<number | undefined>(undefined);\n  private _refreshesSignal = dom.state(0);\n\n  private readonly callbacks: {\n    hintsAdded?: hintsAddedCallback;\n    hintClick?: hintClickCallback;\n    hintClose?: hintCloseCallback;\n  } = {};\n\n  // Event handlers\n  private _hintsAutoRefreshFunction?: () => void;\n  // The hint close function used when the user clicks outside the hint\n  private _windowClickFunction?: () => void;\n\n  /**\n   * Create a new Hint instance\n   * @param elementOrSelector Optional target element or CSS query to start the Hint on\n   * @param options Optional Hint options\n   */\n  public constructor(\n    elementOrSelector?: string | HTMLElement,\n    options?: Partial<HintOptions>\n  ) {\n    this._targetElement = getContainerElement(elementOrSelector);\n    this._options = options\n      ? setOptions(this._options, { ...getDefaultHintOptions(), ...options })\n      : getDefaultHintOptions();\n  }\n\n  /**\n   * Get the callback function for the provided callback name\n   * @param callbackName The name of the callback\n   */\n  callback<K extends keyof typeof this.callbacks>(\n    callbackName: K\n  ): (typeof this.callbacks)[K] | undefined {\n    const callback = this.callbacks[callbackName];\n    if (isFunction(callback)) {\n      return callback;\n    }\n    return undefined;\n  }\n\n  /**\n   * Get the target element for the Hint\n   */\n  getTargetElement(): HTMLElement {\n    return this._targetElement;\n  }\n\n  /**\n   * Get the Hint items\n   */\n  getHints(): HintItem[] {\n    return this._hints;\n  }\n\n  /**\n   * Get the Hint item for the provided step ID\n   * @param stepId The step ID\n   */\n  getHint(stepId: number): HintItem | undefined {\n    return this._hints[stepId];\n  }\n\n  /**\n   * Set the Hint items\n   * @param hints The Hint items\n   */\n  setHints(hints: HintItem[]): this {\n    this._hints = hints;\n    return this;\n  }\n\n  /**\n   * Add a Hint item\n   * @param hint The Hint item\n   */\n  addHint(hint: HintItem): this {\n    // always set isActive to true\n    hint.isActive = dom.state(true);\n    this._hints.push(hint);\n    return this;\n  }\n\n  /**\n   * Get the active hint signal\n   * This is meant to be used internally by the Hint package\n   */\n  getActiveHintSignal() {\n    return this._activeHintSignal;\n  }\n\n  /**\n   * Returns the underlying state of the refreshes\n   * This is an internal method and should not be used outside of the package.\n   */\n  getRefreshesSignal() {\n    return this._refreshesSignal;\n  }\n\n  /**\n   * Returns true if the hints are rendered\n   */\n  isRendered() {\n    return this._root !== undefined;\n  }\n\n  private createRoot() {\n    this._root = HintsRoot({ hint: this });\n    dom.add(this._targetElement, this._root);\n  }\n\n  private recreateRoot() {\n    if (this._root) {\n      this._root.remove();\n      this.createRoot();\n    }\n  }\n\n  /**\n   * Render hints on the page\n   */\n  async render(): Promise<this> {\n    if (!this.isActive()) {\n      return this;\n    }\n\n    if (this.isRendered()) {\n      return this;\n    }\n\n    fetchHintItems(this);\n    this.createRoot();\n\n    this.callback(\"hintsAdded\")?.call(this);\n\n    this.enableHintAutoRefresh();\n    this.enableCloseDialogOnWindowClick();\n\n    return this;\n  }\n\n  /**\n   * Enable closing the dialog when the user clicks outside the hint\n   */\n  enableCloseDialogOnWindowClick() {\n    this._windowClickFunction = () => {\n      this._activeHintSignal.val = undefined;\n    };\n\n    DOMEvent.on(document, \"click\", this._windowClickFunction, false);\n  }\n\n  /**\n   * Disable closing the dialog when the user clicks outside the hint\n   */\n  disableCloseDialogOnWindowClick() {\n    if (this._windowClickFunction) {\n      DOMEvent.off(document, \"click\", this._windowClickFunction, false);\n    }\n  }\n\n  /**\n   * @deprecated renderHints() is deprecated, please use render() instead\n   */\n  async addHints() {\n    return this.render();\n  }\n\n  /**\n   * Hide a specific hint on the page\n   * @param stepId The hint step ID\n   */\n  async hideHint(stepId: number) {\n    const hintItem = this.getHint(stepId);\n\n    if (hintItem) {\n      await hideHint(this, hintItem);\n    }\n\n    return this;\n  }\n\n  /**\n   * Hide all hints on the page\n   */\n  async hideHints() {\n    await hideHints(this);\n    return this;\n  }\n\n  /**\n   * Show a specific hint on the page\n   * @param stepId The hint step ID\n   */\n  showHint(stepId: number) {\n    const hintItem = this.getHint(stepId);\n\n    if (hintItem) {\n      showHint(hintItem);\n    }\n\n    return this;\n  }\n\n  /**\n   * Show all hints on the page\n   */\n  async showHints() {\n    await showHints(this);\n    return this;\n  }\n\n  /**\n   * Destroys and removes all hint elements on the page\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\n   */\n  destroy() {\n    if (this._root) {\n      this._root.remove();\n      this._root = undefined;\n    }\n\n    this.disableHintAutoRefresh();\n    this.disableCloseDialogOnWindowClick();\n\n    return this;\n  }\n\n  /**\n   * @deprecated removeHints() is deprecated, please use destroy() instead\n   */\n  removeHints() {\n    this.destroy();\n    return this;\n  }\n\n  /**\n   * Remove one single hint element from the page\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\n   * Use removeHints if you want to remove all elements.\n   *\n   * @param stepId The hint step ID\n   */\n  removeHint(stepId: number) {\n    this._hints = this._hints.filter((_, i) => i !== stepId);\n    this.recreateRoot();\n\n    return this;\n  }\n\n  /**\n   * Show hint dialog for a specific hint\n   * @param stepId The hint step ID\n   */\n  async showHintDialog(stepId: number) {\n    const item = this.getHint(stepId);\n\n    if (!item) return;\n\n    if (this._activeHintSignal.val !== stepId) {\n      this._activeHintSignal.val = stepId;\n\n      // call the callback function (if any)\n      await this.callback(\"hintClick\")?.call(this, item);\n    } else {\n      // to toggle the hint dialog if the same hint is clicked again\n      this._activeHintSignal.val = undefined;\n    }\n\n    return this;\n  }\n\n  /**\n   * Hide hint dialog from the page\n   */\n  hideHintDialog() {\n    this._activeHintSignal.val = undefined;\n    return this;\n  }\n\n  /**\n   * Refresh the hints on the page\n   */\n  public refresh() {\n    if (!this.isRendered()) {\n      return this;\n    }\n\n    if (this._refreshesSignal.val !== undefined) {\n      this._refreshesSignal.val += 1;\n    }\n\n    return this;\n  }\n\n  /**\n   * Enable hint auto refresh on page scroll and resize for hints\n   */\n  enableHintAutoRefresh(): this {\n    const hintAutoRefreshInterval = this.getOption(\"hintAutoRefreshInterval\");\n    if (hintAutoRefreshInterval >= 0) {\n      this._hintsAutoRefreshFunction = debounce(\n        () => this.refresh(),\n        hintAutoRefreshInterval\n      );\n\n      DOMEvent.on(window, \"scroll\", this._hintsAutoRefreshFunction, true);\n      DOMEvent.on(window, \"resize\", this._hintsAutoRefreshFunction, true);\n    }\n\n    return this;\n  }\n\n  /**\n   * Disable hint auto refresh on page scroll and resize for hints\n   */\n  disableHintAutoRefresh(): this {\n    if (this._hintsAutoRefreshFunction) {\n      DOMEvent.off(window, \"scroll\", this._hintsAutoRefreshFunction, true);\n      DOMEvent.on(window, \"resize\", this._hintsAutoRefreshFunction, true);\n\n      this._hintsAutoRefreshFunction = undefined;\n    }\n\n    return this;\n  }\n\n  /**\n   * Get specific Hint option\n   * @param key The option key\n   */\n  getOption<K extends keyof HintOptions>(key: K): HintOptions[K] {\n    return this._options[key];\n  }\n\n  /**\n   * Set Hint options\n   * @param partialOptions Hint options\n   */\n  setOptions(partialOptions: Partial<HintOptions>): this {\n    this._options = setOptions(this._options, partialOptions);\n    return this;\n  }\n\n  /**\n   * Set specific Hint option\n   * @param key Option key\n   * @param value Option value\n   */\n  setOption<K extends keyof HintOptions>(key: K, value: HintOptions[K]): this {\n    this._options = setOption(this._options, key, value);\n    return this;\n  }\n\n  /**\n   * Clone the Hint instance\n   */\n  clone(): ThisType<this> {\n    return new Hint(this._targetElement, this._options);\n  }\n\n  /**\n   * Returns true if the Hint is active\n   */\n  isActive(): boolean {\n    return this.getOption(\"isActive\");\n  }\n\n  onHintsAdded(providedCallback: hintsAddedCallback) {\n    if (!isFunction(providedCallback)) {\n      throw new Error(\"Provided callback for onhintsadded was not a function.\");\n    }\n\n    this.callbacks.hintsAdded = providedCallback;\n    return this;\n  }\n\n  /**\n   * @deprecated onhintsadded is deprecated, please use onHintsAdded instead\n   * @param providedCallback callback function\n   */\n  onhintsadded(providedCallback: hintsAddedCallback) {\n    this.onHintsAdded(providedCallback);\n  }\n\n  /**\n   * Callback for when hint items are clicked\n   * @param providedCallback callback function\n   */\n  onHintClick(providedCallback: hintClickCallback) {\n    if (!isFunction(providedCallback)) {\n      throw new Error(\"Provided callback for onhintclick was not a function.\");\n    }\n\n    this.callbacks.hintClick = providedCallback;\n    return this;\n  }\n\n  /**\n   * @deprecated onhintclick is deprecated, please use onHintClick instead\n   * @param providedCallback\n   */\n  onhintclick(providedCallback: hintClickCallback) {\n    this.onHintClick(providedCallback);\n  }\n\n  /**\n   * Callback for when hint items are closed\n   * @param providedCallback callback function\n   */\n  onHintClose(providedCallback: hintCloseCallback) {\n    if (isFunction(providedCallback)) {\n      this.callbacks.hintClose = providedCallback;\n    } else {\n      throw new Error(\"Provided callback for onhintclose was not a function.\");\n    }\n    return this;\n  }\n\n  /**\n   * @deprecated onhintclose is deprecated, please use onHintClose instead\n   * @param providedCallback\n   */\n  onhintclose(providedCallback: hintCloseCallback) {\n    this.onHintClose(providedCallback);\n  }\n}\n"
  },
  {
    "path": "src/packages/hint/hintItem.test.ts",
    "content": "describe(\"hintAnimation logic\", () => {\n  const dataHintAnimationAttribute = \"data-hint-animation\";\n\n  let element: HTMLElement;\n  let hint: { getOption: (key: string) => boolean };\n\n  beforeEach(() => {\n    element = document.createElement(\"div\");\n\n    hint = {\n      getOption: jest.fn(() => true), // default: true\n    };\n  });\n\n  function getHintAnimation(element: HTMLElement, hint: any): boolean {\n    const hintAnimationAttr = element.getAttribute(dataHintAnimationAttribute);\n    let hintAnimation: boolean = hint.getOption(\"hintAnimation\");\n    if (hintAnimationAttr) {\n      hintAnimation = hintAnimationAttr === \"true\";\n    }\n    return hintAnimation;\n  }\n\n  test(\"should use hint.getOption when no attribute is set\", () => {\n    (hint.getOption as jest.Mock).mockReturnValue(true);\n\n    const result = getHintAnimation(element, hint);\n\n    expect(result).toBe(true);\n    expect(hint.getOption).toHaveBeenCalledWith(\"hintAnimation\");\n  });\n\n  test(\"should override with true when attribute is 'true'\", () => {\n    element.setAttribute(dataHintAnimationAttribute, \"true\");\n    (hint.getOption as jest.Mock).mockReturnValue(false); // default false\n\n    const result = getHintAnimation(element, hint);\n\n    expect(result).toBe(true);\n  });\n\n  test(\"should override with false when attribute is 'false'\", () => {\n    element.setAttribute(dataHintAnimationAttribute, \"false\");\n    (hint.getOption as jest.Mock).mockReturnValue(true); // default true\n\n    const result = getHintAnimation(element, hint);\n\n    expect(result).toBe(false);\n  });\n});\n"
  },
  {
    "path": "src/packages/hint/hintItem.ts",
    "content": "import { TooltipPosition } from \"../../packages/tooltip\";\nimport { Hint } from \"./hint\";\nimport cloneObject from \"../../util/cloneObject\";\nimport { queryElement, queryElements } from \"../../util/queryElement\";\nimport {\n  dataHintAttribute,\n  dataHintPositionAttribute,\n  dataTooltipClassAttribute,\n  dataHintAnimationAttribute,\n} from \"./dataAttributes\";\nimport { State } from \"../dom\";\n\nexport type HintPosition =\n  | \"top-left\"\n  | \"top-right\"\n  | \"top-middle\"\n  | \"bottom-left\"\n  | \"bottom-right\"\n  | \"bottom-middle\"\n  | \"middle-left\"\n  | \"middle-right\"\n  | \"middle-middle\";\n\nexport type HintItem = {\n  element?: HTMLElement | string | null;\n  tooltipClass?: string;\n  position: TooltipPosition;\n  hint: string;\n  // this is the HintIcon element for this particular hint\n  // used for positioning the HintTooltip\n  hintTooltipElement?: HTMLElement;\n  hintAnimation?: boolean;\n  hintPosition: HintPosition;\n  isActive?: State<boolean>;\n};\n\nexport const fetchHintItems = (hint: Hint) => {\n  hint.setHints([]);\n\n  const targetElement = hint.getTargetElement();\n  const hints = hint.getOption(\"hints\");\n\n  if (hints && hints.length > 0) {\n    for (const _hint of hints) {\n      const hintItem = cloneObject(_hint);\n\n      if (typeof hintItem.element === \"string\") {\n        // grab the element with given selector from the page\n        hintItem.element = queryElement(hintItem.element);\n      }\n\n      hintItem.hintPosition =\n        hintItem.hintPosition || hint.getOption(\"hintPosition\");\n      hintItem.hintAnimation =\n        hintItem.hintAnimation || hint.getOption(\"hintAnimation\");\n\n      if (hintItem.element !== null) {\n        hint.addHint(hintItem as HintItem);\n      }\n    }\n  } else {\n    const elements = Array.from(\n      queryElements(`*[${dataHintAttribute}]`, targetElement)\n    );\n\n    if (!elements || !elements.length) {\n      return false;\n    }\n\n    //first add intro items with data-step\n    for (const element of elements) {\n      // hint animation\n      let hintAnimationAttr = element.getAttribute(dataHintAnimationAttribute);\n\n      let hintAnimation: boolean = hint.getOption(\"hintAnimation\");\n      if (hintAnimationAttr) {\n        hintAnimation = hintAnimationAttr === \"true\";\n      }\n\n      const hintText = element.getAttribute(dataHintAttribute);\n      if (!hintText) return;\n\n      hint.addHint({\n        element: element,\n        hint: hintText,\n        hintPosition: (element.getAttribute(dataHintPositionAttribute) ||\n          hint.getOption(\"hintPosition\")) as HintPosition,\n        hintAnimation,\n        tooltipClass:\n          element.getAttribute(dataTooltipClassAttribute) || undefined,\n        position: (element.getAttribute(\"data-position\") ||\n          hint.getOption(\"tooltipPosition\")) as TooltipPosition,\n      });\n    }\n  }\n\n  return true;\n};\n"
  },
  {
    "path": "src/packages/hint/index.ts",
    "content": "export { Hint } from \"./hint\";\n"
  },
  {
    "path": "src/packages/hint/modal.cy.ts",
    "content": "context(\"Hints Modal\", () => {\n  it(\"should be able to open and close hint modals\", () => {\n    cy.visit(\"./cypress/setup/index.html\").then((window) => {\n      const instance = window.introJs.hint();\n\n      instance.showHints();\n\n      cy.get(\".introjs-hint\").first().click();\n\n      cy.get(\".introjs-tooltip\").should(\"have.length\", 1);\n      cy.get(\".introjs-tooltip\").contains(\"fixed header\");\n\n      cy.get(\".introjs-button\").click();\n\n      cy.get(\".introjs-tooltip\").should(\"have.length\", 0);\n    });\n  });\n\n  it(\"should display the correct modal content\", () => {\n    cy.visit(\"./cypress/setup/index.html\").then((window) => {\n      const instance = window.introJs.hint();\n\n      instance.showHints();\n\n      cy.get(\".introjs-hint\").first().click();\n\n      cy.get(\".introjs-tooltip\").contains(\"fixed header\");\n\n      cy.get(\".introjs-hint\").eq(1).click();\n\n      cy.get(\".introjs-tooltip\").contains(\"a button\");\n\n      cy.get(\".introjs-hint\").eq(2).click();\n\n      cy.get(\".introjs-tooltip\").contains(\"secondary header\");\n\n      cy.get(\".introjs-hint\").eq(3).click();\n\n      cy.get(\".introjs-tooltip\").contains(\"this is the footer\");\n    });\n  });\n\n  it(\"clicking on the same hint should close the modal\", () => {\n    cy.visit(\"./cypress/setup/index.html\").then((window) => {\n      const instance = window.introJs.hint();\n\n      instance.showHints();\n\n      for (let i = 0; i < 3; i++) {\n        cy.get(\".introjs-hint\").first().click();\n\n        cy.get(\".introjs-tooltip\").contains(\"fixed header\");\n\n        cy.get(\".introjs-hint\").first().click();\n\n        cy.get(\".introjs-tooltip\").should(\"not.exist\");\n      }\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/hint/option.ts",
    "content": "import { TooltipPosition } from \"../../packages/tooltip\";\nimport { HintItem, HintPosition } from \"./hintItem\";\nimport { Translator, LanguageCode } from \"../../i18n/language\";\n\nexport interface HintOptions {\n  /* List of all HintItems */\n  hints: Partial<HintItem>[];\n  /* True if the Hint instance is set to active */\n  isActive: boolean;\n  /* Default tooltip box position */\n  tooltipPosition: string;\n  /* Next CSS class for tooltip boxes */\n  tooltipClass: string;\n  /* Default hint position */\n  hintPosition: HintPosition;\n  /* Hint button label */\n  hintButtonLabel: string;\n  /* Display the \"Got it\" button? */\n  hintShowButton: boolean;\n  /* Hints auto-refresh interval in ms (set to -1 to disable) */\n  hintAutoRefreshInterval: number;\n  /* Adding animation to hints? */\n  hintAnimation: boolean;\n  /* additional classes to put on the buttons */\n  buttonClass: string;\n  /* Set how much padding to be used around helper element */\n  helperElementPadding: number;\n  /* To determine the tooltip position automatically based on the window.width/height */\n  autoPosition: boolean;\n  /* Precedence of positions, when auto is enabled */\n  positionPrecedence: TooltipPosition[];\n  /* Optional property to determine if content should be rendered as HTML */\n  tooltipRenderAsHtml?: boolean;\n  /* Optional property to set the language of the hint.\n   Can be a Language object for custom languages or a language code string for built-in languages.\n   Built-in language codes: \"en_US\", \"es_ES\", \"fr_FR\", \"de_DE\", \"fa_IR\"\n   Defaults to the user's browser language if not provided. */\n  language?: LanguageCode;\n}\n\nexport function getDefaultHintOptions(translator?: Translator): HintOptions {\n  const activeTranslator = translator ?? new Translator();\n\n  return {\n    hints: [],\n    isActive: true,\n    tooltipPosition: \"bottom\",\n    tooltipClass: \"\",\n    hintPosition: \"top-middle\",\n    hintButtonLabel: activeTranslator.translate(\"buttons.gotIt\"),\n    hintShowButton: true,\n    hintAutoRefreshInterval: 10,\n    hintAnimation: true,\n    buttonClass: \"introjs-button\",\n    helperElementPadding: 10,\n    autoPosition: true,\n    positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\n    tooltipRenderAsHtml: true,\n    language: activeTranslator.getLanguage(),\n  };\n}\n"
  },
  {
    "path": "src/packages/hint/position.ts",
    "content": "import getOffset from \"../../util/getOffset\";\nimport { HintPosition } from \"./hintItem\";\n\n/**\n * Aligns hint position\n *\n * @api private\n */\nexport const alignHintPosition = (\n  position: HintPosition,\n  hintElement: HTMLElement,\n  targetElement?: HTMLElement\n) => {\n  if (typeof targetElement === \"undefined\") {\n    return;\n  }\n\n  // get/calculate offset of target element\n  const offset = getOffset(targetElement);\n  const iconWidth = 20;\n  const iconHeight = 20;\n\n  // align the hint element\n  switch (position) {\n    default:\n    case \"top-left\":\n      hintElement.style.left = `${offset.left}px`;\n      hintElement.style.top = `${offset.top}px`;\n      break;\n    case \"top-right\":\n      hintElement.style.left = `${offset.left + offset.width - iconWidth}px`;\n      hintElement.style.top = `${offset.top}px`;\n      break;\n    case \"bottom-left\":\n      hintElement.style.left = `${offset.left}px`;\n      hintElement.style.top = `${offset.top + offset.height - iconHeight}px`;\n      break;\n    case \"bottom-right\":\n      hintElement.style.left = `${offset.left + offset.width - iconWidth}px`;\n      hintElement.style.top = `${offset.top + offset.height - iconHeight}px`;\n      break;\n    case \"middle-left\":\n      hintElement.style.left = `${offset.left}px`;\n      hintElement.style.top = `${\n        offset.top + (offset.height - iconHeight) / 2\n      }px`;\n      break;\n    case \"middle-right\":\n      hintElement.style.left = `${offset.left + offset.width - iconWidth}px`;\n      hintElement.style.top = `${\n        offset.top + (offset.height - iconHeight) / 2\n      }px`;\n      break;\n    case \"middle-middle\":\n      hintElement.style.left = `${\n        offset.left + (offset.width - iconWidth) / 2\n      }px`;\n      hintElement.style.top = `${\n        offset.top + (offset.height - iconHeight) / 2\n      }px`;\n      break;\n    case \"bottom-middle\":\n      hintElement.style.left = `${\n        offset.left + (offset.width - iconWidth) / 2\n      }px`;\n      hintElement.style.top = `${offset.top + offset.height - iconHeight}px`;\n      break;\n    case \"top-middle\":\n      hintElement.style.left = `${\n        offset.left + (offset.width - iconWidth) / 2\n      }px`;\n      hintElement.style.top = `${offset.top}px`;\n      break;\n  }\n};\n"
  },
  {
    "path": "src/packages/hint/removeHints.cy.ts",
    "content": "context(\"RemoveHints\", () => {\n  it(\"should remove all hints after calling removeHints()\", () => {\n    cy.visit(\"./cypress/setup/index.html\").then((window) => {\n      const instance = window.introJs.hint().setOptions({\n        hints: [\n          {\n            element: \"#fixed-parent\",\n            hint: \"header element\",\n          },\n          {\n            element: \"#clickable-button\",\n            hint: \"main button\",\n          },\n          {\n            element: \"#relative-parent\",\n            hint: \"relative parent\",\n          },\n        ],\n      });\n\n      instance.showHints();\n\n      cy.get(\".introjs-hint\")\n        .should(\"have.length\", 3)\n        .then(() => {\n          instance.removeHints();\n\n          cy.get(\".introjs-hint\").should(\"have.length\", 0);\n        });\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/hint/show.ts",
    "content": "import { Hint } from \"./hint\";\nimport { HintItem } from \"./hintItem\";\n\n/**\n * Show all hints\n *\n * @api private\n */\nexport async function showHints(hint: Hint) {\n  if (hint.isRendered()) {\n    for (const hintItem of hint.getHints()) {\n      showHint(hintItem);\n    }\n  } else {\n    // or render hints if there are none\n    await hint.render();\n  }\n}\n\n/**\n * Show a hint\n *\n * @api private\n */\nexport function showHint(hintItem: HintItem) {\n  const activeSignal = hintItem.isActive;\n\n  if (activeSignal) {\n    activeSignal.val = true;\n  }\n}\n"
  },
  {
    "path": "src/packages/hint/showHints.cy.ts",
    "content": "context(\"ShowHints\", () => {\n  it(\"should render all hints using the data-hint attributes\", () => {\n    cy.visit(\"./cypress/setup/index.html\").then(async (window) => {\n      const instance = window.introJs.hint();\n\n      await instance.showHints();\n\n      cy.get(\".introjs-hint\").should(\"have.length\", 4);\n    });\n  });\n\n  it(\"should render all hints on the page with the given JSON options\", () => {\n    cy.visit(\"./cypress/setup/index.html\").then((window) => {\n      const instance = window.introJs.hint().setOptions({\n        hints: [\n          {\n            element: \"#fixed-parent\",\n            hint: \"header element\",\n          },\n          {\n            element: \"#clickable-button\",\n            hint: \"main button\",\n          },\n          {\n            element: \"#relative-parent\",\n            hint: \"relative parent\",\n          },\n        ],\n      });\n\n      instance.showHints();\n\n      cy.get(\".introjs-hint\").should(\"have.length\", 3);\n    });\n  });\n\n  it(\"should prefer JSON options over data-hint attributes\", () => {\n    cy.visit(\"./cypress/setup/index.html\").then((window) => {\n      const instance = window.introJs.hint().setOptions({\n        hints: [\n          {\n            element: \"#fixed-parent\",\n            hint: \"header element\",\n          },\n        ],\n      });\n\n      instance.showHints();\n\n      cy.get(\".introjs-hint\").should(\"have.length\", 1);\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/package.ts",
    "content": "/**\n * Generic package interface.\n */\nexport interface Package<TOption> {\n  getOption<K extends keyof TOption>(key: K): TOption[K];\n  setOptions(partialOptions: Partial<TOption>): this;\n  setOption<K extends keyof TOption>(key: K, value: TOption[K]): this;\n  clone(): ThisType<this>;\n  isActive(): boolean;\n}\n"
  },
  {
    "path": "src/packages/tooltip/index.ts",
    "content": "export { TooltipPosition } from \"./tooltipPosition\";\n"
  },
  {
    "path": "src/packages/tooltip/tooltip.test.ts",
    "content": "import dom from \"../dom\";\nimport { Tooltip } from \"./tooltip\";\nimport { axe, toHaveNoViolations } from \"jest-axe\";\nimport { appendMockSteps, getMockSteps, getMockTour } from \"../tour/mock\";\n\nexpect.extend(toHaveNoViolations);\n\ndescribe(\"Tour Tooltip\", () => {\n  let container: HTMLElement;\n\n  beforeEach(() => {\n    jest.resetAllMocks();\n    jest.setTimeout(50000);\n    document.body.innerHTML = \"\";\n    container = document.createElement(\"main\");\n    container.setAttribute(\"role\", \"main\");\n    document.body.appendChild(container);\n  });\n\n  afterEach(() => {\n    document.body.removeChild(container);\n  });\n\n  beforeAll(() => {\n    Object.defineProperty(global, \"navigator\", {\n      value: { language: \"en-US\" },\n      writable: true,\n    });\n  });\n\n  test(\"all tooltips should have the correct class name\", async () => {\n    // Arrange: append mock elements\n    const container = document.createElement(\"div\");\n    document.body.appendChild(container);\n    appendMockSteps(container);\n\n    // Arrange: initialize mock tour with steps\n    const mockTour = getMockTour(container);\n    mockTour.setOptions({\n      steps: getMockSteps(),\n    });\n\n    // Act: start the tour\n    await mockTour.start();\n\n    // Assert: check tooltip class for each step\n    for (let i = 0; i < mockTour.getSteps().length; i++) {\n      const step = mockTour.getStep(i);\n\n      const tooltip = Tooltip({\n        className: \"custom-tooltip\",\n        element: step.element as HTMLElement,\n        position: step.position,\n        refreshes: dom.state(0),\n        showStepNumbers: true,\n        autoPosition: false,\n        positionPrecedence: [\"top\", \"bottom\"],\n        hintMode: false,\n        text: step.title || step.intro,\n      });\n\n      expect(tooltip.className).toContain(\"custom-tooltip\");\n\n      if (i < mockTour.getSteps().length - 1) {\n        await mockTour.nextStep();\n      }\n    }\n  });\n\n  test(\"should have no accessibility violations across all tour tooltips\", async () => {\n    // Arrange: append mock elements\n    appendMockSteps(container);\n\n    // Arrange: initialize mock tour with steps\n    const mockTour = getMockTour(container);\n    mockTour.setOptions({\n      steps: getMockSteps(),\n    });\n\n    // Act: start the tour\n    await mockTour.start();\n\n    // Assert: check accessibility for each tooltip step\n    for (let i = 0; i < mockTour.getSteps().length; i++) {\n      const results = await axe(document.body);\n      expect(results).toHaveNoViolations();\n\n      if (i < mockTour.getSteps().length - 1) {\n        await mockTour.nextStep();\n      }\n    }\n  });\n});\n"
  },
  {
    "path": "src/packages/tooltip/tooltip.ts",
    "content": "import getOffset, { Offset } from \"../../util/getOffset\";\nimport getWindowSize from \"../../util/getWindowSize\";\nimport dom, { ChildDom, State } from \"../dom\";\nimport { arrowClassName, tooltipClassName } from \"../tour/classNames\";\nimport { determineAutoPosition, TooltipPosition } from \"./tooltipPosition\";\n\nconst { div } = dom.tags;\n\nexport const TooltipArrow = (props: {\n  tooltipPosition: State<TooltipPosition>;\n  tooltipBottomOverflow: State<boolean>;\n}) => {\n  const classNames = dom.derive(() => {\n    const classNames = [arrowClassName];\n\n    switch (props.tooltipPosition.val) {\n      case \"top-right-aligned\":\n        classNames.push(\"bottom-right\");\n        break;\n\n      case \"top-middle-aligned\":\n        classNames.push(\"bottom-middle\");\n        break;\n\n      case \"top-left-aligned\":\n      // top-left-aligned is the same as the default top\n      case \"top\":\n        classNames.push(\"bottom\");\n        break;\n      case \"right\":\n        if (props.tooltipBottomOverflow.val) {\n          // In this case, right would have fallen below the bottom of the screen.\n          // Modify so that the bottom of the tooltip connects with the target\n          classNames.push(\"left-bottom\");\n        } else {\n          classNames.push(\"left\");\n        }\n        break;\n      case \"left\":\n        if (props.tooltipBottomOverflow.val) {\n          // In this case, left would have fallen below the bottom of the screen.\n          // Modify so that the bottom of the tooltip connects with the target\n          classNames.push(\"right-bottom\");\n        } else {\n          classNames.push(\"right\");\n        }\n\n        break;\n      case \"floating\":\n        // no arrow element for floating tooltips\n        break;\n      case \"bottom-right-aligned\":\n        classNames.push(\"top-right\");\n        break;\n\n      case \"bottom-middle-aligned\":\n        classNames.push(\"top-middle\");\n        break;\n\n      // case 'bottom-left-aligned':\n      // Bottom-left-aligned is the same as the default bottom\n      // case 'bottom':\n      // Bottom going to follow the default behavior\n      default:\n        classNames.push(\"top\");\n    }\n\n    return classNames;\n  });\n\n  return div({\n    className: () => classNames.val?.filter(Boolean).join(\" \"),\n    style: () =>\n      `display: ${\n        props.tooltipPosition.val === \"floating\" ? \"none\" : \"block\"\n      };`,\n  });\n};\n\n/**\n * Set tooltip right so it doesn't go off the left side of the window\n *\n * @return boolean true, if tooltipLayerStyleRight is ok. false, otherwise.\n */\nfunction checkLeft(\n  targetOffset: {\n    top: number;\n    left: number;\n    width: number;\n    height: number;\n  },\n  tooltipLayerStyleRight: number,\n  tooltipWidth: number,\n  tooltipLeft: State<string>,\n  tooltipRight: State<string>\n): boolean {\n  if (\n    targetOffset.left +\n      targetOffset.width -\n      tooltipLayerStyleRight -\n      tooltipWidth <\n    0\n  ) {\n    // off the left side of the window\n    tooltipLeft.val = `-${targetOffset.left}px`;\n    return false;\n  }\n  tooltipRight.val = `${tooltipLayerStyleRight}px`;\n  return true;\n}\n\n/**\n * Set tooltip left so it doesn't go off the right side of the window\n *\n * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\n */\nfunction checkRight(\n  targetOffset: {\n    top: number;\n    left: number;\n    width: number;\n    height: number;\n  },\n  windowSize: {\n    width: number;\n    height: number;\n  },\n  tooltipLayerStyleLeft: number,\n  tooltipWidth: number,\n  tooltipLeft: State<string>\n): boolean {\n  if (\n    targetOffset.left + tooltipLayerStyleLeft + tooltipWidth >\n    windowSize.width\n  ) {\n    // off the right side of the window\n    tooltipLeft.val = `${\n      windowSize.width - tooltipWidth - targetOffset.left\n    }px`;\n    return false;\n  }\n\n  tooltipLeft.val = `${tooltipLayerStyleLeft}px`;\n  return true;\n}\n\nconst alignTooltip = (\n  position: TooltipPosition,\n  targetOffset: { width: number; height: number; left: number; top: number },\n  windowSize: { width: number; height: number },\n  tooltipWidth: number,\n  tooltipHeight: number,\n  tooltipTop: State<string>,\n  tooltipBottom: State<string>,\n  tooltipLeft: State<string>,\n  tooltipRight: State<string>,\n  tooltipMarginLeft: State<string>,\n  tooltipMarginTop: State<string>,\n  tooltipBottomOverflow: State<boolean>,\n  showStepNumbers: boolean,\n  hintMode: boolean\n) => {\n  tooltipTop.val = \"auto\";\n  tooltipBottom.val = \"auto\";\n  tooltipLeft.val = \"auto\";\n  tooltipRight.val = \"auto\";\n  tooltipMarginLeft.val = \"0\";\n  tooltipMarginTop.val = \"0\";\n\n  let tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipWidth / 2;\n\n  switch (position) {\n    case \"top-right-aligned\":\n      let tooltipLayerStyleRight = 0;\n      checkLeft(\n        targetOffset,\n        tooltipLayerStyleRight,\n        tooltipWidth,\n        tooltipLeft,\n        tooltipRight\n      );\n      tooltipBottom.val = `${targetOffset.height + 20}px`;\n      break;\n\n    case \"top-middle-aligned\":\n      // a fix for middle aligned hints\n      if (hintMode) {\n        tooltipLayerStyleLeftRight += 5;\n      }\n\n      if (\n        checkLeft(\n          targetOffset,\n          tooltipLayerStyleLeftRight,\n          tooltipWidth,\n          tooltipLeft,\n          tooltipRight\n        )\n      ) {\n        tooltipRight.val = undefined;\n        checkRight(\n          targetOffset,\n          windowSize,\n          tooltipLayerStyleLeftRight,\n          tooltipWidth,\n          tooltipLeft\n        );\n      }\n      tooltipBottom.val = `${targetOffset.height + 20}px`;\n      break;\n\n    case \"top-left-aligned\":\n    // top-left-aligned is the same as the default top\n    case \"top\":\n      const tooltipLayerStyleLeft = hintMode ? 0 : 15;\n\n      checkRight(\n        targetOffset,\n        windowSize,\n        tooltipLayerStyleLeft,\n        tooltipWidth,\n        tooltipLeft\n      );\n      tooltipBottom.val = `${targetOffset.height + 20}px`;\n      break;\n    case \"right\":\n      tooltipLeft.val = `${targetOffset.width + 20}px`;\n\n      if (tooltipBottomOverflow.val) {\n        // In this case, right would have fallen below the bottom of the screen.\n        // Modify so that the bottom of the tooltip connects with the target\n        tooltipTop.val = `-${tooltipHeight - targetOffset.height - 20}px`;\n      }\n      break;\n    case \"left\":\n      if (!hintMode && showStepNumbers === true) {\n        tooltipTop.val = \"15px\";\n      }\n\n      if (tooltipBottomOverflow.val) {\n        // In this case, left would have fallen below the bottom of the screen.\n        // Modify so that the bottom of the tooltip connects with the target\n        tooltipTop.val = `-${tooltipHeight - targetOffset.height - 20}px`;\n      }\n      tooltipRight.val = `${targetOffset.width + 20}px`;\n\n      break;\n    case \"floating\":\n      //we have to adjust the top and left of layer manually for intro items without element\n      tooltipLeft.val = \"50%\";\n      tooltipTop.val = \"50%\";\n      tooltipMarginLeft.val = `-${tooltipWidth / 2}px`;\n      tooltipMarginTop.val = `-${tooltipHeight / 2}px`;\n\n      break;\n    case \"bottom-right-aligned\":\n      tooltipLayerStyleRight = 0;\n      checkLeft(\n        targetOffset,\n        tooltipLayerStyleRight,\n        tooltipWidth,\n        tooltipLeft,\n        tooltipRight\n      );\n      tooltipTop.val = `${targetOffset.height + 20}px`;\n      break;\n\n    case \"bottom-middle-aligned\":\n      // a fix for middle aligned hints\n      if (hintMode) {\n        tooltipLayerStyleLeftRight += 5;\n      }\n\n      if (\n        checkLeft(\n          targetOffset,\n          tooltipLayerStyleLeftRight,\n          tooltipWidth,\n          tooltipLeft,\n          tooltipRight\n        )\n      ) {\n        tooltipRight.val = \"\";\n        checkRight(\n          targetOffset,\n          windowSize,\n          tooltipLayerStyleLeftRight,\n          tooltipWidth,\n          tooltipLeft\n        );\n      }\n      tooltipTop.val = `${targetOffset.height + 20}px`;\n      break;\n\n    // case 'bottom-left-aligned':\n    // Bottom-left-aligned is the same as the default bottom\n    // case 'bottom':\n    // Bottom going to follow the default behavior\n    default:\n      checkRight(targetOffset, windowSize, 0, tooltipWidth, tooltipLeft);\n      tooltipTop.val = `${targetOffset.height + 20}px`;\n  }\n};\n\nexport type TooltipProps = {\n  position: TooltipPosition;\n  element: HTMLElement;\n  refreshes: State<number>;\n  hintMode: boolean;\n  showStepNumbers: boolean;\n\n  transitionDuration?: number;\n\n  // auto-alignment properties\n  autoPosition: boolean;\n  positionPrecedence: TooltipPosition[];\n\n  onClick?: (e: any) => void;\n  className?: string;\n  text: string;\n};\n\nexport const Tooltip = (\n  {\n    position: initialPosition,\n    element,\n    refreshes,\n    hintMode = false,\n    showStepNumbers = false,\n\n    transitionDuration = 0,\n\n    // auto-alignment properties\n    positionPrecedence = [],\n    className,\n    autoPosition = true,\n    text,\n    onClick,\n  }: TooltipProps,\n  children?: ChildDom[]\n) => {\n  const top = dom.state<string>(\"auto\");\n  const right = dom.state<string>(\"auto\");\n  const bottom = dom.state<string>(\"auto\");\n  const left = dom.state<string>(\"auto\");\n  const marginLeft = dom.state<string>(\"0\");\n  const marginTop = dom.state<string>(\"0\");\n  const opacity = dom.state<number>(0);\n  // setting a default height for the tooltip instead of 0 to avoid flickering\n  // this default is coming from the CSS class and is overridden after the tooltip is rendered\n  const tooltipHeight = dom.state<number>(250);\n  // max width of the tooltip according to its CSS class\n  // this default is coming from the CSS class and is overridden after the tooltip is rendered\n  const tooltipWidth = dom.state<number>(300);\n  const position = dom.state<TooltipPosition>(initialPosition);\n  // windowSize can change if the window is resized\n  const windowSize = dom.state(getWindowSize());\n  const targetOffset = dom.state<Offset>(getOffset(element));\n  const tooltipBottomOverflow = dom.derive<boolean>(\n    () => targetOffset.val!.top + tooltipHeight.val! > windowSize.val!.height\n  );\n\n  dom.derive(() => {\n    // set the new windowSize and targetOffset if the refreshes signal changes\n    if (refreshes.val !== undefined) {\n      windowSize.val = getWindowSize();\n      targetOffset.val = getOffset(element);\n    }\n  });\n\n  // auto-align tooltip based on position precedence and target offset\n  dom.derive(() => {\n    if (\n      position.val !== undefined &&\n      initialPosition !== \"floating\" &&\n      autoPosition &&\n      tooltipWidth.val &&\n      tooltipHeight.val &&\n      targetOffset.val &&\n      windowSize.val\n    ) {\n      position.val = determineAutoPosition(\n        positionPrecedence,\n        targetOffset.val,\n        tooltipWidth.val,\n        tooltipHeight.val,\n        initialPosition,\n        windowSize.val\n      );\n    }\n  });\n\n  // align tooltip based on position and target offset\n  dom.derive(() => {\n    if (\n      tooltipWidth.val !== undefined &&\n      tooltipHeight.val !== undefined &&\n      tooltipBottomOverflow.val !== undefined &&\n      position.val !== undefined &&\n      targetOffset.val !== undefined &&\n      windowSize.val !== undefined\n    ) {\n      alignTooltip(\n        position.val,\n        targetOffset.val,\n        windowSize.val,\n        tooltipWidth.val,\n        tooltipHeight.val,\n        top,\n        bottom,\n        left,\n        right,\n        marginLeft,\n        marginTop,\n        tooltipBottomOverflow,\n        showStepNumbers,\n        hintMode\n      );\n    }\n  });\n\n  const tooltip = div(\n    {\n      style: () =>\n        `top: ${top.val}; right: ${right.val}; bottom: ${bottom.val}; left: ${left.val}; margin-left: ${marginLeft.val}; margin-top: ${marginTop.val};opacity: ${opacity.val}`,\n      className: () =>\n        `${tooltipClassName} introjs-${position.val} ${className || \"\"}`,\n      role: \"dialog\",\n      \"aria-label\": text,\n      onclick: onClick ?? null,\n    },\n    [\n      TooltipArrow({\n        tooltipPosition: position,\n        tooltipBottomOverflow: tooltipBottomOverflow,\n      }),\n      [children],\n    ]\n  );\n\n  // apply the transition effect\n  setTimeout(() => {\n    opacity.val = 1;\n  }, transitionDuration);\n\n  setTimeout(() => {\n    // set the correct height and width of the tooltip after it has been rendered\n    tooltipHeight.val = tooltip.offsetHeight;\n    tooltipWidth.val = tooltip.offsetWidth;\n  }, 1);\n\n  return tooltip;\n};\n"
  },
  {
    "path": "src/packages/tooltip/tooltipContent.test.ts",
    "content": "import dom from \"../dom\";\nimport { TooltipContent } from \"./tooltipContent\";\n\nconst { div } = dom.tags;\n\ndescribe(\"TooltipContent\", () => {\n  it(\"renders plain text when tooltipRenderAsHtml is false\", () => {\n    const el = TooltipContent({\n      text: \"<strong>Bold Text</strong>\",\n      tooltipRenderAsHtml: false,\n      container: div(),\n    });\n\n    expect(el.innerHTML).toBe(\"&lt;strong&gt;Bold Text&lt;/strong&gt;\");\n    expect(el.querySelector(\"strong\")).toBeNull();\n  });\n\n  it(\"renders HTML content when tooltipRenderAsHtml is true\", () => {\n    const el = TooltipContent({\n      text: \"<strong>Bold Text</strong>\",\n      tooltipRenderAsHtml: true,\n      container: div(),\n    });\n\n    expect(el.innerHTML).toBe(\"<strong>Bold Text</strong>\");\n    expect(el.querySelector(\"strong\")?.textContent).toBe(\"Bold Text\");\n  });\n\n  it(\"applies a custom class when provided\", () => {\n    const el = TooltipContent({\n      text: \"Custom class test\",\n      container: div({ className: \"my-custom-tooltip\" }),\n    });\n\n    expect(el.className).toBe(\"my-custom-tooltip\");\n    expect(el.textContent).toBe(\"Custom class test\");\n  });\n});\n"
  },
  {
    "path": "src/packages/tooltip/tooltipContent.ts",
    "content": "import dom from \"../dom\";\n\nexport type TooltipContentProps = {\n  /**\n   * The text content to be displayed in the tooltip.\n   */\n  text: string;\n  /**\n   * The container element where the tooltip content will be rendered.\n   */\n  container: HTMLElement;\n  /**\n   * If true, the text will be rendered as HTML.\n   */\n  tooltipRenderAsHtml?: boolean;\n};\n\n/**\n * TooltipContent component renders the content of a tooltip.\n * It can render plain text or HTML based on the `tooltipRenderAsHtml` flag.\n */\nexport const TooltipContent = ({\n  text,\n  container,\n  tooltipRenderAsHtml,\n}: TooltipContentProps) => {\n  dom.derive(() => {\n    const el = container as HTMLElement;\n    if (!el) return;\n\n    // Clear existing content\n    el.innerHTML = \"\";\n\n    if (tooltipRenderAsHtml && text) {\n      const fragment = document.createRange().createContextualFragment(text);\n      el.appendChild(fragment);\n    } else {\n      el.textContent = text;\n    }\n  });\n\n  return container;\n};\n"
  },
  {
    "path": "src/packages/tooltip/tooltipPosition.test.ts",
    "content": "import { determineAutoPosition, TooltipPosition } from \"./tooltipPosition\";\n\nconst positionPrecedence: TooltipPosition[] = [\n  \"bottom\",\n  \"top\",\n  \"right\",\n  \"left\",\n];\n\ndescribe(\"placeTooltip\", () => {\n  test(\"should automatically place the tooltip position when there is enough space\", () => {\n    // Arrange\n    // Act\n    const position = determineAutoPosition(\n      positionPrecedence,\n      {\n        top: 200,\n        left: 200,\n        height: 100,\n        width: 100,\n        right: 300,\n        bottom: 300,\n        absoluteTop: 200,\n        absoluteLeft: 200,\n        absoluteRight: 300,\n        absoluteBottom: 300,\n      },\n      100,\n      100,\n      \"top\",\n      { height: 1000, width: 1000 }\n    );\n\n    // Assert\n    expect(position).toBe(\"top-right-aligned\");\n  });\n\n  test(\"should use floating tooltips when height/width is limited\", () => {\n    // Arrange\n    // Act\n    const position = determineAutoPosition(\n      positionPrecedence,\n      {\n        top: 0,\n        left: 0,\n        height: 100,\n        width: 100,\n        right: 0,\n        bottom: 0,\n        absoluteTop: 0,\n        absoluteLeft: 0,\n        absoluteRight: 0,\n        absoluteBottom: 0,\n      },\n      100,\n      100,\n      \"top\",\n      { height: 100, width: 100 }\n    );\n\n    // Assert\n    expect(position).toBe(\"floating\");\n  });\n\n  test(\"should use bottom middle aligned when there is enough vertical space\", () => {\n    // Arrange\n    // Act\n    const position = determineAutoPosition(\n      positionPrecedence,\n      {\n        top: 0,\n        left: 0,\n        height: 100,\n        width: 100,\n        right: 0,\n        bottom: 0,\n        absoluteTop: 0,\n        absoluteLeft: 0,\n        absoluteRight: 0,\n        absoluteBottom: 0,\n      },\n      100,\n      100,\n      \"left\",\n      { height: 500, width: 100 }\n    );\n\n    // Assert\n    expect(position).toBe(\"bottom-middle-aligned\");\n  });\n});\n"
  },
  {
    "path": "src/packages/tooltip/tooltipPosition.ts",
    "content": "import removeEntry from \"../../util/removeEntry\";\nimport { Offset } from \"../../util/getOffset\";\n\nexport type TooltipPosition =\n  | \"floating\"\n  | \"top\"\n  | \"bottom\"\n  | \"left\"\n  | \"right\"\n  | \"top-right-aligned\"\n  | \"top-left-aligned\"\n  | \"top-middle-aligned\"\n  | \"bottom-right-aligned\"\n  | \"bottom-left-aligned\"\n  | \"bottom-middle-aligned\";\n\n/**\n * auto-determine alignment\n */\nfunction determineAutoAlignment(\n  offsetLeft: number,\n  tooltipWidth: number,\n  windowWidth: number,\n  desiredAlignment: TooltipPosition[]\n): TooltipPosition | null {\n  const halfTooltipWidth = tooltipWidth / 2;\n  const winWidth = Math.min(windowWidth, window.screen.width);\n\n  // valid left must be at least a tooltipWidth\n  // away from right side\n  if (winWidth - offsetLeft < tooltipWidth) {\n    removeEntry<TooltipPosition>(desiredAlignment, \"top-left-aligned\");\n    removeEntry<TooltipPosition>(desiredAlignment, \"bottom-left-aligned\");\n  }\n\n  // valid middle must be at least half\n  // width away from both sides\n  if (\n    offsetLeft < halfTooltipWidth ||\n    winWidth - offsetLeft < halfTooltipWidth\n  ) {\n    removeEntry<TooltipPosition>(desiredAlignment, \"top-middle-aligned\");\n    removeEntry<TooltipPosition>(desiredAlignment, \"bottom-middle-aligned\");\n  }\n\n  // valid right must be at least a tooltipWidth\n  // width away from left side\n  if (offsetLeft < tooltipWidth) {\n    removeEntry<TooltipPosition>(desiredAlignment, \"top-right-aligned\");\n    removeEntry<TooltipPosition>(desiredAlignment, \"bottom-right-aligned\");\n  }\n\n  if (desiredAlignment.length) {\n    return desiredAlignment[0];\n  }\n\n  return null;\n}\n\n/**\n * Determines the position of the tooltip based on the position precedence and availability\n * of screen space.\n */\nexport function determineAutoPosition(\n  positionPrecedence: TooltipPosition[],\n  targetOffset: Offset,\n  tooltipWidth: number,\n  tooltipHeight: number,\n  desiredTooltipPosition: TooltipPosition,\n  windowSize: { width: number; height: number }\n): TooltipPosition {\n  // Take a clone of position precedence. These will be the available\n  const possiblePositions = positionPrecedence.slice();\n\n  // Add some padding to the tooltip height and width for better positioning\n  tooltipHeight = tooltipHeight + 10;\n  tooltipWidth = tooltipWidth + 20;\n\n  // If we check all the possible areas, and there are no valid places for the tooltip, the element\n  // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\n  let calculatedPosition: TooltipPosition = \"floating\";\n\n  /*\n   * auto determine position\n   */\n\n  // Check for space below\n  if (targetOffset.absoluteBottom + tooltipHeight > windowSize.height) {\n    removeEntry<TooltipPosition>(possiblePositions, \"bottom\");\n  }\n\n  // Check for space above\n  if (targetOffset.absoluteTop - tooltipHeight < 0) {\n    removeEntry<TooltipPosition>(possiblePositions, \"top\");\n  }\n\n  // Check for space to the right\n  if (targetOffset.absoluteRight + tooltipWidth > windowSize.width) {\n    removeEntry<TooltipPosition>(possiblePositions, \"right\");\n  }\n\n  // Check for space to the left\n  if (targetOffset.absoluteLeft - tooltipWidth < 0) {\n    removeEntry<TooltipPosition>(possiblePositions, \"left\");\n  }\n\n  // Check if user requested a specific alignment\n  const userRequestedAlignment =\n    desiredTooltipPosition && desiredTooltipPosition.includes(\"-aligned\");\n\n  // strip alignment from position for base position checking\n  let basePosition = desiredTooltipPosition;\n  if (desiredTooltipPosition) {\n    // ex: \"bottom-right-aligned\"\n    // should return 'bottom'\n    basePosition = desiredTooltipPosition.split(\"-\")[0] as TooltipPosition;\n  }\n\n  if (possiblePositions.length) {\n    // Pick the first valid position, in order\n    calculatedPosition = possiblePositions[0];\n\n    if (possiblePositions.includes(basePosition)) {\n      // If the requested position is in the list, choose that\n      calculatedPosition = basePosition;\n    }\n  }\n\n  // only \"top\" and \"bottom\" positions have optional alignments\n  if (calculatedPosition === \"top\" || calculatedPosition === \"bottom\") {\n    let defaultAlignment: TooltipPosition;\n    let desiredAlignment: TooltipPosition[] = [];\n\n    if (calculatedPosition === \"top\") {\n      // if screen width is too small\n      // for ANY alignment, middle is\n      // probably the best for visibility\n      defaultAlignment = \"top-middle-aligned\";\n\n      desiredAlignment = [\n        \"top-left-aligned\",\n        \"top-middle-aligned\",\n        \"top-right-aligned\",\n      ];\n    } else {\n      defaultAlignment = \"bottom-middle-aligned\";\n\n      desiredAlignment = [\n        \"bottom-left-aligned\",\n        \"bottom-middle-aligned\",\n        \"bottom-right-aligned\",\n      ];\n    }\n\n    // If user requested a specific alignment, use it directly\n    if (\n      userRequestedAlignment &&\n      desiredAlignment.includes(desiredTooltipPosition)\n    ) {\n      calculatedPosition = desiredTooltipPosition;\n    } else {\n      // No specific alignment requested, use auto-alignment\n      calculatedPosition =\n        determineAutoAlignment(\n          targetOffset.absoluteLeft,\n          tooltipWidth,\n          windowSize.width,\n          desiredAlignment\n        ) || defaultAlignment;\n    }\n  }\n\n  return calculatedPosition;\n}\n"
  },
  {
    "path": "src/packages/tour/callback.ts",
    "content": "import { Tour } from \"./tour\";\n\nexport type introBeforeChangeCallback = (\n  this: Tour,\n  targetElement: HTMLElement,\n  currentStep: number,\n  direction: \"backward\" | \"forward\"\n) => Promise<boolean> | boolean;\n\nexport type introChangeCallback = (\n  this: Tour,\n  targetElement: HTMLElement\n) => void | Promise<void>;\n\nexport type introAfterChangeCallback = (\n  this: Tour,\n  targetElement: HTMLElement\n) => void | Promise<void>;\n\nexport type introCompleteCallback = (\n  this: Tour,\n  currentStep: number,\n  reason: \"skip\" | \"end\" | \"done\"\n) => void | Promise<void>;\n\nexport type introStartCallback = (\n  this: Tour,\n  targetElement: HTMLElement\n) => void | Promise<void>;\n\nexport type introExitCallback = (this: Tour) => void | Promise<void>;\n\nexport type introSkipCallback = (\n  this: Tour,\n  currentStep: number\n) => void | Promise<void>;\n\nexport type introBeforeExitCallback = (\n  this: Tour,\n  targetElement: HTMLElement\n) => boolean | Promise<boolean>;\n\nexport type hintsAddedCallback = (this: Tour) => void | Promise<void>;\n"
  },
  {
    "path": "src/packages/tour/classNames.ts",
    "content": "export const overlayClassName = \"introjs-overlay\";\nexport const disableInteractionClassName = \"introjs-disableInteraction\";\nexport const bulletsClassName = \"introjs-bullets\";\nexport const progressClassName = \"introjs-progress\";\nexport const progressBarClassName = \"introjs-progressbar\";\nexport const helperLayerClassName = \"introjs-helperLayer\";\nexport const tooltipReferenceLayerClassName = \"introjs-tooltipReferenceLayer\";\nexport const helperNumberLayerClassName = \"introjs-helperNumberLayer\";\nexport const tooltipClassName = \"introjs-tooltip\";\nexport const tooltipHeaderClassName = \"introjs-tooltip-header\";\nexport const tooltipTextClassName = \"introjs-tooltiptext\";\nexport const tooltipTitleClassName = \"introjs-tooltip-title\";\nexport const tooltipButtonsClassName = \"introjs-tooltipbuttons\";\nexport const arrowClassName = \"introjs-arrow\";\nexport const skipButtonClassName = \"introjs-skipbutton\";\nexport const previousButtonClassName = \"introjs-prevbutton\";\nexport const nextButtonClassName = \"introjs-nextbutton\";\nexport const doneButtonClassName = \"introjs-donebutton\";\nexport const dontShowAgainClassName = \"introjs-dontShowAgain\";\nexport const hiddenButtonClassName = \"introjs-hidden\";\nexport const disabledButtonClassName = \"introjs-disabled\";\nexport const fullButtonClassName = \"introjs-fullbutton\";\nexport const activeClassName = \"active\";\nexport const fixedTooltipClassName = \"introjs-fixedTooltip\";\nexport const floatingElementClassName = \"introjsFloatingElement\";\nexport const showElementClassName = \"introjs-showElement\";\n"
  },
  {
    "path": "src/packages/tour/components/DisableInteraction.ts",
    "content": "import dom, { State } from \"../../dom\";\nimport { disableInteractionClassName } from \"../classNames\";\nimport { setPositionRelativeToStep } from \"../position\";\nimport { TourStep } from \"../steps\";\n\nconst { div } = dom.tags;\n\nexport type HelperLayerProps = {\n  currentStep: State<number | undefined>;\n  steps: TourStep[];\n  refreshes: State<number>;\n  targetElement: HTMLElement;\n  helperElementPadding: number;\n};\n\nexport const DisableInteraction = ({\n  currentStep,\n  steps,\n  refreshes,\n  targetElement,\n  helperElementPadding,\n}: HelperLayerProps) => {\n  const step = dom.derive(() =>\n    currentStep.val !== undefined ? steps[currentStep.val] : null\n  );\n\n  return () => {\n    if (!step.val) {\n      return null;\n    }\n\n    const disableInteraction = div({\n      className: disableInteractionClassName,\n    });\n\n    dom.derive(() => {\n      // set the position of the reference layer if the refreshes signal changes\n      if (!step.val || refreshes.val == undefined) return;\n\n      setPositionRelativeToStep(\n        targetElement,\n        disableInteraction,\n        step.val,\n        helperElementPadding\n      );\n    });\n\n    return disableInteraction;\n  };\n};\n"
  },
  {
    "path": "src/packages/tour/components/FloatingElement.ts",
    "content": "import dom, { State } from \"../../dom\";\nimport { floatingElementClassName } from \"../classNames\";\n\nconst { div } = dom.tags;\n\nexport type FloatingElementProps = {\n  currentStep: State<number | undefined>;\n};\n\nexport const FloatingElement = ({ currentStep }: FloatingElementProps) => {\n  const floatingElement = div({\n    className: floatingElementClassName,\n  });\n\n  dom.derive(() => {\n    // meaning the tour has ended so we should remove the floating element\n    if (currentStep.val === undefined) {\n      floatingElement.remove();\n    }\n  });\n\n  return floatingElement;\n};\n"
  },
  {
    "path": "src/packages/tour/components/HelperLayer.ts",
    "content": "import { style } from \"../../../util/style\";\nimport dom, { State } from \"../../dom\";\nimport { helperLayerClassName } from \"../classNames\";\nimport { setPositionRelativeToStep } from \"../position\";\nimport { TourStep } from \"../steps\";\n\nconst { div } = dom.tags;\n\nconst getClassName = ({\n  step,\n  tourHighlightClass,\n}: {\n  step: State<TourStep | null>;\n  tourHighlightClass: string;\n}) => {\n  let highlightClass = helperLayerClassName;\n\n  // check for a current step highlight class\n  if (step.val && typeof step.val.highlightClass === \"string\") {\n    highlightClass += ` ${step.val.highlightClass}`;\n  }\n\n  // check for options highlight class\n  if (typeof tourHighlightClass === \"string\") {\n    highlightClass += ` ${tourHighlightClass}`;\n  }\n\n  return highlightClass;\n};\n\nexport type HelperLayerProps = {\n  currentStep: State<number | undefined>;\n  steps: TourStep[];\n  refreshes: State<number>;\n  targetElement: HTMLElement;\n  tourHighlightClass: string;\n  overlayOpacity: number;\n  helperLayerPadding: number;\n};\n\nexport const HelperLayer = ({\n  currentStep,\n  steps,\n  refreshes,\n  targetElement,\n  tourHighlightClass,\n  overlayOpacity,\n  helperLayerPadding,\n}: HelperLayerProps) => {\n  const step = dom.derive(() =>\n    currentStep.val !== undefined ? steps[currentStep.val] : null\n  );\n\n  const helperLayer = div({\n    className: () => getClassName({ step, tourHighlightClass }),\n    style: style({\n      // the inner box shadow is the border for the highlighted element\n      // the outer box shadow is the overlay effect\n      \"box-shadow\": `0 0 1px 2px rgba(33, 33, 33, 0.8), rgba(33, 33, 33, ${overlayOpacity.toString()}) 0 0 0 5000px`,\n    }),\n  });\n\n  dom.derive(() => {\n    // set the new position if the step or refreshes change\n    if (!step.val || refreshes.val === undefined) return;\n\n    setPositionRelativeToStep(\n      targetElement,\n      helperLayer,\n      step.val,\n      helperLayerPadding\n    );\n  });\n\n  return helperLayer;\n};\n"
  },
  {
    "path": "src/packages/tour/components/OverlayLayer.ts",
    "content": "import { style } from \"../../../util/style\";\nimport { overlayClassName } from \"../classNames\";\nimport dom from \"../../dom\";\nimport { Tour } from \"../tour\";\n\nconst { div } = dom.tags;\n\nexport type OverlayLayerProps = {\n  exitOnOverlayClick: boolean;\n  onExitTour: () => Promise<Tour>;\n};\n\nexport const OverlayLayer = ({\n  exitOnOverlayClick,\n  onExitTour,\n}: OverlayLayerProps) => {\n  const overlayLayer = div({\n    className: overlayClassName,\n    style: style({\n      top: 0,\n      bottom: 0,\n      left: 0,\n      right: 0,\n      position: \"fixed\",\n      cursor: exitOnOverlayClick ? \"pointer\" : \"auto\",\n    }),\n  });\n\n  if (exitOnOverlayClick) {\n    overlayLayer.onclick = async () => {\n      await onExitTour();\n    };\n  }\n\n  return overlayLayer;\n};\n"
  },
  {
    "path": "src/packages/tour/components/ReferenceLayer.ts",
    "content": "import dom from \"../../dom\";\nimport { tooltipReferenceLayerClassName } from \"../classNames\";\nimport { setPositionRelativeToStep } from \"../position\";\nimport { TourTooltip, TourTooltipProps } from \"./TourTooltip\";\n\nconst { div } = dom.tags;\n\nexport type ReferenceLayerProps = TourTooltipProps & {\n  targetElement: HTMLElement;\n  helperElementPadding: number;\n};\n\nexport const ReferenceLayer = ({\n  targetElement,\n  helperElementPadding,\n  ...props\n}: ReferenceLayerProps) => {\n  const referenceLayer = div(\n    {\n      className: tooltipReferenceLayerClassName,\n    },\n    TourTooltip(props)\n  );\n\n  dom.derive(() => {\n    // set the position of the reference layer if the refreshes signal changes\n    if (props.refreshes.val == undefined) return;\n\n    setPositionRelativeToStep(\n      targetElement,\n      referenceLayer,\n      props.step,\n      helperElementPadding\n    );\n  });\n\n  return referenceLayer;\n};\n"
  },
  {
    "path": "src/packages/tour/components/TourRoot.test.ts",
    "content": "import { TourRoot } from \"./TourRoot\";\n\njest.mock(\"./OverlayLayer\", () => ({\n  OverlayLayer: jest.fn(() => \"OverlayLayer\"),\n}));\njest.mock(\"./DisableInteraction\", () => ({\n  DisableInteraction: jest.fn(() => \"DisableInteraction\"),\n}));\njest.mock(\"../steps\", () => ({ nextStep: jest.fn(), previousStep: jest.fn() }));\n\njest.useFakeTimers();\n\ndescribe(\"TourRoot\", () => {\n  let tour: any;\n\n  beforeEach(() => {\n    tour = {\n      getCurrentStepSignal: jest.fn(() => ({ val: 0 })),\n      getRefreshesSignal: jest.fn(() => ({ val: 0 })),\n      getSteps: jest.fn(() => [{ disableInteraction: false }]),\n      getTargetElement: jest.fn(() => \"targetElement\"),\n      getOption: jest.fn((option: keyof typeof Option) => {\n        const options = {\n          highlightClass: \"highlight\",\n          overlayOpacity: 0.5,\n          helperElementPadding: 10,\n          exitOnOverlayClick: true,\n          positionPrecedence: [\"top\", \"bottom\"],\n          autoPosition: true,\n          showStepNumbers: true,\n          showBullets: true,\n          showButtons: true,\n          tooltipClass: \"tooltip\",\n          nextToDone: false,\n          showProgress: true,\n          scrollToElement: true,\n          scrollPadding: 20,\n          dontShowAgain: false,\n        };\n        return options[option];\n      }),\n      exit: jest.fn(),\n      goToStep: jest.fn(),\n      isLastStep: jest.fn(() => false),\n      getCurrentStep: jest.fn(() => 0),\n      callback: jest.fn(() => jest.fn()),\n      setDontShowAgain: jest.fn(),\n    };\n  });\n\n  it(\"renders correctly and initializes state\", () => {\n    // Arrange\n    // Act\n    const component = TourRoot({ tour });\n\n    // Assert\n    expect(component).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/components/TourRoot.ts",
    "content": "import dom from \"../../dom\";\nimport { ReferenceLayer } from \"./ReferenceLayer\";\nimport { HelperLayer } from \"./HelperLayer\";\nimport { Tour } from \"../tour\";\nimport { DisableInteraction } from \"./DisableInteraction\";\nimport { OverlayLayer } from \"./OverlayLayer\";\nimport { nextStep, previousStep } from \"../steps\";\nimport { doneButtonClassName } from \"../classNames\";\nimport { style } from \"../../../util/style\";\n\nconst { div } = dom.tags;\n\nexport type TourRootProps = {\n  tour: Tour;\n};\n\nexport const TourRoot = ({ tour }: TourRootProps) => {\n  const currentStepSignal = tour.getCurrentStepSignal();\n  const refreshesSignal = tour.getRefreshesSignal();\n  const steps = tour.getSteps();\n\n  const helperLayer = HelperLayer({\n    currentStep: currentStepSignal,\n    steps,\n    refreshes: refreshesSignal,\n    targetElement: tour.getTargetElement(),\n    tourHighlightClass: tour.getOption(\"highlightClass\"),\n    overlayOpacity: tour.getOption(\"overlayOpacity\"),\n    helperLayerPadding: tour.getOption(\"helperElementPadding\"),\n  });\n\n  const opacity = dom.state(0);\n  // render the tooltip immediately when the tour starts\n  // but we reset the transition duration to 300ms when the tooltip is rendered for the first time\n  let tooltipTransitionDuration = 0;\n\n  const root = div(\n    {\n      className: \"introjs-tour\",\n      style: () => style({ opacity: `${opacity.val}` }),\n    },\n    // helperLayer should not be re-rendered when the state changes for the transition to work\n    helperLayer,\n    () => {\n      // do not remove this check, it is necessary for this state-binding to work\n      // and render the entire section every time the state changes\n      if (currentStepSignal.val === undefined) {\n        return null;\n      }\n\n      const step = dom.derive(() =>\n        currentStepSignal.val !== undefined\n          ? steps[currentStepSignal.val]\n          : null\n      );\n\n      if (!step.val) {\n        return null;\n      }\n\n      const exitOnOverlayClick = tour.getOption(\"exitOnOverlayClick\") === true;\n      const overlayLayer = OverlayLayer({\n        exitOnOverlayClick,\n        onExitTour: async () => {\n          return tour.exit();\n        },\n      });\n\n      const referenceLayer = ReferenceLayer({\n        step: step.val,\n        targetElement: tour.getTargetElement(),\n        refreshes: refreshesSignal,\n        helperElementPadding: tour.getOption(\"helperElementPadding\"),\n\n        transitionDuration: tooltipTransitionDuration,\n\n        positionPrecedence: tour.getOption(\"positionPrecedence\"),\n        autoPosition: tour.getOption(\"autoPosition\"),\n        showStepNumbers: tour.getOption(\"showStepNumbers\"),\n\n        steps: tour.getSteps(),\n        currentStep: currentStepSignal.val,\n\n        onBulletClick: (stepNumber: number) => {\n          tour.goToStep(stepNumber);\n        },\n\n        bullets: tour.getOption(\"showBullets\"),\n\n        buttons: tour.getOption(\"showButtons\"),\n        nextLabel: tour.getOption(\"nextLabel\"),\n        onNextClick: async (e: any) => {\n          if (!tour.isLastStep()) {\n            await nextStep(tour);\n          } else if (\n            new RegExp(doneButtonClassName, \"gi\").test(\n              (e.target as HTMLElement).className\n            )\n          ) {\n            await tour\n              .callback(\"complete\")\n              ?.call(tour, tour.getCurrentStep(), \"done\");\n\n            await tour.exit();\n          }\n        },\n        prevLabel: tour.getOption(\"prevLabel\"),\n        onPrevClick: async () => {\n          const currentStep = tour.getCurrentStep();\n          if (currentStep !== undefined && currentStep > 0) {\n            await previousStep(tour);\n          }\n        },\n        skipLabel: tour.getOption(\"skipLabel\"),\n        onSkipClick: async () => {\n          if (tour.isLastStep()) {\n            await tour\n              .callback(\"complete\")\n              ?.call(tour, tour.getCurrentStep(), \"skip\");\n          }\n\n          await tour.callback(\"skip\")?.call(tour, tour.getCurrentStep());\n\n          await tour.exit();\n        },\n        buttonClass: tour.getOption(\"buttonClass\"),\n        nextToDone: tour.getOption(\"nextToDone\"),\n        doneLabel: tour.getOption(\"doneLabel\"),\n        hideNext: tour.getOption(\"hideNext\"),\n        hidePrev: tour.getOption(\"hidePrev\"),\n        className: step.val.tooltipClass || tour.getOption(\"tooltipClass\"),\n        progress: tour.getOption(\"showProgress\"),\n        progressBarAdditionalClass: tour.getOption(\n          \"progressBarAdditionalClass\"\n        ),\n\n        stepNumbers: tour.getOption(\"showStepNumbers\"),\n        stepNumbersOfLabel: tour.getOption(\"stepNumbersOfLabel\"),\n\n        scrollToElement: tour.getOption(\"scrollToElement\"),\n        scrollPadding: tour.getOption(\"scrollPadding\"),\n\n        dontShowAgain: tour.getOption(\"dontShowAgain\"),\n        onDontShowAgainChange: (checked: boolean) => {\n          tour.setDontShowAgain(checked);\n        },\n        dontShowAgainLabel: tour.getOption(\"dontShowAgainLabel\"),\n        renderAsHtml: tour.getOption(\"tooltipRenderAsHtml\"),\n        text: step.val.title || step.val.intro,\n      });\n\n      const disableInteraction = step.val.disableInteraction\n        ? DisableInteraction({\n            currentStep: currentStepSignal,\n            steps: tour.getSteps(),\n            refreshes: refreshesSignal,\n            targetElement: tour.getTargetElement(),\n            helperElementPadding: tour.getOption(\"helperElementPadding\"),\n          })\n        : null;\n\n      // wait for the helper layer to be rendered before showing the tooltip\n      // this is to prevent the tooltip from flickering when the helper layer is transitioning\n      // the 300ms delay is coming from the helper layer transition duration\n      tooltipTransitionDuration = 300;\n\n      return div(overlayLayer, referenceLayer, disableInteraction);\n    }\n  );\n\n  dom.derive(() => {\n    // to clean up the root element when the tour is done\n    if (currentStepSignal.val === undefined) {\n      opacity.val = 0;\n\n      setTimeout(() => {\n        root.remove();\n      }, 250);\n    }\n  });\n\n  setTimeout(() => {\n    // fade in the root element\n    opacity.val = 1;\n  }, 1);\n\n  return root;\n};\n"
  },
  {
    "path": "src/packages/tour/components/TourTooltip.test.ts",
    "content": "import { Header } from \"./TourTooltip\";\n\ndescribe(\"Header\", () => {\n  it(\"renders plain text title when renderAsHtml is false\", () => {\n    const el = Header({\n      title: \"<strong>Bold Text</strong>\",\n      skipLabel: \"Skip\",\n      renderAsHtml: false,\n      onSkipClick: jest.fn(),\n    });\n\n    const h1 = el.querySelector(\"h1\")!;\n\n    expect(h1.innerHTML).toBe(\"&lt;strong&gt;Bold Text&lt;/strong&gt;\");\n    expect(h1.querySelector(\"strong\")).toBeNull();\n  });\n\n  it(\"renders HTML title when renderAsHtml is true\", () => {\n    const el = Header({\n      title: \"<strong>Bold Text</strong>\",\n      skipLabel: \"Skip\",\n      renderAsHtml: true,\n      onSkipClick: jest.fn(),\n    });\n\n    const h1 = el.querySelector(\"h1\")!;\n\n    expect(h1.innerHTML).toBe(\"<strong>Bold Text</strong>\");\n    expect(h1.querySelector(\"strong\")?.textContent).toBe(\"Bold Text\");\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/components/TourTooltip.ts",
    "content": "import { Tooltip, type TooltipProps } from \"../../tooltip/tooltip\";\nimport dom, { PropValueOrDerived } from \"../../dom\";\nimport {\n  activeClassName,\n  bulletsClassName,\n  disabledButtonClassName,\n  doneButtonClassName,\n  dontShowAgainClassName,\n  fullButtonClassName,\n  helperNumberLayerClassName,\n  hiddenButtonClassName,\n  nextButtonClassName,\n  previousButtonClassName,\n  progressBarClassName,\n  progressClassName,\n  skipButtonClassName,\n  tooltipButtonsClassName,\n  tooltipHeaderClassName,\n  tooltipTextClassName,\n  tooltipTitleClassName,\n} from \"../classNames\";\nimport { TourStep } from \"../steps\";\nimport { dataStepNumberAttribute } from \"../dataAttributes\";\nimport scrollParentToElement from \"../../../util/scrollParentToElement\";\nimport scrollTo from \"../../../util/scrollTo\";\nimport { TooltipContent } from \"../../tooltip/tooltipContent\";\n\nconst { h1, div, input, label, ul, li, a } = dom.tags;\n\nconst DontShowAgain = ({\n  dontShowAgainLabel,\n  onDontShowAgainChange,\n}: {\n  dontShowAgainLabel: string;\n  onDontShowAgainChange: (checked: boolean) => void;\n}) => {\n  return div({ className: dontShowAgainClassName }, [\n    input({\n      type: \"checkbox\",\n      id: dontShowAgainClassName,\n      name: dontShowAgainClassName,\n      onchange: (e: any) => {\n        onDontShowAgainChange((e.target as HTMLInputElement).checked);\n      },\n    }),\n    label({ for: dontShowAgainClassName }, dontShowAgainLabel),\n  ]);\n};\n\nconst Bullets = ({\n  step,\n  steps,\n  onBulletClick,\n}: {\n  step: TourStep;\n  steps: TourStep[];\n  onBulletClick: (stepNumber: number) => void;\n}): HTMLElement => {\n  return div({ className: bulletsClassName }, [\n    ul({ role: \"tablist\" }, [\n      ...steps.map(({ step: stepNumber }) => {\n        const innerLi = li(\n          {\n            role: \"presentation\",\n          },\n          [\n            a({\n              role: \"tab\",\n              className: () =>\n                `${step.step === stepNumber ? activeClassName : \"\"}`,\n              onclick: (e: any) => {\n                const stepNumberAttribute = (\n                  e.target as HTMLElement\n                ).getAttribute(dataStepNumberAttribute);\n                if (!stepNumberAttribute) return;\n\n                onBulletClick(parseInt(stepNumberAttribute, 10));\n              },\n              innerHTML: \"&nbsp;\",\n              [dataStepNumberAttribute]: stepNumber,\n            }),\n          ]\n        );\n\n        return innerLi;\n      }),\n    ]),\n  ]);\n};\n\nconst ProgressBar = ({\n  steps,\n  currentStep,\n  progressBarAdditionalClass,\n}: {\n  steps: TourStep[];\n  currentStep: number;\n  progressBarAdditionalClass: string;\n}) => {\n  const progress = ((currentStep + 1) / steps.length) * 100;\n\n  return div({ className: progressClassName }, [\n    div({\n      className: `${progressBarClassName} ${\n        progressBarAdditionalClass ? progressBarAdditionalClass : \"\"\n      }`,\n      role: \"progress\",\n      \"aria-valuemin\": \"0\",\n      \"aria-valuemax\": \"100\",\n      \"aria-valuenow\": () => progress.toString(),\n      style: `width:${progress}%;`,\n    }),\n  ]);\n};\n\nconst StepNumber = ({\n  step,\n  steps,\n  stepNumbersOfLabel,\n}: {\n  step: TourStep;\n  steps: TourStep[];\n  stepNumbersOfLabel: string;\n}) => {\n  return div({ className: helperNumberLayerClassName }, [\n    `${step.step} ${stepNumbersOfLabel} ${steps.length}`,\n  ]);\n};\n\nconst Button = ({\n  label,\n  onClick,\n  disabled,\n  className,\n}: {\n  label: string;\n  onClick: (e: any) => void;\n  disabled?: PropValueOrDerived;\n  className?: PropValueOrDerived;\n}) => {\n  return a(\n    {\n      role: \"button\",\n      tabIndex: 0,\n      ariaDisabled: disabled ?? false,\n      onclick: onClick,\n      className: className ?? \"\",\n    },\n    [label]\n  );\n};\n\nconst NextButton = ({\n  steps,\n  currentStep,\n\n  nextLabel,\n  doneLabel,\n\n  hideNext,\n  hidePrev,\n  nextToDone,\n  onClick,\n  buttonClass,\n}: {\n  steps: TourStep[];\n  currentStep: number;\n\n  nextLabel: string;\n  doneLabel: string;\n\n  hideNext: boolean;\n  hidePrev: boolean;\n  nextToDone: boolean;\n  onClick: (e: any) => void;\n  buttonClass: string;\n}) => {\n  const isFullButton = currentStep === 0 && steps.length > 1 && hidePrev;\n  const isLastStep = currentStep === steps.length - 1 || steps.length === 1;\n  const isHidden = isLastStep && hideNext;\n\n  const isDisabled = dom.derive(() => {\n    // when the current step is the last one or there is only one step to show\n    return isLastStep && !hideNext && !nextToDone;\n  });\n\n  const isDoneButton = dom.derive(() => {\n    return isLastStep && !hideNext && nextToDone;\n  });\n\n  const nextButton = Button({\n    label: isDoneButton.val ? doneLabel : nextLabel,\n    onClick,\n    className: () => {\n      const classNames = [buttonClass, nextButtonClassName];\n\n      if (isDoneButton.val) {\n        classNames.push(doneButtonClassName);\n      }\n\n      if (isDisabled.val) {\n        classNames.push(disabledButtonClassName);\n      }\n\n      if (isFullButton) {\n        classNames.push(fullButtonClassName);\n      }\n\n      if (isHidden) {\n        classNames.push(hiddenButtonClassName);\n      }\n      return classNames.filter(Boolean).join(\" \");\n    },\n  });\n\n  // wait for the button to be rendered\n  setTimeout(() => {\n    nextButton.focus();\n  }, 1);\n\n  return nextButton;\n};\n\nconst PrevButton = ({\n  label,\n  steps,\n  currentStep,\n  hidePrev,\n  hideNext,\n  onClick,\n  buttonClass,\n}: {\n  label: string;\n  steps: TourStep[];\n  currentStep: number;\n  hidePrev: boolean;\n  hideNext: boolean;\n  onClick: (e: any) => void;\n  buttonClass: string;\n}) => {\n  const isFirstStep = currentStep === 0 && steps.length > 1;\n  // when the current step is the first one and there are more steps to show\n  const isDisabled = isFirstStep && !hidePrev;\n  const isHidden = isFirstStep && hidePrev;\n  // when the current step is the last one or there is only one step to show\n  const isFullButton =\n    (currentStep === steps.length - 1 || steps.length === 1) && hideNext;\n\n  return Button({\n    label,\n    onClick,\n    disabled: isDisabled,\n    className: () => {\n      const classNames = [buttonClass, previousButtonClassName];\n\n      if (isFullButton) {\n        classNames.push(fullButtonClassName);\n      }\n\n      if (isDisabled) {\n        classNames.push(disabledButtonClassName);\n      }\n\n      if (isHidden) {\n        classNames.push(hiddenButtonClassName);\n      }\n\n      return classNames.filter(Boolean).join(\" \");\n    },\n  });\n};\n\nconst Buttons = ({\n  steps,\n  currentStep,\n\n  buttonClass,\n\n  nextToDone,\n  doneLabel,\n\n  hideNext,\n  nextLabel,\n  onNextClick,\n\n  hidePrev,\n  prevLabel,\n  onPrevClick,\n}: {\n  steps: TourStep[];\n  currentStep: number;\n\n  buttonClass: string;\n\n  nextToDone: boolean;\n  doneLabel: string;\n\n  hideNext: boolean;\n  nextLabel: string;\n  onNextClick: (e: any) => void;\n\n  hidePrev: boolean;\n  prevLabel: string;\n  onPrevClick: (e: any) => void;\n}) => {\n  return div(\n    { className: tooltipButtonsClassName },\n    steps.length > 1\n      ? PrevButton({\n          label: prevLabel,\n          steps,\n          currentStep,\n          hidePrev,\n          hideNext,\n          onClick: onPrevClick,\n          buttonClass,\n        })\n      : null,\n    NextButton({\n      currentStep,\n      steps,\n      doneLabel,\n      nextLabel,\n      onClick: onNextClick,\n      hideNext,\n      hidePrev,\n      nextToDone,\n      buttonClass,\n    })\n  );\n};\n\nexport const Header = ({\n  title,\n  skipLabel,\n  renderAsHtml,\n  onSkipClick,\n}: {\n  title: string;\n  skipLabel: string;\n  renderAsHtml?: boolean;\n  onSkipClick: (e: any) => void;\n}) => {\n  const titleEl = title\n    ? TooltipContent({\n        text: title,\n        tooltipRenderAsHtml: renderAsHtml,\n        container: h1({\n          className: tooltipTitleClassName,\n          role: \"heading\",\n          \"aria-level\": 1,\n          \"aria-label\": title,\n        }),\n      })\n    : null;\n\n  return div({ className: tooltipHeaderClassName }, [\n    titleEl,\n    Button({\n      className: skipButtonClassName,\n      label: skipLabel,\n      onClick: onSkipClick,\n    }),\n  ]);\n};\n\nconst scroll = ({\n  step,\n  tooltip,\n  scrollToElement,\n  scrollPadding,\n}: {\n  step: TourStep;\n  tooltip: HTMLElement;\n  scrollToElement: boolean;\n  scrollPadding: number;\n}) => {\n  // when target is within a scrollable element\n  scrollParentToElement(scrollToElement, step.element as HTMLElement);\n\n  // change the scroll of the window, if needed\n  scrollTo(\n    scrollToElement,\n    step.scrollTo,\n    scrollPadding,\n    step.element as HTMLElement,\n    tooltip\n  );\n};\n\nexport type TourTooltipProps = Omit<\n  TooltipProps,\n  \"hintMode\" | \"position\" | \"element\"\n> & {\n  step: TourStep;\n  steps: TourStep[];\n  currentStep: number;\n\n  bullets: boolean;\n  onBulletClick: (stepNumber: number) => void;\n\n  buttons: boolean;\n  nextLabel: string;\n  onNextClick: (e: any) => void;\n  prevLabel: string;\n  onPrevClick: (e: any) => void;\n  skipLabel: string;\n  onSkipClick: (e: any) => void;\n  buttonClass: string;\n  nextToDone: boolean;\n  doneLabel: string;\n  hideNext: boolean;\n  hidePrev: boolean;\n\n  progress: boolean;\n  progressBarAdditionalClass: string;\n\n  stepNumbers: boolean;\n  stepNumbersOfLabel: string;\n\n  scrollToElement: boolean;\n  scrollPadding: number;\n\n  dontShowAgain: boolean;\n  dontShowAgainLabel: string;\n  renderAsHtml?: boolean;\n  onDontShowAgainChange: (checked: boolean) => void;\n};\n\nexport const TourTooltip = ({\n  step,\n  currentStep,\n  steps,\n\n  onBulletClick,\n\n  bullets,\n\n  buttons,\n  nextLabel,\n  onNextClick,\n  prevLabel,\n  onPrevClick,\n  skipLabel,\n  onSkipClick,\n  buttonClass,\n  nextToDone,\n  doneLabel,\n  hideNext,\n  hidePrev,\n\n  progress,\n  progressBarAdditionalClass,\n\n  stepNumbers,\n  stepNumbersOfLabel,\n\n  scrollToElement,\n  scrollPadding,\n\n  dontShowAgain,\n  onDontShowAgainChange,\n  dontShowAgainLabel,\n  renderAsHtml,\n  ...props\n}: TourTooltipProps) => {\n  const children = [];\n  const title = step.title;\n  const text = step.intro;\n  const position = step.position;\n\n  children.push(Header({ title, skipLabel, renderAsHtml, onSkipClick }));\n\n  children.push(\n    TooltipContent({\n      text,\n      tooltipRenderAsHtml: renderAsHtml,\n      container: div({ className: tooltipTextClassName }),\n    })\n  );\n\n  if (dontShowAgain) {\n    children.push(DontShowAgain({ dontShowAgainLabel, onDontShowAgainChange }));\n  }\n\n  if (bullets) {\n    children.push(Bullets({ step, steps, onBulletClick }));\n  }\n\n  if (progress) {\n    children.push(\n      ProgressBar({ steps, currentStep, progressBarAdditionalClass })\n    );\n  }\n\n  if (stepNumbers) {\n    children.push(StepNumber({ step, steps, stepNumbersOfLabel }));\n  }\n\n  if (buttons) {\n    children.push(\n      Buttons({\n        steps,\n        currentStep,\n\n        nextLabel: nextLabel,\n        onNextClick: onNextClick,\n\n        prevLabel: prevLabel,\n        onPrevClick: onPrevClick,\n\n        buttonClass,\n        nextToDone,\n        doneLabel,\n        hideNext,\n        hidePrev,\n      })\n    );\n  }\n\n  const tooltip = Tooltip(\n    {\n      ...props,\n      element: step.element as HTMLElement,\n      hintMode: false,\n      position,\n      text: title || text,\n    },\n    children\n  );\n\n  scroll({\n    step,\n    tooltip,\n    scrollToElement: scrollToElement,\n    scrollPadding: scrollPadding,\n  });\n\n  return tooltip;\n};\n"
  },
  {
    "path": "src/packages/tour/dataAttributes.ts",
    "content": "export const dataStepNumberAttribute = \"data-step-number\";\nexport const dataIntroAttribute = \"data-intro\";\nexport const dataStepAttribute = \"data-step\";\nexport const dataIntroGroupAttribute = \"data-intro-group\";\nexport const dataDisableInteraction = \"data-disable-interaction\";\nexport const dataTitleAttribute = \"data-title\";\nexport const dataTooltipClass = \"data-tooltip-class\";\nexport const dataHighlightClass = \"data-highlight-class\";\nexport const dataPosition = \"data-position\";\nexport const dataScrollTo = \"data-scroll-to\";\n"
  },
  {
    "path": "src/packages/tour/dont-show-again.cy.ts",
    "content": "context(\"Don't show again checkbox\", () => {\n  beforeEach(() => {\n    cy.visit(\"./cypress/setup/index.html\");\n    cy.clearCookies();\n  });\n\n  it(\"should render the 'Dont show Again' checkbox\", () => {\n    cy.window().then((window) => {\n      window.introJs\n        .tour()\n        .setOptions({\n          dontShowAgain: true,\n          steps: [\n            {\n              intro: \"step one\",\n            },\n            {\n              element: \"#clickable-button\",\n              intro: \"step two\",\n            },\n          ],\n        })\n        .start();\n\n      cy.wait(500);\n\n      cy.compareSnapshot(\"dont-show-again-checkbox-first-step\");\n\n      cy.nextStep();\n\n      cy.wait(800);\n\n      cy.compareSnapshot(\"dont-show-again-checkbox-second-step\");\n    });\n  });\n\n  it(\"should not display the tour if checkbox is clicked\", () => {\n    cy.window().then((window) => {\n      const instance = window.introJs.tour().setOptions({\n        dontShowAgain: true,\n        steps: [\n          {\n            intro: \"step one\",\n          },\n          {\n            element: \"#clickable-button\",\n            intro: \"step two\",\n          },\n        ],\n      });\n\n      instance.start();\n\n      cy.wait(500);\n\n      cy.compareSnapshot(\"dont-show-again-clicked-first-step\");\n\n      cy.get(\".introjs-dontShowAgain input\").click();\n\n      cy.get(\".introjs-skipbutton\").click();\n\n      cy.wait(800);\n\n      cy.compareSnapshot(\"dont-show-again-clicked-after-exit\");\n\n      instance.start();\n\n      cy.wait(500);\n\n      cy.compareSnapshot(\"dont-show-again-clicked-after-second-start\");\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/dontShowAgain.test.ts",
    "content": "import * as cookie from \"../../../src/util/cookie\";\nimport { setDontShowAgain, getDontShowAgain } from \"./dontShowAgain\";\n\ndescribe(\"dontShowAgain\", () => {\n  test(\"should call set cookie\", () => {\n    const setCookieMock = jest.spyOn(cookie, \"setCookie\");\n\n    setDontShowAgain(true, \"cookie-name\", 7);\n\n    expect(setCookieMock).toBeCalledTimes(1);\n    expect(setCookieMock).toBeCalledWith(\"cookie-name\", \"true\", 7);\n  });\n\n  test(\"should call delete cookie\", () => {\n    const setCookieMock = jest.spyOn(cookie, \"setCookie\");\n    const deleteCookieMock = jest.spyOn(cookie, \"deleteCookie\");\n\n    setDontShowAgain(false, \"cookie-name\", 7);\n\n    expect(setCookieMock).toBeCalledTimes(0);\n    expect(deleteCookieMock).toBeCalledTimes(1);\n    expect(deleteCookieMock).toBeCalledWith(\"cookie-name\");\n  });\n\n  test(\"should return true when cookie is valid\", () => {\n    jest.spyOn(cookie, \"getCookie\").mockReturnValue(\"true\");\n\n    expect(getDontShowAgain(\"cookie-name\")).toBe(true);\n  });\n\n  test(\"should return false when cookie is invalid\", () => {\n    jest.spyOn(cookie, \"getCookie\").mockReturnValue(\"invalid-state\");\n\n    expect(getDontShowAgain(\"cookie-name\")).toBe(false);\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/dontShowAgain.ts",
    "content": "import { deleteCookie, getCookie, setCookie } from \"../../util/cookie\";\n\nconst dontShowAgainCookieValue = \"true\";\n\n/**\n * Set the \"Don't show again\" state\n *\n * @api private\n */\nexport function setDontShowAgain(\n  dontShowAgain: boolean,\n  cookieName: string,\n  cookieDays: number\n) {\n  if (dontShowAgain) {\n    setCookie(cookieName, dontShowAgainCookieValue, cookieDays);\n  } else {\n    deleteCookie(cookieName);\n  }\n}\n\n/**\n * Get the \"Don't show again\" state from cookies\n *\n * @api private\n */\nexport function getDontShowAgain(cookieName: string): boolean {\n  const dontShowCookie = getCookie(cookieName);\n  return dontShowCookie !== \"\" && dontShowCookie === dontShowAgainCookieValue;\n}\n"
  },
  {
    "path": "src/packages/tour/exit.cy.ts",
    "content": "context(\"Exit\", () => {\n  beforeEach(() => {\n    cy.visit(\"./cypress/setup/index.html\");\n  });\n\n  it(\"should remove leftovers from the DOM\", () => {\n    cy.window().then((window) => {\n      const instance = window.introJs.tour().setOptions({\n        steps: [\n          {\n            intro: \"step one\",\n          },\n          {\n            intro: \"step two\",\n          },\n        ],\n      });\n\n      instance.start();\n\n      const selector = '[class^=\"intro\"]';\n\n      cy.get(selector).then((items) => {\n        cy.wrap(items).its(\"length\").should(\"be.gte\", 1);\n\n        instance.exit();\n\n        cy.get(selector).should(\"have.length\", 0);\n      });\n    });\n  });\n\n  it(\"should exit the tour after clicking on the skip icon\", () => {\n    cy.window().then((window) => {\n      const instance = window.introJs.tour().setOptions({\n        steps: [\n          {\n            intro: \"step one\",\n          },\n          {\n            intro: \"step two\",\n          },\n        ],\n      });\n\n      instance.start();\n\n      cy.wait(500);\n\n      cy.get(\".introjs-skipbutton\").click();\n\n      cy.wait(500);\n\n      cy.get(\".introjs-overlay\").should(\"have.length\", 0);\n    });\n  });\n\n  it(\"should exit the tour after clicking on the overlay layer\", () => {\n    cy.window().then((window) => {\n      const instance = window.introJs.tour().setOptions({\n        steps: [\n          {\n            intro: \"step one\",\n          },\n          {\n            intro: \"step two\",\n          },\n        ],\n      });\n\n      instance.start();\n\n      cy.wait(500);\n\n      cy.get(\".introjs-overlay\").click({ force: true });\n\n      cy.wait(500);\n\n      cy.get(\".introjs-overlay\").should(\"have.length\", 0);\n    });\n  });\n\n  it(\"should not exit the tour after clicking on the tooltip layer\", () => {\n    cy.window().then((window) => {\n      const instance = window.introJs.tour().setOptions({\n        steps: [\n          {\n            intro: \"step one\",\n          },\n          {\n            intro: \"step two\",\n          },\n        ],\n      });\n\n      instance.start();\n\n      cy.wait(500);\n\n      cy.get(\".introjs-tooltip\").click({ force: true });\n\n      cy.wait(500);\n\n      cy.get(\".introjs-overlay\").should(\"have.length\", 1);\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/exitIntro.test.ts",
    "content": "import { getMockTour } from \"./mock\";\n\ndescribe(\"exitIntro\", () => {\n  test(\"should reset the _currentStep\", async () => {\n    const mockTour = getMockTour();\n    mockTour.addStep({ element: document.querySelector(\"h1\") });\n    await mockTour.start();\n\n    await mockTour.exit(false);\n\n    expect(mockTour.getCurrentStep()).toBeUndefined();\n  });\n\n  test(\"should call the onexit and onbeforeexit callbacks\", async () => {\n    const fnOnExit = jest.fn();\n    const fnOnBeforeExit = jest.fn();\n    fnOnBeforeExit.mockReturnValue(true);\n\n    const mockTour = getMockTour();\n    mockTour.addStep({ element: document.querySelector(\"h1\") });\n    mockTour.onExit(fnOnExit);\n    mockTour.onBeforeExit(fnOnBeforeExit);\n\n    await mockTour.start();\n    await mockTour.exit(false);\n\n    expect(fnOnExit).toBeCalledTimes(1);\n\n    expect(fnOnBeforeExit).toBeCalledTimes(1);\n    expect(fnOnBeforeExit).toHaveBeenCalledWith(document.body);\n    expect(fnOnBeforeExit).toHaveBeenCalledBefore(fnOnExit);\n  });\n\n  test(\"should not continue when onbeforeexit returns false\", async () => {\n    const fnOnExit = jest.fn();\n    const fnOnBeforeExit = jest.fn();\n    fnOnBeforeExit.mockReturnValue(false);\n\n    const mockTour = getMockTour();\n    mockTour.addStep({ element: document.querySelector(\"h1\") });\n    mockTour.onExit(fnOnExit);\n    mockTour.onBeforeExit(fnOnBeforeExit);\n\n    await mockTour.start();\n    await mockTour.exit(false);\n\n    expect(fnOnExit).toBeCalledTimes(0);\n\n    expect(fnOnBeforeExit).toBeCalledTimes(1);\n    expect(fnOnBeforeExit).toHaveBeenCalledWith(document.body);\n\n    // test cleanup\n    document.body.innerHTML = \"\";\n  });\n\n  test(\"should not continue when exit force is true\", async () => {\n    const fnOnExit = jest.fn();\n    const fnOnBeforeExit = jest.fn();\n    fnOnBeforeExit.mockReturnValue(false);\n\n    const mockTour = getMockTour();\n    mockTour.addStep({ element: document.querySelector(\"h1\") });\n    mockTour.onExit(fnOnExit);\n    mockTour.onBeforeExit(fnOnBeforeExit);\n\n    await mockTour.start();\n    await mockTour.exit(false);\n\n    expect(fnOnExit).toBeCalledTimes(0);\n    expect(fnOnBeforeExit).toBeCalledTimes(1);\n\n    // test cleanup\n    document.body.innerHTML = \"\";\n  });\n\n  test(\"should continue when exit force is true and beforeExit callback returns false\", async () => {\n    const fnOnExit = jest.fn();\n    const fnOnBeforeExit = jest.fn();\n    fnOnBeforeExit.mockReturnValue(false);\n\n    const mockTour = getMockTour();\n    mockTour.addStep({ element: document.querySelector(\"h1\") });\n    mockTour.onExit(fnOnExit);\n    mockTour.onBeforeExit(fnOnBeforeExit);\n\n    await mockTour.start();\n    await mockTour.exit(true);\n\n    expect(fnOnExit).toBeCalledTimes(1);\n    expect(fnOnBeforeExit).toBeCalledTimes(1);\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/exitIntro.ts",
    "content": "import { removeShowElement } from \"./showElement\";\nimport { Tour } from \"./tour\";\n\n/**\n * Exit from intro\n *\n * @api private\n * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\n */\nexport default async function exitIntro(\n  tour: Tour,\n  force: boolean = false\n): Promise<boolean> {\n  const targetElement = tour.getTargetElement();\n  let continueExit: boolean | undefined = true;\n\n  // calling the onBeforeExit callback if it is defined\n  // If this callback return `false`, it would halt the process\n  continueExit = await tour.callback(\"beforeExit\")?.call(tour, targetElement);\n\n  // skip this check if `force` parameter is `true`\n  // otherwise, if `onBeforEexit` returned `false`, don't exit the intro\n  if (!force && continueExit === false) return false;\n\n  removeShowElement();\n\n  //check if any callback is defined\n  await tour.callback(\"exit\")?.call(tour);\n\n  // set the step to default\n  // this would update the signal to the tour that the tour has ended\n  // and the corresponding components would be updated\n  tour.resetCurrentStep();\n\n  return true;\n}\n"
  },
  {
    "path": "src/packages/tour/highlight.cy.ts",
    "content": "context(\"Highlight\", () => {\n  beforeEach(() => {\n    cy.visit(\"./cypress/setup/index.html\");\n  });\n\n  it(\"should highlight the target element\", () => {\n    cy.window().then((window) => {\n      window.introJs\n        .tour()\n        .setOptions({\n          steps: [\n            {\n              intro: \"step one\",\n            },\n            {\n              element: \"#clickable-button\",\n              intro: \"step two\",\n            },\n          ],\n        })\n        .start();\n\n      cy.wait(500);\n\n      cy.compareSnapshot(\"highlight-element-first-step\");\n\n      cy.nextStep();\n\n      cy.wait(800);\n\n      cy.compareSnapshot(\"highlight-element-second-step\");\n    });\n  });\n\n  it(\"should let user interact with the target element\", () => {\n    cy.window().then((window) => {\n      const button = window.document.querySelector(\"#clickable-button\");\n      button.addEventListener(\"mouseover\", () => {\n        button.textContent = \"Hovered\";\n      });\n\n      window.introJs\n        .tour()\n        .setOptions({\n          steps: [\n            { intro: \"step one\" },\n            {\n              element: \"#clickable-button\",\n              intro: \"step two\",\n              disableInteraction: false,\n            },\n          ],\n        })\n        .start();\n\n      cy.nextStep();\n      cy.wait(500);\n\n      cy.get(\".introjs-tooltiptext\").should(\"contain\", \"step two\");\n\n      cy.get(\".introjs-helperLayer\").realHover();\n\n      cy.get(\"#clickable-button\").should(\"contain\", \"Hovered\");\n\n      cy.get(\"#clickable-button\").then(($btn) => {\n        const spy = cy.spy();\n        $btn.on(\"click\", spy);\n\n        cy.get(\".introjs-helperLayer\")\n          .realClick()\n          .then(() => {\n            expect(spy).to.have.been.calledOnce;\n          });\n      });\n    });\n  });\n\n  it(\"interaction with the target element should be disabled when disabledInteraction is true\", () => {\n    cy.window().then((window) => {\n      window.introJs\n        .tour()\n        .setOptions({\n          disableInteraction: true,\n          steps: [\n            {\n              element: \"#clickable-button\",\n              intro: \"step two\",\n            },\n          ],\n        })\n        .start();\n\n      cy.wait(500);\n      let sp = cy.spy(window, \"click\");\n\n      cy.get(\".introjs-helperLayer\").realHover();\n      cy.get(\"#clickable-button\").contains(\"Example button\");\n\n      cy.get(\".introjs-helperLayer\")\n        .realClick()\n        .then(() => expect(sp).to.not.be.called);\n    });\n  });\n\n  it(\"should interaction with the target element the parent element has positive: relative\", () => {\n    cy.window().then((window) => {\n      window.introJs\n        .tour()\n        .setOptions({\n          steps: [\n            {\n              element: \"#clickable-relative-button\",\n              intro: \"step two\",\n            },\n          ],\n        })\n        .start();\n\n      let sp = cy.spy(window, \"clickRelative\");\n\n      cy.get(\".introjs-helperLayer\").realHover();\n      cy.get(\"#clickable-relative-button\").contains(\"Hovered Relative\");\n\n      cy.get(\".introjs-helperLayer\")\n        .realClick()\n        .then(() => expect(sp).to.be.calledOnce);\n    });\n  });\n\n  it(\"should not be able to interaction with the target element the parent element has positive: relative and z-index\", () => {\n    cy.window().then((window) => {\n      // related issue: https://github.com/usablica/intro.js/issues/1202\n      cy.get(\"#relative-parent\").invoke(\n        \"attr\",\n        \"style\",\n        \"z-index: 1;position: relative;\"\n      );\n\n      window.introJs\n        .tour()\n        .setOptions({\n          steps: [\n            {\n              element: \"#clickable-relative-button\",\n              intro: \"step two\",\n            },\n          ],\n        })\n        .start();\n\n      cy.wait(500);\n\n      let sp = cy.spy(window, \"clickRelative\");\n\n      cy.get(\".introjs-helperLayer\").realHover();\n      cy.get(\"#clickable-button\").contains(\"Example button\");\n\n      cy.get(\".introjs-helperLayer\")\n        .realClick()\n        .then(() => expect(sp).to.not.be.called);\n    });\n  });\n\n  it(\"should interaction with the target element the parent element has positive: absolute\", () => {\n    cy.window().then((window) => {\n      window.introJs\n        .tour()\n        .setOptions({\n          steps: [\n            {\n              element: \"#clickable-absolute-button\",\n              intro: \"step two\",\n            },\n          ],\n        })\n        .start();\n\n      let sp = cy.spy(window, \"clickAbsolute\");\n\n      cy.get(\".introjs-helperLayer\").realHover();\n      cy.get(\"#clickable-absolute-button\").contains(\"Hovered Absolute\");\n\n      cy.get(\".introjs-helperLayer\")\n        .realClick()\n        .then(() => expect(sp).to.be.calledOnce);\n    });\n  });\n\n  it(\"should not be able to interaction with the target element the parent element has positive: absolute and z-index\", () => {\n    cy.window().then((window) => {\n      // related issue: https://github.com/usablica/intro.js/issues/1202\n      cy.get(\"#absolute-parent\").invoke(\n        \"attr\",\n        \"style\",\n        \"z-index: 1;position: absolute;\"\n      );\n\n      window.introJs\n        .tour()\n        .setOptions({\n          steps: [\n            {\n              element: \"#clickable-absolute-button\",\n              intro: \"step two\",\n            },\n          ],\n        })\n        .start();\n\n      cy.wait(500);\n\n      let sp = cy.spy(window, \"clickAbsolute\");\n\n      cy.get(\".introjs-helperLayer\").realHover();\n      cy.get(\"#clickable-button\").contains(\"Example button\");\n\n      cy.get(\".introjs-helperLayer\")\n        .realClick()\n        .then(() => expect(sp).to.not.be.called);\n    });\n  });\n\n  it(\"should highlight a fixed element correctly\", () => {\n    cy.viewport(550, 750);\n\n    cy.window().then((window) => {\n      window.introJs\n        .tour()\n        .setOptions({\n          steps: [\n            {\n              element: \"#fixed\",\n              intro: \"step two\",\n            },\n          ],\n        })\n        .start();\n\n      cy.wait(500);\n\n      cy.compareSnapshot(\"highlight-fixed-element\", {\n        capture: \"viewport\",\n      });\n    });\n  });\n\n  it(\"should highlight a fixed element correctly after scroll\", () => {\n    cy.viewport(550, 750);\n\n    cy.window().then((window) => {\n      window.scrollTo({\n        top: 200,\n      });\n\n      window.introJs\n        .tour()\n        .setOptions({\n          steps: [\n            {\n              element: \"#fixed\",\n              intro: \"step two\",\n            },\n          ],\n        })\n        .start();\n\n      cy.wait(500);\n\n      cy.compareSnapshot(\"highlight-fixed-element-scroll\", {\n        capture: \"viewport\",\n      });\n    });\n  });\n\n  it(\"should highlight a fixed parent element correctly after scroll\", () => {\n    cy.viewport(550, 750);\n\n    cy.window().then((window) => {\n      window.scrollTo({\n        top: 200,\n      });\n\n      window.introJs\n        .tour()\n        .setOptions({\n          steps: [\n            {\n              element: \"#fixed-parent\",\n              intro: \"step two\",\n            },\n          ],\n        })\n        .start();\n\n      cy.wait(500);\n\n      cy.compareSnapshot(\"highlight-fixed-parent-element-scroll\", {\n        capture: \"viewport\",\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/index.ts",
    "content": "export { Tour } from \"./tour\";\n"
  },
  {
    "path": "src/packages/tour/mock.ts",
    "content": "import dom from \"../dom\";\nimport { TourStep } from \"./steps\";\nimport { Tour } from \"./tour\";\nimport {\n  dataIntroAttribute,\n  dataPosition,\n  dataStepAttribute,\n  dataTitleAttribute,\n} from \"./dataAttributes\";\n\nconst { div, b, a, h1 } = dom.tags;\n\nexport const appendMockSteps = (targetElement: HTMLElement = document.body) => {\n  // ✅ Create a single region container instead of <main>\n  let region = targetElement.querySelector('[role=\"region\"]');\n  if (!region) {\n    region = document.createElement(\"section\");\n    region.setAttribute(\"role\", \"region\");\n    region.setAttribute(\"aria-label\", \"Mock steps region\");\n    targetElement.appendChild(region);\n  }\n\n  const mockElementOne = div();\n  mockElementOne.setAttribute(dataIntroAttribute, \"Mock element\");\n\n  const mockElementTwo = b();\n  mockElementTwo.setAttribute(dataIntroAttribute, \"Mock element left position\");\n  mockElementTwo.setAttribute(dataPosition, \"left\");\n\n  const mockElementThree = h1(\"Mock heading\");\n  mockElementThree.setAttribute(\n    dataIntroAttribute,\n    \"Mock element second to last\"\n  );\n  mockElementThree.setAttribute(dataStepAttribute, \"10\");\n  mockElementThree.setAttribute(dataTitleAttribute, \"test title\");\n  mockElementThree.setAttribute(\"aria-label\", \"Mock heading\");\n\n  const mockElementFour = a(\"Mock element last\");\n  mockElementFour.setAttribute(dataIntroAttribute, \"Mock element last\");\n  mockElementFour.setAttribute(dataStepAttribute, \"20\");\n\n  // ✅ Append inside region, not <main>\n  region.appendChild(mockElementOne);\n  region.appendChild(mockElementTwo);\n  region.appendChild(mockElementThree);\n  region.appendChild(mockElementFour);\n\n  return [mockElementOne, mockElementTwo, mockElementThree, mockElementFour];\n};\n\nexport const getMockPartialSteps = (): Partial<TourStep>[] => {\n  return [\n    {\n      title: \"Floating title 1\",\n      intro: \"Step One of the tour\",\n    },\n    {\n      title: \"Floating title 2\",\n      intro: \"Step Two of the tour\",\n    },\n    {\n      title: \"First title\",\n      intro: \"Step Three of the tour\",\n      position: \"top\",\n      scrollTo: \"tooltip\",\n      element: \"h1\",\n    },\n    {\n      intro: \"Step Four of the tour\",\n      position: \"right\",\n      scrollTo: \"off\",\n      element: document.createElement(\"div\"),\n    },\n    {\n      element: \".not-found\",\n      intro: \"Element not found\",\n    },\n  ];\n};\n\nexport const getMockSteps = (): TourStep[] => {\n  return [\n    {\n      step: 1,\n      scrollTo: \"tooltip\",\n      position: \"bottom\",\n      title: \"Floating title 1\",\n      intro: \"Step One of the tour\",\n    },\n    {\n      step: 2,\n      scrollTo: \"tooltip\",\n      position: \"bottom\",\n      title: \"Floating title 2\",\n      intro: \"Step Two of the tour\",\n    },\n    {\n      step: 3,\n      position: \"top\",\n      scrollTo: \"tooltip\",\n      title: \"First title\",\n      intro: \"Step Three of the tour\",\n    },\n    {\n      step: 4,\n      position: \"right\",\n      scrollTo: \"off\",\n      title: \"\",\n      intro: \"Step Four of the tour\",\n      element: document.createElement(\"div\"),\n    },\n    {\n      step: 5,\n      position: \"right\",\n      scrollTo: \"off\",\n      title: \"\",\n      intro: \"Element not found\",\n      element: \".not-found\",\n    },\n  ];\n};\n\nexport const getMockTour = (targetElement: HTMLElement = document.body) => {\n  return new Tour(targetElement);\n};\n"
  },
  {
    "path": "src/packages/tour/modal.cy.ts",
    "content": "context(\"Modal\", () => {\n  beforeEach(() => {\n    cy.visit(\"./cypress/setup/index.html\");\n  });\n\n  it(\"should match the popup\", () => {\n    cy.window().then((win) => {\n      win.introJs\n        .tour()\n        .setOptions({\n          steps: [\n            {\n              intro: \"step one\",\n            },\n            {\n              intro: \"step two\",\n            },\n          ],\n        })\n        .start();\n\n      cy.wait(500);\n\n      cy.compareSnapshot(\"first-step\");\n\n      cy.nextStep();\n      cy.wait(800);\n\n      cy.compareSnapshot(\"second-step\");\n\n      cy.nextStep();\n      cy.wait(800);\n\n      cy.compareSnapshot(\"exit\");\n    });\n  });\n\n  it(\"should set the position\", () => {\n    cy.window().then((win) => {\n      cy.viewport(\"macbook-13\");\n\n      win.introJs\n        .tour()\n        .setOptions({\n          steps: [\n            {\n              element: \"#main-section\",\n              intro: \"position bottom\",\n              position: \"bottom\",\n            },\n            {\n              element: \"#clickable-button\",\n              intro: \"position right\",\n              position: \"right\",\n            },\n            {\n              element: \"#clickable-absolute-button\",\n              intro: \"position left\",\n              position: \"left\",\n            },\n          ],\n        })\n        .start();\n\n      cy.wait(800);\n      cy.compareSnapshot(\"position-bottom\");\n\n      cy.nextStep();\n      cy.wait(500);\n      cy.compareSnapshot(\"position-right\");\n\n      cy.nextStep();\n      cy.wait(500);\n      cy.compareSnapshot(\"position-left\");\n    });\n  });\n\n  it(\"should update the modal after refresh(true)\", () => {\n    cy.window().then((win) => {\n      const instance = win.introJs.tour().setOptions({\n        showProgress: true,\n        showBullets: true,\n        steps: [\n          {\n            element: \"#main-section\",\n            intro: \"step one\",\n          },\n          {\n            element: \"#clickable-button\",\n            intro: \"step two\",\n          },\n        ],\n      });\n\n      instance.start();\n\n      cy.wait(800).then(() => {\n        cy.compareSnapshot(\"refresh-first-step\");\n        cy.nextStep();\n\n        cy.wait(500).then(() => {\n          cy.compareSnapshot(\"refresh-second-step\");\n\n          cy.wait(500).then(() => {\n            instance\n              .setOptions({\n                steps: [\n                  {\n                    element: \"#main-section\",\n                    intro: \"step one\",\n                  },\n                  {\n                    element: \"#clickable-button\",\n                    intro: \"step two\",\n                  },\n                  {\n                    element: \"#clickable-absolute-button\",\n                    intro: \"step three\",\n                  },\n                ],\n              })\n              .refresh(true);\n\n            cy.nextStep();\n            cy.wait(500);\n            cy.compareSnapshot(\"refresh-third-step\");\n          });\n        });\n      });\n    });\n  });\n\n  it(\"should apply tooltipClass from step configuration over tour tooltipClass\", () => {\n    cy.visit(\"./cypress/setup/index.html\").then((win) => {\n      cy.viewport(\"macbook-13\");\n\n      const instance = win.introJs.tour().setOptions({\n        tooltipClass: \"tour-tooltip\",\n        steps: [\n          {\n            element: \"#main-section\",\n            intro: \"step tooltip class\",\n            tooltipClass: \"step-tooltip\",\n          },\n        ],\n      });\n      instance.refresh(true);\n      instance.start();\n\n      cy.get(\".introjs-tooltip\")\n        .should(\"have.class\", \"step-tooltip\")\n        .should(\"not.have.class\", \"tour-tooltip\");\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/navigation.cy.ts",
    "content": "context(\"Navigation\", () => {\n  beforeEach(() => {\n    cy.visit(\"./cypress/setup/index.html\").then((window) => {\n      window.introJs\n        .tour()\n        .setOptions({\n          steps: [\n            {\n              intro: \"step one\",\n            },\n            {\n              intro: \"step two\",\n            },\n          ],\n        })\n        .start();\n    });\n  });\n\n  it(\"should go to the next step\", () => {\n    cy.get(\".introjs-tooltiptext\").contains(\"step one\");\n    cy.nextStep();\n    cy.get(\".introjs-tooltiptext\").contains(\"step two\");\n  });\n\n  it(\"previous button should be disabled\", () => {\n    cy.get(\".introjs-tooltiptext\").contains(\"step one\");\n    cy.get(\".introjs-prevbutton\").should(\"have.class\", \"introjs-disabled\");\n    cy.prevStep();\n    cy.get(\".introjs-tooltiptext\").contains(\"step one\");\n  });\n\n  it(\"should go to the previous step\", () => {\n    cy.get(\".introjs-tooltiptext\").contains(\"step one\");\n    cy.nextStep();\n    cy.get(\".introjs-tooltiptext\").contains(\"step two\");\n    cy.prevStep();\n    cy.get(\".introjs-tooltiptext\").contains(\"step one\");\n  });\n\n  it(\"should exit the tour after clicking on Done\", () => {\n    cy.get(\".introjs-tooltiptext\").contains(\"step one\");\n    cy.nextStep();\n    cy.get(\".introjs-tooltiptext\").contains(\"step two\");\n    cy.get(\".introjs-donebutton\").should(\"exist\");\n    cy.get(\".introjs-donebutton\").click();\n    cy.get(\".introjs-showElement\").should(\"not.exist\");\n  });\n\n  it(\"should close the tour after clicking on the exit button\", () => {\n    cy.get(\".introjs-showElement\").should(\"exist\");\n    cy.get(\".introjs-skipbutton\").click();\n    cy.get(\".introjs-showElement\").should(\"not.exist\");\n  });\n\n  it(\"should navigate by clicking on the bullet items\", () => {\n    cy.get(\".introjs-tooltiptext\").should(\"contain.text\", \"step one\");\n\n    cy.get(\".introjs-bullets > ul > li:nth-child(1)\").trigger(\"click\");\n    cy.get(\".introjs-tooltiptext\").should(\"contain.text\", \"step one\");\n\n    cy.get(\".introjs-bullets > ul > li:nth-child(2)\").trigger(\"click\");\n\n    cy.get(\".introjs-tooltiptext\").should(($el) => {\n      expect($el.text().trim()).to.eq(\"step two\");\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/onKeyDown.ts",
    "content": "import { nextStep, previousStep } from \"./steps\";\nimport { Tour } from \"./tour\";\nimport { previousButtonClassName, skipButtonClassName } from \"./classNames\";\nimport { dataStepNumberAttribute } from \"./dataAttributes\";\n\n/**\n * on keyCode:\n * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\n * This feature has been removed from the Web standards.\n * Though some browsers may still support it, it is in\n * the process of being dropped.\n * Instead, you should use KeyboardEvent.code,\n * if it's implemented.\n *\n * jQuery's approach is to test for\n *   (1) e.which, then\n *   (2) e.charCode, then\n *   (3) e.keyCode\n * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\n */\nexport default async function onKeyDown(tour: Tour, e: KeyboardEvent) {\n  let code = e.code === undefined ? e.which : e.code;\n\n  // if e.which is null\n  if (code === null) {\n    code = e.charCode === null ? e.keyCode : e.charCode;\n  }\n\n  if (\n    (code === \"Escape\" || code === 27) &&\n    tour.getOption(\"exitOnEsc\") === true\n  ) {\n    //escape key pressed, exit the intro\n    //check if exit callback is defined\n    await tour.exit();\n  } else if (code === \"ArrowLeft\" || code === 37) {\n    //left arrow\n    await previousStep(tour);\n  } else if (code === \"ArrowRight\" || code === 39) {\n    //right arrow\n    await nextStep(tour);\n  } else if (code === \"Enter\" || code === \"NumpadEnter\" || code === 13) {\n    //srcElement === ie\n    const target = (e.target || e.srcElement) as HTMLElement;\n    if (target && target.className.match(previousButtonClassName)) {\n      //user hit enter while focusing on previous button\n      await previousStep(tour);\n    } else if (target && target.className.match(skipButtonClassName)) {\n      // user hit enter while focusing on skip button\n      if (tour.isEnd()) {\n        await tour\n          .callback(\"complete\")\n          ?.call(tour, tour.getCurrentStep(), \"skip\");\n      }\n\n      await tour.exit();\n    } else if (target && target.getAttribute(dataStepNumberAttribute)) {\n      // user hit enter while focusing on step bullet\n      target.click();\n    } else {\n      //default behavior for responding to enter\n      await nextStep(tour);\n    }\n\n    //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\n    if (e.preventDefault) {\n      e.preventDefault();\n    } else {\n      e.returnValue = false;\n    }\n  }\n}\n"
  },
  {
    "path": "src/packages/tour/option.test.ts",
    "content": "import { getDefaultTourOptions } from \"./option\";\nimport { Translator } from \"../../i18n/language\";\n\nObject.defineProperty(global, \"navigator\", {\n  value: { language: \"en-US\" },\n  writable: true,\n});\n\ndescribe(\"getDefaultTourOptions\", () => {\n  it(\"should create a new Translator internally if none is injected\", () => {\n    const opts = getDefaultTourOptions();\n    const t = new Translator();\n    t.setLanguage(\"en_US\");\n    expect(opts.nextLabel).toBe(t.translate(\"buttons.next\"));\n    expect(opts.doneLabel).toBe(t.translate(\"buttons.done\"));\n    expect(opts.language).toEqual(\"en_US\");\n  });\n\n  it(\"should use the injected translator's language for translations\", () => {\n    const translator = new Translator();\n    translator.setLanguage(\"fr_FR\");\n    const opts = getDefaultTourOptions(translator);\n\n    expect(opts.nextLabel).toBe(translator.translate(\"buttons.next\"));\n    expect(opts.prevLabel).toBe(translator.translate(\"buttons.prev\"));\n    expect(opts.doneLabel).toBe(translator.translate(\"buttons.done\"));\n    expect(opts.language).toEqual(\"fr_FR\");\n  });\n\n  it(\"should update all labels correctly for different languages\", () => {\n    const translator = new Translator();\n    translator.setLanguage(\"es_ES\");\n    const opts = getDefaultTourOptions(translator);\n\n    expect(opts.nextLabel).toBe(translator.translate(\"buttons.next\"));\n    expect(opts.stepNumbersOfLabel).toBe(\n      translator.translate(\"messages.stepNumbersOfLabel\")\n    );\n    expect(opts.dontShowAgainLabel).toBe(\n      translator.translate(\"messages.dontShowAgainLabel\")\n    );\n    expect(opts.language).toEqual(\"es_ES\");\n  });\n\n  it(\"should always return an independent translator when called separately\", () => {\n    const opts1 = getDefaultTourOptions();\n    const opts2 = getDefaultTourOptions();\n\n    expect(opts1.nextLabel).toBe(opts2.nextLabel);\n    expect(opts1.language).toEqual(\"en_US\");\n  });\n\n  it(\"should default to en_US if translator not provided\", () => {\n    const opts = getDefaultTourOptions();\n    expect(opts.language).toEqual(\"en_US\");\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/option.ts",
    "content": "import { TooltipPosition } from \"../../packages/tooltip\";\nimport { TourStep, ScrollTo } from \"./steps\";\nimport { Translator, LanguageCode } from \"../../i18n/language\";\n\nexport interface TourOptions {\n  steps: Partial<TourStep>[];\n  /* Is this tour instance active? Don't show the tour again if this flag is set to false */\n  isActive: boolean;\n  /* Next button label in tooltip box */\n  nextLabel: string;\n  /* Previous button label in tooltip box */\n  prevLabel: string;\n  /* Skip button label in tooltip box */\n  skipLabel: string;\n  /* Done button label in tooltip box */\n  doneLabel: string;\n  /* Hide previous button in the first step? Otherwise, it will be disabled button. */\n  hidePrev: boolean;\n  /* Hide next button in the last step? Otherwise, it will be disabled button (note: this will also hide the \"Done\" button) */\n  hideNext: boolean;\n  /* Change the Next button to Done in the last step of the intro? otherwise, it will render a disabled button */\n  nextToDone: boolean;\n  /* Default tooltip box position */\n  tooltipPosition: TooltipPosition;\n  /* Next CSS class for tooltip boxes */\n  tooltipClass: string;\n  /* Start intro for a group of elements */\n  group: string;\n  /* CSS class that is added to the helperLayer */\n  highlightClass: string;\n  /* Close introduction when pressing Escape button? */\n  exitOnEsc: boolean;\n  /* Close introduction when clicking on overlay layer? */\n  exitOnOverlayClick: boolean;\n  /* Display the pagination detail */\n  showStepNumbers: boolean;\n  /* Pagination \"of\" label */\n  stepNumbersOfLabel: string;\n  /* Let user use keyboard to navigate the tour? */\n  keyboardNavigation: boolean;\n  /* Show tour control buttons? */\n  showButtons: boolean;\n  /* Show tour bullets? */\n  showBullets: boolean;\n  /* Show tour progress? */\n  showProgress: boolean;\n  /* Scroll to highlighted element? */\n  scrollToElement: boolean;\n  /*\n   * Should we scroll the tooltip or target element?\n   * Options are: 'element', 'tooltip' or 'off'\n   */\n  scrollTo: ScrollTo;\n  /* Padding to add after scrolling when element is not in the viewport (in pixels) */\n  scrollPadding: number;\n  /* Set the overlay opacity */\n  overlayOpacity: number;\n  /* To determine the tooltip position automatically based on the window.width/height */\n  autoPosition: boolean;\n  /* Precedence of positions, when auto is enabled */\n  positionPrecedence: TooltipPosition[];\n  /* Disable an interaction with element? */\n  disableInteraction: boolean;\n  /* To display the \"Don't show again\" checkbox in the tour */\n  dontShowAgain: boolean;\n  dontShowAgainLabel: string;\n  /* \"Don't show again\" cookie name and expiry (in days) */\n  dontShowAgainCookie: string;\n  dontShowAgainCookieDays: number;\n  /* Set how much padding to be used around helper element */\n  helperElementPadding: number;\n  /* additional classes to put on the buttons */\n  buttonClass: string;\n  /* additional classes to put on progress bar */\n  progressBarAdditionalClass: string;\n  /* Optional property to determine if content should be rendered as HTML */\n  tooltipRenderAsHtml?: boolean;\n  /* Optional property to set the language of the tour.\n   Can be a Language object for custom languages or a language code string for built-in languages.\n   Built-in language codes: \"en_US\", \"es_ES\", \"fr_FR\", \"de_DE\", \"fa_IR\"\n   Defaults to the user's browser language if not provided. */\n  language?: LanguageCode;\n}\n\nexport function getDefaultTourOptions(translator?: Translator): TourOptions {\n  const activeTranslator = translator ?? new Translator();\n\n  return {\n    steps: [],\n    isActive: true,\n    nextLabel: activeTranslator.translate(\"buttons.next\"),\n    prevLabel: activeTranslator.translate(\"buttons.prev\"),\n    skipLabel: \"×\",\n    doneLabel: activeTranslator.translate(\"buttons.done\"),\n    hidePrev: false,\n    hideNext: false,\n    nextToDone: true,\n    tooltipPosition: \"bottom\",\n    tooltipClass: \"\",\n    group: \"\",\n    highlightClass: \"\",\n    exitOnEsc: true,\n    exitOnOverlayClick: true,\n    showStepNumbers: false,\n    stepNumbersOfLabel: activeTranslator.translate(\n      \"messages.stepNumbersOfLabel\"\n    ),\n    keyboardNavigation: true,\n    showButtons: true,\n    showBullets: true,\n    showProgress: false,\n    scrollToElement: true,\n    scrollTo: \"element\",\n    scrollPadding: 30,\n    overlayOpacity: 0.5,\n    autoPosition: true,\n    positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\n    disableInteraction: false,\n\n    dontShowAgain: false,\n    dontShowAgainLabel: activeTranslator.translate(\n      \"messages.dontShowAgainLabel\"\n    ),\n    dontShowAgainCookie: \"introjs-dontShowAgain\",\n    dontShowAgainCookieDays: 365,\n    helperElementPadding: 10,\n\n    buttonClass: \"introjs-button\",\n    progressBarAdditionalClass: \"\",\n    tooltipRenderAsHtml: true,\n    language: activeTranslator.getLanguage(),\n  };\n}\n"
  },
  {
    "path": "src/packages/tour/position.cy.ts",
    "content": "context(\"Intro.js tooltip position with scrollable container\", () => {\n  beforeEach(() => {\n    cy.visit(\"./cypress/setup/index.html\");\n\n    // scrollable container and target element\n    cy.document().then((doc) => {\n      const container = doc.createElement(\"div\");\n      container.id = \"scrollable-container\";\n      container.style.cssText =\n        \"height: 600px; overflow-y: scroll; border: 2px solid gray; margin-bottom: 20px;\";\n\n      const getTargetElement = (id, marginTop, label) => {\n        const target = doc.createElement(\"div\");\n        target.id = id;\n        target.style.cssText = `margin-top: ${marginTop}; background-color: yellow; padding: 10px;`;\n        target.setAttribute(\"data-intro\", label);\n        target.textContent = `Step Element (${label})`;\n        return target;\n      };\n\n      container.appendChild(\n        getTargetElement(\n          \"scrollable-target-element-1\",\n          \"5px\",\n          \"First Scrollable Step\"\n        )\n      );\n      container.appendChild(\n        getTargetElement(\n          \"scrollable-target-element-2\",\n          \"800px\",\n          \"Second Scrollable Step\"\n        )\n      );\n      doc.body.prepend(container);\n    });\n  });\n\n  it(\"scrolls and ensures tooltip is correctly positioned near target\", () => {\n    cy.get(\"#scrollable-container\").scrollTo(\"top\");\n\n    cy.window().then((win) => {\n      cy.compareSnapshot(\"scrollable-first-step\");\n\n      win.introJs.tour().start();\n      cy.wait(500);\n      cy.compareSnapshot(\"scrollable-second-step\");\n\n      cy.nextStep();\n      cy.wait(500);\n      cy.compareSnapshot(\"scrollable-third-step\");\n\n      cy.nextStep();\n      cy.wait(800);\n      cy.compareSnapshot(\"scrollable-fourth-step\");\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/position.ts",
    "content": "import { setPositionRelativeTo } from \"../../util/positionRelativeTo\";\nimport { TourStep } from \"./steps\";\n\n/**\n * Sets the position of the element relative to the TourStep\n * @api private\n */\nexport const setPositionRelativeToStep = (\n  relativeElement: HTMLElement,\n  element: HTMLElement,\n  step: TourStep,\n  padding: number\n) => {\n  setTimeout(() => {\n    setPositionRelativeTo(\n      relativeElement,\n      element,\n      step.element as HTMLElement,\n      step.position === \"floating\" ? 0 : padding\n    );\n  }, 0);\n};\n"
  },
  {
    "path": "src/packages/tour/progressbar.cy.ts",
    "content": "context(\"ProgressBar\", () => {\n  beforeEach(() => {\n    cy.visit(\"./cypress/setup/index.html\");\n  });\n\n  it(\"should match the popup\", () => {\n    cy.window().then((win) => {\n      win.introJs\n        .tour()\n        .setOptions({\n          showProgress: true,\n          steps: [\n            {\n              intro: \"step one\",\n            },\n            {\n              intro: \"step two\",\n            },\n          ],\n        })\n        .start();\n\n      cy.wait(500);\n\n      cy.compareSnapshot(\"first-step\");\n\n      cy.nextStep();\n      cy.wait(800);\n\n      cy.compareSnapshot(\"second-step\");\n\n      cy.nextStep();\n      cy.wait(800);\n\n      cy.compareSnapshot(\"exit\");\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/refresh.test.ts",
    "content": "import { getMockTour } from \"./mock\";\nimport { Tour } from \"./tour\";\nimport dom from \"../dom\";\nimport {\n  sleep,\n  waitMsForDerivations,\n  waitMsForExitTransition,\n} from \"../../util/sleep\";\n\nconst { div } = dom.tags;\n\ndescribe(\"refresh\", () => {\n  let mockTour: Tour;\n  let targetElement: HTMLElement;\n\n  beforeEach(() => {\n    mockTour = getMockTour();\n    targetElement = div();\n    dom.add(document.body, targetElement);\n  });\n\n  afterEach(async () => {\n    await mockTour.exit();\n    await sleep(waitMsForExitTransition);\n  });\n\n  test(\"should not refetch the steps when refreshStep is false\", async () => {\n    // Arrange\n    mockTour.addStep({\n      intro: \"first\",\n    });\n\n    await mockTour.start();\n    await sleep(waitMsForDerivations);\n\n    // Act\n    mockTour.setOptions({\n      steps: [\n        {\n          intro: \"first\",\n        },\n        {\n          intro: \"second\",\n        },\n      ],\n    });\n\n    mockTour.refresh();\n\n    // Assert\n    expect(mockTour.getSteps()).toHaveLength(1);\n    expect(mockTour.getStep(0).intro).toBe(\"first\");\n    expect(document.querySelectorAll(\".introjs-bullets ul li\").length).toBe(1);\n  });\n\n  test(\"should fetch the steps when refreshStep is true\", async () => {\n    // Arrange\n    mockTour.addStep({\n      intro: \"first\",\n    });\n\n    await mockTour.start();\n    await sleep(waitMsForDerivations);\n\n    // Act\n    mockTour.setOptions({\n      steps: [\n        {\n          intro: \"first\",\n        },\n        {\n          intro: \"second\",\n        },\n      ],\n    });\n\n    mockTour.refresh(true);\n\n    // Assert\n    expect(mockTour.getSteps()).toHaveLength(2);\n    expect(mockTour.getStep(1).intro).toBe(\"second\");\n    expect(document.querySelectorAll(\".introjs-bullets ul li\").length).toBe(2);\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/showElement.ts",
    "content": "import { addClass } from \"../../util/className\";\nimport { TourStep } from \"./steps\";\nimport { Tour } from \"./tour\";\nimport getPropValue from \"../../util/getPropValue\";\nimport { queryElementsByClassName } from \"../../util/queryElement\";\nimport { removeClass } from \"../../util/className\";\nimport { showElementClassName } from \"./classNames\";\n\n/**\n * To set the show element\n * This function set a relative (in most cases) position and changes the z-index\n *\n * @api private\n */\nfunction setShowElement(targetElement: HTMLElement) {\n  addClass(targetElement, \"introjs-showElement\");\n\n  const currentElementPosition = getPropValue(targetElement, \"position\");\n  if (\n    currentElementPosition !== \"absolute\" &&\n    currentElementPosition !== \"relative\" &&\n    currentElementPosition !== \"sticky\" &&\n    currentElementPosition !== \"fixed\"\n  ) {\n    //change to new intro item\n    addClass(targetElement, \"introjs-relativePosition\");\n  }\n}\n\n/**\n * Show an element on the page\n *\n * @api private\n */\nexport async function showElement(tour: Tour, step: TourStep) {\n  tour.callback(\"change\")?.call(tour, step.element);\n\n  //remove old classes if the element still exist\n  removeShowElement();\n\n  setShowElement(step.element as HTMLElement);\n\n  await tour.callback(\"afterChange\")?.call(tour, step.element);\n}\n\n/**\n * To remove all show element(s)\n *\n * @api private\n */\nexport function removeShowElement() {\n  const elms = Array.from(queryElementsByClassName(showElementClassName));\n\n  for (const elm of elms) {\n    removeClass(elm, /introjs-[a-zA-Z]+/g);\n  }\n}\n"
  },
  {
    "path": "src/packages/tour/start.cy.ts",
    "content": "context(\"Start\", () => {\n  it(\"should start the tour with data-intro attributes\", () => {\n    cy.visit(\"./cypress/setup/index.html\").then((window) => {\n      const instance = window.introJs.tour();\n      instance.start();\n\n      cy.get(\".introjs-tooltiptext\").contains(\"first header step\");\n      cy.nextStep();\n      cy.get(\".introjs-tooltiptext\").contains(\"second paragraph step\");\n      cy.nextStep();\n      cy.get(\".introjs-tooltiptext\").contains(\"third header step\");\n      cy.nextStep();\n      cy.get(\".introjs-tooltiptext\").contains(\"fourth header step\");\n      cy.nextStep();\n      cy.get(\".introjs-overlay\").should(\"have.length\", 0);\n    });\n  });\n\n  it(\"should prefer tour configs over data-intro attributes\", () => {\n    cy.visit(\"./cypress/setup/index.html\").then((window) => {\n      const instance = window.introJs.tour().setOptions({\n        steps: [\n          {\n            intro: \"step one\",\n          },\n          {\n            intro: \"step two\",\n          },\n        ],\n      });\n\n      instance.start();\n\n      cy.get(\".introjs-tooltiptext\").contains(\"step one\");\n    });\n  });\n\n  it(\"should not throw an exception after calling start mulitple times\", () => {\n    cy.visit(\"./cypress/setup/index.html\").then((window) => {\n      const instance = window.introJs.tour().setOptions({\n        steps: [\n          {\n            intro: \"step one\",\n          },\n          {\n            intro: \"step two\",\n          },\n        ],\n      });\n\n      instance.start();\n      instance.exit();\n      instance.start();\n      instance.exit();\n      instance.start();\n      instance.exit();\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/start.test.ts",
    "content": "import { start } from \"./start\";\nimport * as steps from \"./steps\";\nimport * as nextStep from \"./steps\";\nimport { getMockTour } from \"./mock\";\ndescribe(\"start\", () => {\n  beforeEach(() => {\n    jest.resetAllMocks();\n  });\n\n  test(\"should call the onstart callback\", () => {\n    // Arrange\n    jest.spyOn(steps, \"fetchSteps\").mockReturnValue([]);\n    jest.spyOn(nextStep, \"nextStep\").mockReturnValue(Promise.resolve(true));\n\n    const onstartCallback = jest.fn();\n\n    const mockTour = getMockTour();\n    mockTour.onStart(onstartCallback);\n\n    // Act\n    start(mockTour);\n\n    // Assert\n    expect(onstartCallback).toBeCalledTimes(1);\n    expect(onstartCallback).toBeCalledWith(document.body);\n  });\n\n  test(\"should not start the tour if isActive is false\", () => {\n    // Arrange\n    const fetchIntroStepsMock = jest\n      .spyOn(steps, \"fetchSteps\")\n      .mockReturnValue([]);\n    const nextStepMock = jest.spyOn(nextStep, \"nextStep\");\n\n    const mockTour = getMockTour();\n    mockTour.setOption(\"isActive\", false);\n\n    // Act\n    start(mockTour);\n\n    // Assert\n    expect(fetchIntroStepsMock).toBeCalledTimes(0);\n    expect(nextStepMock).toBeCalledTimes(0);\n  });\n});\ndescribe(\"fetch steps\", () => {\n  const getMockTour = () => {\n    const steps: any[] = [];\n\n    return {\n      addStep(step: any) {\n        if (!step.element) {\n          const el = document.createElement(\"div\");\n          el.setAttribute(\"data-intro\", step.intro || \"mock step\");\n          step.element = el;\n          document.body.appendChild(el);\n        }\n        steps.push(step);\n        return this;\n      },\n      getSteps() {\n        return steps;\n      },\n      start: jest.fn().mockResolvedValue(true),\n    };\n  };\n\n  test(\"should fetch the steps\", async () => {\n    const mockTour = getMockTour();\n    mockTour.addStep({ intro: \"first\" });\n    await mockTour.start();\n    expect(mockTour.getSteps()).toHaveLength(1);\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/start.ts",
    "content": "import { nextStep } from \"./steps\";\nimport { fetchSteps } from \"./steps\";\nimport { Tour } from \"./tour\";\n\n/**\n * Initiate a new tour the page\n *\n * @api private\n */\nexport const start = async (tour: Tour): Promise<Boolean> => {\n  // don't start the tour if the instance is not active\n  if (!tour.isActive()) {\n    return false;\n  }\n\n  // don't start the tour if it's already started\n  if (tour.hasStarted()) {\n    return false;\n  }\n\n  await tour.callback(\"start\")?.call(tour, tour.getTargetElement());\n\n  //set it to the introJs object\n  const steps = fetchSteps(tour);\n\n  if (steps.length === 0) {\n    return false;\n  }\n\n  tour.setSteps(steps);\n\n  //then, start the show\n  await nextStep(tour);\n\n  return true;\n};\n"
  },
  {
    "path": "src/packages/tour/steps.test.ts",
    "content": "import dom from \"../dom\";\nimport { fetchSteps, nextStep, previousStep } from \"./steps\";\nimport {\n  appendMockSteps,\n  getMockPartialSteps,\n  getMockSteps,\n  getMockTour,\n} from \"./mock\";\nimport { showElement } from \"./showElement\";\n\nconst { div, h1 } = dom.tags;\n\njest.mock(\"./showElement\");\njest.mock(\"./exitIntro\");\n\ndescribe(\"steps\", () => {\n  describe(\"previousStep\", () => {\n    test(\"should decrement the step counter\", async () => {\n      // Arrange\n      const mockTour = getMockTour();\n      mockTour.setSteps(getMockSteps());\n      await mockTour.setCurrentStep(1);\n\n      await previousStep(mockTour);\n\n      expect(mockTour.getCurrentStep()).toBe(0);\n    });\n\n    test(\"should not decrement when step is 0\", async () => {\n      // Arrange\n      const mockTour = getMockTour();\n      mockTour.setSteps(getMockSteps());\n      await mockTour.setCurrentStep(0);\n\n      // Act\n      await previousStep(mockTour);\n      await Promise.resolve();\n\n      // Assert\n      expect(mockTour.getCurrentStep()).toBe(0);\n    });\n  });\n\n  describe(\"nextStep\", () => {\n    test(\"should increment the step counter\", async () => {\n      // Arrange\n      const mockTour = getMockTour();\n      mockTour.setSteps(getMockSteps());\n      await mockTour.setCurrentStep(0);\n\n      // Act\n      await nextStep(mockTour);\n\n      // Assert\n      expect(mockTour.getCurrentStep()).toBe(1);\n    });\n\n    test(\"should call ShowElement\", async () => {\n      // Arrange\n      const showElementMock = jest.fn();\n      (showElement as jest.Mock).mockImplementation(showElementMock);\n      const mockTour = getMockTour();\n      mockTour.setSteps(getMockSteps());\n\n      // Act\n      await nextStep(mockTour);\n\n      // Assert\n      expect(showElementMock).toHaveBeenCalledTimes(1);\n    });\n\n    test(\"should call the complete callback\", async () => {\n      // Arrange\n      const mockTour = getMockTour();\n      mockTour.setSteps(getMockSteps().slice(0, 2));\n\n      // Mock isEnd so that after reaching step 1, next call finishes the tour\n      jest.spyOn(mockTour, \"isEnd\").mockImplementation(() => {\n        return mockTour.getCurrentStep() === 1;\n      });\n\n      const fnCompleteCallback = jest.fn();\n      mockTour.onComplete(fnCompleteCallback);\n\n      // Act\n      await nextStep(mockTour);\n      await nextStep(mockTour);\n      await nextStep(mockTour);\n\n      // Assert\n      expect(fnCompleteCallback).toBeCalledTimes(1);\n      expect(fnCompleteCallback).toHaveBeenCalledWith(1, \"end\");\n    });\n\n    test(\"should be able to add steps using addStep()\", async () => {\n      // Arrange\n      const mockTour = getMockTour();\n      mockTour.addStep({\n        element: div(),\n        intro: \"test step\",\n      });\n\n      // Act\n      await mockTour.start();\n\n      // Assert\n      expect(mockTour.getSteps()).toHaveLength(1);\n      expect(mockTour.getStep(0).intro).toBe(\"test step\");\n    });\n\n    test(\"should be able to add steps using addSteps()\", async () => {\n      // Arrange\n      const mockTour = getMockTour();\n\n      mockTour.addSteps([\n        {\n          intro: \"first step\",\n        },\n        {\n          element: div(),\n          intro: \"second step\",\n        },\n      ]);\n\n      // Act\n      await mockTour.start();\n\n      // Assert\n      expect(mockTour.getSteps()).toHaveLength(2);\n      expect(mockTour.getStep(0).intro).toBe(\"first step\");\n      expect(mockTour.getStep(1).intro).toBe(\"second step\");\n    });\n  });\n\n  describe(\"fetchSteps\", () => {\n    test(\"should add floating element from options.steps to the list\", () => {\n      // Arrange\n      const mockTour = getMockTour();\n      mockTour.setOption(\"steps\", getMockSteps());\n\n      // Act\n      const steps = fetchSteps(mockTour);\n\n      // Assert\n      expect(steps.length).toBe(5);\n\n      expect(steps[0].position).toBe(\"floating\");\n      expect(steps[0].title).toBe(\"Floating title 1\");\n      expect(steps[0].intro).toBe(\"Step One of the tour\");\n      expect(steps[0].step).toBe(1);\n\n      expect(steps[1].position).toBe(\"floating\");\n      expect(steps[1].title).toBe(\"Floating title 2\");\n      expect(steps[1].intro).toBe(\"Step Two of the tour\");\n      expect(steps[1].step).toBe(2);\n    });\n\n    test(\"should find and add elements from options.steps to the list\", () => {\n      // Arrange\n      document.body.appendChild(h1());\n\n      const mockTour = getMockTour();\n      mockTour.addSteps(getMockPartialSteps());\n\n      // Act\n      const steps = fetchSteps(mockTour);\n\n      // Assert\n      expect(steps.length).toBe(5);\n\n      expect(steps[0].position).toBe(\"floating\");\n      expect(steps[0].title).toBe(\"Floating title 1\");\n      expect(steps[0].intro).toBe(\"Step One of the tour\");\n      expect(steps[0].step).toBe(1);\n\n      expect(steps[1].position).toBe(\"floating\");\n      expect(steps[1].title).toBe(\"Floating title 2\");\n      expect(steps[1].intro).toBe(\"Step Two of the tour\");\n      expect(steps[1].step).toBe(2);\n\n      expect(steps[2].position).toBe(\"top\");\n      expect(steps[2].title).toBe(\"First title\");\n      expect(steps[2].intro).toBe(\"Step Three of the tour\");\n      expect(steps[2].step).toBe(3);\n\n      expect(steps[3].element).toStrictEqual(getMockPartialSteps()[3].element);\n      expect(steps[3].position).toBe(\"right\");\n      expect(steps[3].intro).toBe(\"Step Four of the tour\");\n      expect(steps[3].step).toBe(4);\n\n      expect(steps[4].position).toBe(\"floating\");\n      expect(steps[4].intro).toBe(\"Element not found\");\n      expect(steps[4].step).toBe(5);\n    });\n\n    test(\"should find the data-* elements from the DOM with the correct order\", () => {\n      // Arrange\n      const targetElement = div();\n      const [\n        mockElementOne,\n        mockElementTwo,\n        mockElementThree,\n        mockElementFour,\n      ] = appendMockSteps(targetElement);\n      const mockTour = getMockTour(targetElement);\n\n      // Act\n      const steps = fetchSteps(mockTour);\n\n      // Assert\n      expect(steps.length).toBe(4);\n\n      expect(steps[0].position).toBe(\"bottom\");\n      expect(steps[0].intro).toBe(\"Mock element\");\n      expect(steps[0].element).toBe(mockElementOne);\n      expect(steps[0].step).toBe(1);\n\n      expect(steps[1].position).toBe(\"left\");\n      expect(steps[1].intro).toBe(\"Mock element left position\");\n      expect(steps[1].element).toBe(mockElementTwo);\n      expect(steps[1].step).toBe(2);\n\n      expect(steps[2].position).toBe(\"bottom\");\n      expect(steps[2].intro).toBe(\"Mock element second to last\");\n      expect(steps[2].element).toBe(mockElementThree);\n      expect(steps[2].step).toBe(10);\n\n      expect(steps[3].position).toBe(\"bottom\");\n      expect(steps[3].intro).toBe(\"Mock element last\");\n      expect(steps[3].element).toBe(mockElementFour);\n      expect(steps[3].step).toBe(20);\n    });\n\n    test(\"should respect the custom step attribute (DOM)\", () => {\n      // Arrange\n      appendMockSteps();\n\n      const mockTour = getMockTour();\n\n      // Act\n      const steps = fetchSteps(mockTour);\n\n      // Assert\n      expect(steps.length).toBe(4);\n\n      expect(steps[2].intro).toBe(\"Mock element second to last\");\n      expect(steps[2].step).toBe(10);\n\n      expect(steps[3].intro).toBe(\"Mock element last\");\n      expect(steps[3].step).toBe(20);\n    });\n\n    test(\"should ignore DOM elements when options.steps is available\", () => {\n      // Arrange\n      appendMockSteps();\n      var mockTour = getMockTour();\n      mockTour.setOption(\"steps\", getMockSteps());\n\n      // Act\n      const steps = fetchSteps(mockTour);\n\n      // Assert\n      expect(steps.length).toBe(5);\n      expect(steps[0].intro).toBe(\"Step One of the tour\");\n      expect(steps[1].intro).toBe(\"Step Two of the tour\");\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/steps.ts",
    "content": "import { TooltipPosition } from \"../../packages/tooltip\";\nimport { queryElement, queryElements } from \"../../util/queryElement\";\nimport cloneObject from \"../../util/cloneObject\";\nimport { Tour } from \"./tour\";\nimport {\n  dataDisableInteraction,\n  dataHighlightClass,\n  dataIntroAttribute,\n  dataIntroGroupAttribute,\n  dataPosition,\n  dataScrollTo,\n  dataStepAttribute,\n  dataTitleAttribute,\n  dataTooltipClass,\n} from \"./dataAttributes\";\nimport { showElement } from \"./showElement\";\n\nexport type ScrollTo = \"off\" | \"element\" | \"tooltip\";\n\nexport type TourStep = {\n  step: number;\n  title: string;\n  intro: string;\n  tooltipClass?: string;\n  highlightClass?: string;\n  element?: Element | HTMLElement | string | null;\n  position: TooltipPosition;\n  scrollTo: ScrollTo;\n  disableInteraction?: boolean;\n};\n\n/**\n * Go to next step on intro\n *\n * @api private\n */\nexport async function nextStep(tour: Tour) {\n  if (tour.isEnd()) {\n    await tour.callback(\"complete\")?.call(tour, tour.getCurrentStep(), \"end\");\n    await tour.exit();\n    return false;\n  }\n\n  await tour.incrementCurrentStep();\n\n  const currentStep = tour.getCurrentStep();\n  const nextStep = tour.getStep(currentStep!);\n  await showElement(tour, nextStep);\n\n  return true;\n}\n\n/**\n * Go to previous step on intro\n *\n * @api private\n */\nexport async function previousStep(tour: Tour) {\n  const currentStep = tour.getCurrentStep();\n  if (currentStep === undefined || currentStep <= 0) {\n    return false;\n  }\n\n  await tour.decrementCurrentStep();\n\n  const newStep = tour.getCurrentStep()!;\n  const prevStep = tour.getStep(newStep);\n  await showElement(tour, prevStep);\n\n  return true;\n}\n\n/**\n * Finds all Intro steps from the data-* attributes and the options.steps array\n *\n * @api private\n */\nexport const fetchSteps = (tour: Tour) => {\n  let steps: TourStep[] = [];\n\n  if (tour.getOption(\"steps\")?.length) {\n    //use steps passed programmatically\n    for (const _step of tour.getOption(\"steps\")) {\n      const step = cloneObject(_step);\n\n      //set the step\n      step.step = steps.length + 1;\n\n      step.title = step.title || \"\";\n\n      //use querySelector function only when developer used CSS selector\n      if (typeof step.element === \"string\") {\n        //grab the element with given selector from the page\n        step.element = queryElement(step.element) || undefined;\n      }\n\n      // tour without element\n      if (!step.element) {\n        step.element = tour.appendFloatingElement();\n        step.position = \"floating\";\n      }\n\n      step.position = step.position || tour.getOption(\"tooltipPosition\");\n      step.scrollTo = step.scrollTo || tour.getOption(\"scrollTo\");\n\n      if (typeof step.disableInteraction === \"undefined\") {\n        step.disableInteraction = tour.getOption(\"disableInteraction\");\n      }\n\n      if (step.element !== null) {\n        steps.push(step as TourStep);\n      }\n    }\n  } else {\n    const elements = Array.from(\n      queryElements(`*[${dataIntroAttribute}]`, tour.getTargetElement())\n    );\n\n    // if there's no element to intro\n    if (elements.length < 1) {\n      return [];\n    }\n\n    const itemsWithoutStep: TourStep[] = [];\n\n    for (const element of elements) {\n      // start intro for groups of elements\n      if (\n        tour.getOption(\"group\") &&\n        element.getAttribute(dataIntroGroupAttribute) !==\n          tour.getOption(\"group\")\n      ) {\n        continue;\n      }\n\n      // skip hidden elements\n      if (element.style.display === \"none\") {\n        continue;\n      }\n\n      // get the step for the current element or set as 0 if is not present\n      const stepIndex = parseInt(\n        element.getAttribute(dataStepAttribute) || \"0\",\n        10\n      );\n\n      let disableInteraction = tour.getOption(\"disableInteraction\");\n      if (element.hasAttribute(dataDisableInteraction)) {\n        disableInteraction = !!element.getAttribute(dataDisableInteraction);\n      }\n\n      const newIntroStep: TourStep = {\n        step: stepIndex,\n        element,\n        title: element.getAttribute(dataTitleAttribute) || \"\",\n        intro: element.getAttribute(dataIntroAttribute) || \"\",\n        tooltipClass: element.getAttribute(dataTooltipClass) || undefined,\n        highlightClass: element.getAttribute(dataHighlightClass) || undefined,\n        position: (element.getAttribute(dataPosition) ||\n          tour.getOption(\"tooltipPosition\")) as TooltipPosition,\n        scrollTo:\n          (element.getAttribute(dataScrollTo) as ScrollTo) ||\n          tour.getOption(\"scrollTo\"),\n        disableInteraction,\n      };\n\n      if (stepIndex > 0) {\n        steps[stepIndex - 1] = newIntroStep;\n      } else {\n        itemsWithoutStep.push(newIntroStep);\n      }\n    }\n\n    // fill items without step in blanks and update their step\n    for (let i = 0; itemsWithoutStep.length > 0; i++) {\n      if (typeof steps[i] === \"undefined\") {\n        const newStep = itemsWithoutStep.shift();\n        if (!newStep) break;\n\n        newStep.step = i + 1;\n        steps[i] = newStep;\n      }\n    }\n  }\n\n  // removing undefined/null elements\n  steps = steps.filter((n) => n);\n\n  // Sort all items with given steps\n  steps.sort((a, b) => a.step - b.step);\n\n  return steps;\n};\n"
  },
  {
    "path": "src/packages/tour/tour.test.ts",
    "content": "import {\n  className,\n  content,\n  doneButton,\n  find,\n  nextButton,\n  prevButton,\n  skipButton,\n  tooltipText,\n  waitFor,\n} from \"../../../tests/jest/helper\";\nimport * as dontShowAgain from \"./dontShowAgain\";\nimport {\n  appendMockSteps,\n  getMockPartialSteps,\n  getMockTour,\n  getMockSteps,\n} from \"./mock\";\nimport { Tour } from \"./tour\";\nimport { helperLayerClassName, overlayClassName } from \"./classNames\";\nimport {\n  sleep,\n  waitMsForDerivations,\n  waitMsForExitTransition,\n} from \"../../util/sleep\";\nimport { axe, toHaveNoViolations } from \"jest-axe\";\nexpect.extend(toHaveNoViolations);\njest.setTimeout(40000);\n\ndescribe(\"Tour\", () => {\n  beforeEach(() => {\n    jest.resetAllMocks();\n  });\n\n  describe(\"constructor\", () => {\n    test(\"should set the targetElement to document.body\", () => {\n      // Arrange & Act\n      const tour = new Tour();\n\n      // Assert\n      expect(tour.getTargetElement()).toBe(document.body);\n    });\n\n    test(\"should set the correct targetElement\", () => {\n      // Arrange\n      const stubTargetElement = document.createElement(\"div\");\n\n      // Act\n      const tour = new Tour(stubTargetElement);\n\n      // Assert\n      expect(tour.getTargetElement()).toBe(stubTargetElement);\n    });\n\n    test(\"should merge user options with default options\", () => {\n      // Arrange\n      const userOptions = { showStepNumbers: true };\n\n      // Act\n      const tour = new Tour(undefined, userOptions);\n\n      // Assert\n      expect(tour.getOption(\"showStepNumbers\")).toBe(true);\n      expect(tour.getOption(\"showButtons\")).toBe(true);\n      expect(tour.getOption(\"exitOnEsc\")).toBe(true);\n    });\n  });\n\n  describe(\"start\", () => {\n    let mockTour: Tour;\n\n    beforeEach(() => {\n      mockTour = getMockTour();\n\n      document.body.innerHTML = `<div>\n          <h1 id='title'>Title</h1>\n          <p id='paragraph'>Paragraph</p>\n          <div id='position-absolute' style='position: absolute;'>Position Absolute</div>\n          <div id='position-fixed' style='position: fixed;'>Position Fixed</div>\n        </div>`;\n    });\n\n    afterEach(async () => {\n      await mockTour.exit();\n    });\n\n    test(\"should not start the tour twice\", async () => {\n      // Arrange\n      mockTour.addSteps(getMockPartialSteps());\n      const onStartMock = jest.fn();\n      mockTour.onStart(onStartMock);\n\n      // Act\n      await mockTour.start();\n      await mockTour.start();\n\n      // Assert\n      expect(onStartMock).toBeCalledTimes(1);\n    });\n\n    test(\"should start floating intro with one step\", async () => {\n      // Arrange & Act\n      await mockTour\n        .setOptions({\n          steps: [\n            {\n              intro: \"hello world\",\n            },\n          ],\n        })\n        .start();\n\n      // Assert\n      expect(content(tooltipText())).toBe(\"hello world\");\n      expect(content(doneButton())).toBe(\"Done\");\n      expect(prevButton()).toBeNull();\n      expect(className(\".introjs-showElement\")).toContain(\n        \"introjsFloatingElement\"\n      );\n      expect(className(\".introjs-showElement\")).toContain(\n        \"introjs-relativePosition\"\n      );\n    });\n\n    test(\"should start floating intro with two steps\", async () => {\n      // Arrange\n      mockTour.setOptions({\n        steps: [\n          {\n            intro: \"step one\",\n          },\n          {\n            intro: \"step two\",\n          },\n        ],\n      });\n\n      // Act\n      await mockTour.start();\n\n      // Assert\n      expect(content(tooltipText())).toBe(\"step one\");\n\n      expect(doneButton()).toBeNull();\n\n      expect(prevButton()).not.toBeNull();\n      expect(className(prevButton())).toContain(\"introjs-disabled\");\n\n      expect(nextButton()).not.toBeNull();\n      expect(className(nextButton())).not.toContain(\"introjs-disabled\");\n\n      expect(className(\".introjs-showElement\")).toContain(\n        \"introjsFloatingElement\"\n      );\n      expect(className(\".introjs-showElement\")).toContain(\n        \"introjs-relativePosition\"\n      );\n    });\n\n    test(\"should highlight the target element\", async () => {\n      // Arrange\n      const mockElement = document.querySelector(\"#paragraph\");\n      mockTour.setOptions({\n        steps: [\n          {\n            intro: \"step one\",\n            element: mockElement,\n          },\n        ],\n      });\n\n      // Act\n      await mockTour.start();\n\n      // Assert\n      expect(mockElement?.className).toContain(\"introjs-showElement\");\n      expect(mockElement?.className).toContain(\"introjs-relativePosition\");\n    });\n\n    test(\"should remove the container element after exit() is called\", async () => {\n      // Arrange\n      const mockElement = document.querySelector(\"#paragraph\");\n      mockTour.setOptions({\n        steps: [\n          {\n            intro: \"step one\",\n            element: mockElement,\n          },\n        ],\n      });\n\n      // Act\n      await mockTour.start();\n      await sleep(waitMsForDerivations);\n      await mockTour.exit();\n      await sleep(waitMsForExitTransition);\n\n      // Assert\n      expect(mockElement?.className).not.toContain(\"introjs-showElement\");\n      expect(document.querySelector(`.${helperLayerClassName}`)).toBeNull();\n      expect(document.querySelector(`.${overlayClassName}`)).toBeNull();\n    });\n\n    test(\"should not highlight the target element if queryString is incorrect\", async () => {\n      // Arrange\n      const mockElement = document.querySelector(\"#non-existing-element\");\n      mockTour.setOptions({\n        steps: [\n          {\n            intro: \"step one\",\n            element: mockElement,\n          },\n        ],\n      });\n\n      // Act\n      await mockTour.start();\n\n      // Assert\n      expect(className(\".introjs-showElement\")).toContain(\n        \"introjsFloatingElement\"\n      );\n    });\n\n    test(\"should not add relativePosition if target element is fixed\", async () => {\n      // Arrange\n      const fixedMockElement = document.querySelector(\"#position-fixed\");\n      mockTour.setOptions({\n        steps: [\n          {\n            intro: \"step one\",\n            element: fixedMockElement,\n          },\n        ],\n      });\n\n      // Act\n      await mockTour.start();\n\n      // Assert\n      expect(fixedMockElement?.className).toContain(\"introjs-showElement\");\n      expect(fixedMockElement?.className).not.toContain(\n        \"introjs-relativePosition\"\n      );\n    });\n\n    test(\"should not add relativePosition if target element is fixed or absolute\", async () => {\n      // Arrange\n      const absoluteMockElement = document.querySelector(\"#position-absolute\");\n      mockTour.setOptions({\n        steps: [\n          {\n            intro: \"step one\",\n            element: absoluteMockElement,\n          },\n        ],\n      });\n\n      // Act\n      await mockTour.start();\n\n      // Assert\n      expect(absoluteMockElement?.className).toContain(\"introjs-showElement\");\n      expect(absoluteMockElement?.className).not.toContain(\n        \"introjs-relativePosition\"\n      );\n    });\n\n    test(\"should call the onstart callback\", async () => {\n      // Arrange\n      const fn = jest.fn();\n      mockTour\n        .setOptions({\n          steps: [\n            {\n              intro: \"step one\",\n              element: document.querySelector(\"h1\"),\n            },\n          ],\n        })\n        .onStart(fn);\n\n      // Act\n      await mockTour.start();\n\n      // Assert\n      expect(fn).toBeCalledTimes(1);\n      expect(fn).toBeCalledWith(window.document.body);\n    });\n\n    test(\"should call onexit and oncomplete when there is one step\", async () => {\n      // Arrange\n      const onexitMock = jest.fn();\n      const oncompleteMock = jest.fn();\n\n      mockTour\n        .setOptions({\n          steps: [\n            {\n              intro: \"hello world\",\n            },\n          ],\n        })\n        .onExit(onexitMock)\n        .onComplete(oncompleteMock);\n\n      // Act\n      await mockTour.start();\n      nextButton().click();\n      await waitFor(1000);\n\n      // Assert\n      expect(onexitMock).toBeCalledTimes(1);\n      expect(oncompleteMock).toBeCalledTimes(1);\n    });\n\n    test(\"should call onexit when skip is clicked\", async () => {\n      // Arrange\n      const onexitMock = jest.fn();\n      const oncompleteMock = jest.fn();\n\n      mockTour\n        .setOptions({\n          steps: [\n            {\n              intro: \"hello world\",\n            },\n          ],\n        })\n        .onExit(onexitMock)\n        .onComplete(oncompleteMock);\n\n      // Act\n      await mockTour.start();\n      skipButton().click();\n      await waitFor(1000);\n\n      // Assert\n      expect(onexitMock).toBeCalledTimes(1);\n      expect(oncompleteMock).toBeCalledTimes(1);\n    });\n\n    test(\"should call not oncomplete when skip is clicked and there are two steps\", async () => {\n      // Arrange\n      const onexitMock = jest.fn();\n      const oncompleteMMock = jest.fn();\n      mockTour\n        .setOptions({\n          steps: [\n            {\n              intro: \"first\",\n            },\n            {\n              intro: \"second\",\n            },\n          ],\n        })\n        .onExit(onexitMock)\n        .onComplete(oncompleteMMock);\n\n      // Act\n      await mockTour.start();\n      skipButton().click();\n      await waitFor(1000);\n\n      // Assert\n      expect(onexitMock).toBeCalledTimes(1);\n      expect(oncompleteMMock).toBeCalledTimes(0);\n    });\n\n    test(\"should not append the dontShowAgain checkbox when its inactive\", async () => {\n      // Arrange\n      mockTour.setOptions({\n        dontShowAgain: false,\n        steps: [\n          {\n            intro: \"hello world\",\n          },\n        ],\n      });\n\n      // Act\n      await mockTour.start();\n\n      // Assert\n      expect(find(\".introjs-dontShowAgain\")).toBeNull();\n    });\n\n    test(\"should append the dontShowAgain checkbox\", async () => {\n      // Arrange\n      mockTour.setOptions({\n        dontShowAgain: true,\n        steps: [\n          {\n            intro: \"hello world\",\n          },\n        ],\n      });\n\n      // Act\n      await mockTour.start();\n\n      // Assert\n      expect(find(\".introjs-dontShowAgain\")).not.toBeNull();\n    });\n\n    test(\"should call setDontShowAgain when then checkbox is clicked\", async () => {\n      // Arrange\n      const setDontShowAgainSpy = jest.spyOn(dontShowAgain, \"setDontShowAgain\");\n\n      mockTour.setOptions({\n        dontShowAgain: true,\n        steps: [\n          {\n            intro: \"hello world\",\n          },\n        ],\n      });\n\n      // Act\n      await mockTour.start();\n      await sleep(waitMsForDerivations);\n      const checkbox = find(\".introjs-dontShowAgain input\");\n      checkbox.click();\n\n      // Assert\n      expect(setDontShowAgainSpy).toBeCalledTimes(1);\n      expect(setDontShowAgainSpy).toBeCalledWith(\n        true,\n        mockTour.getOption(\"dontShowAgainCookie\"),\n        mockTour.getOption(\"dontShowAgainCookieDays\")\n      );\n    });\n\n    it(\"should clean up all event listeners\", async () => {\n      // Arrange\n      const tour = new Tour();\n      tour.addSteps(getMockPartialSteps());\n      const addEventListenerSpy = jest.spyOn(window, \"addEventListener\");\n      const removeEventListenerSpy = jest.spyOn(window, \"removeEventListener\");\n\n      // Act\n      await tour.start();\n      await tour.exit();\n\n      // Assert\n      expect(addEventListenerSpy).toBeCalledTimes(2);\n      expect(removeEventListenerSpy).toBeCalledTimes(2);\n    });\n\n    it(\"should not enable keyboard navigation and resize when start is false\", async () => {\n      // Arrange\n      mockTour.enableKeyboardNavigation = jest.fn();\n      mockTour.enableRefreshOnResize = jest.fn();\n\n      // Act\n      await mockTour.start();\n\n      // Assert\n      expect(mockTour.enableKeyboardNavigation).not.toBeCalled();\n      expect(mockTour.enableRefreshOnResize).not.toBeCalled();\n    });\n  });\n\n  describe(\"enableRefreshOnResize\", () => {\n    it(\"should add event listener for resize\", () => {\n      // Arrange\n      const tour = new Tour();\n      const addEventListenerSpy = jest.spyOn(window, \"addEventListener\");\n\n      // Act\n      tour.enableRefreshOnResize();\n\n      // Assert\n      expect(addEventListenerSpy).toBeCalledWith(\n        \"resize\",\n        expect.any(Function),\n        true\n      );\n    });\n  });\n\n  describe(\"disableRefreshOnResize\", () => {\n    it('should remove event listener for \"resize\"', () => {\n      // Arrange\n      const tour = new Tour();\n      const removeEventListenerSpy = jest.spyOn(window, \"removeEventListener\");\n\n      // Act\n      tour.enableRefreshOnResize();\n      tour.disableRefreshOnResize();\n\n      // Assert\n      expect(removeEventListenerSpy).toBeCalledWith(\n        \"resize\",\n        expect.any(Function),\n        true\n      );\n    });\n  });\n\n  describe(\"enableKeyboardNavigation\", () => {\n    it(\"should not add event listener when keyboard navigation is disabled\", () => {\n      // Arrange\n      const tour = new Tour();\n      tour.setOption(\"keyboardNavigation\", false);\n      const addEventListenerSpy = jest.spyOn(window, \"addEventListener\");\n\n      // Act\n      tour.enableKeyboardNavigation();\n\n      // Assert\n      expect(addEventListenerSpy).not.toBeCalledWith(\n        \"keydown\",\n        expect.any(Function),\n        true\n      );\n    });\n\n    it('should add event listener for \"keydown\"', () => {\n      // Arrange\n      const tour = new Tour();\n      const addEventListenerSpy = jest.spyOn(window, \"addEventListener\");\n\n      // Act\n      tour.enableKeyboardNavigation();\n\n      // Assert\n      expect(addEventListenerSpy).toBeCalledWith(\n        \"keydown\",\n        expect.any(Function),\n        true\n      );\n    });\n  });\n\n  describe(\"disableKeyboardNavigation\", () => {\n    it('should remove event listener for \"keydown\"', () => {\n      // Arrange\n      const tour = new Tour();\n      const removeEventListenerSpy = jest.spyOn(window, \"removeEventListener\");\n\n      // Act\n      tour.enableKeyboardNavigation();\n      tour.disableKeyboardNavigation();\n\n      // Assert\n      expect(removeEventListenerSpy).toBeCalledWith(\n        \"keydown\",\n        expect.any(Function),\n        true\n      );\n    });\n  });\n\n  describe(\"isActive\", () => {\n    test(\"should be false if isActive flag is false\", () => {\n      // Arrange\n      const tour = new Tour();\n\n      // Act\n      tour.setOptions({\n        isActive: false,\n      });\n\n      // Assert\n      expect(tour.isActive()).toBeFalsy();\n    });\n\n    test(\"should be true if dontShowAgain is active but cookie is missing\", () => {\n      // Arrange\n      jest.spyOn(dontShowAgain, \"getDontShowAgain\").mockReturnValueOnce(false);\n\n      const tour = new Tour();\n\n      // Act\n      tour.setOptions({\n        isActive: true,\n        dontShowAgain: true,\n      });\n\n      // Assert\n      expect(tour.isActive()).toBeTruthy();\n    });\n\n    test(\"should be false if dontShowAgain is active but isActive is true\", () => {\n      // Arrange\n      jest.spyOn(dontShowAgain, \"getDontShowAgain\").mockReturnValueOnce(true);\n      const tour = new Tour();\n\n      // Act\n      tour.setOptions({\n        isActive: true,\n        dontShowAgain: true,\n      });\n\n      // Assert\n      expect(tour.isActive()).toBeFalsy();\n    });\n  });\n\n  describe(\"hasStarted\", () => {\n    test(\"should be false if the tour has not started\", async () => {\n      const mockTour = getMockTour();\n      mockTour.addSteps(getMockPartialSteps());\n\n      // Act\n      expect(mockTour.hasStarted()).toBeFalsy();\n    });\n\n    test(\"it should be true if the tour has started\", async () => {\n      // Arrange\n      const mockTour = getMockTour();\n      mockTour.addSteps(getMockPartialSteps());\n\n      // Act\n      await mockTour.start();\n\n      // Act\n      expect(mockTour.hasStarted()).toBeTruthy();\n    });\n\n    test(\"it should be false if the tour has started and exited\", async () => {\n      // Arrange\n      const mockTour = getMockTour();\n      mockTour.addSteps(getMockPartialSteps());\n\n      // Act\n      await mockTour.start();\n      await mockTour.exit();\n\n      // Act\n      expect(mockTour.hasStarted()).toBeFalsy();\n    });\n  });\n\n  describe(\"tooltipRenderAsHtml\", () => {\n    beforeEach(() => {\n      document.body.innerHTML = \"\"; // Clear previous test DOM\n    });\n    test(\"should render HTML when tooltipRenderAsHtml is true\", async () => {\n      const tour = new Tour();\n\n      // Arrange & Act\n      tour.setOptions({\n        tooltipRenderAsHtml: true,\n        steps: [\n          {\n            intro: \"<b>Bold text</b> and <i>italic text</i>\",\n          },\n        ],\n      });\n\n      await tour.start();\n\n      // Assert\n      const tooltip = find(\".introjs-tooltiptext\");\n      expect(tooltip).not.toBeNull();\n      expect(tooltip?.querySelector(\"b\")?.textContent).toBe(\"Bold text\");\n      expect(tooltip?.querySelector(\"i\")?.textContent).toBe(\"italic text\");\n    });\n\n    test(\"should not render HTML when tooltipRenderAsHtml is false\", async () => {\n      const tour = new Tour();\n\n      // Arrange & Act\n      tour.setOptions({\n        tooltipRenderAsHtml: false,\n        steps: [\n          {\n            intro: \"<b>Bold text</b> and <i>italic text</i>\",\n          },\n        ],\n      });\n\n      await tour.start();\n\n      // Assert\n      const tooltip = find(\".introjs-tooltiptext\");\n      expect(tooltip).not.toBeNull();\n      expect(tooltip?.innerHTML).toContain(\n        \"&lt;b&gt;Bold text&lt;/b&gt; and &lt;i&gt;italic text&lt;/i&gt;\"\n      );\n      expect(tooltip?.querySelector(\"b\")).toBeNull();\n      expect(tooltip?.querySelector(\"i\")).toBeNull();\n    });\n  });\n  test(\"should have no accessibility violations across all tour steps\", async () => {\n    const container = document.createElement(\"main\");\n    container.setAttribute(\"role\", \"main\");\n    document.body.appendChild(container);\n\n    const textEl = document.createElement(\"p\");\n    textEl.id = \"paragraph\";\n    textEl.textContent = \"This is a sample paragraph for the tour.\";\n\n    const imgEl = document.createElement(\"img\");\n    imgEl.id = \"sample-image\";\n    imgEl.src = \"https://via.placeholder.com/150\";\n    imgEl.alt = \"Sample placeholder image\";\n\n    const videoEl = document.createElement(\"video\");\n    videoEl.id = \"sample-video\";\n    videoEl.controls = true;\n    const source = document.createElement(\"source\");\n    source.src = \"https://www.w3schools.com/html/mov_bbb.mp4\";\n    source.type = \"video/mp4\";\n    videoEl.appendChild(source);\n\n    const linkEl = document.createElement(\"a\");\n    linkEl.id = \"sample-link\";\n    linkEl.href = \"#\";\n    linkEl.textContent = \"Learn more\";\n\n    container.appendChild(textEl);\n    container.appendChild(imgEl);\n    container.appendChild(videoEl);\n    container.appendChild(linkEl);\n\n    appendMockSteps(container);\n\n    const mockTour = getMockTour(container);\n    mockTour.setOptions({\n      steps: [\n        { element: \"#paragraph\", intro: \"Accessible text content\" },\n        { element: \"#sample-image\", intro: \"Accessible image with alt text\" },\n        { element: \"#sample-video\", intro: \"Accessible video with controls\" },\n        { element: \"#sample-link\", intro: \"Accessible link element\" },\n      ],\n    });\n\n    await mockTour.start();\n\n    for (let i = 0; i < mockTour.getSteps().length; i++) {\n      if (i < mockTour.getSteps().length - 1) {\n        const results = await axe(document.body);\n        expect(results).toHaveNoViolations();\n        await mockTour.nextStep();\n      }\n    }\n  });\n\n  describe(\"setCurrentStep\", () => {\n    test(\"should call beforeChange and proceed when callback returns true\", async () => {\n      const mockTour = getMockTour();\n      mockTour.setSteps(getMockSteps());\n\n      const fnBeforeChange = jest.fn().mockResolvedValue(true);\n      mockTour.onBeforeChange(fnBeforeChange);\n\n      // Act\n      await mockTour.setCurrentStep(1);\n\n      // Assert\n      expect(fnBeforeChange).toHaveBeenCalledTimes(1);\n      expect(mockTour.getCurrentStep()).toBe(1);\n    });\n\n    test(\"should allow backward step even if callback returns false\", async () => {\n      const mockTour = getMockTour();\n      mockTour.setSteps(getMockSteps());\n      mockTour.setCurrentStep(1);\n\n      const fnBeforeChange = jest.fn().mockResolvedValue(false);\n      mockTour.onBeforeChange(fnBeforeChange);\n\n      // Act\n      await mockTour.setCurrentStep(0);\n\n      // Assert\n      expect(fnBeforeChange).toHaveBeenCalledTimes(1);\n      expect(mockTour.getCurrentStep()).toBe(0);\n    });\n\n    test(\"should return early if target step does not exist\", async () => {\n      const mockTour = getMockTour();\n      mockTour.setSteps(getMockSteps());\n\n      // Act\n      const result = await mockTour.setCurrentStep(999);\n\n      // Assert\n      expect(result).toBe(mockTour);\n      expect(mockTour.getCurrentStep()).toBe(undefined);\n    });\n  });\n});\n"
  },
  {
    "path": "src/packages/tour/tour.ts",
    "content": "import { fetchSteps, nextStep, previousStep, TourStep } from \"./steps\";\nimport { Package } from \"../package\";\nimport {\n  introAfterChangeCallback,\n  introBeforeChangeCallback,\n  introBeforeExitCallback,\n  introChangeCallback,\n  introCompleteCallback,\n  introExitCallback,\n  introSkipCallback,\n  introStartCallback,\n} from \"./callback\";\nimport { getDefaultTourOptions, TourOptions } from \"./option\";\nimport { setOptions, setOption } from \"../../option\";\nimport { start } from \"./start\";\nimport exitIntro from \"./exitIntro\";\nimport isFunction from \"../../util/isFunction\";\nimport { getDontShowAgain, setDontShowAgain } from \"./dontShowAgain\";\nimport { getContainerElement } from \"../../util/containerElement\";\nimport DOMEvent from \"../../util/DOMEvent\";\nimport onKeyDown from \"./onKeyDown\";\nimport dom from \"../dom\";\nimport { TourRoot } from \"./components/TourRoot\";\nimport { FloatingElement } from \"./components/FloatingElement\";\n\n/**\n * Intro.js Tour class\n */\nexport class Tour implements Package<TourOptions> {\n  private _steps: TourStep[] = [];\n  private _currentStepSignal = dom.state<number | undefined>(undefined);\n  private _refreshesSignal = dom.state(0);\n  private _root: Element | undefined;\n  private _direction: \"forward\" | \"backward\";\n  private readonly _targetElement: HTMLElement;\n  private _options: TourOptions;\n  private _floatingElement: Element | undefined;\n\n  private readonly callbacks: {\n    beforeChange?: introBeforeChangeCallback;\n    change?: introChangeCallback;\n    afterChange?: introAfterChangeCallback;\n    complete?: introCompleteCallback;\n    start?: introStartCallback;\n    exit?: introExitCallback;\n    skip?: introSkipCallback;\n    beforeExit?: introBeforeExitCallback;\n  } = {};\n\n  // Event handlers\n  private _keyboardNavigationHandler?: (e: KeyboardEvent) => Promise<void>;\n  private _refreshOnResizeHandler?: (e: Event) => void;\n\n  /**\n   * Create a new Tour instance\n   * @param elementOrSelector Optional target element or CSS query to start the Tour on\n   * @param options Optional Tour options\n   */\n  public constructor(\n    elementOrSelector?: string | HTMLElement,\n    options?: Partial<TourOptions>\n  ) {\n    this._targetElement = getContainerElement(elementOrSelector);\n    this._options = options\n      ? setOptions(this._options, { ...getDefaultTourOptions(), ...options })\n      : getDefaultTourOptions();\n  }\n\n  /**\n   * Get a specific callback function\n   * @param callbackName callback name\n   */\n  callback<K extends keyof typeof this.callbacks>(\n    callbackName: K\n  ): (typeof this.callbacks)[K] | undefined {\n    const callback = this.callbacks[callbackName];\n    if (isFunction(callback)) {\n      return callback;\n    }\n    return undefined;\n  }\n\n  /**\n   * Go to a specific step of the tour\n   * @param step step number\n   */\n  async goToStep(step: number) {\n    // step - 2 because steps starts from zero index and nextStep() increments the step\n    this.setCurrentStep(step - 2);\n    await nextStep(this);\n    return this;\n  }\n\n  /**\n   * Go to a specific step of the tour with the explicit [data-step] number\n   * @param stepNumber [data-step] value of the step\n   */\n  async goToStepNumber(stepNumber: number) {\n    for (let i = 0; i < this._steps.length; i++) {\n      const item = this._steps[i];\n\n      if (item.step === stepNumber) {\n        // i - 1 because nextStep() increments the step\n        this.setCurrentStep(i - 1);\n        break;\n      }\n    }\n\n    await nextStep(this);\n\n    return this;\n  }\n\n  /**\n   * Add a step to the tour options.\n   * This method should be used in conjunction with the `start()` method.\n   * @param step step to add\n   */\n  addStep(step: Partial<TourStep>) {\n    if (!this._options.steps) {\n      this._options.steps = [];\n    }\n\n    this._options.steps.push(step);\n\n    return this;\n  }\n\n  /**\n   * Add multiple steps to the tour options.\n   * This method should be used in conjunction with the `start()` method.\n   * @param steps steps to add\n   */\n  addSteps(steps: Partial<TourStep>[]) {\n    if (!steps.length) return this;\n\n    for (const step of steps) {\n      this.addStep(step);\n    }\n\n    return this;\n  }\n\n  /**\n   * Set the steps of the tour\n   * @param steps steps to set\n   */\n  setSteps(steps: TourStep[]): this {\n    this._steps = steps;\n    return this;\n  }\n\n  /**\n   * Get all available steps of the tour\n   */\n  getSteps(): TourStep[] {\n    return this._steps;\n  }\n\n  /**\n   * Get a specific step of the tour\n   * @param {number} step step number\n   */\n  getStep(step: number): TourStep {\n    return this._steps[step];\n  }\n\n  /**\n   * Returns the underlying state of the current step\n   * This is an internal method and should not be used outside of the package.\n   */\n  getCurrentStepSignal() {\n    return this._currentStepSignal;\n  }\n\n  /**\n   * Returns the underlying state of the refreshes\n   * This is an internal method and should not be used outside of the package.\n   */\n  getRefreshesSignal() {\n    return this._refreshesSignal;\n  }\n\n  /**\n   * Get the current step of the tour\n   */\n  getCurrentStep(): number | undefined {\n    return this._currentStepSignal.val;\n  }\n\n  /**\n   * @deprecated `currentStep()` is deprecated, please use `getCurrentStep()` instead.\n   */\n  currentStep(): number | undefined {\n    return this._currentStepSignal.val;\n  }\n\n  resetCurrentStep() {\n    this._currentStepSignal.val = undefined;\n  }\n\n  /**\n   * Set the current step of the tour and the direction of the tour\n   * @param step\n   */\n  async setCurrentStep(step: number): Promise<this> {\n    const targetStep = this.getStep(step);\n    if (!targetStep) return this;\n\n    const currentStep = this._currentStepSignal.val;\n    const direction =\n      currentStep === undefined || step >= currentStep ? \"forward\" : \"backward\";\n\n    const continueStep = await this.callback(\"beforeChange\")?.call(\n      this,\n      targetStep.element as HTMLElement,\n      currentStep,\n      direction\n    );\n\n    if (\n      direction === \"forward\" &&\n      continueStep === false &&\n      currentStep !== undefined\n    ) {\n      return this;\n    }\n\n    this._direction = direction;\n    this._currentStepSignal.val = step;\n    return this;\n  }\n\n  /**\n   * Increment the current step of the tour (does not start the tour step, must be called in conjunction with `nextStep`)\n   */\n  async incrementCurrentStep(): Promise<this> {\n    const currentStep = this.getCurrentStep();\n    if (currentStep === undefined) {\n      await this.setCurrentStep(0);\n    } else {\n      await this.setCurrentStep(currentStep + 1);\n    }\n\n    return this;\n  }\n\n  /**\n   * Decrement the current step of the tour (does not start the tour step, must be in conjunction with `previousStep`)\n   */\n  async decrementCurrentStep(): Promise<this> {\n    const currentStep = this.getCurrentStep();\n    if (currentStep !== undefined && currentStep > 0) {\n      await this.setCurrentStep(currentStep - 1);\n    }\n\n    return this;\n  }\n\n  /**\n   * Get the direction of the tour (forward or backward)\n   */\n  getDirection() {\n    return this._direction;\n  }\n\n  /**\n   * Go to the next step of the tour\n   */\n  async nextStep() {\n    await nextStep(this);\n    return this;\n  }\n\n  /**\n   * Go to the previous step of the tour\n   */\n  async previousStep() {\n    await previousStep(this);\n    return this;\n  }\n\n  /**\n   * Check if the current step is the last step\n   */\n  isEnd(): boolean {\n    const currentStep = this.getCurrentStep();\n    return currentStep !== undefined && currentStep >= this._steps.length;\n  }\n\n  /**\n   * Check if the current step is the last step of the tour\n   */\n  isLastStep(): boolean {\n    return this.getCurrentStep() === this._steps.length - 1;\n  }\n\n  /**\n   * Get the target element of the tour\n   */\n  getTargetElement(): HTMLElement {\n    return this._targetElement;\n  }\n\n  /**\n   * Set the options for the tour\n   * @param partialOptions key/value pair of options\n   */\n  setOptions(partialOptions: Partial<TourOptions>): this {\n    this._options = setOptions(this._options, partialOptions);\n    return this;\n  }\n\n  /**\n   * Set a specific option for the tour\n   * @param key option key\n   * @param value option value\n   */\n  setOption<K extends keyof TourOptions>(key: K, value: TourOptions[K]): this {\n    this._options = setOption(this._options, key, value);\n    return this;\n  }\n\n  /**\n   * Get a specific option for the tour\n   * @param key option key\n   */\n  getOption<K extends keyof TourOptions>(key: K): TourOptions[K] {\n    return this._options[key];\n  }\n\n  /**\n   * Clone the current tour instance\n   */\n  clone(): ThisType<this> {\n    return new Tour(this._targetElement, this._options);\n  }\n\n  /**\n   * Returns true if the tour instance is active\n   */\n  isActive(): boolean {\n    if (\n      this.getOption(\"dontShowAgain\") &&\n      getDontShowAgain(this.getOption(\"dontShowAgainCookie\"))\n    ) {\n      return false;\n    }\n\n    return this.getOption(\"isActive\");\n  }\n\n  /**\n   * Returns true if the tour has started\n   */\n  hasStarted(): boolean {\n    return this.getCurrentStep() !== undefined;\n  }\n\n  /**\n   * Set the `dontShowAgain` option for the tour so that the tour does not show twice to the same user\n   * This is a persistent option that is stored in the browser's cookies\n   *\n   * @param dontShowAgain boolean value to set the `dontShowAgain` option\n   */\n  setDontShowAgain(dontShowAgain: boolean) {\n    setDontShowAgain(\n      dontShowAgain,\n      this.getOption(\"dontShowAgainCookie\"),\n      this.getOption(\"dontShowAgainCookieDays\")\n    );\n    return this;\n  }\n\n  /**\n   * Enable keyboard navigation for the tour\n   */\n  enableKeyboardNavigation() {\n    if (this.getOption(\"keyboardNavigation\")) {\n      this._keyboardNavigationHandler = (e: KeyboardEvent) =>\n        onKeyDown(this, e);\n      DOMEvent.on(window, \"keydown\", this._keyboardNavigationHandler, true);\n    }\n\n    return this;\n  }\n\n  /**\n   * Disable keyboard navigation for the tour\n   */\n  disableKeyboardNavigation() {\n    if (this._keyboardNavigationHandler) {\n      DOMEvent.off(window, \"keydown\", this._keyboardNavigationHandler, true);\n      this._keyboardNavigationHandler = undefined;\n    }\n\n    return this;\n  }\n\n  /**\n   * Enable refresh on window resize for the tour\n   */\n  enableRefreshOnResize() {\n    this._refreshOnResizeHandler = (_: Event) => this.refresh();\n    DOMEvent.on(window, \"resize\", this._refreshOnResizeHandler, true);\n  }\n\n  /**\n   * Disable refresh on window resize for the tour\n   */\n  disableRefreshOnResize() {\n    if (this._refreshOnResizeHandler) {\n      DOMEvent.off(window, \"resize\", this._refreshOnResizeHandler, true);\n      this._refreshOnResizeHandler = undefined;\n    }\n  }\n\n  /**\n   * Append the floating element to the target element.\n   * Floating element is a helper element that is used when the step does not have a target element.\n   * For internal use only.\n   */\n  appendFloatingElement() {\n    if (!this._floatingElement) {\n      this._floatingElement = FloatingElement({\n        currentStep: this.getCurrentStepSignal(),\n      });\n\n      // only add the floating element once per tour instance\n      dom.add(this.getTargetElement(), this._floatingElement);\n    }\n\n    return this._floatingElement;\n  }\n\n  /**\n   * Create the root element for the tour\n   */\n  private createRoot() {\n    if (!this._root) {\n      this._root = TourRoot({ tour: this });\n      dom.add(this.getTargetElement(), this._root);\n    }\n  }\n\n  /**\n   * Deletes the root element and recreates it\n   */\n  private recreateRoot() {\n    if (this._root) {\n      this._root.remove();\n      this._root = undefined;\n      this.createRoot();\n    }\n  }\n\n  /**\n   * Starts the tour and shows the first step\n   */\n  async start() {\n    if (await start(this)) {\n      this.createRoot();\n      this.enableKeyboardNavigation();\n      this.enableRefreshOnResize();\n    }\n\n    return this;\n  }\n\n  /**\n   * Exit the tour\n   * @param {boolean} force whether to force exit the tour\n   */\n  async exit(force?: boolean) {\n    if (await exitIntro(this, force ?? false)) {\n      this.disableKeyboardNavigation();\n      this.disableRefreshOnResize();\n    }\n\n    return this;\n  }\n\n  /**\n   * Refresh the tour\n   * @param {boolean} refreshSteps whether to refresh the tour steps\n   */\n  refresh(refreshSteps?: boolean) {\n    const currentStep = this.getCurrentStep();\n\n    if (currentStep === undefined) {\n      return this;\n    }\n\n    if (this._refreshesSignal.val !== undefined) {\n      this._refreshesSignal.val += 1;\n    }\n\n    // fetch new steps and recreate the root element\n    if (refreshSteps) {\n      this.setSteps(fetchSteps(this));\n      this.recreateRoot();\n    }\n\n    return this;\n  }\n\n  /**\n   * @deprecated onbeforechange is deprecated, please use onBeforeChange instead.\n   */\n  onbeforechange(callback: introBeforeChangeCallback) {\n    return this.onBeforeChange(callback);\n  }\n\n  /**\n   * Add a callback to be called before the tour changes steps\n   * @param {Function} callback callback function to be called\n   */\n  onBeforeChange(callback: introBeforeChangeCallback) {\n    if (!isFunction(callback)) {\n      throw new Error(\n        \"Provided callback for onBeforeChange was not a function\"\n      );\n    }\n\n    this.callbacks.beforeChange = callback;\n    return this;\n  }\n\n  /**\n   * @deprecated onchange is deprecated, please use onChange instead.\n   */\n  onchange(callback: introChangeCallback) {\n    this.onChange(callback);\n  }\n\n  /**\n   * Add a callback to be called when the tour changes steps\n   * @param {Function} callback callback function to be called\n   */\n  onChange(callback: introChangeCallback) {\n    if (!isFunction(callback)) {\n      throw new Error(\"Provided callback for onChange was not a function.\");\n    }\n\n    this.callbacks.change = callback;\n    return this;\n  }\n\n  /**\n   * @deprecated onafterchange is deprecated, please use onAfterChange instead.\n   */\n  onafterchange(callback: introAfterChangeCallback) {\n    this.onAfterChange(callback);\n  }\n\n  /**\n   * Add a callback to be called after the tour changes steps\n   * @param {Function} callback callback function to be called\n   */\n  onAfterChange(callback: introAfterChangeCallback) {\n    if (!isFunction(callback)) {\n      throw new Error(\"Provided callback for onAfterChange was not a function\");\n    }\n\n    this.callbacks.afterChange = callback;\n    return this;\n  }\n\n  /**\n   * @deprecated oncomplete is deprecated, please use onComplete instead.\n   */\n  oncomplete(callback: introCompleteCallback) {\n    return this.onComplete(callback);\n  }\n\n  /**\n   * Add a callback to be called when the tour is completed\n   * @param {Function} callback callback function to be called\n   */\n  onComplete(callback: introCompleteCallback) {\n    if (!isFunction(callback)) {\n      throw new Error(\"Provided callback for oncomplete was not a function.\");\n    }\n\n    this.callbacks.complete = callback;\n    return this;\n  }\n\n  /**\n   * @deprecated onstart is deprecated, please use onStart instead.\n   */\n  onstart(callback: introStartCallback) {\n    return this.onStart(callback);\n  }\n\n  /**\n   * Add a callback to be called when the tour is started\n   * @param {Function} callback callback function to be called\n   */\n  onStart(callback: introStartCallback) {\n    if (!isFunction(callback)) {\n      throw new Error(\"Provided callback for onstart was not a function.\");\n    }\n\n    this.callbacks.start = callback;\n    return this;\n  }\n\n  /**\n   * @deprecated onexit is deprecated, please use onExit instead.\n   */\n  onexit(callback: introExitCallback) {\n    return this.onExit(callback);\n  }\n\n  /**\n   * Add a callback to be called when the tour is exited\n   * @param {Function} callback callback function to be called\n   */\n  onExit(callback: introExitCallback) {\n    if (!isFunction(callback)) {\n      throw new Error(\"Provided callback for onexit was not a function.\");\n    }\n\n    this.callbacks.exit = callback;\n    return this;\n  }\n\n  /**\n   * @deprecated onskip is deprecated, please use onSkip instead.\n   */\n  onskip(callback: introSkipCallback) {\n    return this.onSkip(callback);\n  }\n\n  /**\n   * Add a callback to be called when the tour is skipped\n   * @param {Function} callback callback function to be called\n   */\n  onSkip(callback: introSkipCallback) {\n    if (!isFunction(callback)) {\n      throw new Error(\"Provided callback for onskip was not a function.\");\n    }\n\n    this.callbacks.skip = callback;\n    return this;\n  }\n\n  /**\n   * @deprecated onbeforeexit is deprecated, please use onBeforeExit instead.\n   */\n  onbeforeexit(callback: introBeforeExitCallback) {\n    return this.onBeforeExit(callback);\n  }\n\n  /**\n   * Add a callback to be called before the tour is exited\n   * @param {Function} callback callback function to be called\n   */\n  onBeforeExit(callback: introBeforeExitCallback) {\n    if (!isFunction(callback)) {\n      throw new Error(\"Provided callback for onbeforeexit was not a function.\");\n    }\n\n    this.callbacks.beforeExit = callback;\n    return this;\n  }\n}\n"
  },
  {
    "path": "src/styles/introjs-rtl.scss",
    "content": ".introjs-tooltipbuttons {\n  text-align: left;\n}\n\n.introjs-skipbutton {\n  left: 0;\n  right: auto;\n}\n\n.introjs-tooltip {\n  direction: rtl;\n}\n\n.introjs-prevbutton {\n  float: right;\n}\n\n.introjs-nextbutton {\n  float: left;\n}\n\n.introjs-bullets {\n  ul {\n    li {\n      float: right;\n    }\n  }\n}\n"
  },
  {
    "path": "src/styles/introjs.scss",
    "content": "$black900: #212121;\n$black800: #424242;\n$black600: #616161;\n$black500: #9e9e9e;\n$black400: #bdbdbd;\n$black300: #e0e0e0;\n$black200: #eeeeee;\n$black100: #f4f4f4;\n$white: #ffffff;\n\n$font_family: \"Helvetica Neue\", Inter, ui-sans-serif, \"Apple Color Emoji\",\n  Helvetica, Arial, sans-serif;\n$background_color_9: #08c;\n$background_color_10: rgba(136, 136, 136, 0.24);\n\n.introjs-tour {\n  transition: all 0.3s ease-out;\n}\n\n.introjs-overlay {\n  position: absolute;\n  box-sizing: content-box;\n  z-index: 999999;\n  opacity: 0;\n  transition: all 0.3s ease-out;\n}\n\n.introjs-showElement {\n  z-index: 9999999 !important;\n}\n\ntr.introjs-showElement {\n  > td {\n    z-index: 9999999 !important;\n    position: relative;\n  }\n\n  > th {\n    z-index: 9999999 !important;\n    position: relative;\n  }\n}\n\n.introjs-disableInteraction {\n  z-index: 99999999 !important;\n  position: absolute;\n  background-color: $white;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.introjs-relativePosition {\n  position: relative;\n}\n\n.introjs-helperLayer {\n  box-sizing: content-box;\n  position: absolute;\n  z-index: 9999998;\n  border-radius: 4px;\n  transition: all 0.3s ease-out;\n\n  * {\n    box-sizing: content-box;\n\n    &:before {\n      box-sizing: content-box;\n    }\n\n    &:after {\n      box-sizing: content-box;\n    }\n  }\n}\n\n.introjs-tooltipReferenceLayer {\n  font-family: $font_family;\n  box-sizing: content-box;\n  position: absolute;\n  visibility: hidden;\n  z-index: 100000000;\n  background-color: transparent;\n  transition: all 0.3s ease-out;\n\n  * {\n    font-family: $font_family;\n  }\n}\n\n.introjs-helperNumberLayer {\n  font-family: $font_family;\n  color: $black500;\n  text-align: center;\n  padding-top: 10px;\n  padding-bottom: 10px;\n}\n\n.introjs-arrow {\n  border: 5px solid transparent;\n  content: \"\";\n  position: absolute;\n}\n\n.introjs-arrow.top {\n  top: -10px;\n  left: 10px;\n  border-bottom-color: $white;\n}\n\n.introjs-arrow.top-right {\n  top: -10px;\n  right: 10px;\n  border-bottom-color: $white;\n}\n\n.introjs-arrow.top-middle {\n  top: -10px;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: $white;\n}\n\n.introjs-arrow.right {\n  right: -10px;\n  top: 10px;\n  border-left-color: $white;\n}\n\n.introjs-arrow.right-bottom {\n  bottom: 10px;\n  right: -10px;\n  border-left-color: $white;\n}\n\n.introjs-arrow.bottom {\n  bottom: -10px;\n  left: 10px;\n  border-top-color: $white;\n}\n\n.introjs-arrow.bottom-right {\n  bottom: -10px;\n  right: 10px;\n  border-top-color: $white;\n}\n\n.introjs-arrow.bottom-middle {\n  bottom: -10px;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: $white;\n}\n\n.introjs-arrow.left {\n  left: -10px;\n  top: 10px;\n  border-right-color: $white;\n}\n\n.introjs-arrow.left-bottom {\n  left: -10px;\n  bottom: 10px;\n  border-right-color: $white;\n}\n\n.introjs-tooltip {\n  box-sizing: content-box;\n  position: absolute;\n  visibility: visible;\n  background-color: $white;\n  min-width: 250px;\n  max-width: 300px;\n  border-radius: 5px;\n  box-shadow: 0 3px 30px rgba($black900, 0.3);\n  transition: opacity 0.1s ease-out;\n}\n\n.introjs-tooltiptext {\n  padding: 20px;\n}\n\n.introjs-dontShowAgain {\n  padding-left: 20px;\n  padding-right: 20px;\n}\n\n.introjs-dontShowAgain input {\n  padding: 0;\n  margin: 0;\n  margin-bottom: 2px;\n  display: inline;\n  width: 10px;\n  height: 10px;\n}\n\n.introjs-dontShowAgain label {\n  font-size: 14px;\n  display: inline-block;\n  font-weight: normal;\n  margin: 0 0 0 5px;\n  padding: 0;\n  background-color: $white;\n  color: $black600;\n  user-select: none;\n}\n\n.introjs-tooltip-title {\n  font-size: 18px;\n  width: 90%;\n  min-height: 1.5em;\n  margin: 0;\n  padding: 0;\n  font-weight: 700;\n  line-height: 1.5;\n}\n\n.introjs-tooltip-header {\n  position: relative;\n  padding-left: 20px;\n  padding-right: 20px;\n  padding-top: 10px;\n  min-height: 1.5em;\n}\n\n.introjs-tooltipbuttons {\n  border-top: 1px solid $black300;\n  padding: 10px;\n  text-align: right;\n  white-space: nowrap;\n\n  &:after {\n    content: \"\";\n    visibility: hidden;\n    display: block;\n    height: 0;\n    clear: both;\n  }\n}\n\n.introjs-button {\n  box-sizing: content-box;\n  position: relative;\n  overflow: visible;\n\n  padding: 0.5rem 1rem;\n\n  border: 1px solid $black400;\n  text-decoration: none;\n  text-shadow: 1px 1px 0 $white;\n  font-size: 14px;\n  color: $black800;\n  white-space: nowrap;\n  cursor: pointer;\n  outline: none;\n  background-color: $black100;\n  border-radius: 0.2em;\n  zoom: 1;\n  display: inline;\n\n  &:hover {\n    outline: none;\n    text-decoration: none;\n    border-color: $black500;\n    background-color: $black300;\n    color: $black900;\n  }\n\n  &:focus {\n    outline: none;\n    text-decoration: none;\n    background-color: $black200;\n    box-shadow: 0 0 0 0.2rem rgba($black500, 0.5);\n    border: 1px solid $black600;\n    color: $black900;\n  }\n\n  &:active {\n    outline: none;\n    text-decoration: none;\n    background-color: $black300;\n    border-color: $black500;\n    color: $black900;\n  }\n\n  &::-moz-focus-inner {\n    padding: 0;\n    border: 0;\n  }\n}\n\n.introjs-skipbutton {\n  position: absolute;\n  top: 0;\n  right: 0;\n\n  display: inline-block;\n  width: 45px;\n  height: 45px;\n  line-height: 45px;\n\n  color: $black600;\n  font-size: 22px;\n  cursor: pointer;\n  font-weight: bold;\n  text-align: center;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: $black900;\n    outline: none;\n    text-decoration: none;\n  }\n}\n\n.introjs-prevbutton {\n  float: left;\n}\n\n.introjs-nextbutton {\n  float: right;\n}\n\n.introjs-disabled {\n  color: $black500;\n  border-color: $black400;\n  box-shadow: none;\n  cursor: default;\n  background-color: $black100;\n  background-image: none;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: $black500;\n    border-color: $black400;\n    box-shadow: none;\n    cursor: default;\n    background-color: $black100;\n    background-image: none;\n    text-decoration: none;\n  }\n}\n\n.introjs-hidden {\n  display: none;\n}\n\n.introjs-bullets {\n  text-align: center;\n  padding-top: 10px;\n  padding-bottom: 10px;\n\n  ul {\n    box-sizing: content-box;\n    clear: both;\n    margin: 0 auto 0;\n    padding: 0;\n    display: inline-block;\n\n    li {\n      box-sizing: content-box;\n      list-style: none;\n      float: left;\n      margin: 0 2px;\n\n      a {\n        transition: width 0.1s ease-in;\n        box-sizing: content-box;\n        display: block;\n        width: 6px;\n        height: 6px;\n        background: #ccc;\n        border-radius: 10px;\n        text-decoration: none;\n        cursor: pointer;\n\n        &:hover,\n        &:focus {\n          width: 15px;\n          background: #999;\n          text-decoration: none;\n          outline: none;\n        }\n      }\n\n      a.active {\n        width: 15px;\n        background: #999;\n      }\n    }\n  }\n}\n\n.introjs-progress {\n  box-sizing: content-box;\n  overflow: hidden;\n  height: 10px;\n  margin: 10px;\n  border-radius: 4px;\n  background-color: $black300;\n}\n\n.introjs-progressbar {\n  box-sizing: content-box;\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 10px;\n  line-height: 10px;\n  text-align: center;\n  background-color: $background_color_9;\n}\n\n.introjsFloatingElement {\n  position: absolute;\n  height: 0;\n  width: 0;\n  left: 50%;\n  top: 50%;\n}\n\n.introjs-fixedTooltip {\n  position: fixed;\n}\n\n.introjs-hint {\n  box-sizing: content-box;\n  position: absolute;\n  background: transparent;\n  width: 20px;\n  height: 15px;\n  cursor: pointer;\n\n  &:focus {\n    border: 0;\n    outline: 0;\n  }\n\n  &:hover {\n    > .introjs-hint-pulse {\n      background-color: rgba(60, 60, 60, 0.57);\n    }\n  }\n}\n\n.introjs-hidehint {\n  display: none;\n}\n\n.introjs-fixedhint {\n  position: fixed;\n}\n\n@keyframes introjspulse {\n  0% {\n    transform: scale(0.95);\n    box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.7);\n  }\n\n  70% {\n    transform: scale(1);\n    box-shadow: 0 0 0 10px rgba(0, 0, 0, 0);\n  }\n\n  100% {\n    transform: scale(0.95);\n    box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);\n  }\n}\n\n.introjs-hint-pulse {\n  box-sizing: content-box;\n  width: 15px;\n  height: 15px;\n  border-radius: 30px;\n  background-color: $background_color_10;\n  z-index: 10;\n  position: absolute;\n  transition: all 0.2s ease-out;\n  animation: introjspulse 2s infinite;\n}\n\n.introjs-hint-no-anim {\n  .introjs-hint-pulse {\n    animation: none;\n  }\n}\n\n.introjs-hint-dot {\n  box-sizing: content-box;\n  background: transparent;\n  border-radius: 60px;\n  height: 50px;\n  width: 50px;\n  position: absolute;\n  top: -18px;\n  left: -18px;\n  z-index: 1;\n  opacity: 0;\n}\n"
  },
  {
    "path": "src/util/DOMEvent.ts",
    "content": "/**\n * DOMEvent Handles all DOM events\n *\n * methods:\n *\n * on - add event handler\n * off - remove event\n */\n\ninterface Events {\n  keydown: KeyboardEvent;\n  resize: Event;\n  scroll: Event;\n  click: MouseEvent;\n}\n\ntype Listener<T> = (e: T) => void | undefined | string | Promise<string | void>;\n\nclass DOMEvent {\n  /**\n   * Adds event listener\n   */\n  public on<T extends keyof Events>(\n    obj: EventTarget,\n    type: T,\n    listener: Listener<Events[T]>,\n    useCapture: boolean\n  ) {\n    if (\"addEventListener\" in obj) {\n      obj.addEventListener(type, listener, useCapture);\n    } else if (\"attachEvent\" in obj) {\n      (obj as any).attachEvent(`on${type}`, listener);\n    }\n  }\n\n  /**\n   * Removes event listener\n   */\n  public off<T extends keyof Events>(\n    obj: EventTarget,\n    type: T,\n    listener: Listener<Events[T]>,\n    useCapture: boolean\n  ) {\n    if (\"removeEventListener\" in obj) {\n      obj.removeEventListener(type, listener, useCapture);\n    } else if (\"detachEvent\" in obj) {\n      (obj as any).detachEvent(`on${type}`, listener);\n    }\n  }\n}\n\nexport default new DOMEvent();\n"
  },
  {
    "path": "src/util/className.ts",
    "content": "/**\n * Append CSS classes to an element\n * @api private\n */\nexport const addClass = (\n  element: HTMLElement | SVGElement,\n  ...classNames: string[]\n) => {\n  for (const className of classNames) {\n    if (element instanceof SVGElement) {\n      // svg\n      const pre = element.getAttribute(\"class\") || \"\";\n\n      if (!pre.match(className)) {\n        // check if element doesn't already have className\n        setClass(element, pre, className);\n      }\n    } else {\n      if (element.classList !== undefined) {\n        // check for modern classList property\n        element.classList.add(className);\n      } else if (!element.className.match(className)) {\n        // check if element doesn't already have className\n        setClass(element, element.className, className);\n      }\n    }\n  }\n};\n\n/**\n * Set CSS classes to an element\n * @param element element to set class\n * @param classNames list of class names\n */\nexport const setClass = (\n  element: HTMLElement | SVGElement,\n  ...classNames: string[]\n) => {\n  const className = classNames.filter(Boolean).join(\" \");\n\n  if (element instanceof SVGElement) {\n    element.setAttribute(\"class\", className);\n  } else {\n    if (element.classList !== undefined) {\n      element.classList.value = className;\n    } else {\n      element.className = className;\n    }\n  }\n};\n\n/**\n * Remove a class from an element\n *\n * @api private\n */\nexport const removeClass = (\n  element: HTMLElement | SVGElement,\n  classNameRegex: RegExp | string\n) => {\n  if (element instanceof SVGElement) {\n    const pre = element.getAttribute(\"class\") || \"\";\n\n    element.setAttribute(\n      \"class\",\n      pre.replace(classNameRegex, \"\").replace(/\\s\\s+/g, \" \").trim()\n    );\n  } else {\n    element.className = element.className\n      .replace(classNameRegex, \"\")\n      .replace(/\\s\\s+/g, \" \")\n      .trim();\n  }\n};\n"
  },
  {
    "path": "src/util/cloneObject.ts",
    "content": "/**\n * Makes a copy of an object\n * @api private\n */\nexport default function cloneObject<T>(source: T): T {\n  if (source === null || typeof source !== \"object\" || \"nodeType\" in source) {\n    return source;\n  }\n\n  const temp = {} as T;\n\n  for (const key in source) {\n    if (\n      \"jQuery\" in window &&\n      window.jQuery &&\n      source[key] instanceof (window.jQuery as any)\n    ) {\n      temp[key] = source[key];\n    } else {\n      temp[key] = cloneObject(source[key]);\n    }\n  }\n  return temp;\n}\n"
  },
  {
    "path": "src/util/clssName.test.ts",
    "content": "import { removeClass, addClass, setClass } from \"./className\";\n\ndescribe(\"className\", () => {\n  describe(\"setClass\", () => {\n    it(\"should set class name to an element\", () => {\n      const el = document.createElement(\"div\");\n      el.className = \"firstClass\";\n\n      setClass(el, \"secondClass\");\n\n      expect(el.className).toBe(\"secondClass\");\n    });\n\n    it(\"should set class name to an SVG element\", () => {\n      const el = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n      el.setAttribute(\"class\", \"firstClass\");\n\n      setClass(el, \"secondClass\");\n\n      expect(el.getAttribute(\"class\")).toBe(\"secondClass\");\n    });\n  });\n\n  describe(\"addClass\", () => {\n    test(\"should append when className is empty\", () => {\n      const el = document.createElement(\"div\");\n      addClass(el, \"myClass\");\n      expect(el.className).toBe(\"myClass\");\n    });\n\n    test(\"should append when className is NOT empty\", () => {\n      const el = document.createElement(\"div\");\n      el.className = \"firstClass\";\n\n      addClass(el, \"secondClass\");\n\n      expect(el.className).toBe(\"firstClass secondClass\");\n    });\n\n    test(\"should not append duplicate classNames to elements\", () => {\n      const el = document.createElement(\"div\");\n      el.className = \"firstClass\";\n\n      addClass(el, \"firstClass\");\n\n      expect(el.className).toBe(\"firstClass\");\n    });\n\n    test(\"should not append duplicate list of classNames to elements\", () => {\n      const el = document.createElement(\"div\");\n      el.className = \"firstClass firstClass\";\n\n      addClass(el, \"firstClass\", \"firstClass\", \"firstClass\");\n\n      expect(el.className).toBe(\"firstClass\");\n    });\n\n    test(\"should not append duplicate list of classNames to an empty className\", () => {\n      const el = document.createElement(\"div\");\n\n      addClass(el, \"firstClass\", \"firstClass\", \"firstClass\");\n\n      expect(el.className).toBe(\"firstClass\");\n    });\n\n    test(\"should append lassNames to an SVG\", () => {\n      const el = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n      el.setAttribute(\"class\", \"firstClass\");\n\n      addClass(el, \"secondClass\", \"thirdClass\");\n\n      expect(el.getAttribute(\"class\")).toBe(\n        \"firstClass secondClass thirdClass\"\n      );\n    });\n\n    test(\"should not append duplicate list of classNames to an empty className of SVG\", () => {\n      const el = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n      el.setAttribute(\"class\", \"firstClass\");\n\n      addClass(el, \"firstClass\", \"firstClass\", \"firstClass\");\n\n      expect(el.getAttribute(\"class\")).toBe(\"firstClass\");\n    });\n  });\n\n  describe(\"removeClass\", () => {\n    it(\"should do nothing when the class name is not found\", () => {\n      // Arrange\n      const el = document.createElement(\"div\");\n      el.className = \"firstClass\";\n\n      // Act\n      removeClass(el, \"secondClass\");\n\n      // Assert\n      expect(el.className).toBe(\"firstClass\");\n    });\n\n    it(\"should remove middle class name from an element\", () => {\n      // Arrange\n      const el = document.createElement(\"div\");\n      el.className = \"firstClass secondClass thirdClass\";\n\n      // Act\n      removeClass(el, \"secondClass\");\n\n      // Assert\n      expect(el.className).toBe(\"firstClass thirdClass\");\n    });\n\n    it(\"should remove the first class name from an element\", () => {\n      // Arrange\n      const el = document.createElement(\"div\");\n      el.className = \"firstClass secondClass thirdClass\";\n\n      // Act\n      removeClass(el, \"firstClass\");\n\n      // Assert\n      expect(el.className).toBe(\"secondClass thirdClass\");\n    });\n\n    it(\"should remove the last class name from an element\", () => {\n      // Arrange\n      const el = document.createElement(\"div\");\n      el.className = \"firstClass secondClass thirdClass\";\n\n      // Act\n      removeClass(el, \"thirdClass\");\n\n      // Assert\n      expect(el.className).toBe(\"firstClass secondClass\");\n    });\n\n    it(\"should remove the only class name from an element\", () => {\n      // Arrange\n      const el = document.createElement(\"div\");\n      el.className = \"secondClass\";\n\n      // Act\n      removeClass(el, \"secondClass\");\n\n      // Assert\n      expect(el.className).toBe(\"\");\n    });\n\n    it(\"should remove the first class name from an SVG element\", () => {\n      // Arrange\n      const el = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n      el.setAttribute(\"class\", \"firstClass secondClass thirdClass\");\n\n      // Act\n      removeClass(el, \"firstClass\");\n\n      // Assert\n      expect(el.getAttribute(\"class\")).toBe(\"secondClass thirdClass\");\n    });\n\n    it(\"should remove middle class name from an SVG element\", () => {\n      // Arrange\n      const el = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n      el.setAttribute(\"class\", \"firstClass secondClass thirdClass\");\n\n      // Act\n      removeClass(el, \"secondClass\");\n\n      // Assert\n      expect(el.getAttribute(\"class\")).toBe(\"firstClass thirdClass\");\n    });\n\n    it(\"should remove the last class name from an SVG element\", () => {\n      // Arrange\n      const el = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n      el.setAttribute(\"class\", \"firstClass secondClass\");\n\n      // Act\n      removeClass(el, \"secondClass\");\n\n      // Assert\n      expect(el.getAttribute(\"class\")).toBe(\"firstClass\");\n    });\n\n    it(\"should remove the only class name from an SVG element\", () => {\n      // Arrange\n      const el = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n      el.setAttribute(\"class\", \"secondClass\");\n\n      // Act\n      removeClass(el, \"secondClass\");\n\n      // Assert\n      expect(el.getAttribute(\"class\")).toBe(\"\");\n    });\n  });\n});\n"
  },
  {
    "path": "src/util/containerElement.test.ts",
    "content": "import { getContainerElement } from \"./containerElement\";\nimport * as queryElement from \"./queryElement\";\n\ndescribe(\"containerElement\", () => {\n  afterEach(() => {\n    jest.restoreAllMocks();\n  });\n\n  describe(\"getContainerElement\", () => {\n    it(\"should return document.body when arg is undefined\", () => {\n      // Arrange, Act\n      const container = getContainerElement(undefined);\n\n      // Assert\n      expect(container).toBe(document.body);\n    });\n\n    it(\"should return HTMLElement when arg is an element\", () => {\n      // Arrange\n      const stubElement = document.createElement(\"div\");\n\n      // Act\n      const container = getContainerElement(stubElement);\n\n      // Assert\n      expect(container).toBe(stubElement);\n    });\n\n    it(\"should query element when arg is a string\", () => {\n      // Arrange\n      const stubElement = document.createElement(\"div\");\n      jest.spyOn(queryElement, \"getElement\").mockReturnValue(stubElement);\n\n      // Act\n      const container = getContainerElement(\"div\");\n\n      // Assert\n      expect(container).toBe(stubElement);\n    });\n\n    it(\"should throw exception when selector is not found\", () => {\n      // Arrange\n      jest.spyOn(queryElement, \"queryElement\").mockReturnValue(null);\n\n      // Act, Assert\n      expect(() => getContainerElement(\"div\")).toThrow();\n    });\n  });\n});\n"
  },
  {
    "path": "src/util/containerElement.ts",
    "content": "import { getElement } from \"./queryElement\";\n\n/**\n * Given an element or a selector, tries to find the appropriate container element.\n */\nexport const getContainerElement = (\n  elementOrSelector?: string | HTMLElement\n) => {\n  if (!elementOrSelector) {\n    return document.body;\n  }\n\n  if (typeof elementOrSelector === \"string\") {\n    return getElement(elementOrSelector);\n  }\n\n  return elementOrSelector;\n};\n"
  },
  {
    "path": "src/util/cookie.test.ts",
    "content": "import { getAllCookies, getCookie, setCookie, deleteCookie } from \"./cookie\";\n\ndescribe(\"cookie\", () => {\n  let _cookie = \"\";\n\n  beforeAll(() => {\n    Object.defineProperty(window.document, \"cookie\", {\n      get: () => _cookie,\n      set: (v) => (_cookie = v),\n    });\n  });\n\n  beforeEach(() => {\n    _cookie = \"hello=world;abc=bar\";\n  });\n\n  test(\"should return undefined when cookie doesnt exist\", () => {\n    expect(getCookie(\"doesntExist\")).toBe(undefined);\n  });\n\n  test(\"should return the cookie name\", () => {\n    expect(getCookie(\"abc\")).toBe(\"bar\");\n  });\n\n  test(\"should return all cookies\", () => {\n    expect(getAllCookies()).toEqual({\n      abc: \"bar\",\n      hello: \"world\",\n    });\n  });\n\n  test(\"should set cookie\", () => {\n    setCookie(\"new\", \"foo\");\n    expect(getCookie(\"new\")).toEqual(\"foo\");\n  });\n\n  test(\"should delete cookie\", () => {\n    expect(getCookie(\"hello\")).toEqual(\"world\");\n    deleteCookie(\"hello\");\n    expect(getCookie(\"hello\")).toEqual(\"\");\n  });\n});\n"
  },
  {
    "path": "src/util/cookie.ts",
    "content": "export function setCookie(name: string, value: string, days?: number) {\n  const cookie: {\n    [name: string]: string | undefined;\n    path: string;\n    expires: string | undefined;\n  } = { [name]: value, path: \"/\", expires: undefined };\n\n  if (days) {\n    let date = new Date();\n    date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n    cookie.expires = date.toUTCString();\n  }\n\n  let arr = [];\n  for (let key in cookie) {\n    arr.push(`${key}=${cookie[key]}`);\n  }\n\n  document.cookie = arr.join(\"; \");\n\n  return getCookie(name);\n}\n\nexport function getAllCookies() {\n  let cookie: { [name: string]: string } = {};\n\n  document.cookie.split(\";\").forEach((el) => {\n    let [k, v] = el.split(\"=\");\n    cookie[k.trim()] = v;\n  });\n\n  return cookie;\n}\n\nexport function getCookie(name: string) {\n  return getAllCookies()[name];\n}\n\nexport function deleteCookie(name: string) {\n  setCookie(name, \"\", -1);\n}\n"
  },
  {
    "path": "src/util/debounce.ts",
    "content": "export default function debounce(\n  func: Function,\n  timeout: number\n): (...args: any) => void {\n  let timer: number;\n\n  return (...args) => {\n    window.clearTimeout(timer);\n\n    timer = window.setTimeout(() => {\n      func(args);\n    }, timeout);\n  };\n}\n"
  },
  {
    "path": "src/util/elementInViewport.test.ts",
    "content": "import dom from \"../packages/dom\";\nimport elementInViewport from \"./elementInViewport\";\n\nconst { div } = dom.tags;\n\ndescribe(\"elementInViewport\", () => {\n  test(\"should return true when element is in viewport\", () => {\n    // Arrange\n    const getBoundingClientRectSpy = jest.fn(\n      () =>\n        ({\n          top: 100,\n          left: 10,\n          bottom: 100,\n          right: 50,\n        } as DOMRect)\n    );\n    const elm = div();\n    elm.getBoundingClientRect = getBoundingClientRectSpy;\n\n    // Act\n    const isInViewport = elementInViewport(elm);\n\n    // Assert\n    expect(isInViewport).toBeTrue();\n  });\n\n  test(\"should return false when element left is not in viewport\", () => {\n    // Arrange\n    const getBoundingClientRectSpy = jest.fn(\n      () =>\n        ({\n          top: -100,\n          left: 10,\n          bottom: 100,\n          right: 50,\n        } as DOMRect)\n    );\n    const elm = div();\n    elm.getBoundingClientRect = getBoundingClientRectSpy;\n\n    // Act\n    const isInViewport = elementInViewport(elm);\n\n    // Assert\n    expect(isInViewport).toBeFalse();\n  });\n\n  test(\"should return false when element right is not in viewport\", () => {\n    // Arrange\n    const getBoundingClientRectSpy = jest.fn(\n      () =>\n        ({\n          top: 100,\n          left: 10,\n          bottom: 100,\n          right: window.innerWidth + 50,\n        } as DOMRect)\n    );\n    const elm = div();\n    elm.getBoundingClientRect = getBoundingClientRectSpy;\n\n    // Act\n    const isInViewport = elementInViewport(elm);\n\n    // Assert\n    expect(isInViewport).toBeFalse();\n  });\n\n  test(\"should return false when element top is not in viewport\", () => {\n    // Arrange\n    const getBoundingClientRectSpy = jest.fn(\n      () =>\n        ({\n          top: -100,\n          left: 10,\n          bottom: 100,\n          right: 50,\n        } as DOMRect)\n    );\n    const elm = div();\n    elm.getBoundingClientRect = getBoundingClientRectSpy;\n\n    // Act\n    const isInViewport = elementInViewport(elm);\n\n    // Assert\n    expect(isInViewport).toBeFalse();\n  });\n\n  test(\"should return false when element bottom is not in viewport\", () => {\n    // Arrange\n    const getBoundingClientRectSpy = jest.fn(\n      () =>\n        ({\n          top: 100,\n          left: 10,\n          bottom: window.innerHeight + 5,\n          right: 50,\n        } as DOMRect)\n    );\n    const elm = div();\n    elm.getBoundingClientRect = getBoundingClientRectSpy;\n\n    // Act\n    const isInViewport = elementInViewport(elm);\n\n    // Assert\n    expect(isInViewport).toBeFalse();\n  });\n});\n"
  },
  {
    "path": "src/util/elementInViewport.ts",
    "content": "/**\n * Check to see if the element is in the viewport or not\n * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\n *\n * @api private\n */\nexport default function elementInViewport(el: HTMLElement): boolean {\n  const rect = el.getBoundingClientRect();\n\n  return (\n    rect.top >= 0 &&\n    rect.left >= 0 &&\n    rect.bottom + 80 <= window.innerHeight && // add 80 to get the text right\n    rect.right <= window.innerWidth\n  );\n}\n"
  },
  {
    "path": "src/util/getOffset.test.ts",
    "content": "import getOffset from \"./getOffset\";\nimport dom from \"../packages/dom\";\n\nconst { div } = dom.tags;\n\nconst mockBoundingClientRect = (\n  element: HTMLElement,\n  domRect: Partial<DOMRect>\n) => {\n  const getBoundingClientRectSpy = jest.fn(() => {\n    const rect: DOMRect = {\n      x: 0,\n      y: 0,\n      width: 0,\n      height: 0,\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n      toJSON: () => null,\n      ...domRect,\n    };\n    return rect;\n  });\n  element.getBoundingClientRect = getBoundingClientRectSpy;\n\n  return element;\n};\n\ndescribe(\"getOffset\", () => {\n  afterEach(() => {\n    document.body.innerHTML = \"\";\n    document.body.scrollTop = 0;\n    document.body.scrollLeft;\n  });\n\n  it(\"should return the correct offset without scroll\", () => {\n    // Arrange\n    const element = mockBoundingClientRect(div(), {\n      top: 100,\n      left: 10,\n      bottom: 350,\n      right: 50,\n      height: 250,\n    });\n    document.body.appendChild(element);\n\n    // Act\n    const result = getOffset(element);\n\n    // Assert\n    expect(result).toEqual({\n      absoluteBottom: 350,\n      absoluteLeft: 10,\n      absoluteRight: 50,\n      absoluteTop: 100,\n      bottom: 350,\n      height: 250,\n      left: 10,\n      right: 10,\n      top: 100,\n      width: 0,\n    });\n  });\n\n  it(\"should return the correct offset with scrollTop\", () => {\n    // Arrange\n    const element = mockBoundingClientRect(div(), {\n      top: 100,\n      left: 10,\n      bottom: 350,\n      right: 50,\n      height: 250,\n    });\n    document.body.scrollTop = 150;\n    document.body.appendChild(element);\n\n    // Act\n    const result = getOffset(element);\n\n    // Assert\n    expect(result).toEqual({\n      absoluteBottom: 350,\n      absoluteLeft: 10,\n      absoluteRight: 50,\n      absoluteTop: 100,\n      bottom: 500,\n      height: 250,\n      left: 10,\n      right: 10,\n      top: 250,\n      width: 0,\n    });\n  });\n\n  it(\"should ignore scroll values when element is fixed\", () => {\n    // Arrange\n    const element = mockBoundingClientRect(\n      div({\n        style: \"position: fixed\",\n      }),\n      {\n        top: 100,\n        left: 10,\n        bottom: 350,\n        right: 50,\n        height: 250,\n      }\n    );\n    document.body.scrollTop = 150;\n    document.body.scrollLeft = 100;\n    document.body.appendChild(element);\n\n    // Act\n    const result = getOffset(element);\n\n    // Assert\n    expect(result).toEqual({\n      absoluteBottom: 350,\n      absoluteLeft: 10,\n      absoluteRight: 50,\n      absoluteTop: 100,\n      bottom: 350,\n      height: 250,\n      left: 10,\n      right: 10,\n      top: 100,\n      width: 0,\n    });\n  });\n\n  it(\"should return position relative to a relative element\", () => {\n    // Given\n    const relativeElement = mockBoundingClientRect(\n      div({\n        style: \"position: relative\",\n      }),\n      {\n        top: 100,\n        left: 10,\n        bottom: 700,\n        right: 50,\n        height: 550,\n      }\n    );\n\n    const element = mockBoundingClientRect(div(), {\n      top: 150,\n      left: 30,\n      bottom: 350,\n      right: 150,\n      height: 250,\n    });\n\n    relativeElement.appendChild(element);\n\n    // When\n    const result = getOffset(element, relativeElement);\n\n    // Then\n    expect(result).toEqual({\n      absoluteBottom: 350,\n      absoluteLeft: 30,\n      absoluteRight: 150,\n      absoluteTop: 150,\n      bottom: 300,\n      height: 250,\n      left: 20,\n      right: 20,\n      top: 50,\n      width: 0,\n    });\n  });\n\n  it(\"should return position relative to a sticky element\", () => {\n    // Given\n    const relativeElement = mockBoundingClientRect(\n      div({\n        style: \"position: sticky\",\n      }),\n      {\n        top: 100,\n        left: 10,\n        bottom: 700,\n        right: 50,\n        height: 550,\n      }\n    );\n\n    const element = mockBoundingClientRect(div(), {\n      top: 150,\n      left: 30,\n      bottom: 350,\n      right: 150,\n      height: 250,\n    });\n\n    relativeElement.appendChild(element);\n\n    // When\n    const result = getOffset(element, relativeElement);\n\n    // Then\n    expect(result).toEqual({\n      absoluteBottom: 350,\n      absoluteLeft: 30,\n      absoluteRight: 150,\n      absoluteTop: 150,\n      bottom: 300,\n      height: 250,\n      left: 20,\n      right: 20,\n      top: 50,\n      width: 0,\n    });\n  });\n});\n"
  },
  {
    "path": "src/util/getOffset.ts",
    "content": "import getPropValue from \"./getPropValue\";\nimport isFixed from \"./isFixed\";\n\nexport type Offset = {\n  width: number;\n  height: number;\n  left: number;\n  right: number;\n  top: number;\n  bottom: number;\n  absoluteTop: number;\n  absoluteLeft: number;\n  absoluteRight: number;\n  absoluteBottom: number;\n};\n\n/**\n * Get an element position on the page relative to another element (or body) including scroll offset\n * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\n *\n * @api private\n * @returns Element's position info\n */\nexport default function getOffset(\n  element: HTMLElement,\n  relativeEl?: HTMLElement\n): Offset {\n  const body = document.body;\n  const docEl = document.documentElement;\n  const scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\n  const scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\n\n  relativeEl = relativeEl || docEl || body;\n\n  const x = element.getBoundingClientRect();\n  const xr = relativeEl.getBoundingClientRect();\n  const relativeElPosition = getPropValue(relativeEl, \"position\");\n\n  let obj: { top: number; left: number } = { top: 0, left: 0 };\n\n  if (\n    (relativeEl.tagName.toLowerCase() !== \"body\" &&\n      relativeElPosition === \"relative\") ||\n    relativeElPosition === \"sticky\"\n  ) {\n    // when the container of our target element is _not_ body and has either \"relative\" or \"sticky\" position, we should not\n    // consider the scroll position but we need to include the relative x/y of the container element\n    obj = Object.assign(obj, {\n      top: x.top - xr.top,\n      left: x.left - xr.left,\n    });\n  } else {\n    if (isFixed(element)) {\n      obj = Object.assign(obj, {\n        top: x.top,\n        left: x.left,\n      });\n    } else {\n      obj = Object.assign(obj, {\n        top: x.top + scrollTop,\n        left: x.left + scrollLeft,\n      });\n    }\n  }\n\n  return {\n    ...obj,\n    ...{\n      width: x.width,\n      height: x.height,\n      bottom: obj.top + x.height,\n      right: obj.left + x.width,\n      absoluteTop: x.top,\n      absoluteLeft: x.left,\n      absoluteBottom: x.bottom,\n      absoluteRight: x.right,\n    },\n  };\n}\n"
  },
  {
    "path": "src/util/getPropValue.ts",
    "content": "/**\n * Get an element CSS property on the page\n * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\n *\n * @api private\n * @returns string property value\n */\nexport default function getPropValue(\n  element: HTMLElement,\n  propName: string\n): string {\n  let propValue = \"\";\n  if (\"currentStyle\" in element) {\n    //IE\n    // @ts-ignore\n    propValue = element.currentStyle[propName];\n  } else if (document.defaultView && document.defaultView.getComputedStyle) {\n    //Others\n    propValue = document.defaultView\n      .getComputedStyle(element, null)\n      .getPropertyValue(propName);\n  }\n\n  //Prevent exception in IE\n  if (propValue && propValue.toLowerCase) {\n    return propValue.toLowerCase();\n  } else {\n    return propValue;\n  }\n}\n"
  },
  {
    "path": "src/util/getScrollParent.ts",
    "content": "/**\n * Find the nearest scrollable parent\n * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\n */\nexport default function getScrollParent(element: HTMLElement): HTMLElement {\n  let style = window.getComputedStyle(element);\n  const excludeStaticParent = style.position === \"absolute\";\n  const overflowRegex = /(auto|scroll)/;\n\n  if (style.position === \"fixed\") return document.body;\n\n  for (\n    let parent: HTMLElement | null = element;\n    (parent = parent.parentElement);\n\n  ) {\n    style = window.getComputedStyle(parent);\n    if (excludeStaticParent && style.position === \"static\") {\n      continue;\n    }\n    if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX))\n      return parent;\n  }\n\n  return document.body;\n}\n"
  },
  {
    "path": "src/util/getWindowSize.ts",
    "content": "/**\n * Provides a cross-browser way to get the screen dimensions\n * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\n *\n * @api private\n */\nexport default function getWinSize(): { width: number; height: number } {\n  if (window.innerWidth !== undefined) {\n    return { width: window.innerWidth, height: window.innerHeight };\n  } else {\n    const D = document.documentElement;\n    return { width: D.clientWidth, height: D.clientHeight };\n  }\n}\n"
  },
  {
    "path": "src/util/isFixed.ts",
    "content": "import getPropValue from \"./getPropValue\";\n\n/**\n * Checks to see if target element (or parents) position is fixed or not\n *\n * @api private\n */\nexport default function isFixed(element: HTMLElement): boolean {\n  const parent = element.parentElement;\n\n  if (!parent || parent.nodeName === \"HTML\") {\n    return false;\n  }\n\n  if (getPropValue(element, \"position\") === \"fixed\") {\n    return true;\n  }\n\n  return isFixed(parent);\n}\n"
  },
  {
    "path": "src/util/isFunction.test.ts",
    "content": "import isFunction from \"./isFunction\";\n\ndescribe(\"isFunction\", () => {\n  it(\"should return false when string is passed\", () => {\n    const res = isFunction(\"abc\");\n\n    expect(res).toBeFalse();\n  });\n\n  it(\"should return false when undefined is passed\", () => {\n    const res = isFunction(undefined);\n\n    expect(res).toBeFalse();\n  });\n\n  it(\"should return false when null is passed\", () => {\n    const res = isFunction(null);\n\n    expect(res).toBeFalse();\n  });\n\n  it(\"should return true when function is passed\", () => {\n    const res = isFunction(() => \"abc\");\n\n    expect(res).toBeTrue();\n  });\n});\n"
  },
  {
    "path": "src/util/isFunction.ts",
    "content": "// Returns true if the given parameter is a function\nexport default (x: any): x is Function => typeof x === \"function\";\n"
  },
  {
    "path": "src/util/positionRelativeTo.test.ts",
    "content": "import { setPositionRelativeTo } from \"./positionRelativeTo\";\nimport { getBoundingClientRectSpy } from \"../../tests/jest/helper\";\nimport dom from \"../packages/dom\";\n\nconst { div } = dom.tags;\n\ndescribe(\"setPositionRelativeTo\", () => {\n  it(\"should return if helperLayer or currentStep is null\", () => {\n    // Act\n    const result = setPositionRelativeTo(\n      null as unknown as HTMLElement,\n      null as unknown as HTMLElement,\n      null as unknown as HTMLElement,\n      10\n    );\n\n    // Assert\n    expect(result).toBeUndefined();\n  });\n\n  it(\"should set the correct width, height, top, left\", () => {\n    // Arrange\n    const stepElement = div();\n    stepElement.getBoundingClientRect = getBoundingClientRectSpy(\n      200,\n      100,\n      10,\n      50,\n      100,\n      100\n    );\n\n    const helperLayer = div();\n    helperLayer.getBoundingClientRect = getBoundingClientRectSpy(\n      500,\n      500,\n      5,\n      10,\n      15,\n      20\n    );\n\n    // Act\n    setPositionRelativeTo(document.body, helperLayer, stepElement, 10);\n\n    // Assert\n    expect(helperLayer.style.width).toBe(\"210px\");\n    expect(helperLayer.style.height).toBe(\"110px\");\n    expect(helperLayer.style.top).toBe(\"5px\");\n    expect(helperLayer.style.left).toBe(\"45px\");\n  });\n\n  it(\"should add fixedTooltip if element is fixed\", () => {\n    // Arrange\n    const stepElementParent = div();\n    const stepElement = div();\n    stepElement.style.position = \"fixed\";\n    stepElementParent.appendChild(stepElement);\n\n    const helperLayer = div();\n\n    // Act\n    setPositionRelativeTo(stepElementParent, helperLayer, stepElement, 10);\n\n    // Assert\n    expect(helperLayer.className).toBe(\"introjs-fixedTooltip\");\n  });\n\n  it(\"should remove the fixedTooltip className if element is not fixed\", () => {\n    // Arrange\n    const stepElement = div();\n    stepElement.style.position = \"absolute\";\n\n    const helperLayer = div();\n    helperLayer.className = \"introjs-fixedTooltip\";\n\n    // Act\n    setPositionRelativeTo(document.body, helperLayer, stepElement, 10);\n\n    // Assert\n    expect(helperLayer.className).not.toBe(\"introjs-fixedTooltip\");\n  });\n});\n"
  },
  {
    "path": "src/util/positionRelativeTo.ts",
    "content": "import getOffset from \"./getOffset\";\nimport isFixed from \"./isFixed\";\nimport { removeClass, addClass } from \"./className\";\nimport setStyle from \"./style\";\n\nexport const getPositionRelativeTo = (\n  relativeElement: HTMLElement,\n  element: HTMLElement,\n  targetElement: HTMLElement,\n  padding: number\n) => {\n  if (!element || !relativeElement || !targetElement) {\n    return;\n  }\n\n  // If the target element is fixed, the tooltip should be fixed as well.\n  // Otherwise, remove a fixed class that may be left over from the previous\n  // step.\n  if (targetElement instanceof Element && isFixed(targetElement)) {\n    addClass(element, \"introjs-fixedTooltip\");\n  } else {\n    removeClass(element, \"introjs-fixedTooltip\");\n  }\n\n  const position = getOffset(targetElement, relativeElement);\n\n  return {\n    width: `${position.width + padding}px`,\n    height: `${position.height + padding}px`,\n    top: `${position.top - padding / 2}px`,\n    left: `${position.left - padding / 2}px`,\n  };\n};\n\n/**\n * Sets the position of the element relative to the target element\n * @api private\n */\nexport const setPositionRelativeTo = (\n  relativeElement: HTMLElement,\n  element: HTMLElement,\n  targetElement: HTMLElement,\n  padding: number\n) => {\n  const styles = getPositionRelativeTo(\n    relativeElement,\n    element,\n    targetElement,\n    padding\n  );\n\n  if (!styles) return;\n\n  //set new position to helper layer\n  setStyle(element, styles);\n};\n"
  },
  {
    "path": "src/util/queryElement.ts",
    "content": "export const queryElement = (\n  selector: string,\n  container?: HTMLElement | null\n): HTMLElement | null => {\n  return (container ?? document).querySelector(selector);\n};\n\nexport const queryElements = (\n  selector: string,\n  container?: HTMLElement | null\n): NodeListOf<HTMLElement> => {\n  return (container ?? document).querySelectorAll(selector);\n};\n\nexport const queryElementsByClassName = (\n  className: string,\n  container?: HTMLElement | null\n): NodeListOf<HTMLElement> => {\n  return queryElements(`.${className}`, container);\n};\n\nexport const getElement = (\n  selector: string,\n  container?: HTMLElement | null\n) => {\n  const element = queryElement(selector, container);\n\n  if (!element) {\n    throw new Error(`Element with selector ${selector} not found`);\n  }\n\n  return element;\n};\n"
  },
  {
    "path": "src/util/removeEntry.ts",
    "content": "/**\n * Remove an entry from a string array if it's there, does nothing if it isn't there.\n */\nexport default function removeEntry<K>(stringArray: K[], stringToRemove: K) {\n  if (stringArray.includes(stringToRemove)) {\n    stringArray.splice(stringArray.indexOf(stringToRemove), 1);\n  }\n}\n"
  },
  {
    "path": "src/util/scrollParentToElement.ts",
    "content": "import getScrollParent from \"./getScrollParent\";\n\n/**\n * scroll a scrollable element to a child element\n */\nexport default function scrollParentToElement(\n  scrollToElement: boolean,\n  targetElement: HTMLElement\n) {\n  if (!scrollToElement) return;\n\n  const parent = getScrollParent(targetElement);\n\n  if (parent === document.body) return;\n\n  parent.scrollTop = targetElement.offsetTop - parent.offsetTop;\n}\n"
  },
  {
    "path": "src/util/scrollTo.ts",
    "content": "import elementInViewport from \"./elementInViewport\";\nimport getWindowSize from \"./getWindowSize\";\nimport { ScrollTo } from \"../packages/tour/steps\";\n\n/**\n * To change the scroll of `window` after highlighting an element\n *\n * @api private\n */\nexport default function scrollTo(\n  scrollToElement: boolean,\n  scrollTo: ScrollTo,\n  scrollPadding: number,\n  targetElement: HTMLElement,\n  tooltipLayer: HTMLElement\n) {\n  if (scrollTo === \"off\") return;\n  let rect: DOMRect;\n\n  if (!scrollToElement) return;\n\n  if (scrollTo === \"tooltip\") {\n    rect = tooltipLayer.getBoundingClientRect();\n  } else {\n    rect = targetElement.getBoundingClientRect();\n  }\n\n  if (!elementInViewport(targetElement)) {\n    const winHeight = getWindowSize().height;\n    const top = rect.bottom - (rect.bottom - rect.top);\n\n    // TODO (afshinm): do we need scroll padding now?\n    // I have changed the scroll option and now it scrolls the window to\n    // the center of the target element or tooltip.\n\n    if (top < 0 || targetElement.clientHeight > winHeight) {\n      window.scrollBy(\n        0,\n        rect.top - (winHeight / 2 - rect.height / 2) - scrollPadding\n      ); // 30px padding from edge to look nice\n\n      //Scroll down\n    } else {\n      window.scrollBy(\n        0,\n        rect.top - (winHeight / 2 - rect.height / 2) + scrollPadding\n      ); // 30px padding from edge to look nice\n    }\n  }\n}\n"
  },
  {
    "path": "src/util/sleep.ts",
    "content": "export const sleep = (ms: number) =>\n  new Promise((resolve) => setTimeout(resolve, ms));\n\n// time to wait for the derivations to update\nexport const waitMsForDerivations = 5;\n\n// time to wait for the exit transition to complete\nexport const waitMsForExitTransition = 260;\n"
  },
  {
    "path": "src/util/style.test.ts",
    "content": "import setStyle from \"./style\";\n\ndescribe(\"setStyle\", () => {\n  test(\"should set style when the list is empty\", () => {\n    const el = document.createElement(\"div\");\n    setStyle(el, {\n      \"text-align\": \"center\",\n    });\n\n    expect(el.style.cssText).toBe(\"text-align: center;\");\n  });\n\n  test(\"should set style using cssText\", () => {\n    const el = document.createElement(\"div\");\n    setStyle(el, \"text-align: center\");\n\n    expect(el.style.cssText).toBe(\"text-align: center;\");\n  });\n\n  test(\"should set when style is not empty\", () => {\n    const el = document.createElement(\"div\");\n    el.style.position = \"relative\";\n\n    setStyle(el, \"text-align: center\");\n\n    expect(el.style.cssText).toBe(\"position: relative; text-align: center;\");\n  });\n\n  test(\"should set when style is not empty and given value is an object\", () => {\n    const el = document.createElement(\"div\");\n    el.style.position = \"relative\";\n\n    setStyle(el, {\n      \"text-align\": \"center\",\n    });\n\n    expect(el.style.cssText).toBe(\"position: relative; text-align: center;\");\n  });\n\n  test(\"should override the existing property\", () => {\n    const el = document.createElement(\"div\");\n    el.style.position = \"relative\";\n\n    setStyle(el, {\n      position: \"absolute\",\n      \"text-align\": \"center\",\n    });\n\n    expect(el.style.cssText).toBe(\"position: absolute; text-align: center;\");\n  });\n});\n"
  },
  {
    "path": "src/util/style.ts",
    "content": "/**\n * Converts a style object to a css text\n * @param style style object\n * @returns css text\n */\nexport const style = (style: { [key: string]: string | number }): string => {\n  let cssText = \"\";\n\n  for (const rule in style) {\n    cssText += `${rule}:${style[rule]};`;\n  }\n\n  return cssText;\n};\n\n/**\n * Sets the style of an DOM element\n */\nexport default function setStyle(\n  element: HTMLElement,\n  styles: string | { [key: string]: string | number }\n) {\n  let cssText = \"\";\n\n  if (element.style.cssText) {\n    cssText += element.style.cssText;\n  }\n\n  if (typeof styles === \"string\") {\n    cssText += styles;\n  } else {\n    cssText += style(styles);\n  }\n\n  element.style.cssText = cssText;\n}\n"
  },
  {
    "path": "tests/jest/global.d.ts",
    "content": "import \"jest-extended\";\n"
  },
  {
    "path": "tests/jest/helper.ts",
    "content": "export function find(selector: string | HTMLElement): HTMLElement {\n  if (typeof selector === \"string\") {\n    return document.querySelector(selector) as HTMLElement;\n  }\n\n  if (selector instanceof Element) {\n    return selector;\n  }\n\n  throw Error(\"invalid selector\");\n}\n\nexport function content(selector: string | HTMLElement): string | null {\n  const el = find(selector);\n\n  if (el) {\n    return el.innerHTML;\n  }\n\n  return null;\n}\n\nexport function className(selector: string | HTMLElement): string | null {\n  const el = find(selector);\n\n  if (el) {\n    return el.className;\n  }\n\n  return null;\n}\n\nexport function skipButton() {\n  return find(\".introjs-skipbutton\");\n}\n\nexport function nextButton() {\n  return find(\".introjs-nextbutton\");\n}\n\nexport function prevButton() {\n  return find(\".introjs-prevbutton\");\n}\n\nexport function doneButton() {\n  return find(\".introjs-donebutton\");\n}\n\nexport function tooltipText() {\n  return find(\".introjs-tooltiptext\");\n}\n\nexport function getBoundingClientRectSpy(\n  width: number,\n  height: number,\n  top: number,\n  left: number,\n  bottom: number,\n  right: number\n) {\n  return jest.fn(\n    () =>\n      ({\n        top,\n        left,\n        bottom,\n        right,\n        width,\n        height,\n      } as DOMRect)\n  );\n}\n\nexport const waitFor = (timeout: number) =>\n  new Promise((resolve) => setTimeout(resolve, timeout));\n"
  },
  {
    "path": "tests/jest/setup.ts",
    "content": "import \"regenerator-runtime/runtime\";\nimport { TextEncoder, TextDecoder } from \"util\";\n\n// ✅ Polyfill for environments missing these (keeps it safe)\nif (typeof global.TextEncoder === \"undefined\") {\n  (global as any).TextEncoder = TextEncoder;\n}\nif (typeof global.TextDecoder === \"undefined\") {\n  (global as any).TextDecoder = TextDecoder;\n}\n\n// ✅ Use Jest's built-in JSDOM globals, not your own instance\n// The testEnvironment: \"jsdom\" already provides `window`, `document`, `Element`, `SVGElement`, etc.\n// You don’t need to create a new JSDOM manually.\n\n// ✅ Optional custom matchers (uncomment if you use them)\n// import * as matchers from \"jest-extended\";\n// expect.extend(matchers);\n"
  },
  {
    "path": "themes/introjs-dark.css",
    "content": "/*\nDark theme for IntroJs\nBy: Khashayar Pourdeilami (http://kpourdeilami.github.io)\nfor: IntroJs (https://github.com/usablica/intro.js)\n*/\n.introjs-overlay {\n  position: absolute;\n  z-index: 999999;\n  background:#fff;\n  -webkit-transition: all 0.3s ease-out;\n     -moz-transition: all 0.3s ease-out;\n      -ms-transition: all 0.3s ease-out;\n       -o-transition: all 0.3s ease-out;\n          transition: all 0.3s ease-out;\n}\n\n.introjs-fixParent {\n  z-index: auto !important;\n  opacity: 1.0 !important;\n}\n\n.introjs-showElement,\ntr.introjs-showElement > td,\ntr.introjs-showElement > th {\n  z-index: 9999999 !important;\n}\n\n.introjs-relativePosition,\ntr.introjs-showElement > td,\ntr.introjs-showElement > th {\n  position: relative;\n}\n\n.introjs-helperLayer {\n  position: absolute;\n  z-index: 9999998;\n  background:#656D78;\n  -webkit-transition: all 0.3s ease-out;\n     -moz-transition: all 0.3s ease-out;\n      -ms-transition: all 0.3s ease-out;\n       -o-transition: all 0.3s ease-out;\n          transition: all 0.3s ease-out;\n}\n\n.introjs-helperNumberLayer {\n  position: absolute;\n\n  z-index: 9999999999 !important;\n  padding: 10px;\n  font-family: Arial, verdana, tahoma;\n  font-size: 13px;\n  top:-40px;\n  font-weight: bold;\n  color: white;\n  text-align: center;\n  background:#434A54;\n  width: 20px;\n  height:20px;\n  line-height: 20px;\n}\n\n.introjs-arrow {\n  border: 5px solid #434A54;\n  content:'';\n  position: absolute;\n}\n.introjs-arrow.top {\n  top: -10px;\n  border-top-color:transparent;\n  border-right-color:transparent;\n  border-bottom-color:#434A54;\n  border-left-color:transparent;\n}\n.introjs-arrow.top-right {\n  top: -10px;\n  right: 10px;\n  border-top-color:transparent;\n  border-right-color:transparent;\n  border-bottom-color:#434A54;\n  border-left-color:transparent;\n}\n.introjs-arrow.top-middle {\n  top: -10px;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color:transparent;\n  border-right-color:transparent;\n  border-bottom-color:#434A54;\n  border-left-color:transparent;\n}\n.introjs-arrow.right {\n  right: -10px;\n  top: 10px;\n  border-top-color:transparent;\n  border-right-color:transparent;\n  border-bottom-color:transparent;\n  border-left-color:#434A54;\n}\n.introjs-arrow.bottom {\n  bottom: -10px;\n  border-top-color:#434A54;\n  border-right-color:transparent;\n  border-bottom-color:transparent;\n  border-left-color:transparent;\n}\n.introjs-arrow.left {\n  left: -10px;\n  top: 10px;\n  border-top-color:transparent;\n  border-right-color:#434A54;\n  border-bottom-color:transparent;\n  border-left-color:transparent;\n}\n\n.introjs-tooltip {\n  position: absolute;\n  padding: 10px;\n  background-color: #434A54;\n  min-width: 200px;\n  padding-top:30px;\n\n  max-width: 300px;\n  color:#fff;\n  -webkit-transition: opacity 0.1s ease-out;\n     -moz-transition: opacity 0.1s ease-out;\n      -ms-transition: opacity 0.1s ease-out;\n       -o-transition: opacity 0.1s ease-out;\n          transition: opacity 0.1s ease-out;\n}\n\n.introjs-tooltipbuttons {\n  text-align: right;\n  position:relative;\n  bottom:-44px;\n  margin-left:-10px;\n  margin-right:-10px;\n  padding:5px;\n  background:#656D78;\n}\n\n/*\n Buttons style by http://nicolasgallagher.com/lab/css3-github-buttons/\n Changed by Afshin Mehrabani\n Further modified by: Khashayar P.\n*/\n.introjs-button {\n  position: relative;\n  overflow: visible;\n  display: inline-block;\n  padding: 0.3em 0.8em;\n  border: 2px solid #fff;\n  margin: 0;\n  text-decoration: none;\n  font: 11px/normal sans-serif;\n  color: #fff !important;\n  white-space: nowrap;\n  cursor: pointer;\n  outline: none;\n  -webkit-background-clip: padding;\n  -moz-background-clip: padding;\n  -o-background-clip: padding-box;\n  /*background-clip: padding-box;*/ /* commented out due to Opera 11.10 bug */\n  /* IE hacks */\n  zoom: 1;\n  *display: inline;\n  margin-top: 10px;\n}\n\n.introjs-button:hover {\n  text-decoration: none;\n  color:#434A54 !important;\n  background:#fff;\n}\n\n.introjs-button:focus,\n.introjs-button:active {\n  background:#fff !important;\n  color:#434A54 !important;\n}\n\n/* overrides extra padding on button elements in Firefox */\n.introjs-button::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\n.introjs-skipbutton {\n  margin-right: 5px;\n  color: #fff;\n}\n\n.introjs-prevbutton {\n\n  border-right: none;\n}\n\n\n.introjs-disabled, .introjs-disabled:hover, .introjs-disabled:focus {\n  color: #fff;\n  box-shadow: none;\n  cursor: default;\n  background:transparent;\n  border-color:transparent;\n}\n\n.introjs-bullets {\n  text-align: center;\n  display:none;\n}\n.introjs-bullets ul {\n  clear: both;\n  margin: 15px auto 0;\n  padding: 0;\n  display: inline-block;\n}\n.introjs-bullets ul li {\n  list-style: none;\n  float: left;\n  margin: 0 2px;\n}\n.introjs-bullets ul li a {\n  display: block;\n  width: 8px;\n  height: 8px;\n  background: rgba(255,255,255,0.1);\n  border-radius: 10px;\n  -moz-border-radius: 10px;\n  -webkit-border-radius: 10px;\n  text-decoration: none;\n}\n.introjs-bullets ul li a:hover {\n  background: rgba(255,255,255,0.2);\n}\n.introjs-bullets ul li a.active {\n  background: rgba(255,255,255,0.2);\n}\n.introjsFloatingElement {\n  position: absolute;\n  height: 0;\n  width: 0;\n  left: 50%;\n  top: 50%;\n}\n"
  },
  {
    "path": "themes/introjs-flattener.css",
    "content": ".introjs-helperNumberLayer {\n  font-family: tahoma, Arial, verdana, sans-serif;\n  font-size: 14px;\n  text-shadow: none;\n  width: 22px;\n  height: 22px;\n  line-height: 22px;\n  border: 2px solid #ecf0f1;\n  border-radius: 50%;\n  background: #e74c3c;\n}\n\n.introjs-helperLayer {\n  background-color: #FFF;\n  background-color: rgba(255,255,255,.9);\n  border: none;\n  border-radius: 2px;\n}\n\n.introjs-tooltip {\n  letter-spacing: .1em;\n  color: #2c3e50;\n  font-family: tahoma, Arial, verdana, sans-serif;\n  border-radius: 2px;\n}\n\n.introjs-button {\n  padding: 0.6em 0.8em;\n  text-shadow: none;\n  font-weight: bold;\n  color: #2c3e50;\n  font-family: tahoma, Arial, verdana, sans-serif;\n  background: #ecf0f1;\n  background-image: none;\n  -webkit-border-radius: .2em;\n  -moz-border-radius: .2em;\n  border-radius: .2em;\n  -webkit-transition: background .3s, border .3s;\n     -moz-transition: background .3s, border .3s;\n      -ms-transition: background .3s, border .3s;\n       -o-transition: background .3s, border .3s;\n          transition: background .3s, border .3s;\n}\n\n.introjs-prevbutton {\n  border-radius: .2em 0 0 .2em;\n}\n\n.introjs-nextbutton {\n  border-radius: 0 .2em .2em 0;\n}\n\n.introjs-button:hover, .introjs-button:focus {\n  background: #2c3e50;\n  color: #fff;\n  box-shadow: none;\n  border-color: #2c3e50;\n  text-decoration: none;\n}\n"
  },
  {
    "path": "themes/introjs-modern.css",
    "content": ".introjs-tooltip {\n  background-color: rgba(000, 0, 0, 0.5);\n  color: #fff;\n}\n\n.introjs-button,\n.introjs-button:hover, .introjs-button:focus, .introjs-button:active,\n.introjs-disabled, .introjs-disabled:focus, .introjs-disabled:hover {\n  outline: none;\n  background-image: none;\n  background-color: transparent;\n  color: #fff;\n  border: 1px solid transparent;\n  border-radius: 50px;\n  box-shadow: none;\n  border-shadow: none;\n  text-shadow: none;\n}\n\n.introjs-button:hover, .introjs-button:focus, .introjs-button:active {\n  border: 1px solid #fff\n}\n.introjs-disabled, .introjs-disabled:focus, .introjs-disabled:hover {\n  color: #ccc;\n  border: 1px solid transparent;\n}\n\n.introjs-arrow {\n  border: 10px solid #fff;\n}\n.introjs-arrow.top, .introjs-arrow.top-middle, .introjs-arrow.top-right {\n  border-color: transparent transparent rgba(000, 0, 0, 0.5);\n  top: -20px;\n  left: 20px;\n}\n.introjs-arrow.bottom, .introjs-arrow.bottom-middle, .introjs-arrow.bottom-right {\n  border-color: rgba(000, 0, 0, 0.5) transparent transparent;\n  bottom: -20px;\n  left: 20px;\n}\n.introjs-arrow.left, .introjs-arrow.right {\n    top: 20px;\n}\n.introjs-arrow.left-bottom, .introjs-arrow.right-bottom {\n    bottom: 20px;\n}\n\n.introjs-arrow.left, .introjs-arrow.left-bottom {\n  left: -20px;\n  border-color: transparent rgba(000, 0, 0, 0.5) transparent transparent;\n}\n.introjs-arrow.right, .introjs-arrow.right-bottom {\n  right: -20px;\n  border-color: transparent transparent transparent rgba(000, 0, 0, 0.5);\n}\n"
  },
  {
    "path": "themes/introjs-nassim.css",
    "content": ".introjs-overlay {\r\n  position: absolute;\r\n  z-index: 999999;\r\n  background: #181818;\r\n  opacity: 0;\r\n\r\n  -webkit-transition: all 0.3s ease-out;\r\n     -moz-transition: all 0.3s ease-out;\r\n      -ms-transition: all 0.3s ease-out;\r\n       -o-transition: all 0.3s ease-out;\r\n          transition: all 0.3s ease-out;\r\n}\r\n\r\n.introjs-fixParent {\r\n  z-index: auto !important;\r\n  opacity: 1.0 !important;\r\n}\r\n\r\n.introjs-showElement {\r\n  z-index: 9999999 !important;\r\n}\r\n\r\n.introjs-relativePosition {\r\n  position: relative;\r\n}\r\n\r\n.introjs-helperLayer {\r\n  position: absolute;\r\n  z-index: 9999998;\r\n  background-color: #FFF;\r\n  background-color: rgba(255,255,255,.9);\r\n  border: 1px solid #777;\r\n  border: 2px solid rgba(117, 117, 117, 1);\r\n  border-radius: 4px;\r\n  box-shadow: 0 5px 8px -3px rgba(0,0,0,.6);\r\n  -webkit-transition: all 0.3s ease-out;\r\n     -moz-transition: all 0.3s ease-out;\r\n      -ms-transition: all 0.3s ease-out;\r\n       -o-transition: all 0.3s ease-out;\r\n          transition: all 0.3s ease-out;\r\n}\r\n\r\n.introjs-helperNumberLayer {\r\n  position: absolute;\r\n  top: -16px;\r\n  left: -9px;\r\n  z-index: 9999999999 !important;\r\n  padding: 2px;\r\n  font-family: Arial, verdana, tahoma;\r\n  font-size: 13px;\r\n  font-weight: bold;\r\n  color: #fff; /* Old browsers */ /* Chrome10+,Safari5.1+ */\r\n  background: #DA4433;\r\n  width: 20px;\r\n  box-shadow: 0 1px 1px rgba(0,0,0,.35);\r\n  height:20px;\r\n  text-align: center;\r\n  line-height: 20px;\r\n  border: 2px solid #DA4433;\r\n  border-radius: 0; /* IE6-9 */  /* IE10 text shadows */\r\n}\r\n\r\n.introjs-helperNumberLayer:after {\r\n  content:\"\";\r\n  width:0;\r\n  height:0;\r\n  position:absolute;\r\n  content:0;\r\n  left:-3px;\r\n  bottom:-10px;\r\n  border:4px solid transparent;\r\n  border-right-color:#900;\r\n  border-top-color:#900;\r\n}\r\n\r\n.introjs-arrow {\r\n  border: 5px solid white;\r\n  content:'';\r\n  position: absolute;\r\n}\r\n.introjs-arrow.top {\r\n  top: -10px;\r\n  border-top-color:transparent;\r\n  border-right-color:transparent;\r\n  border-bottom-color: #ecf0f1;\r\n  border-left-color:transparent;\r\n}\r\n.introjs-arrow.right {\r\n  right: -10px;\r\n  top: 10px;\r\n  border-top-color:transparent;\r\n  border-right-color:transparent;\r\n  border-bottom-color:transparent;\r\n  border-left-color:#ecf0f1;\r\n}\r\n.introjs-arrow.bottom {\r\n  bottom: -10px;\r\n  border-top-color:#ecf0f1;\r\n  border-right-color:transparent;\r\n  border-bottom-color:transparent;\r\n  border-left-color:transparent;\r\n}\r\n.introjs-arrow.left {\r\n  left: -10px;\r\n  top: 10px;\r\n  border-top-color:transparent;\r\n  border-right-color: #ecf0f1;\r\n  border-bottom-color:transparent;\r\n  border-left-color:transparent;\r\n}\r\n\r\n.introjs-tooltip {\r\n  position: absolute;\r\n  padding: 10px 10px;\r\n  background-color: #ecf0f1;\r\n  min-width: 200px;\r\n  max-width: 300px;\r\n  border-radius: 3px;\r\n  /* border-radius: 3px; */\r\n  /* box-shadow: 0 6px 7px -4px rgba(0,0,0,.4); */\r\n  -webkit-transition: opacity 0.1s ease-out;\r\n     -moz-transition: opacity 0.1s ease-out;\r\n      -ms-transition: opacity 0.1s ease-out;\r\n       -o-transition: opacity 0.1s ease-out;\r\n          transition: opacity 0.1s ease-out;\r\n  /* border: 5px double #0787AF; */\r\n}\r\n\r\n.introjs-tooltiptext {\r\n    margin-left: -10px;\r\n\r\n    margin-right: -10px;\r\n    /* border-top: 1px solid #FFFFFF; */\r\n    /* background: #FAFAFA; */\r\n    color: #2c3e50;\r\n    padding: 25px 30px 15px;\r\n    /* border-bottom: 1px solid #FFFFFF; */\r\n}\r\n\r\n.introjs-tooltipbuttons {\r\n  text-align: center;\r\n  /* background: rgba(0, 0, 0, 0.06); */\r\n  border-radius: 0 0 8px 8px;\r\n  padding-bottom: 10px;\r\n}\r\n\r\n/*\r\n Buttons style by http://nicolasgallagher.com/lab/css3-github-buttons/\r\n Changed by Afshin Mehrabani\r\n*/\r\n.introjs-button {\r\n  position: relative;\r\n  overflow: visible;\r\n  display: inline-block;\r\n  padding: 0.5em 0.8em;\r\n  /* box-shadow: 0 2px 0px -0px #306588; */\r\n  margin: 0;\r\n  outline: none;\r\n  border: 2px solid;\r\n  background: transparent;\r\n  text-decoration: none;\r\n  font: 11px/normal sans-serif;\r\n  color: #2980b9 !important;\r\n  white-space: nowrap;\r\n  cursor: pointer;\r\n  outline: none !important;\r\n  -webkit-background-clip: padding;\r\n  -moz-background-clip: padding;\r\n  -o-background-clip: padding-box;\r\n  /*background-clip: padding-box;*/ /* commented out due to Opera 11.10 bug */\r\n  -webkit-border-radius: 0.2em;\r\n  -moz-border-radius: 0.2em;\r\n  border-radius: 0.2em;\r\n  /* IE hacks */\r\n  zoom: 1;\r\n  *display: inline;\r\n  margin-top: 10px;\r\n  transition:all 0.25s ease;\r\n  -webkit-transition:all 0.25s ease;\r\n  -moz-transition:all 0.25s ease;\r\n  -ms-transition:all 0.25s ease;\r\n  -o-transition:all 0.25s ease;\r\n}\r\n\r\n.introjs-button:hover {\r\n  color: #fff;\r\n  background: #2671A2;\r\n  text-decoration: none;\r\n  border-color: #235677;\r\n}\r\n\r\n.introjs-button:focus,\r\n.introjs-button:active {\r\n    background: #23587A;  text-decoration: none;\r\n    color: #fff;\r\n    /* bottom: -1px; */\r\n    box-shadow: none;\r\n    border-color: #173B53;\r\n}\r\n\r\n/* overrides extra padding on button elements in Firefox */\r\n.introjs-button::-moz-focus-inner {\r\n  padding: 0;\r\n  border: 0;\r\n}\r\n\r\n.introjs-skipbutton {\r\n  margin-right: 5px;\r\n  color: #c00;\r\n  background: transparent;\r\n}\r\n\r\n.introjs-skipbutton:hover {\r\n    background: #EB1540;\r\n    border-color: #B91D0D;\r\n\r\n}\r\n\r\n.introjs-skipbutton:active, .introjs-skipbutton:focus {\r\n    background: #C02312;\r\n    /* box-shadow: 0 1px 0px -0px #6F1309; */\r\n\r\n}\r\n\r\n.introjs-prevbutton {\r\n  -webkit-border-radius: 0.2em 0 0 0.2em;\r\n  -moz-border-radius: 0.2em 0 0 0.2em;\r\n  border-radius: 0.2em 0 0 0.2em;\r\n  border-right: none;\r\n}\r\n\r\n.introjs-nextbutton {\r\n  -webkit-border-radius: 0 0.2em 0.2em 0;\r\n  -moz-border-radius: 0 0.2em 0.2em 0;\r\n  border-radius: 0 0.2em 0.2em 0;\r\n}\r\n\r\n.introjs-disabled, .introjs-disabled:hover, .introjs-disabled:focus {\r\n  color: #C2C2C2 !important;\r\n  border-color: #d4d4d4;\r\n  cursor: default;\r\n  /* box-shadow: 0 2px 0px -0px #CACED1; */\r\n  background-color: #E6E6E6;\r\n  background-image: none;\r\n  text-decoration: none;\r\n}\r\n\r\n.introjs-bullets {\r\n  text-align: center;\r\n  position: absolute;\r\n  left: 0;\r\n  right: 0;\r\n  top: -5px;\r\n}\r\n.introjs-bullets ul {\r\n  clear: both;\r\n  margin: 15px auto 0;\r\n  padding: 0;\r\n  display: inline-block;\r\n}\r\n.introjs-bullets ul li {\r\n  list-style: none;\r\n  float: left;\r\n  margin: 0 2px;\r\n}\r\n.introjs-bullets ul li a {\r\n  display: block;\r\n  width: 6px;\r\n  height: 6px;\r\n  background: #ccc;\r\n  border-radius: 10px;\r\n  -moz-border-radius: 10px;\r\n  -webkit-border-radius: 10px;\r\n  text-decoration: none;\r\n}\r\n.introjs-bullets ul li a:hover {\r\n  background: #999;\r\n}\r\n.introjs-bullets ul li a.active {\r\n  background: #999;\r\n}\r\n\r\n.introjs-progress {\r\n  background-color: #FAFAFA;\r\n  margin: 5px 20px;\r\n}\r\n.introjs-progressbar {\r\n  background-color: #2980b9;\r\n}\r\n\r\n.introjsFloatingElement {\r\n  position: absolute;\r\n  height: 0;\r\n  width: 0;\r\n  left: 50%;\r\n  top: 50%;\r\n}\r\n"
  },
  {
    "path": "themes/introjs-nazanin.css",
    "content": ".introjs-overlay {\r\n  position: absolute;\r\n  z-index: 999999;\r\n  background: #525252;\r\n  opacity: 0;\r\n\r\n  -webkit-transition: all 0.3s ease-out;\r\n     -moz-transition: all 0.3s ease-out;\r\n      -ms-transition: all 0.3s ease-out;\r\n       -o-transition: all 0.3s ease-out;\r\n          transition: all 0.3s ease-out;\r\n}\r\n\r\n.introjs-fixParent {\r\n  z-index: auto !important;\r\n  opacity: 1.0 !important;\r\n}\r\n\r\n.introjs-showElement {\r\n  z-index: 9999999 !important;\r\n}\r\n\r\n.introjs-relativePosition {\r\n  position: relative;\r\n}\r\n\r\n.introjs-helperLayer {\r\n  position: absolute;\r\n  z-index: 9999998;\r\n  background-color: #FFF;\r\n  background-color: rgba(255,255,255,.9);\r\n  border: 1px solid #777;\r\n  border: 3px solid rgba(211, 214, 209, 1);\r\n  border-radius: 0;\r\n  box-shadow: 0 5px 8px -3px rgba(0,0,0,.6);\r\n  -webkit-transition: all 0.3s ease-out;\r\n     -moz-transition: all 0.3s ease-out;\r\n      -ms-transition: all 0.3s ease-out;\r\n       -o-transition: all 0.3s ease-out;\r\n          transition: all 0.3s ease-out;\r\n}\r\n\r\n.introjs-helperNumberLayer {\r\n  position: absolute;\r\n  top: -16px;\r\n  left: -16px;\r\n  z-index: 9999999999 !important;\r\n  padding: 2px;\r\n  font-family: Arial, verdana, tahoma;\r\n  font-size: 13px;\r\n  font-weight: bold;\r\n  color: white; /* Old browsers */ /* Chrome10+,Safari5.1+ */\r\n  background:#ff3019 ;\r\n  width: 20px;\r\n  height:20px;\r\n  text-align: center;\r\n  line-height: 20px;\r\n  border: 3px solid #DA4433;\r\n  border-radius: 10px 10px 0; /* IE6-9 */  /* IE10 text shadows */\r\n}\r\n\r\n.introjs-arrow {\r\n  border: 5px solid white;\r\n  content:'';\r\n  position: absolute;\r\n}\r\n.introjs-arrow.top {\r\n  top: -10px;\r\n  border-top-color:transparent;\r\n  border-right-color:transparent;\r\n  border-bottom-color: #ecf0f1;\r\n  border-left-color:transparent;\r\n}\r\n.introjs-arrow.right {\r\n  right: -10px;\r\n  top: 10px;\r\n  border-top-color:transparent;\r\n  border-right-color:transparent;\r\n  border-bottom-color:transparent;\r\n  border-left-color:#ecf0f1;\r\n}\r\n.introjs-arrow.bottom {\r\n  bottom: -10px;\r\n  border-top-color:#ecf0f1;\r\n  border-right-color:transparent;\r\n  border-bottom-color:transparent;\r\n  border-left-color:transparent;\r\n}\r\n.introjs-arrow.left {\r\n  left: -10px;\r\n  top: 10px;\r\n  border-top-color:transparent;\r\n  border-right-color: #ecf0f1;\r\n  border-bottom-color:transparent;\r\n  border-left-color:transparent;\r\n}\r\n\r\n.introjs-tooltip {\r\n  position: absolute;\r\n  padding: 10px;\r\n  background-color: #ecf0f1;\r\n  min-width: 200px;\r\n  max-width: 300px;\r\n  /* border-radius: 3px; */\r\n  box-shadow: 0 6px 7px -4px rgba(0,0,0,.4);\r\n  -webkit-transition: opacity 0.1s ease-out;\r\n     -moz-transition: opacity 0.1s ease-out;\r\n      -ms-transition: opacity 0.1s ease-out;\r\n       -o-transition: opacity 0.1s ease-out;\r\n          transition: opacity 0.1s ease-out;\r\n}\r\n\r\n.introjs-tooltiptext {\r\n    margin-left: -10px;\r\n\r\n    margin-right: -10px;\r\n    border-top: 1px solid #FFFFFF;\r\n    background: #FAFAFA;\r\n    color: #2c3e50;\r\n    padding: 5px 10px;\r\n    border-bottom: 1px solid #FFFFFF;\r\n}\r\n\r\n.introjs-tooltipbuttons {\r\n  text-align: center;\r\n}\r\n\r\n/*\r\n Buttons style by http://nicolasgallagher.com/lab/css3-github-buttons/\r\n Changed by Afshin Mehrabani\r\n*/\r\n.introjs-button {\r\n  position: relative;\r\n  overflow: visible;\r\n  display: inline-block;\r\n  padding: 0.5em 0.8em;\r\n  box-shadow: 0 2px 0px -0px #306588;\r\n  margin: 0;\r\n  outline: none;\r\n  background: #2980b9;\r\n  text-decoration: none;\r\n  font: 11px/normal sans-serif;\r\n  color: #fff !important;\r\n  white-space: nowrap;\r\n  cursor: pointer;\r\n  outline: none !important;\r\n  -webkit-background-clip: padding;\r\n  -moz-background-clip: padding;\r\n  -o-background-clip: padding-box;\r\n  /*background-clip: padding-box;*/ /* commented out due to Opera 11.10 bug */\r\n  -webkit-border-radius: 0.2em;\r\n  -moz-border-radius: 0.2em;\r\n  border-radius: 0.2em;\r\n  /* IE hacks */\r\n  zoom: 1;\r\n  *display: inline;\r\n  margin-top: 10px;\r\n}\r\n\r\n.introjs-button:hover {\r\n  color: #fff;\r\n  background: #2671A2;\r\n  text-decoration: none;\r\n  box-shadow: 0 2px 0px -0px #235677;\r\n}\r\n\r\n.introjs-button:focus,\r\n.introjs-button:active {\r\n    background: #23587A;  text-decoration: none;\r\n    /* bottom: -1px; */\r\n    box-shadow: 0 2px 0px 0px #173B53;\r\n}\r\n\r\n/* overrides extra padding on button elements in Firefox */\r\n.introjs-button::-moz-focus-inner {\r\n  padding: 0;\r\n  border: 0;\r\n}\r\n\r\n.introjs-skipbutton {\r\n  margin-right: 5px;\r\n  color: #fff;\r\n  background: #e74c3c;\r\n  box-shadow: 0 2px 0px -0px #B91D0D;\r\n}\r\n\r\n.introjs-skipbutton:hover {\r\n    background: #EB1540;  box-shadow: 0 2px 0px -0px #B91D0D;\r\n\r\n}\r\n\r\n.introjs-skipbutton:active, .introjs-skipbutton:focus {\r\n    background: #C02312;\r\n    box-shadow: 0 1px 0px -0px #6F1309;\r\n\r\n}\r\n\r\n.introjs-prevbutton {\r\n  -webkit-border-radius: 0.2em 0 0 0.2em;\r\n  -moz-border-radius: 0.2em 0 0 0.2em;\r\n  border-radius: 0.2em 0 0 0.2em;\r\n  border-right: none;\r\n}\r\n\r\n.introjs-nextbutton {\r\n  -webkit-border-radius: 0 0.2em 0.2em 0;\r\n  -moz-border-radius: 0 0.2em 0.2em 0;\r\n  border-radius: 0 0.2em 0.2em 0;\r\n}\r\n\r\n.introjs-disabled, .introjs-disabled:hover, .introjs-disabled:focus {\r\n  color: #C2C2C2 !important;\r\n  border-color: #d4d4d4;\r\n  cursor: default;\r\n  box-shadow: 0 2px 0px -0px #CACED1;\r\n  background-color: #E6E6E6;\r\n  background-image: none;\r\n  text-decoration: none;\r\n}\r\n\r\n.introjs-bullets {\r\n  text-align: center;\r\n}\r\n.introjs-bullets ul {\r\n  clear: both;\r\n  margin: 15px auto 0;\r\n  padding: 0;\r\n  display: inline-block;\r\n}\r\n.introjs-bullets ul li {\r\n  list-style: none;\r\n  float: left;\r\n  margin: 0 2px;\r\n}\r\n.introjs-bullets ul li a {\r\n  display: block;\r\n  width: 6px;\r\n  height: 6px;\r\n  background: #ccc;\r\n  border-radius: 10px;\r\n  -moz-border-radius: 10px;\r\n  -webkit-border-radius: 10px;\r\n  text-decoration: none;\r\n}\r\n.introjs-bullets ul li a:hover {\r\n  background: #999;\r\n}\r\n.introjs-bullets ul li a.active {\r\n  background: #999;\r\n}\r\n\r\n.introjs-progress {\r\n  background-color: #FAFAFA;\r\n}\r\n.introjs-progressbar {\r\n  background-color: #2980b9;\r\n}\r\n\r\n.introjsFloatingElement {\r\n  position: absolute;\r\n  height: 0;\r\n  width: 0;\r\n  left: 50%;\r\n  top: 50%;\r\n}\r\n"
  },
  {
    "path": "themes/introjs-royal.css",
    "content": ".introjs-overlay {\r\n  position: absolute;\r\n  z-index: 999999;\r\n  background: #525252;\r\n  opacity: 0;\r\n\r\n  -webkit-transition: all 0.3s ease-out;\r\n     -moz-transition: all 0.3s ease-out;\r\n      -ms-transition: all 0.3s ease-out;\r\n       -o-transition: all 0.3s ease-out;\r\n          transition: all 0.3s ease-out;\r\n}\r\n\r\n.introjs-fixParent {\r\n  z-index: auto !important;\r\n  opacity: 1.0 !important;\r\n}\r\n\r\n.introjs-showElement {\r\n  z-index: 9999999 !important;\r\n}\r\n\r\n.introjs-relativePosition {\r\n  position: relative;\r\n}\r\n\r\n.introjs-helperLayer {\r\n  position: absolute;\r\n  z-index: 9999998;\r\n  background-color: #FFF;\r\n  background-color: rgba(255,255,255,.9);\r\n  border: 1px solid #777;\r\n  border: 3px solid rgba(255, 255, 255, 1);\r\n  border-radius: 0;\r\n  box-shadow: 0 8px 50px -10px rgba(0,0,0,.6);\r\n  -webkit-transition: all 0.3s ease-out;\r\n     -moz-transition: all 0.3s ease-out;\r\n      -ms-transition: all 0.3s ease-out;\r\n       -o-transition: all 0.3s ease-out;\r\n          transition: all 0.3s ease-out;\r\n}\r\n\r\n.introjs-helperNumberLayer {\r\n  position: absolute;\r\n  top: -29px;\r\n  left: -29px;\r\n  z-index: 9999999999 !important;\r\n  padding: 3px;\r\n  font-family: Arial, verdana, tahoma;\r\n  font-size: 13px;\r\n  font-weight: bold;\r\n  color: #DA4433; /* Old browsers */ /* Chrome10+,Safari5.1+ */\r\n  background: #FFFFFF;\r\n  width: 20px;\r\n  height:20px;\r\n  text-align: center;\r\n  line-height: 20px;\r\n  border: 3px solid #DA4433;\r\n  border-right: none;\r\n  border-bottom: none; /* IE6-9 */  /* IE10 text shadows */\r\n  border-radius: 10px 0 0 0;\r\n}\r\n\r\n.introjs-arrow {\r\n  border: 5px solid white;\r\n  content:'';\r\n  position: absolute;\r\n}\r\n.introjs-arrow.top {\r\n  top: -10px;\r\n  border-top-color:transparent;\r\n  border-right-color:transparent;\r\n  border-bottom-color: #ecf0f1;\r\n  border-left-color:transparent;\r\n  display: none !important;\r\n}\r\n.introjs-arrow.right {\r\n  right: -10px;\r\n  top: 10px;\r\n  border-top-color:transparent;\r\n  border-right-color:transparent;\r\n  border-bottom-color:transparent;\r\n  border-left-color:#ecf0f1;\r\n}\r\n.introjs-arrow.bottom {\r\n  bottom: -10px;\r\n  border-top-color:#ecf0f1;\r\n  border-right-color:transparent;\r\n  border-bottom-color:transparent;\r\n  border-left-color:transparent;\r\n}\r\n.introjs-arrow.left {\r\n  left: -10px;\r\n  top: 10px;\r\n  border-top-color:transparent;\r\n  border-right-color: #ecf0f1;\r\n  border-bottom-color:transparent;\r\n  border-left-color:transparent;\r\n}\r\n\r\n.introjs-tooltip {\r\n  position: fixed;\r\n  padding: 10px 170px 30px 10px;\r\n  background-color: #ecf0f1;\r\n  min-width: 200px;\r\n  max-width: 300px;\r\n  /* border-radius: 3px; */\r\n  border-top: 3px solid #236591;\r\n  box-shadow: 0 -6px 50px -4px rgba(0,0,0,.4);\r\n  -webkit-transition: opacity 0.1s ease-out;\r\n     -moz-transition: opacity 0.1s ease-out;\r\n      -ms-transition: opacity 0.1s ease-out;\r\n       -o-transition: opacity 0.1s ease-out;\r\n          transition: opacity 0.1s ease-out;\r\n  bottom: 0 !important;\r\n  left: 0 !Important;\r\n  top: initial !important;\r\n  right: 0 !Important;\r\n  max-width: initial;\r\n  width: auto !important;\r\n}\r\n\r\n.introjs-tooltiptext {\r\n    margin-left: -10px;\r\n\r\n    margin-right: -10px;\r\n    /* border-top: 1px solid #FFFFFF; */\r\n    /* background: #FAFAFA; */\r\n    color: #2c3e50;\r\n    padding: 5px 10px;\r\n    /* border-bottom: 1px solid #FFFFFF; */\r\n}\r\n\r\n.introjs-tooltipbuttons {\r\n  text-align: center;\r\n  position: absolute;\r\n  right: 10px;\r\n  top: 0;\r\n}\r\n\r\n/*\r\n Buttons style by http://nicolasgallagher.com/lab/css3-github-buttons/\r\n Changed by Afshin Mehrabani\r\n*/\r\n.introjs-button {\r\n  position: relative;\r\n  overflow: visible;\r\n  display: inline-block;\r\n  padding: 0.5em 0.8em;\r\n  box-shadow: 0 2px 0px -0px #306588;\r\n  margin: 0;\r\n  outline: none;\r\n  background: #2980b9;\r\n  text-decoration: none;\r\n  font: 11px/normal sans-serif;\r\n  color: #fff !important;\r\n  white-space: nowrap;\r\n  cursor: pointer;\r\n  outline: none !important;\r\n  -webkit-background-clip: padding;\r\n  -moz-background-clip: padding;\r\n  -o-background-clip: padding-box;\r\n  /*background-clip: padding-box;*/ /* commented out due to Opera 11.10 bug */\r\n  -webkit-border-radius: 0.2em;\r\n  -moz-border-radius: 0.2em;\r\n  border-radius: 0.2em;\r\n  /* IE hacks */\r\n  zoom: 1;\r\n  *display: inline;\r\n  margin-top: 10px;\r\n}\r\n\r\n.introjs-button:hover {\r\n  color: #fff;\r\n  background: #2671A2;\r\n  text-decoration: none;\r\n  box-shadow: 0 2px 0px -0px #235677;\r\n}\r\n\r\n.introjs-button:focus,\r\n.introjs-button:active {\r\n    background: #23587A;  text-decoration: none;\r\n    /* bottom: -1px; */\r\n    box-shadow: 0 2px 0px 0px #173B53;\r\n}\r\n\r\n/* overrides extra padding on button elements in Firefox */\r\n.introjs-button::-moz-focus-inner {\r\n  padding: 0;\r\n  border: 0;\r\n}\r\n\r\n.introjs-skipbutton {\r\n  margin-right: 5px;\r\n  color: #fff;\r\n  background: #e74c3c;\r\n  box-shadow: 0 2px 0px -0px #B91D0D;\r\n}\r\n\r\n.introjs-skipbutton:hover {\r\n    background: #EB1540;  box-shadow: 0 2px 0px -0px #B91D0D;\r\n\r\n}\r\n\r\n.introjs-skipbutton:active, .introjs-skipbutton:focus {\r\n    background: #C02312;\r\n    box-shadow: 0 1px 0px -0px #6F1309;\r\n\r\n}\r\n\r\n.introjs-prevbutton {\r\n  -webkit-border-radius: 0.2em 0 0 0.2em;\r\n  -moz-border-radius: 0.2em 0 0 0.2em;\r\n  border-radius: 0.2em 0 0 0.2em;\r\n  border-right: none;\r\n}\r\n\r\n.introjs-nextbutton {\r\n  -webkit-border-radius: 0 0.2em 0.2em 0;\r\n  -moz-border-radius: 0 0.2em 0.2em 0;\r\n  border-radius: 0 0.2em 0.2em 0;\r\n}\r\n\r\n.introjs-disabled, .introjs-disabled:hover, .introjs-disabled:focus {\r\n  color: #C2C2C2 !important;\r\n  border-color: #d4d4d4;\r\n  cursor: default;\r\n  box-shadow: 0 2px 0px -0px #CACED1;\r\n  background-color: #E6E6E6;\r\n  background-image: none;\r\n  text-decoration: none;\r\n}\r\n\r\n.introjs-bullets {\r\n  text-align: center;\r\n  float: right;\r\n  position: absolute;\r\n  right: 10px;\r\n  bottom: 10px;\r\n}\r\n.introjs-bullets ul {\r\n  clear: both;\r\n  margin: 15px auto 0;\r\n  padding: 0;\r\n  display: inline-block;\r\n}\r\n.introjs-bullets ul li {\r\n  list-style: none;\r\n  float: left;\r\n  margin: 0 2px;\r\n}\r\n.introjs-bullets ul li a {\r\n  display: block;\r\n  width: 6px;\r\n  height: 6px;\r\n  background: #ccc;\r\n  border-radius: 10px;\r\n  -moz-border-radius: 10px;\r\n  -webkit-border-radius: 10px;\r\n  text-decoration: none;\r\n}\r\n.introjs-bullets ul li a:hover {\r\n  background: #999;\r\n}\r\n.introjs-bullets ul li a.active {\r\n  background: #999;\r\n}\r\n\r\n.introjs-progress {\r\n  width: 20%;\r\n  position: absolute;\r\n  bottom: 10px;\r\n  background-color: #fff;\r\n}\r\n.introjs-progressbar {\r\n  background-color: #2980b9;\r\n}\r\n\r\n.introjsFloatingElement {\r\n  position: absolute;\r\n  height: 0;\r\n  width: 0;\r\n  left: 50%;\r\n  top: 50%;\r\n}\r\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es2015\",\n    \"allowSyntheticDefaultImports\": true,\n    \"moduleResolution\": \"Bundler\",\n    \"importHelpers\": true,\n    \"resolveJsonModule\": true,\n    \"allowJs\": true,\n    \"alwaysStrict\": true,\n    \"sourceMap\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noFallthroughCasesInSwitch\": true,\n    \"noImplicitReturns\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"noImplicitAny\": true,\n    \"noImplicitThis\": true,\n    \"strictNullChecks\": true,\n    \"declaration\": true,\n    \"strictBindCallApply\": true,\n    \"rootDir\": \".\",\n    \"baseUrl\": \"./\",\n    \"outDir\": \"dist\"\n  },\n  \"include\": [\"src/**/*\", \"src/index.ts\", \"tests/jest/**/*\"],\n  \"exclude\": [\n    \"./cypress.config.ts\",\n    \"cypress\",\n    \"dist\",\n    \"node_modules\",\n    \"**/*.cy.ts\"\n  ]\n}\n"
  },
  {
    "path": "tsconfig.release.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"rootDir\": \".\",\n    \"removeComments\": true\n  },\n  \"include\": [\n    \"index.ts\",\n    \"src/**/*\"\n  ],\n  \"exclude\": [\n    \"tests/**/*\"\n  ]\n}\n"
  },
  {
    "path": "tsconfig.test.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"types\": [\"jest\"],\n    \"esModuleInterop\": true\n  }\n}\n"
  }
]